This is an automated email from the ASF dual-hosted git repository.

arosien pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/daffodil-vscode.git

commit ca7a12a5d01fd2dd3092f55949e2665411360140
Author: Robert Strickland <[email protected]>
AuthorDate: Thu Aug 10 15:19:25 2023 -0500

    Cleaning Data Editor Legacy Code
    
    - Removes lingering variables & functionality due to the rapid
      development of the data editor.
    - Fixes issue where the data view content control showed index of
      viewport container instead of file offset.
    
    Closes #771
    Closes #773
---
 .../DataDisplays/CustomByteDisplay/BinaryData.ts   | 108 +-------------
 .../CustomByteDisplay/DataLineFeed.svelte          |  18 +--
 .../FileTraversalIndicator.svelte                  |   2 +-
 .../CustomByteDisplay/SelectedByteEdit.svelte      |  67 +++++----
 .../components/DataDisplays/DataViewports.svelte   |  74 +---------
 .../DataDisplays/Fieldsets/ContentControls.svelte  |   2 +-
 .../DataDisplays/Fieldsets/DataView.svelte         |   4 +-
 .../DataDisplays/Header/DisplayHeader.svelte       |   7 +-
 .../DataMetrics/ByteFrequencyGraph.svelte          |  14 +-
 src/svelte/src/components/Header/Header.svelte     |   3 +-
 .../components/Header/fieldsets/FileMetrics.svelte |   5 +-
 .../src/components/Header/fieldsets/FileMetrics.ts |   4 +-
 .../Header/fieldsets/SearchReplace.svelte          |  14 +-
 .../components/Header/fieldsets/SearchReplace.ts   |  58 +-------
 .../components/Header/fieldsets/Settings.svelte    |   7 +-
 .../src/components/Inputs/Buttons/Button.svelte    |   8 +-
 .../Inputs/Buttons/ToggleableButton.svelte         |   4 +-
 .../components/ServerMetrics/ServerMetrics.svelte  |   4 +-
 src/svelte/src/components/dataEditor.svelte        |  73 ++--------
 src/svelte/src/components/layouts/Tooltip.svelte   |   2 +-
 src/svelte/src/stores/configuration.ts             |   4 -
 src/svelte/src/stores/index.ts                     | 156 ++++++++++++---------
 src/svelte/src/utilities/display.ts                |  30 +---
 src/svelte/src/utilities/highlights.ts             |   2 +-
 yarn.lock                                          | 141 +++++++++----------
 25 files changed, 254 insertions(+), 557 deletions(-)

diff --git 
a/src/svelte/src/components/DataDisplays/CustomByteDisplay/BinaryData.ts 
b/src/svelte/src/components/DataDisplays/CustomByteDisplay/BinaryData.ts
index 4aa9cc2..e3f9e31 100644
--- a/src/svelte/src/components/DataDisplays/CustomByteDisplay/BinaryData.ts
+++ b/src/svelte/src/components/DataDisplays/CustomByteDisplay/BinaryData.ts
@@ -15,9 +15,8 @@
  * limitations under the License.
  */
 
-import { writable, derived } from 'svelte/store'
 import { SimpleWritable } from '../../../stores/localStore'
-import type { BytesPerRow, RadixValues } from '../../../stores/configuration'
+import type { RadixValues } from '../../../stores/configuration'
 import { radixBytePad } from '../../../utilities/display'
 
 export const BYTE_ACTION_DIV_OFFSET: number = 24
@@ -53,17 +52,6 @@ export interface EditByteEvent extends EditEvent {
   targetByte: ByteValue
 }
 
-export enum ViewportBoundaryTrigger {
-  SCROLL_TOP,
-  SCROLL_BOTTOM,
-}
-
-export const scroll_boundary_event = (top: boolean, end: boolean) => {
-  return top
-    ? ViewportBoundaryTrigger.SCROLL_TOP
-    : ViewportBoundaryTrigger.SCROLL_BOTTOM
-}
-
 export const byte_value_string = (value: number, radix: RadixValues) => {
   if (value > 255)
     throw `Value {${value}} is larger than an unsigned int (255).`
@@ -87,8 +75,6 @@ export const RADIX_REGEX_MATCH_STR = {
   2: /[0-1]{8}/g,
 }
 
-export const processingViewportRefresh = writable(false)
-
 export class ViewportData_t {
   data = new Uint8Array(0)
   fileOffset = -1
@@ -160,98 +146,6 @@ export class ViewportDataStore_t extends 
SimpleWritable<ViewportData_t> {
   }
 }
 
-export const viewport = new ViewportDataStore_t()
-
-export type ByteActionPxOffsets = {
-  insertBefore: {
-    left: number
-    top: number
-  }
-  insertAfter: {
-    left: number
-    top: number
-  }
-  delete: {
-    left: number
-    top: number
-  }
-  input: {
-    left: number
-    top: number
-  }
-}
-
 export function latin1Undefined(charCode: number): boolean {
   return charCode < 32 || (charCode > 126 && charCode < 160)
 }
-
-export function update_byte_action_offsets(
-  targetDiv: HTMLDivElement,
-  offsetTopBy: number = 0,
-  offsetLeftBy: number = 0
-) {
-  const targetWidth = parseInt(targetDiv.style.width.replace('px', '')) + 4
-  byteActionPxOffsets.update((currentOffsets) => {
-    currentOffsets.delete = {
-      left: targetDiv.offsetLeft + offsetLeftBy,
-      top: targetDiv.offsetTop + BYTE_ACTION_DIV_OFFSET - offsetTopBy,
-    }
-    currentOffsets.input = {
-      left: targetDiv.offsetLeft + offsetLeftBy,
-      top: targetDiv.offsetTop - offsetTopBy,
-    }
-    currentOffsets.insertAfter = {
-      left: targetDiv.offsetLeft + targetWidth + offsetLeftBy,
-      top: targetDiv.offsetTop - offsetTopBy,
-    }
-    currentOffsets.insertBefore = {
-      left: targetDiv.offsetLeft - targetWidth + offsetLeftBy,
-      top: targetDiv.offsetTop - offsetTopBy,
-    }
-
-    return currentOffsets
-  })
-}
-
-export enum ByteValuePxWidths {
-  DISPLAY = 20,
-  EDITING = 68,
-}
-
-export let ByteValueArray: Array<ByteValue> = []
-
-export const bytesPerRow = writable(16 as BytesPerRow)
-export const editingByte = writable(false)
-export const selectedByte = writable({
-  text: '',
-  offset: -1,
-  value: -1,
-} as ByteValue)
-export const byteActionPxOffsets = writable({
-  insertBefore: {
-    left: 0,
-    top: 0,
-  },
-  insertAfter: {
-    left: 0,
-    top: 0,
-  },
-  delete: {
-    left: 0,
-    top: 0,
-  },
-  input: {
-    left: 0,
-    top: 0,
-  },
-} as ByteActionPxOffsets)
-export const mouseSelectionBytes = writable({ mousedown: -1, mouseup: -1 })
-
-// derived readable number whose value is the computed number of bytes in the 
edited file
-export const offsetMax = derived(viewport, ($viewport) => {
-  // this should be the same as the computed file size
-  return $viewport.fileOffset + $viewport.length + $viewport.bytesLeft
-})
-export function focus_byte_input() {
-  document.getElementById('byte-input').focus()
-}
diff --git 
a/src/svelte/src/components/DataDisplays/CustomByteDisplay/DataLineFeed.svelte 
b/src/svelte/src/components/DataDisplays/CustomByteDisplay/DataLineFeed.svelte
index 8d70148..ebfe8b7 100644
--- 
a/src/svelte/src/components/DataDisplays/CustomByteDisplay/DataLineFeed.svelte
+++ 
b/src/svelte/src/components/DataDisplays/CustomByteDisplay/DataLineFeed.svelte
@@ -15,7 +15,7 @@ See the License for the specific language governing 
permissions and
 limitations under the License.
 -->
 <script lang="ts">
-  import { createEventDispatcher, onMount, tick } from 'svelte'
+  import { createEventDispatcher, onMount } from 'svelte'
   import {
     editedDataSegment,
     editMode,
@@ -24,6 +24,10 @@ limitations under the License.
     seekOffsetInput,
     selectionDataStore,
     selectionSize,
+    selectedByte,
+    fileMetrics,
+    searchQuery,
+    editorActionsAllowed,
   } from '../../../stores'
   import {
     EditByteModes,
@@ -31,18 +35,15 @@ limitations under the License.
     VIEWPORT_CAPACITY_MAX,
     type BytesPerRow,
     type RadixValues,
-    editorActionsAllowed,
     EditActionRestrictions,
   } from '../../../stores/configuration'
   import { MessageCommand } from '../../../utilities/message'
   import { vscode } from '../../../utilities/vscode'
-  import { fileMetrics } from '../../Header/fieldsets/FileMetrics'
   import Button from '../../Inputs/Buttons/Button.svelte'
   import FlexContainer from '../../layouts/FlexContainer.svelte'
   import {
     byte_value_string,
     null_byte,
-    selectedByte,
     type ByteSelectionEvent,
     type ByteValue,
     type ViewportData_t,
@@ -63,7 +64,6 @@ limitations under the License.
     searchResultsHighlights,
     updateSearchResultsHighlights,
   } from '../../../utilities/highlights'
-  import { searchQuery } from '../../Header/fieldsets/SearchReplace'
 
   export let lineTop: number
   export let awaitViewportScroll: boolean
@@ -119,7 +119,6 @@ limitations under the License.
   let totalLinesPerViewport = 0
   let lineTopMaxViewport = 64
   let lineTopMaxFile = 64
-  let viewportFileSegment = 1
   let atViewportHead = true
   let atViewportTail = false
   let atFileHead = true
@@ -168,7 +167,6 @@ limitations under the License.
       totalLinesPerViewport - NUM_LINES_DISPLAYED,
       0
     )
-    viewportFileSegment = viewportData.fileOffset / viewportData.length + 1
 
     atViewportHead = lineTop === 0
     atViewportTail = lineTop === lineTopMaxViewport
@@ -360,7 +358,6 @@ limitations under the License.
         ? selectionEvent.targetByte
         : null_byte()
 
-    // update_byte_action_offsets(selectionEvent.targetElement)
     selectedByteElement = selectionEvent.targetElement
 
     editedDataSegment.update(() => {
@@ -468,10 +465,7 @@ limitations under the License.
 
 <div class="container" style:height id={CONTAINER_ID}>
   {#each viewportLines as viewportLine, i}
-    <div
-      class={`line ${viewportLine.highlight} ${themeClass}`}
-      title={`file line #${viewportLine.fileLine}`}
-    >
+    <div class={`line ${viewportLine.highlight} ${themeClass}`}>
       <div class="address" id="address">
         <b>{viewportLine.offset}</b>
       </div>
diff --git 
a/src/svelte/src/components/DataDisplays/CustomByteDisplay/FileTraversalIndicator.svelte
 
b/src/svelte/src/components/DataDisplays/CustomByteDisplay/FileTraversalIndicator.svelte
index 56c9142..7c7b8f4 100644
--- 
a/src/svelte/src/components/DataDisplays/CustomByteDisplay/FileTraversalIndicator.svelte
+++ 
b/src/svelte/src/components/DataDisplays/CustomByteDisplay/FileTraversalIndicator.svelte
@@ -25,7 +25,7 @@ limitations under the License.
   export let bytesPerRow = 16
   export let percentageTraversed
   export let maxDisplayLines = 20
-  export let selectionActive
+  export let selectionActive: boolean
 
   let indicatorContainer: HTMLElement
   let indicatorClickDisabled: boolean = false
diff --git 
a/src/svelte/src/components/DataDisplays/CustomByteDisplay/SelectedByteEdit.svelte
 
b/src/svelte/src/components/DataDisplays/CustomByteDisplay/SelectedByteEdit.svelte
index 3b75540..b46adb4 100644
--- 
a/src/svelte/src/components/DataDisplays/CustomByteDisplay/SelectedByteEdit.svelte
+++ 
b/src/svelte/src/components/DataDisplays/CustomByteDisplay/SelectedByteEdit.svelte
@@ -32,17 +32,16 @@ limitations under the License.
     addressRadix,
     rerenderActionElements,
     focusedViewportId,
+    editorActionsAllowed,
+    bytesPerRow,
   } from '../../../stores'
   import { enterKeypressEvents } from '../../../utilities/enterKeypressEvents'
-  import { bytesPerRow, type ByteValue, type EditAction } from './BinaryData'
+  import type { ByteValue, EditAction } from './BinaryData'
   import {
     UIThemeCSSClass,
     type CSSThemeClass,
   } from '../../../utilities/colorScheme'
-  import {
-    EditActionRestrictions,
-    editorActionsAllowed,
-  } from '../../../stores/configuration'
+  import { EditActionRestrictions } from '../../../stores/configuration'
 
   const eventDispatcher = createEventDispatcher()
 
@@ -55,6 +54,7 @@ limitations under the License.
     id: string
     position: ActionElementPosition
     HTMLRef: HTMLDivElement | HTMLInputElement
+    render: boolean
   }
   type ActionElements = {
     [k in Actions]: ActionElement
@@ -63,21 +63,25 @@ limitations under the License.
     input: {
       id: 'binary-action-input',
       HTMLRef: undefined as HTMLInputElement,
+      render: true,
       position: { viewportLine: -1, viewportByteIndex: -1 },
     },
     'insert-before': {
       id: 'binary-action-before',
       HTMLRef: undefined,
+      render: true,
       position: { viewportLine: -1, viewportByteIndex: -1 },
     },
     'insert-after': {
       id: 'binary-action-after',
       HTMLRef: undefined,
+      render: true,
       position: { viewportLine: -1, viewportByteIndex: -1 },
     },
     delete: {
       id: 'binary-action-delete',
       HTMLRef: undefined,
+      render: true,
       position: { viewportLine: -1, viewportByteIndex: -1 },
     },
   }
@@ -210,7 +214,10 @@ limitations under the License.
             previousByteId
           ) as HTMLDivElement
 
-          if (!elementToReplace) break
+          if (!elementToReplace) {
+            actionElements[element].render = false
+            break
+          }
 
           targetParent.contains(elementToReplace)
             ? apply_element_replacements(
@@ -236,7 +243,10 @@ limitations under the License.
             nextByteId
           ) as HTMLDivElement
 
-          if (!elementToReplace) break
+          if (!elementToReplace) {
+            actionElements[element].render = false
+            break
+          }
 
           targetParent.contains(elementToReplace)
             ? apply_element_replacements(
@@ -297,36 +307,33 @@ limitations under the License.
   function byteOffsetToElementId(byteOffset: number): string {
     return $focusedViewportId + '-' + byteOffset.toString()
   }
-  function element_byteline_position(
-    targetElement: HTMLDivElement
-  ): number | undefined {
-    const index = parseInt(targetElement.id) + 1
-    return index % BPR
-  }
 </script>
 
 {#if $editorActionsAllowed == EditActionRestrictions.None}
   <!-- svelte-ignore a11y-click-events-have-key-events -->
   <!-- svelte-ignore a11y-no-static-element-interactions -->
-  <div
-    class="insert-before {themeClass}"
-    id={actionElements['insert-before'].id}
-    style:width={elementDivWidth}
-    on:click={send_insert}
-  >
-    &#8676;
-  </div>
-
+  {#if actionElements['insert-before'].render}
+    <div
+      class="insert-before {themeClass}"
+      id={actionElements['insert-before'].id}
+      style:width={elementDivWidth}
+      on:click={send_insert}
+    >
+      &#8676;
+    </div>
+  {/if}
   <!-- svelte-ignore a11y-click-events-have-key-events -->
   <!-- svelte-ignore a11y-no-static-element-interactions -->
-  <div
-    class="insert-after {themeClass}"
-    id={actionElements['insert-after'].id}
-    style:width={elementDivWidth}
-    on:click={send_insert}
-  >
-    &#8677;
-  </div>
+  {#if actionElements['insert-after'].render}
+    <div
+      class="insert-after {themeClass}"
+      id={actionElements['insert-after'].id}
+      style:width={elementDivWidth}
+      on:click={send_insert}
+    >
+      &#8677;
+    </div>
+  {/if}
 
   <span>
     <input
diff --git a/src/svelte/src/components/DataDisplays/DataViewports.svelte 
b/src/svelte/src/components/DataDisplays/DataViewports.svelte
index 38ad6cc..b031f25 100644
--- a/src/svelte/src/components/DataDisplays/DataViewports.svelte
+++ b/src/svelte/src/components/DataDisplays/DataViewports.svelte
@@ -18,84 +18,12 @@ limitations under the License.
   import {
     addressRadix,
     bytesPerRow,
-    editMode,
-    editedDataSegment,
-    editorEncoding,
-    selectionDataStore,
-    selectionSize,
-    viewportClientHeight,
-    viewportLineHeight,
-    viewportScrollHeight,
-    viewportScrollTop,
-    viewportLength,
     displayRadix,
     dataFeedLineTop,
     dataFeedAwaitRefresh,
+    viewport,
   } from '../../stores'
-  import {
-    viewport_references,
-    type ViewportReferences,
-  } from '../../utilities/display'
-  import { MessageCommand } from '../../utilities/message'
-  import { onMount, tick } from 'svelte'
-  import { vscode } from '../../utilities/vscode'
-  import { EditByteModes } from '../../stores/configuration'
-  import { viewport } from './CustomByteDisplay/BinaryData'
   import DataLineFeed from './CustomByteDisplay/DataLineFeed.svelte'
-
-  const viewportRefs = viewport_references() as ViewportReferences
-
-  //
-  // reactive statements
-  //
-
-  $: {
-    $editMode === EditByteModes.Single
-      ? postEditorOnChangeMsg('hex')
-      : postEditorOnChangeMsg($editorEncoding)
-
-    // when the viewport length changes, update the viewport geometry
-    if ($viewportLength >= 0) {
-      // populateViewportGeometry()
-    }
-  }
-
-  function populateViewportGeometry() {
-    // event handlers expect synchronous functions, so wrap the async function 
in a sync function
-    async function populateViewportGeometryOps_() {
-      if (viewportRefs.physical) {
-        // wait for the DOM to be updated before getting the viewport geometry
-        await tick()
-        $viewportScrollTop = viewportRefs.physical.scrollTop
-        $viewportScrollHeight = viewportRefs.physical.scrollHeight
-        $viewportClientHeight = viewportRefs.physical.clientHeight
-        $viewportLineHeight = parseFloat(
-          getComputedStyle(viewportRefs.physical).lineHeight
-        )
-      }
-    }
-
-    populateViewportGeometryOps_()
-  }
-
-  function postEditorOnChangeMsg(forcedEncoding?: string) {
-    vscode.postMessage({
-      command: MessageCommand.editorOnChange,
-      data: {
-        fileOffset: $selectionDataStore.startOffset,
-        selectionData: $editedDataSegment,
-        encoding: forcedEncoding ? forcedEncoding : $editorEncoding,
-        selectionSize: $selectionSize,
-        editMode: $editMode,
-      },
-    })
-  }
-
-  onMount(() => {
-    // populateViewportGeometry()
-    // recalculate the viewport geometry when the window is resized
-    // window.addEventListener('resize', populateViewportGeometry)
-  })
 </script>
 
 <DataLineFeed
diff --git 
a/src/svelte/src/components/DataDisplays/Fieldsets/ContentControls.svelte 
b/src/svelte/src/components/DataDisplays/Fieldsets/ContentControls.svelte
index d22aa6b..16ceef9 100644
--- a/src/svelte/src/components/DataDisplays/Fieldsets/ContentControls.svelte
+++ b/src/svelte/src/components/DataDisplays/Fieldsets/ContentControls.svelte
@@ -20,7 +20,7 @@ limitations under the License.
   import { createEventDispatcher } from 'svelte'
   import FlexContainer from '../../layouts/FlexContainer.svelte'
   import Button from '../../Inputs/Buttons/Button.svelte'
-  import { type EditEvent } from '../CustomByteDisplay/BinaryData'
+  import type { EditEvent } from '../CustomByteDisplay/BinaryData'
   const eventDispatcher = createEventDispatcher()
 
   function applyChanges(event: Event) {
diff --git a/src/svelte/src/components/DataDisplays/Fieldsets/DataView.svelte 
b/src/svelte/src/components/DataDisplays/Fieldsets/DataView.svelte
index dc75563..f648f20 100644
--- a/src/svelte/src/components/DataDisplays/Fieldsets/DataView.svelte
+++ b/src/svelte/src/components/DataDisplays/Fieldsets/DataView.svelte
@@ -30,12 +30,12 @@ limitations under the License.
     dvUint8,
     selectionDataStore,
     editedDataSegment,
+    selectedByte,
   } from '../../../stores'
   import { ENDIANNESS_OPTIONS } from '../../../stores/configuration'
   import { UIThemeCSSClass } from '../../../utilities/colorScheme'
-  import Input from '../../Inputs/Input/Input.svelte'
   import { createEventDispatcher } from 'svelte'
-  import { selectedByte } from '../CustomByteDisplay/BinaryData'
+  import Input from '../../Inputs/Input/Input.svelte'
 
   const eventDispatcher = createEventDispatcher()
   const ERROR_MESSAGE_TIMEOUT = 5000
diff --git a/src/svelte/src/components/DataDisplays/Header/DisplayHeader.svelte 
b/src/svelte/src/components/DataDisplays/Header/DisplayHeader.svelte
index 2350ef0..28450cd 100644
--- a/src/svelte/src/components/DataDisplays/Header/DisplayHeader.svelte
+++ b/src/svelte/src/components/DataDisplays/Header/DisplayHeader.svelte
@@ -23,6 +23,8 @@ limitations under the License.
     seekOffsetInput,
     selectionDataStore,
     selectionSize,
+    bytesPerRow,
+    viewport,
   } from '../../../stores'
   import {
     EditByteModes,
@@ -33,7 +35,6 @@ limitations under the License.
   } from '../../../stores/configuration'
   import { UIThemeCSSClass } from '../../../utilities/colorScheme'
   import { createEventDispatcher } from 'svelte'
-  import { bytesPerRow } from '../CustomByteDisplay/BinaryData'
 
   type ViewportDivSpread = '24px' | '28px' | '68px'
 
@@ -60,8 +61,8 @@ limitations under the License.
 
   $: selectionOffsetText = setSelectionOffsetInfo(
     'Selection',
-    $selectionDataStore.startOffset,
-    $selectionDataStore.endOffset,
+    $viewport.fileOffset + $selectionDataStore.startOffset,
+    $viewport.fileOffset + $selectionDataStore.endOffset,
     $selectionSize,
     $addressRadix
   )
diff --git a/src/svelte/src/components/DataMetrics/ByteFrequencyGraph.svelte 
b/src/svelte/src/components/DataMetrics/ByteFrequencyGraph.svelte
index 2841ff4..cbbaa92 100644
--- a/src/svelte/src/components/DataMetrics/ByteFrequencyGraph.svelte
+++ b/src/svelte/src/components/DataMetrics/ByteFrequencyGraph.svelte
@@ -20,7 +20,7 @@ limitations under the License.
   import { MessageCommand } from '../../utilities/message'
   import { onMount } from 'svelte'
   import Input from '../Inputs/Input/Input.svelte'
-  import { offsetMax } from '../DataDisplays/CustomByteDisplay/BinaryData'
+  import { viewport } from '../../stores'
   import { DATA_PROFILE_MAX_LENGTH } from '../../stores/configuration'
   import { addressRadix } from '../../stores'
   import { radixToString, regexEditDataTest } from '../../utilities/display'
@@ -179,9 +179,9 @@ limitations under the License.
           } else if (endOffsetTemp <= startOffset) {
             setErrorMessage('End offset must be greater than start offset')
             return
-          } else if (endOffsetTemp > $offsetMax) {
+          } else if (endOffsetTemp > viewport.offsetMax) {
             setErrorMessage(
-              `End offset must be less than or equal to ${$offsetMax}`
+              `End offset must be less than or equal to ${viewport.offsetMax}`
             )
             return
           }
@@ -211,9 +211,11 @@ limitations under the License.
           } else if (lengthTemp <= 0) {
             setErrorMessage('Length must be greater than 0')
             return
-          } else if (lengthTemp > $offsetMax - startOffset) {
+          } else if (lengthTemp > viewport.offsetMax - startOffset) {
             setErrorMessage(
-              `Length must be less than or equal to ${$offsetMax - 
startOffset}`
+              `Length must be less than or equal to ${
+                viewport.offsetMax - startOffset
+              }`
             )
             return
           }
@@ -401,7 +403,7 @@ limitations under the License.
   <div class="stats">
     <label for="computed-size"
       >&nbsp;Max Offset: <span id="computed-size" class="nowrap"
-        >{$offsetMax}</span
+        >{viewport.offsetMax}</span
       ></label
     >
     <label for="min-frequency"
diff --git a/src/svelte/src/components/Header/Header.svelte 
b/src/svelte/src/components/Header/Header.svelte
index 0a926ae..e04cbfd 100644
--- a/src/svelte/src/components/Header/Header.svelte
+++ b/src/svelte/src/components/Header/Header.svelte
@@ -16,11 +16,12 @@ limitations under the License.
 -->
 <script lang="ts">
   import FileMetrics from './fieldsets/FileMetrics.svelte'
-  import { fileMetrics } from './fieldsets/FileMetrics'
   import SearchReplace from './fieldsets/SearchReplace.svelte'
   import Settings from './fieldsets/Settings.svelte'
   import FlexContainer from '../layouts/FlexContainer.svelte'
   import { UIThemeCSSClass } from '../../utilities/colorScheme'
+  import { fileMetrics } from '../../stores'
+
   let hideChildren = false
 </script>
 
diff --git a/src/svelte/src/components/Header/fieldsets/FileMetrics.svelte 
b/src/svelte/src/components/Header/fieldsets/FileMetrics.svelte
index 429478c..ca5a559 100644
--- a/src/svelte/src/components/Header/fieldsets/FileMetrics.svelte
+++ b/src/svelte/src/components/Header/fieldsets/FileMetrics.svelte
@@ -17,14 +17,13 @@ limitations under the License.
 <script lang="ts">
   import Button from '../../Inputs/Buttons/Button.svelte'
   import FlexContainer from '../../layouts/FlexContainer.svelte'
-  import { fileMetrics } from './FileMetrics'
   import { MessageCommand } from '../../../utilities/message'
   import { vscode } from '../../../utilities/vscode'
-  import { saveable } from '../../../stores'
+  import { saveable, fileMetrics } from '../../../stores'
   import { createEventDispatcher } from 'svelte'
   import SidePanel from '../../layouts/SidePanel.svelte'
   import ByteFrequencyGraph from '../../DataMetrics/ByteFrequencyGraph.svelte'
-  import { viewport } from '../../DataDisplays/CustomByteDisplay/BinaryData'
+  import { viewport } from '../../../stores'
   import { humanReadableByteLength } from '../../../utilities/display'
   import { DATA_PROFILE_MAX_LENGTH } from '../../../stores/configuration'
   import Tooltip from '../../layouts/Tooltip.svelte'
diff --git a/src/svelte/src/components/Header/fieldsets/FileMetrics.ts 
b/src/svelte/src/components/Header/fieldsets/FileMetrics.ts
index 45e64de..053f915 100644
--- a/src/svelte/src/components/Header/fieldsets/FileMetrics.ts
+++ b/src/svelte/src/components/Header/fieldsets/FileMetrics.ts
@@ -24,10 +24,8 @@ class FileMetricsData {
   undoCount: number = 0
 }
 
-class FileMetrics extends SimpleWritable<FileMetricsData> {
+export class FileMetrics extends SimpleWritable<FileMetricsData> {
   protected init(): FileMetricsData {
     return new FileMetricsData()
   }
 }
-
-export const fileMetrics = new FileMetrics()
diff --git a/src/svelte/src/components/Header/fieldsets/SearchReplace.svelte 
b/src/svelte/src/components/Header/fieldsets/SearchReplace.svelte
index 36251a7..7f32d7a 100644
--- a/src/svelte/src/components/Header/fieldsets/SearchReplace.svelte
+++ b/src/svelte/src/components/Header/fieldsets/SearchReplace.svelte
@@ -18,11 +18,10 @@ limitations under the License.
   import {
     addressRadix,
     allowCaseInsensitiveSearch,
+    editorActionsAllowed,
     editorEncoding,
     seekable,
     seekOffsetInput,
-  } from '../../../stores'
-  import {
     replaceable,
     replaceErr,
     replaceQuery,
@@ -30,7 +29,7 @@ limitations under the License.
     searchErr,
     searchQuery,
     seekErr,
-  } from './SearchReplace'
+  } from '../../../stores'
   import { vscode } from '../../../utilities/vscode'
   import { MessageCommand } from '../../../utilities/message'
 
@@ -38,18 +37,15 @@ limitations under the License.
   import Button from '../../Inputs/Buttons/Button.svelte'
   import Input from '../../Inputs/Input/Input.svelte'
   import FlexContainer from '../../layouts/FlexContainer.svelte'
-  import { createEventDispatcher, tick } from 'svelte'
+  import { createEventDispatcher } from 'svelte'
   import { UIThemeCSSClass } from '../../../utilities/colorScheme'
   import ToggleableButton from '../../Inputs/Buttons/ToggleableButton.svelte'
   import {
     clearSearchResultsHighlights,
     updateSearchResultsHighlights,
   } from '../../../utilities/highlights'
-  import { viewport } from '../../DataDisplays/CustomByteDisplay/BinaryData'
-  import {
-    EditActionRestrictions,
-    editorActionsAllowed,
-  } from '../../../stores/configuration'
+  import { viewport } from '../../../stores'
+  import { EditActionRestrictions } from '../../../stores/configuration'
 
   const eventDispatcher = createEventDispatcher()
 
diff --git a/src/svelte/src/components/Header/fieldsets/SearchReplace.ts 
b/src/svelte/src/components/Header/fieldsets/SearchReplace.ts
index 45bdd7f..089ec07 100644
--- a/src/svelte/src/components/Header/fieldsets/SearchReplace.ts
+++ b/src/svelte/src/components/Header/fieldsets/SearchReplace.ts
@@ -18,10 +18,6 @@
 import { SimpleWritable } from '../../../stores/localStore'
 import { addressRadix, seekOffsetInput } from '../../../stores'
 import { get } from 'svelte/store'
-import { validateEncodingStr } from '../../../utilities/display'
-import { ErrorStore, ErrorComponentType } from '../../Error/Error'
-import { editorEncoding, selectionDataStore } from '../../../stores'
-import { derived } from 'svelte/store'
 
 interface QueryableData {
   input: string
@@ -37,7 +33,7 @@ class SearchData implements QueryableData {
   overflow: boolean = false
   byteLength: number = 0
 }
-class SearchQuery extends SimpleWritable<SearchData> {
+export class SearchQuery extends SimpleWritable<SearchData> {
   protected init(): SearchData {
     return new SearchData()
   }
@@ -80,55 +76,3 @@ export class ReplaceQuery extends 
SimpleWritable<ReplaceData> {
     return new ReplaceData()
   }
 }
-
-export const searchQuery = new SearchQuery()
-export const replaceQuery = new ReplaceQuery()
-
-export const searchErr = new ErrorStore(ErrorComponentType.SYMBOL)
-export const replaceErr = new ErrorStore(ErrorComponentType.SYMBOL)
-export const seekErr = new ErrorStore(ErrorComponentType.SYMBOL)
-
-export const searchable = derived(
-  [searchQuery, editorEncoding],
-  ([$searchQuery, $editorEncoding]) => {
-    if ($searchQuery.input.length === 0 || $searchQuery.processing) {
-      searchErr.update(() => {
-        return ''
-      })
-      return false
-    }
-    const ret = validateEncodingStr($searchQuery.input, $editorEncoding, 
'full')
-    searchErr.update(() => {
-      return ret.errMsg
-    })
-    return ret.valid
-  }
-)
-
-export const replaceable = derived(
-  [replaceQuery, editorEncoding, searchable, selectionDataStore],
-  ([$replaceData, $editorEncoding, $searchable, $selectionData]) => {
-    if (
-      $replaceData.input.length < 0 ||
-      !$searchable ||
-      $replaceData.processing
-    ) {
-      replaceErr.update(() => {
-        return ''
-      })
-      return false
-    }
-    if ($selectionData.active) {
-      replaceErr.update(() => {
-        return 'Cannot replace while viewport data is selected'
-      })
-      return false
-    }
-
-    const ret = validateEncodingStr($replaceData.input, $editorEncoding)
-    replaceErr.update(() => {
-      return ret.errMsg
-    })
-    return ret.valid
-  }
-)
diff --git a/src/svelte/src/components/Header/fieldsets/Settings.svelte 
b/src/svelte/src/components/Header/fieldsets/Settings.svelte
index 298388e..2605a7e 100644
--- a/src/svelte/src/components/Header/fieldsets/Settings.svelte
+++ b/src/svelte/src/components/Header/fieldsets/Settings.svelte
@@ -19,9 +19,12 @@ limitations under the License.
     RADIX_OPTIONS,
     ENCODING_GROUPS,
     EDIT_ACTIONS,
-    editorActionsAllowed,
   } from '../../../stores/configuration'
-  import { displayRadix, editorEncoding } from '../../../stores'
+  import {
+    displayRadix,
+    editorEncoding,
+    editorActionsAllowed,
+  } from '../../../stores'
   import FlexContainer from '../../layouts/FlexContainer.svelte'
   import { UIThemeCSSClass } from '../../../utilities/colorScheme'
 </script>
diff --git a/src/svelte/src/components/Inputs/Buttons/Button.svelte 
b/src/svelte/src/components/Inputs/Buttons/Button.svelte
index acad004..1b624d6 100644
--- a/src/svelte/src/components/Inputs/Buttons/Button.svelte
+++ b/src/svelte/src/components/Inputs/Buttons/Button.svelte
@@ -15,14 +15,14 @@ See the License for the specific language governing 
permissions and
 limitations under the License.
 -->
 <script lang="ts">
+  import Tooltip from '../../layouts/Tooltip.svelte'
+  import FlexContainer from '../../layouts/FlexContainer.svelte'
   import { onMount } from 'svelte'
+  import { UIThemeCSSClass } from '../../../utilities/colorScheme'
+  import { tooltipsEnabled } from '../../../stores'
   export let fn: (event?: Event) => void
   export let disabledBy = false
   export let width = ''
-  import { UIThemeCSSClass } from '../../../utilities/colorScheme'
-  import FlexContainer from '../../layouts/FlexContainer.svelte'
-  import Tooltip from '../../layouts/Tooltip.svelte'
-  import { tooltipsEnabled } from '../../../utilities/display'
 
   onMount(() => {
     collapseContent = document.body.clientWidth <= 1600
diff --git a/src/svelte/src/components/Inputs/Buttons/ToggleableButton.svelte 
b/src/svelte/src/components/Inputs/Buttons/ToggleableButton.svelte
index dfd5079..388cccf 100644
--- a/src/svelte/src/components/Inputs/Buttons/ToggleableButton.svelte
+++ b/src/svelte/src/components/Inputs/Buttons/ToggleableButton.svelte
@@ -19,9 +19,9 @@ limitations under the License.
   export let disabledBy = false
   export let width = ''
   export let active = false
-  import { UIThemeCSSClass } from '../../../utilities/colorScheme'
-  import FlexContainer from '../../layouts/FlexContainer.svelte'
   import Tooltip from '../../layouts/Tooltip.svelte'
+  import FlexContainer from '../../layouts/FlexContainer.svelte'
+  import { UIThemeCSSClass } from '../../../utilities/colorScheme'
 
   export let description: string
 </script>
diff --git a/src/svelte/src/components/ServerMetrics/ServerMetrics.svelte 
b/src/svelte/src/components/ServerMetrics/ServerMetrics.svelte
index a8b98a4..e18bfc3 100644
--- a/src/svelte/src/components/ServerMetrics/ServerMetrics.svelte
+++ b/src/svelte/src/components/ServerMetrics/ServerMetrics.svelte
@@ -15,8 +15,8 @@ See the License for the specific language governing 
permissions and
 limitations under the License.
 -->
 <script lang="ts">
-  import { MessageCommand } from '../../utilities/message'
   import FlexContainer from '../layouts/FlexContainer.svelte'
+  import { MessageCommand } from '../../utilities/message'
 
   let heartbeat = {
     latency: 0,
@@ -28,7 +28,7 @@ limitations under the License.
     serverVersion: 'Unknown',
     sessionCount: 0,
   }
-  let timerId: number = 0
+  let timerId: NodeJS.Timeout
 
   function showHeartbeatInfo(show: boolean) {
     const element = document.getElementsByClassName(
diff --git a/src/svelte/src/components/dataEditor.svelte 
b/src/svelte/src/components/dataEditor.svelte
index 47c799c..4cb9c24 100644
--- a/src/svelte/src/components/dataEditor.svelte
+++ b/src/svelte/src/components/dataEditor.svelte
@@ -29,14 +29,13 @@ limitations under the License.
     requestable,
     selectionDataStore,
     selectionSize,
-    viewportCapacity,
-    viewportEndOffset,
-    viewportFollowingByteCount,
     viewportNumLinesDisplayed,
-    viewportStartOffset,
     dataFeedLineTop,
     SelectionData_t,
     dataFeedAwaitRefresh,
+    fileMetrics,
+    viewport,
+    searchQuery,
   } from '../stores'
   import {
     CSSThemeClass,
@@ -47,22 +46,18 @@ limitations under the License.
   import { vscode } from '../utilities/vscode'
   import Header from './Header/Header.svelte'
   import Main from './Main.svelte'
-  import { EditByteModes } from '../stores/configuration'
+  import { EditByteModes, NUM_LINES_DISPLAYED } from '../stores/configuration'
   import ServerMetrics from './ServerMetrics/ServerMetrics.svelte'
   import { enterKeypressEvents } from '../utilities/enterKeypressEvents'
-  import {
-    type EditEvent,
-    viewport,
+  import type {
+    EditEvent,
     ViewportData_t,
   } from './DataDisplays/CustomByteDisplay/BinaryData'
-  import { fileMetrics } from './Header/fieldsets/FileMetrics'
   import {
-    DISPLAYED_DATA_LINES,
     byte_count_divisible_offset,
     viewport_offset_to_line_num,
   } from '../utilities/display'
   import { clearSearchResultsHighlights } from '../utilities/highlights'
-  import { searchQuery } from './Header/fieldsets/SearchReplace'
 
   $: $UIThemeCSSClass = $darkUITheme ? CSSThemeClass.Dark : CSSThemeClass.Light
 
@@ -124,7 +119,7 @@ limitations under the License.
             viewportStartOffset,
             $bytesPerRow
           ) -
-          (DISPLAYED_DATA_LINES - 1)
+          (NUM_LINES_DISPLAYED - 1)
         : viewport_offset_to_line_num(offset, viewportStartOffset, 
$bytesPerRow)
       $dataFeedAwaitRefresh = true
 
@@ -144,47 +139,6 @@ limitations under the License.
     clearDataDisplays()
   }
 
-  function scrolledToEnd(_: Event) {
-    if ($viewportFollowingByteCount > 0) {
-      // top the display must be the last page of the current viewport, plus 
one line
-      const topOfLastPagePlusOneLine =
-        $viewportEndOffset +
-        $bytesPerRow -
-        $viewportNumLinesDisplayed * $bytesPerRow
-
-      vscode.postMessage({
-        command: MessageCommand.scrollViewport,
-        data: {
-          // scroll the viewport with the desired offset in the middle
-          scrollOffset: $viewportEndOffset - Math.floor($viewportCapacity / 2),
-          bytesPerRow: $bytesPerRow,
-          numLinesDisplayed: $viewportNumLinesDisplayed,
-        },
-      })
-      seek(topOfLastPagePlusOneLine)
-    }
-  }
-
-  function scrolledToTop(_: Event) {
-    if ($viewportStartOffset > 0) {
-      // offset to scroll to after the viewport is scrolled, which should be 
the previous line in the file
-      const topOfFirstPageMinusOneLine = $viewportStartOffset - $bytesPerRow
-      vscode.postMessage({
-        command: MessageCommand.scrollViewport,
-        data: {
-          // scroll the viewport with the desired offset in the middle
-          scrollOffset: Math.max(
-            topOfFirstPageMinusOneLine - Math.floor($viewportCapacity / 2),
-            0
-          ),
-          bytesPerRow: $bytesPerRow,
-          numLinesDisplayed: $viewportNumLinesDisplayed,
-        },
-      })
-      seek(topOfFirstPageMinusOneLine)
-    }
-  }
-
   function seekEventHandler(_: CustomEvent) {
     seek($seekOffset)
   }
@@ -278,6 +232,7 @@ limitations under the License.
     searchQuery.clear()
     clearSearchResultsHighlights()
   }
+
   function handleKeyBind(event: Event) {
     const kbdEvent = event as KeyboardEvent
     if (kbdEvent.key === 'Enter') {
@@ -325,15 +280,6 @@ limitations under the License.
         break
     }
   })
-
-  function scrollBoundaryEventHandler(e: CustomEvent) {
-    if (e.detail.scrolledTop) {
-      scrolledToTop(e)
-    }
-    if (e.detail.scrolledEnd) {
-      scrolledToEnd(e)
-    }
-  }
 </script>
 
 <svelte:window on:keydown|nonpassive={handleKeyBind} />
@@ -350,9 +296,6 @@ limitations under the License.
     on:clearDataDisplays={clearDataDisplays}
     on:applyChanges={custom_apply_changes}
     on:handleEditorEvent={handleEditorEvent}
-    on:scrolledToTop={scrolledToTop}
-    on:scrolledToEnd={scrolledToEnd}
-    on:scrollBoundary={scrollBoundaryEventHandler}
     on:traverse-file={traversalEventHandler}
     on:seek={seekEventHandler}
   />
diff --git a/src/svelte/src/components/layouts/Tooltip.svelte 
b/src/svelte/src/components/layouts/Tooltip.svelte
index c4220f0..dc54251 100644
--- a/src/svelte/src/components/layouts/Tooltip.svelte
+++ b/src/svelte/src/components/layouts/Tooltip.svelte
@@ -15,7 +15,7 @@ See the License for the specific language governing 
permissions and
 limitations under the License.
 -->
 <script lang="ts">
-  import { tooltipsEnabled } from '../../utilities/display'
+  import { tooltipsEnabled } from '../../stores'
 
   const NULL = () => {}
 
diff --git a/src/svelte/src/stores/configuration.ts 
b/src/svelte/src/stores/configuration.ts
index dc17d57..8b681a1 100644
--- a/src/svelte/src/stores/configuration.ts
+++ b/src/svelte/src/stores/configuration.ts
@@ -15,8 +15,6 @@
  * limitations under the License.
  */
 
-import { writable } from 'svelte/store'
-
 export type Radixes = 'Hexadecimal' | 'Decimal' | 'Octal' | 'Binary'
 
 export type RadixValues = 16 | 10 | 8 | 2
@@ -115,5 +113,3 @@ export const VIEWPORT_CAPACITY_MAX = 16 * 64 // 1024, Ωedit 
maximum viewport si
 export const NUM_LINES_DISPLAYED = 20
 
 export const DATA_PROFILE_MAX_LENGTH = 10_000_000
-
-export const editorActionsAllowed = writable(EditActionRestrictions.None)
diff --git a/src/svelte/src/stores/index.ts b/src/svelte/src/stores/index.ts
index f817c04..6723b89 100644
--- a/src/svelte/src/stores/index.ts
+++ b/src/svelte/src/stores/index.ts
@@ -16,28 +16,32 @@
  */
 
 import type { ValidationResponse } from '../utilities/display'
-import {
-  EditByteModes,
-  UNPRINTABLE_CHAR_STAND_IN,
-  type RadixValues,
-  type BytesPerRow,
-  EditActionRestrictions,
-  editorActionsAllowed,
-} from './configuration'
 import { ThemeType } from '../utilities/colorScheme'
-import { fileMetrics } from '../components/Header/fieldsets/FileMetrics'
+import { FileMetrics } from '../components/Header/fieldsets/FileMetrics'
+import { derived, writable } from 'svelte/store'
+import { SimpleWritable } from './localStore'
+import { ErrorComponentType, ErrorStore } from '../components/Error/Error'
 import {
   radixBytePad,
   regexEditDataTest,
   validateEncodingStr,
 } from '../utilities/display'
-import { derived, writable } from 'svelte/store'
-import { SimpleWritable } from './localStore'
 import {
   BYTE_ACTION_DIV_OFFSET,
-  selectedByte,
-  viewport,
+  ViewportDataStore_t,
+  type ByteValue,
 } from '../components/DataDisplays/CustomByteDisplay/BinaryData'
+import {
+  ReplaceQuery,
+  SearchQuery,
+} from '../components/Header/fieldsets/SearchReplace'
+import {
+  EditByteModes,
+  UNPRINTABLE_CHAR_STAND_IN,
+  type RadixValues,
+  type BytesPerRow,
+  EditActionRestrictions,
+} from './configuration'
 
 export class SelectionData_t {
   startOffset = -1
@@ -107,22 +111,80 @@ export const searchCaseInsensitive = writable(false)
 export const dataFeedLineTop = writable(0)
 export const dataFeedAwaitRefresh = writable(false)
 export const rerenderActionElements = writable(false)
-// data in the viewport
-// export const viewportData = writable(new Uint8Array(0))
 
 // Viewport properties
-export const viewportStartOffset = writable(0)
-export const viewportLength = writable(0)
-export const viewportFollowingByteCount = writable(0)
-export const viewportScrollTop = writable(0)
-export const viewportScrollHeight = writable(0)
-export const viewportClientHeight = writable(0)
-export const viewportCapacity = writable(0)
-export const viewportLineHeight = writable(0)
+export const viewport = new ViewportDataStore_t()
+export const viewportNumLinesDisplayed = writable(20)
+
+export const bytesPerRow = writable(16 as BytesPerRow)
+export const editingByte = writable(false)
+export const selectedByte = writable({
+  text: '',
+  offset: -1,
+  value: -1,
+} as ByteValue)
+
+export const fileMetrics = new FileMetrics()
+
+export const searchQuery = new SearchQuery()
+export const replaceQuery = new ReplaceQuery()
+
+export const searchErr = new ErrorStore(ErrorComponentType.SYMBOL)
+export const replaceErr = new ErrorStore(ErrorComponentType.SYMBOL)
+export const seekErr = new ErrorStore(ErrorComponentType.SYMBOL)
+
+export const editorActionsAllowed = writable(EditActionRestrictions.None)
+export const tooltipsEnabled = writable(false)
+export const sizeHumanReadable = writable(false)
 
 // tracks the start and end offsets of the current selection
 export const selectionDataStore = new SelectionData()
 
+export const searchable = derived(
+  [searchQuery, editorEncoding],
+  ([$searchQuery, $editorEncoding]) => {
+    if ($searchQuery.input.length === 0 || $searchQuery.processing) {
+      searchErr.update(() => {
+        return ''
+      })
+      return false
+    }
+    const ret = validateEncodingStr($searchQuery.input, $editorEncoding, 
'full')
+    searchErr.update(() => {
+      return ret.errMsg
+    })
+    return ret.valid
+  }
+)
+
+export const replaceable = derived(
+  [replaceQuery, editorEncoding, searchable, selectionDataStore],
+  ([$replaceData, $editorEncoding, $searchable, $selectionData]) => {
+    if (
+      $replaceData.input.length < 0 ||
+      !$searchable ||
+      $replaceData.processing
+    ) {
+      replaceErr.update(() => {
+        return ''
+      })
+      return false
+    }
+    if ($selectionData.active) {
+      replaceErr.update(() => {
+        return 'Cannot replace while viewport data is selected'
+      })
+      return false
+    }
+
+    const ret = validateEncodingStr($replaceData.input, $editorEncoding)
+    replaceErr.update(() => {
+      return ret.errMsg
+    })
+    return ret.valid
+  }
+)
+
 // derived readable enumeration that indicates the edit mode (single byte or 
multiple bytes)
 export const editMode = derived(
   selectionDataStore,
@@ -134,41 +196,6 @@ export const editMode = derived(
   EditByteModes.Single
 )
 
-// derived readable number whose value is the number of lines displayed in the 
viewport
-export const viewportNumLinesDisplayed = derived(
-  [viewportClientHeight, viewportLineHeight],
-  ([$viewportClientHeight, $viewportLineHeight]) => {
-    return Math.floor($viewportClientHeight / $viewportLineHeight) + 1
-  }
-)
-
-// derived readable number whose value is the end offset of the current 
viewport
-export const viewportEndOffset = derived(
-  [viewportStartOffset, viewportLength],
-  ([$viewportStartOffset, $viewportLength]) => {
-    return $viewportStartOffset + $viewportLength
-  }
-)
-
-// derived readable boolean that indicates if the viewport is scrolled to the 
top
-export const viewportScrolledToTop = derived(
-  [viewportScrollTop],
-  ([$viewportScrollTop]) => {
-    return $viewportScrollTop === 0
-  }
-)
-
-// derived readable boolean that indicates if the viewport is scrolled to the 
end
-export const viewportScrolledToEnd = derived(
-  [viewportScrollTop, viewportScrollHeight, viewportClientHeight],
-  ([$viewportScrollTop, $viewportScrollHeight, $viewportClientHeight]) => {
-    return (
-      Math.ceil($viewportScrollTop) + $viewportClientHeight >=
-      $viewportScrollHeight
-    )
-  }
-)
-
 // derived readable number whose value is the size of the current data 
selection
 export const selectionSize = derived(
   [selectionDataStore, editorSelection],
@@ -216,11 +243,6 @@ export const editedByteIsOriginalByte = derived(
   }
 )
 
-// derived readable number that indicates the number of encoded bytes per row 
in each viewport
-export const bytesPerRow = derived(displayRadix, ($displayRadix) => {
-  return $displayRadix === 2 ? 8 : (16 as BytesPerRow)
-})
-
 export const viewportColumnWidth = derived(bytesPerRow, (bytesPerRow) => {
   return bytesPerRow * BYTE_ACTION_DIV_OFFSET
 })
@@ -376,10 +398,12 @@ function validRequestableData(
 }
 
 export const dvOffset = derived(
-  [selectionDataStore, addressRadix],
-  ([$selectionData, $addressRadix]) => {
+  [selectionDataStore, addressRadix, viewport],
+  ([$selectionData, $addressRadix, $viewport]) => {
     return $selectionData.active
-      ? $selectionData.startOffset.toString($addressRadix).toUpperCase()
+      ? ($viewport.fileOffset + $selectionData.startOffset)
+          .toString($addressRadix)
+          .toUpperCase()
       : ''
   }
 )
diff --git a/src/svelte/src/utilities/display.ts 
b/src/svelte/src/utilities/display.ts
index 4a9617e..0e2c14f 100644
--- a/src/svelte/src/utilities/display.ts
+++ b/src/svelte/src/utilities/display.ts
@@ -13,19 +13,12 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-import { writable } from 'svelte/store'
 import {
   EditByteModes,
   type BytesPerRow,
   type RadixValues,
 } from '../stores/configuration'
 
-export type ViewportReferences = {
-  physical: HTMLTextAreaElement
-  address: HTMLTextAreaElement
-  logical: HTMLTextAreaElement
-}
-
 export type Viewport = 'physical' | 'address' | 'logical'
 
 export type ValidationResponse = {
@@ -45,29 +38,8 @@ const ByteDivWidths = {
 }
 
 export type BinaryBytePrefix = 'B' | 'KB' | 'MB' | 'GB' | 'TB' | 'PB'
-export type BinaryBitPrefix = 'b' | 'Kb' | 'Mb' | 'Gb' | 'Tb' | 'Pb'
-type ValidByteOctetCount = 1 | 2 | 3 | 4
-
-export const DISPLAYED_DATA_LINES = 20
-
-export const tooltipsEnabled = writable(false)
-export const sizeHumanReadable = writable(false)
-
-export function viewport_references(
-  viewport?: Viewport
-): ViewportReferences | HTMLTextAreaElement {
-  return viewport
-    ? (document.getElementById(viewport) as HTMLTextAreaElement)
-    : {
-        physical: document.getElementById('physical') as HTMLTextAreaElement,
-        address: document.getElementById('address') as HTMLTextAreaElement,
-        logical: document.getElementById('logical') as HTMLTextAreaElement,
-      }
-}
 
-export function edit_byte_window_ref(): HTMLDivElement {
-  return document.getElementById('editByteWindow') as HTMLDivElement
-}
+export type BinaryBitPrefix = 'b' | 'Kb' | 'Mb' | 'Gb' | 'Tb' | 'Pb'
 
 export function radixBytePad(radix: RadixValues): number {
   switch (radix) {
diff --git a/src/svelte/src/utilities/highlights.ts 
b/src/svelte/src/utilities/highlights.ts
index 51966b0..1ceeb44 100644
--- a/src/svelte/src/utilities/highlights.ts
+++ b/src/svelte/src/utilities/highlights.ts
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-import { derived, get, readable, writable } from 'svelte/store'
+import { derived, readable, writable } from 'svelte/store'
 import { selectionDataStore } from '../stores'
 
 let selectionHighlightLUT = new Uint8Array(1024)
diff --git a/yarn.lock b/yarn.lock
index c35256a..ab0a7b2 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -3,11 +3,11 @@
 
 
 "@babel/runtime@^7.21.0":
-  version "7.22.6"
-  resolved 
"https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.22.6.tgz#57d64b9ae3cff1d67eb067ae117dac087f5bd438";
-  integrity 
sha512-wDb5pWm4WDdF6LFUde3Jl8WzPA+3ZbxYqkC6xAXuD3irdEHN1k0NfTRrJD8ZD378SJ61miMLCqIOXYhd8x+AJQ==
+  version "7.22.10"
+  resolved 
"https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.22.10.tgz#ae3e9631fd947cb7e3610d3e9d8fef5f76696682";
+  integrity 
sha512-21t/fkKLMZI4pqP2wlmsQAWnYW1PDyKyyUV4vCi+B25ydmdaYTKXPwCj0BzSUnZf4seIiYvSA3jcZ3gdsMFkLQ==
   dependencies:
-    regenerator-runtime "^0.13.11"
+    regenerator-runtime "^0.14.0"
 
 "@cspotcode/source-map-support@^0.8.0":
   version "0.8.1"
@@ -68,12 +68,7 @@
     "@jridgewell/sourcemap-codec" "^1.4.10"
     "@jridgewell/trace-mapping" "^0.3.9"
 
-"@jridgewell/[email protected]":
-  version "3.1.0"
-  resolved 
"https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78";
-  integrity 
sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==
-
-"@jridgewell/resolve-uri@^3.0.3":
+"@jridgewell/resolve-uri@^3.0.3", "@jridgewell/resolve-uri@^3.1.0":
   version "3.1.1"
   resolved 
"https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz#c08679063f279615a3326583ba3a90d1d82cc721";
   integrity 
sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==
@@ -91,11 +86,6 @@
     "@jridgewell/gen-mapping" "^0.3.0"
     "@jridgewell/trace-mapping" "^0.3.9"
 
-"@jridgewell/[email protected]":
-  version "1.4.14"
-  resolved 
"https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24";
-  integrity 
sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==
-
 "@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.13", 
"@jridgewell/sourcemap-codec@^1.4.14":
   version "1.4.15"
   resolved 
"https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32";
@@ -110,12 +100,12 @@
     "@jridgewell/sourcemap-codec" "^1.4.10"
 
 "@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.18", 
"@jridgewell/trace-mapping@^0.3.9":
-  version "0.3.18"
-  resolved 
"https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz#25783b2086daf6ff1dcb53c9249ae480e4dd4cd6";
-  integrity 
sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==
+  version "0.3.19"
+  resolved 
"https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz#f8a3249862f91be48d3127c3cfe992f79b4b8811";
+  integrity 
sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==
   dependencies:
-    "@jridgewell/resolve-uri" "3.1.0"
-    "@jridgewell/sourcemap-codec" "1.4.14"
+    "@jridgewell/resolve-uri" "^3.1.0"
+    "@jridgewell/sourcemap-codec" "^1.4.14"
 
 "@nodelib/[email protected]":
   version "2.1.5"
@@ -279,9 +269,9 @@
     "@types/estree" "*"
 
 "@types/eslint@*":
-  version "8.44.1"
-  resolved 
"https://registry.yarnpkg.com/@types/eslint/-/eslint-8.44.1.tgz#d1811559bb6bcd1a76009e3f7883034b78a0415e";
-  integrity 
sha512-XpNDc4Z5Tb4x+SW1MriMVeIsMoONHCkWFMkR/aPJbzEsxqHy+4Glu/BqTdPrApfDeMaXbtNh6bseNgl5KaWrSg==
+  version "8.44.2"
+  resolved 
"https://registry.yarnpkg.com/@types/eslint/-/eslint-8.44.2.tgz#0d21c505f98a89b8dd4d37fa162b09da6089199a";
+  integrity 
sha512-sdPRb9K6iL5XZOmBubg8yiFp5yS/JdUDQsq5e6h95km91MCYMuvp7mh1fjPEYUhvHepKpZOjnEaMBR4PxjWDzg==
   dependencies:
     "@types/estree" "*"
     "@types/json-schema" "*"
@@ -356,9 +346,9 @@
   integrity 
sha512-/fvYntiO1GeICvqbQ3doGDIP97vWmvFt83GKguJ6prmQM2iXZfFcq6YE8KteFyRtX2/h5Hf91BYvPodJKFYv5Q==
 
 "@types/node@*", "@types/node@>=12.12.47", "@types/node@>=13.7.0", 
"@types/node@^20.4.1":
-  version "20.4.5"
-  resolved 
"https://registry.yarnpkg.com/@types/node/-/node-20.4.5.tgz#9dc0a5cb1ccce4f7a731660935ab70b9c00a5d69";
-  integrity 
sha512-rt40Nk13II9JwQBdeYqmbn2Q6IVTA5uPhvSO+JVqdXw/6/4glI6oR9ezty/A9Hg5u7JH4OmYmuQ+XvjKm0Datg==
+  version "20.5.0"
+  resolved 
"https://registry.yarnpkg.com/@types/node/-/node-20.5.0.tgz#7fc8636d5f1aaa3b21e6245e97d56b7f56702313";
+  integrity 
sha512-Mgq7eCtoTjT89FqNoTzzXg2XvCi5VMhRV6+I2aYanc6kQCBImeNaAYRs/DyoVqk1YEUJK5gN9VO7HRIdz4Wo3Q==
 
 "@types/pug@^2.0.6":
   version "2.0.6"
@@ -385,9 +375,9 @@
   integrity 
sha512-ghW5SfuDmsGDS2A4xkvGsLwDRNc3Vj5rS6rPOyPm/IryZuf3wceZKxgYaUoW+k9f0f/CB7y2c1rRsdOWZWn0PQ==
 
 "@types/vscode@^1.60.2":
-  version "1.80.0"
-  resolved 
"https://registry.yarnpkg.com/@types/vscode/-/vscode-1.80.0.tgz#e004dd6cde74dafdb7fab64a6e1754bf8165b981";
-  integrity 
sha512-qK/CmOdS2o7ry3k6YqU4zD3R2AYlJfbwBoSbKpBoP+GpXNE+0NEgJOli4n0bm0diK5kfBnchgCEj4igQz/44Hg==
+  version "1.81.0"
+  resolved 
"https://registry.yarnpkg.com/@types/vscode/-/vscode-1.81.0.tgz#c27228dd063002e0e00611be70b0497beaa24d39";
+  integrity 
sha512-YIaCwpT+O2E7WOMq0eCgBEABE++SX3Yl/O02GoMIF2DO3qAtvw7m6BXFYsxnc6XyzwZgh6/s/UG78LSSombl2w==
 
 "@types/ws@*":
   version "8.5.5"
@@ -466,9 +456,9 @@
     keytar "^7.7.0"
 
 "@vscode/vsce@^2.18.0":
-  version "2.20.0"
-  resolved 
"https://registry.yarnpkg.com/@vscode/vsce/-/vsce-2.20.0.tgz#0e81dd9fcbd7ef35bb6aabb4b64aedfac58d9bf4";
-  integrity 
sha512-FR8Tq2WgGRi/Py5/9WUFG2DCxdqaHXyuhHXSP8hsNc1FsxNzAkqKqfvOUUGxA7gOytmc9s/000QA7wKVukMDbQ==
+  version "2.20.1"
+  resolved 
"https://registry.yarnpkg.com/@vscode/vsce/-/vsce-2.20.1.tgz#c37c5867d23667ea3a468d3ec0309c40ae434937";
+  integrity 
sha512-ilbvoqvR/1/zseRPBAzYR6aKqSJ+jvda4/BqIwOqTxajpvLtEpK3kMLs77+dJdrlygS+VrP7Yhad8j0ukyD96g==
   dependencies:
     azure-devops-node-api "^11.0.1"
     chalk "^2.4.2"
@@ -980,9 +970,9 @@ caniuse-api@^3.0.0:
     lodash.uniq "^4.5.0"
 
 caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001517:
-  version "1.0.30001518"
-  resolved 
"https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001518.tgz#b3ca93904cb4699c01218246c4d77a71dbe97150";
-  integrity 
sha512-rup09/e3I0BKjncL+FesTayKtPrdwKhUufQFd3riFw1hHg8JmIFoInYfB102cFcY/pPgGmdyl/iy+jgiDi2vdA==
+  version "1.0.30001520"
+  resolved 
"https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001520.tgz#62e2b7a1c7b35269594cf296a80bdf8cb9565006";
+  integrity 
sha512-tahF5O9EiiTzwTUqAeFjIZbn4Dnqxzz7ktrgGlMYNLH43Ul26IgTMH/zvL3DG0lZxBYnlT04axvInszUsZULdA==
 
 chai@^4.3.7:
   version "4.3.7"
@@ -1183,11 +1173,16 @@ commander@^9.3.0:
   resolved 
"https://registry.yarnpkg.com/commander/-/commander-9.5.0.tgz#bc08d1eb5cedf7ccb797a96199d41c7bc3e60d30";
   integrity 
sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==
 
-compare-versions@^5.0.1, compare-versions@^5.0.3:
+compare-versions@^5.0.1:
   version "5.0.3"
   resolved 
"https://registry.yarnpkg.com/compare-versions/-/compare-versions-5.0.3.tgz#a9b34fea217472650ef4a2651d905f42c28ebfd7";
   integrity 
sha512-4UZlZP8Z99MGEY+Ovg/uJxJuvoXuN4M6B3hKaiackiHrgzQFEe3diJi1mf1PNHbFujM7FvLrK2bpgIaImbtZ1A==
 
+compare-versions@^6.0.0:
+  version "6.1.0"
+  resolved 
"https://registry.yarnpkg.com/compare-versions/-/compare-versions-6.1.0.tgz#3f2131e3ae93577df111dba133e6db876ffe127a";
+  integrity 
sha512-LNZQXhqUvqUTotpZ00qLSaify3b4VFD588aRr8MKFw4CMUr98ytzCW5wDH5qx/DEY5kCDXcbcRuCqL0szEf2tg==
+
 [email protected]:
   version "0.0.1"
   resolved 
"https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b";
@@ -1477,9 +1472,9 @@ duplexer2@~0.1.4:
     readable-stream "^2.0.2"
 
 electron-to-chromium@^1.4.477:
-  version "1.4.477"
-  resolved 
"https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.477.tgz#05669aa6f161ee9076a6805457e9bd9fe6d0dfd1";
-  integrity 
sha512-shUVy6Eawp33dFBFIoYbIwLHrX0IZ857AlH9ug2o4rvbWmpaCUdBpQ5Zw39HRrfzAFm4APJE9V+E2A/WB0YqJw==
+  version "1.4.490"
+  resolved 
"https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.490.tgz#d99286f6e915667fa18ea4554def1aa60eb4d5f1";
+  integrity 
sha512-6s7NVJz+sATdYnIwhdshx/N/9O6rvMxmhVoDSDFdj6iA45gHR8EQje70+RYsF4GeB+k0IeNSBnP7yG9ZXJFr7A==
 
 emoji-regex@^8.0.0:
   version "8.0.0"
@@ -1973,9 +1968,9 @@ immediate@~3.0.5:
   integrity 
sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==
 
 immutable@^4.0.0:
-  version "4.3.1"
-  resolved 
"https://registry.yarnpkg.com/immutable/-/immutable-4.3.1.tgz#17988b356097ab0719e2f741d56f3ec6c317f9dc";
-  integrity 
sha512-lj9cnmB/kVS0QHsJnYKD1uo3o39nrbKxszjnqS9Fr6NB7bZzW45U6WSGBPKXDL/CvDKqDNPA4r3DoDQ8GTxo2A==
+  version "4.3.2"
+  resolved 
"https://registry.yarnpkg.com/immutable/-/immutable-4.3.2.tgz#f89d910f8dfb6e15c03b2cae2faaf8c1f66455fe";
+  integrity 
sha512-oGXzbEDem9OOpDWZu88jGiYCvIsLHMvGw+8OXlpsvTFvIQplQbjg1B1cvKg8f7Hoch6+NGjpPsH1Fr+Mc2D1aA==
 
 import-fresh@^3.2.1:
   version "3.3.0"
@@ -2023,10 +2018,10 @@ is-binary-path@~2.1.0:
   dependencies:
     binary-extensions "^2.0.0"
 
-is-core-module@^2.11.0:
-  version "2.12.1"
-  resolved 
"https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.12.1.tgz#0c0b6885b6f80011c71541ce15c8d66cf5a4f9fd";
-  integrity 
sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==
+is-core-module@^2.13.0:
+  version "2.13.0"
+  resolved 
"https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.0.tgz#bb52aa6e2cbd49a30c2ba68c42bf3435ba6072db";
+  integrity 
sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==
   dependencies:
     has "^1.0.3"
 
@@ -2488,13 +2483,13 @@ [email protected]:
     yargs-unparser "2.0.0"
 
 monaco-page-objects@^3.5.1:
-  version "3.8.0"
-  resolved 
"https://registry.yarnpkg.com/monaco-page-objects/-/monaco-page-objects-3.8.0.tgz#2fac19b213e3adb59fdfe3eb3c38485d306dc68a";
-  integrity 
sha512-/bsrTHul7KsZ1SmdQFHIdVZTU2Nr+odGpxZAJddWxanX1uEAreqE4H758wI9Ie3mZLFO798lPjv2zaUAi+kDFw==
+  version "3.9.0"
+  resolved 
"https://registry.yarnpkg.com/monaco-page-objects/-/monaco-page-objects-3.9.0.tgz#a01c5b6b52715d4b12eb8a7e111cbbc8705401ce";
+  integrity 
sha512-Hw5eJqYAhe/a83xziiIU113RVZ7vUOdyNCPxgjVN+JcKjuLzqgQcSRY0NRnQzfMmckpNUpNfcx6o1nKkiPZv4g==
   dependencies:
     clipboardy "^3.0.0"
     clone-deep "^4.0.1"
-    compare-versions "^5.0.3"
+    compare-versions "^6.0.0"
     fs-extra "^11.1.1"
     ts-essentials "^9.3.2"
 
@@ -3218,10 +3213,10 @@ rechoir@^0.8.0:
   dependencies:
     resolve "^1.20.0"
 
-regenerator-runtime@^0.13.11:
-  version "0.13.11"
-  resolved 
"https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz#f6dca3e7ceec20590d07ada785636a90cdca17f9";
-  integrity 
sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==
+regenerator-runtime@^0.14.0:
+  version "0.14.0"
+  resolved 
"https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz#5e19d68eb12d486f797e15a3c6a918f7cec5eb45";
+  integrity 
sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==
 
 require-directory@^2.1.1:
   version "2.1.1"
@@ -3256,11 +3251,11 @@ resolve-from@^5.0.0:
   integrity 
sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==
 
 resolve@^1.20.0:
-  version "1.22.2"
-  resolved 
"https://registry.yarnpkg.com/resolve/-/resolve-1.22.2.tgz#0ed0943d4e301867955766c9f3e1ae6d01c6845f";
-  integrity 
sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==
+  version "1.22.4"
+  resolved 
"https://registry.yarnpkg.com/resolve/-/resolve-1.22.4.tgz#1dc40df46554cdaf8948a486a10f6ba1e2026c34";
+  integrity 
sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==
   dependencies:
-    is-core-module "^2.11.0"
+    is-core-module "^2.13.0"
     path-parse "^1.0.7"
     supports-preserve-symlinks-flag "^1.0.0"
 
@@ -3349,9 +3344,9 @@ sanitize-filename@^1.6.3:
     truncate-utf8-bytes "^1.0.0"
 
 sass@^1.57.1:
-  version "1.64.1"
-  resolved 
"https://registry.yarnpkg.com/sass/-/sass-1.64.1.tgz#6a46f6d68e0fa5ad90aa59ce025673ddaa8441cf";
-  integrity 
sha512-16rRACSOFEE8VN7SCgBu1MpYCyN7urj9At898tyzdXFhC+a+yOX5dXwAR7L8/IdPJ1NB8OYoXmD55DM30B2kEQ==
+  version "1.65.1"
+  resolved 
"https://registry.yarnpkg.com/sass/-/sass-1.65.1.tgz#8f283b0c26335a88246a448d22e1342ba2ea1432";
+  integrity 
sha512-9DINwtHmA41SEd36eVPQ9BJKpn7eKDQmUHmpI0y5Zv2Rcorrh0zS+cFrt050hdNbmmCNKTW3hV5mWfuegNRsEA==
   dependencies:
     chokidar ">=3.0.0 <4.0.0"
     immutable "^4.0.0"
@@ -3382,9 +3377,9 @@ schema-utils@^4.0.0, schema-utils@^4.0.1:
     ajv-keywords "^5.1.0"
 
 selenium-webdriver@^4.8.1:
-  version "4.10.0"
-  resolved 
"https://registry.yarnpkg.com/selenium-webdriver/-/selenium-webdriver-4.10.0.tgz#0508cdfbb5ad8470d8fd19db1a69d3e87f474b79";
-  integrity 
sha512-hSQPw6jgc+ej/UEcdQPG/iBwwMeCEgZr9HByY/J8ToyXztEqXzU9aLsIyrlj1BywBcStO4JQK/zMUWWrV8+riA==
+  version "4.11.1"
+  resolved 
"https://registry.yarnpkg.com/selenium-webdriver/-/selenium-webdriver-4.11.1.tgz#6a84f68d06199d075e6c2a5448bf08f4249b98c8";
+  integrity 
sha512-bvrnr3UZlLScErOmn8gV6cqc+1PYDHn0575CxUR2U14fMWt7OKxSy0lAThhZq4sq4d1HqP8ebz11oiHSlAQ2WA==
   dependencies:
     jszip "^3.10.1"
     tmp "^0.2.1"
@@ -3617,9 +3612,9 @@ supports-preserve-symlinks-flag@^1.0.0:
   integrity 
sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==
 
 svelte-check@^3.0.2:
-  version "3.4.6"
-  resolved 
"https://registry.yarnpkg.com/svelte-check/-/svelte-check-3.4.6.tgz#d43de724ad89d1198c96770e9d23965d3379ad44";
-  integrity 
sha512-OBlY8866Zh1zHQTkBMPS6psPi7o2umTUyj6JWm4SacnIHXpWFm658pG32m3dKvKFL49V4ntAkfFHKo4ztH07og==
+  version "3.5.0"
+  resolved 
"https://registry.yarnpkg.com/svelte-check/-/svelte-check-3.5.0.tgz#ebf2d29799bdd35d35d7c6298115726708e7e6e3";
+  integrity 
sha512-KHujbn4k17xKYLmtCwv0sKKM7uiHTYcQvXnvrCcNU6a7hcszh99zFTIoiu/Sp/ewAw5aJmillJ1Cs8gKLmcX4A==
   dependencies:
     "@jridgewell/trace-mapping" "^0.3.17"
     chokidar "^3.4.1"
@@ -3755,9 +3750,9 @@ terser@^5.16.8:
     source-map-support "~0.5.20"
 
 thread-stream@^2.0.0:
-  version "2.3.0"
-  resolved 
"https://registry.yarnpkg.com/thread-stream/-/thread-stream-2.3.0.tgz#4fc07fb39eff32ae7bad803cb7dd9598349fed33";
-  integrity 
sha512-kaDqm1DET9pp3NXwR8382WHbnpXnRkN9xGN9dQt3B2+dmXiW8X1SOwmFOxAErEQ47ObhZ96J6yhZNXuyCOL7KA==
+  version "2.4.0"
+  resolved 
"https://registry.yarnpkg.com/thread-stream/-/thread-stream-2.4.0.tgz#5def29598d1d4171ba3bace7e023a71d87d99c07";
+  integrity 
sha512-xZYtOtmnA63zj04Q+F9bdEay5r47bvpo1CaNqsKi7TpoJHcotUez8Fkfo2RJWpW91lnnaApdpRbVwCWsy+ifcw==
   dependencies:
     real-require "^0.2.0"
 
@@ -3959,9 +3954,9 @@ v8-compile-cache-lib@^3.0.1:
   integrity 
sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==
 
 vscode-extension-tester-locators@^3.4.1:
-  version "3.6.0"
-  resolved 
"https://registry.yarnpkg.com/vscode-extension-tester-locators/-/vscode-extension-tester-locators-3.6.0.tgz#112f8173fd5d86c9e312a6eae16820ce9525608a";
-  integrity 
sha512-RjQf5XL33dJORl9ck5X0vhAHf93TOONPE4nb9nai/pDM15nYcD1TqMyzRGl/XxHpvBu/bP8MV/bHfCT6b8w2cQ==
+  version "3.7.0"
+  resolved 
"https://registry.yarnpkg.com/vscode-extension-tester-locators/-/vscode-extension-tester-locators-3.7.0.tgz#c48454b00a9db1a0c2aebb48f52e162fcb57707a";
+  integrity 
sha512-ML9RFOum8GoE4xggYNzUIanFOT4CWUDCK5LFraLEoJ+9rptA5PSLGC+uSPYVKNNU2pG946SPEC3ZJDetc/IeqA==
 
 [email protected]:
   version "5.5.3"

Reply via email to