Repository: OpenRefine/OpenRefine (java)

Issue:
UI edits to schema selection and edits saving in Wikibase extension
This has been mentioned in previous PRs and issues, but starting a new issue to track all the final adjustments needed in more detail. This is a request to improve the following UI features:
<img width="1025" alt="Screenshot 2022-10-16 at 21 45 24" src="https://user-images.githubusercontent.com/25489750/196059745-f935c4d5-a547-4af1-b946-8851c431fa8e.png">

1. I think this text is not needed - it's too clunky in the layout; it's information experienced users know and don't need to see at all times; it's also something new users should learn from tutorials / documentation; new users (as shown during user testing) tend not to read small text anyway, and just click around until they find the solution to go forth, or just go and watch a tutorial;
2. Save schema should be called "Save schema progress".
3. Save schema progress / Discard changes should move below the main schema editing area (see wireframes).
4. This should probably just say "Select..."
5. "Save new" is potentially confusing if users just want to save and override an existing schema. Another idea was to keep the button to say only "Save", but I think this will make it potentially confusing next to the dropdown in case users decide they are just saving their selection choice. I propose we call this button "Save schema edits" and we move it to the right of the screen (see wireframes). 

### Proposed solution
Proposed redesign:
<img width="1064" alt="Screenshot 2022-10-16 at 23 59 48" src="https://user-images.githubusercontent.com/25489750/196060312-3ab0d35c-76dc-44ac-aca2-a05112b969e7.png">

For more context see complete design wireframes accessible via this link: https://docs.google.com/document/d/1uWkrid1UJwM3FCak_fI4VUY2EUabVUUFk9z6OeWtzKs/edit?usp=sharing

### Alternatives considered
Several previous iterations can be seen in the wireframe versions in the link above. The naming of the "Save" button and the schema vs schema template was discussed in more detail in previous PRs, e.g. https://github.com/OpenRefine/OpenRefine/pull/5303

### Additional context
The need to adjust this was discussed during the final round of user testing for the Commons extension project carried out Sept / Oct 2022.

Pull request description:
Wikibase: Layout and label changes to schema alignment tab
Fixes #5346

Patch:
diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml
deleted file mode 100644
index 9780ee044..000000000
--- a/.github/workflows/codeql.yml
+++ /dev/null
@@ -1,66 +0,0 @@
-# For most projects, this workflow file will not need changing; you simply need
-# to commit it to your repository.
-#
-# You may wish to alter this file to override the set of languages analyzed,
-# or to provide custom queries or build logic.
-#
-# ******** NOTE ********
-# We have attempted to detect the languages in your repository. Please check
-# the `language` matrix defined below to confirm you have the correct set of
-# supported CodeQL languages.
-#
-name: "CodeQL"
-
-on:
-  push:
-    branches: [ "master" ]
-  pull_request:
-    # The branches below must be a subset of the branches above
-    branches: [ "master" ]
-  schedule:
-    - cron: '27 23 * * 6'
-
-jobs:
-  analyze:
-    name: Analyze
-    runs-on: ubuntu-latest
-    permissions:
-      actions: read
-      contents: read
-      security-events: write
-
-    strategy:
-      fail-fast: false
-      matrix:
-        language: [ 'java', 'javascript' ]
-        # CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python', 'ruby' ]
-        # Learn more about CodeQL language support at https://aka.ms/codeql-docs/language-support
-
-    steps:
-    - name: Checkout repository
-      uses: actions/checkout@v3
-
-    # Initializes the CodeQL tools for scanning.
-    - name: Initialize CodeQL
-      uses: github/codeql-action/init@v2
-      with:
-        languages: ${{ matrix.language }}
-        # If you wish to specify custom queries, you can do so here or in a config file.
-        # By default, queries listed here will override any specified in a config file.
-        # Prefix the list here with "+" to use these queries and those in the config file.
-
-        # Details on CodeQL's query packs refer to : https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-code-scanning#using-queries-in-ql-packs
-        # queries: security-extended,security-and-quality
-
-    # ℹ️ Command-line programs to run using the OS shell.
-    # 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun
-
-    - name: Build
-      run: |
-        echo "Run, Build Application using script"
-        ./refine build
-
-    - name: Perform CodeQL Analysis
-      uses: github/codeql-action/analyze@v2
-      with:
-        category: "/language:${{matrix.language}}"
diff --git a/.github/workflows/codeql_java.yml b/.github/workflows/codeql_java.yml
new file mode 100644
index 000000000..752453665
--- /dev/null
+++ b/.github/workflows/codeql_java.yml
@@ -0,0 +1,38 @@
+name: "CodeQL Java"
+
+on:
+  push:
+    branches: [ "master" ]
+    paths:
+      - '**/*.java' # Only trigger the workflow if Java files have changed
+  pull_request:
+    branches: [ "master" ]
+    paths:
+      - '**/*.java'
+
+jobs:
+  analyze:
+    name: Analyze Java
+    runs-on: ubuntu-latest
+    permissions:
+      actions: read
+      contents: read
+      security-events: write
+
+    steps:
+      - name: Checkout repository
+        uses: actions/checkout@v3
+
+      - name: Initialize CodeQL
+        uses: github/codeql-action/init@v2
+        with:
+          languages: 'java'
+
+      - name: Build
+        run: |
+          ./refine build
+
+      - name: Perform CodeQL Analysis
+        uses: github/codeql-action/analyze@v2
+        with:
+          category: "/language:java"
diff --git a/.github/workflows/codeql_javascript.yml b/.github/workflows/codeql_javascript.yml
new file mode 100644
index 000000000..644924576
--- /dev/null
+++ b/.github/workflows/codeql_javascript.yml
@@ -0,0 +1,38 @@
+name: "CodeQL JavaScript"
+
+on:
+  push:
+    branches: [ "master" ]
+    paths:
+      - '**/*.js' # Only trigger the workflow if JavaScript files have changed
+  pull_request:
+    branches: [ "master" ]
+    paths:
+      - '**/*.js'
+
+jobs:
+  analyze:
+    name: Analyze JavaScript
+    runs-on: ubuntu-latest
+    permissions:
+      actions: read
+      contents: read
+      security-events: write
+
+    steps:
+      - name: Checkout repository
+        uses: actions/checkout@v3
+
+      - name: Initialize CodeQL
+        uses: github/codeql-action/init@v2
+        with:
+          languages: 'javascript'
+
+      - name: Build
+        run: |
+          ./refine build
+
+      - name: Perform CodeQL Analysis
+        uses: github/codeql-action/analyze@v2
+        with:
+          category: "/language:javascript"
diff --git a/.github/workflows/pull_request_server.yml b/.github/workflows/pull_request_server.yml
index 78ce4a7ff..3d5bd96b4 100644
--- a/.github/workflows/pull_request_server.yml
+++ b/.github/workflows/pull_request_server.yml
@@ -47,7 +47,7 @@ jobs:
   linux_server_tests:
     strategy:
       matrix:
-        java: [ 11, 17 ]
+        java: [ 11, 20 ]
 
     runs-on: ubuntu-latest
 
@@ -122,11 +122,11 @@ jobs:
     steps:
       - uses: actions/checkout@v3
 
-      - name: Set up Java 17
+      - name: Set up Java 20
         uses: actions/setup-java@v3
         with:
           distribution: 'temurin'
-          java-version: 17
+          java-version: 20
           cache: 'maven'
 
       - name: Check Java linting
diff --git a/README.md b/README.md
index 6b7f2a921..570405b06 100644
--- a/README.md
+++ b/README.md
@@ -33,7 +33,7 @@ If you have cloned this repository to your computer, you can run OpenRefine with
 * `./refine` on Mac OS and Linux
 * `refine.bat` on Windows
 
-This requires [JDK 11](https://adoptium.net/), [Apache Maven](https://maven.apache.org/) and [NPM](https://www.npmjs.com/).
+This requires [JDK 11](https://adoptium.net/) or newer, [Apache Maven](https://maven.apache.org/) and [NPM](https://www.npmjs.com/) 16 or newer.
 
 ## Documentation
 
diff --git a/benchmark/pom.xml b/benchmark/pom.xml
index 1419fcb65..c9f3cd13d 100644
--- a/benchmark/pom.xml
+++ b/benchmark/pom.xml
@@ -121,7 +121,7 @@
       <plugins>
         <plugin>
           <artifactId>maven-clean-plugin</artifactId>
-          <version>3.2.0</version>
+          <version>3.3.1</version>
         </plugin>
         <plugin>
           <artifactId>maven-install-plugin</artifactId>
diff --git a/extensions/database/module/langs/translation-es.json b/extensions/database/module/langs/translation-es.json
index 0967ef424..fb253b914 100644
--- a/extensions/database/module/langs/translation-es.json
+++ b/extensions/database/module/langs/translation-es.json
@@ -1,1 +1,64 @@
-{}
+{
+    "database-source/databaseHostPlaceholder": "Introduzca el dominio o la IP del servidor de base de datos",
+    "database-parsing/preview-button": "Actualizar&nbsp;Vista previa",
+    "database-source/databasePortLabel": "Puerto",
+    "database-parsing/ignore-first": "ignorar primero",
+    "database-import/title": "Servidores de base de datos",
+    "database-import/creating": "Creando proyecto…",
+    "database-import/importer-name": "Base de datos",
+    "database-import/preparing": "Preparando el resultado …",
+    "database-import/checking": "Validando consulta…",
+    "database-source/alert-user": "Debe especificar un usuario para la de base de datos",
+    "database-source/alert-port": "Debe especificar un puerto para la base de datos",
+    "database-source/alert-host": "Debe especificar un host de base de datos",
+    "database-source/alert-password": "Tienes que especificar una contraseña de base de datos",
+    "database-source/alert-connection-name": "Debe especificar un nombre de conexión",
+    "database-source/alert-invalid-query-keyword": "La consulta no puede contener palabras clave de manipulación de datos:",
+    "database-source/alert-initial-database": "Debe especificar una base de datos inicial",
+    "database-source/alert-query": "Debe especificar una consulta válida",
+    "database-source/databaseFileNameLabel": "Archivo de base de datos",
+    "database-source/connectionNamePlaceholder": "Introducir un Nombre de Conexión nuevo",
+    "database-source/alert-invalid-query-select": "La consulta debe comenzar con la palabra clave SELECT",
+    "database-source/form-validation-failure": "¡Nuevo formulario de conexión inválido!",
+    "database-source/connectionNameLabel": "Nombre",
+    "database-source/databaseTypeLabel": "Tipo",
+    "database-source/alert-connection-edit": "Conexión editada",
+    "database-source/databaseNameLabel": "Nombre de la base de datos",
+    "database-source/databaseTestButton": "Prueba",
+    "database-source/databaseConnectButton": "Conectar",
+    "database-source/databaseUserLabel": "Usuario",
+    "database-source/databasePasswordLabel": "Contraseña",
+    "database-source/databaseHostLabel": "Host",
+    "database-source/databaseSchemaLabel": "Esquema",
+    "database-source/databaseUserPlaceholder": "Ingrese el usuario de la base de datos",
+    "database-source/databasePortPlaceholder": "Introduzca el puerto de la base de datos, por ejemplo 3306",
+    "database-source/databaseSchemaPlaceholder": "Ingrese el esquema inicial de la base de datos",
+    "database-source/databasePasswordPlaceholder": "Ingrese la contraseña de la base de datos",
+    "database-source/databaseNamePlaceholder": "Ingrese el nombre de la base de datos",
+    "database-source/databaseFileNamePlaceholder": "Ingrese la ruta completa al archivo de la base de datos",
+    "database-source/connectionNameDefaultValue": "Nombre_de_Conexión_Nueva",
+    "database-source/databaseSaveButton": "Guardar",
+    "database-source/new-connection-legend": "Nuevo Editor de Conexión",
+    "database-source/newConnectionButtonDiv": "Nueva conexión",
+    "database-parsing/start-over": "&laquo; Comenzar de nuevo",
+    "database-parsing/conf-pars": "Configurar opciones de parsing",
+    "database-source/savedConnectionSpan": "Conexiones guardadas",
+    "database-parsing/proj-name": "Nombre del&nbsp;proyecto",
+    "database-parsing/create-proj": "Crear Proyecto &raquo;",
+    "database-parsing/option": "Opciones",
+    "database-parsing/parse-next": "Analizar siguiente",
+    "database-parsing/disable-auto-preview": "Deshabilitar vista previa automática",
+    "database-parsing/worksheet": "Hojas de cálculo",
+    "database-parsing/updating-preview": "Actualizando vista previa…",
+    "database-parsing/ignore": "linea(s) al inicio del archivo",
+    "database-parsing/discard-next": "Descartar el Inicial",
+    "database-parsing/parse": "línea(s) como encabezados de columna",
+    "database-parsing/store-cell": "Guardar las celdas en blanco como nulos",
+    "database-parsing/discard": "Fila(s) de datos",
+    "database-parsing/limit": "Fila(s) de datos",
+    "database-parsing/store-row": "Almacenar filas vacías",
+    "database-source/alert-conn-name-invalid-character": "Error al introducir el nombre de la conexión: Carácter ilegal en la entrada. Sólo se permite [a-zA-Z0-9._-]",
+    "database-source/alert-db-host-invalid-character": "Error de host de base de datos: Carácter ilegal en la entrada. Sólo se permiten caracteres alfanuméricos",
+    "database-source/alert-db-user-invalid-character": "Error en usuario de base de datos: Carácter ilegal en la entrada. Sólo se permiten caracteres alfanuméricos",
+    "database-source/alert-db-port-invalid-character": "Error en el puerto de base de datos: Carácter ilegal en la entrada. Sólo se permiten valores numéricos."
+}
diff --git a/extensions/wikibase/module/langs/translation-en.json b/extensions/wikibase/module/langs/translation-en.json
index 96eed2976..74ff926b8 100644
--- a/extensions/wikibase/module/langs/translation-en.json
+++ b/extensions/wikibase/module/langs/translation-en.json
@@ -34,9 +34,8 @@
     "wikibase-addition/version-error": "Manifest version $1 is not supported. OpenRefine supports manifest versions 1.x and 2.x only.",
     "wikibase-schema/dialog-header": "Align to Wikibase",
     "wikibase-schema/target-wikibase-instance": "Target Wikibase instance:",
-    "wikibase-schema/dialog-explanation": "The schema below specifies how your tabular data will be transformed into <a href=\"$1\">$2</a> edits.",
     "wikibase-schema/start-from-an-existing-schema": "Start from an existing schema:",
-    "wikibase-schema/save-new-schema": "Save new...",
+    "wikibase-schema/save-new-schema": "Save schema changes",
     "wikibase-schema/preview-explanation": "This tab shows the first edits (out of $1) that will be made once you upload the changes to <a href=\"$2\" target=\"_blank\">$3</a>. You can use facets to inspect the edits on particular items.",
     "wikibase-schema/schema-tab-header": "Schema",
     "wikibase-schema/warnings-tab-header": "Issues",
@@ -336,7 +335,7 @@
     "wikibase-save-schema-dialog/dialog-header": "Save schema",
     "wikibase-save-schema-dialog/schema-name": "New schema name",
     "wikibase-save-schema-dialog/existing-schema-label": "Or select an existing schema to override",
-    "wikibase-save-schema-dialog/select-schema": "Select schema...",
+    "wikibase-save-schema-dialog/select-schema": "Select...",
     "wikibase-save-schema-dialog/save": "Save",
     "wikibase-save-schema-dialog/empty-name": "Please provide a name for the schema.",
     "wikibase-save-schema-dialog/manage-schemas": "Manage schemas…",
diff --git a/extensions/wikibase/module/langs/translation-es.json b/extensions/wikibase/module/langs/translation-es.json
index 705e7c4e8..d1eb2871d 100644
--- a/extensions/wikibase/module/langs/translation-es.json
+++ b/extensions/wikibase/module/langs/translation-es.json
@@ -234,5 +234,31 @@
     "wikibase-schema/mediainfo-wikitext-override": "Wikitext (anular):",
     "wikibase-schema/mediainfo-wikitext-no-override": "Wikitexto (no anular):",
     "wikibase-addition/manifest-paste-input": "JSON del manifiesto",
-    "wikibase-addition/manifest-url-input": "URL del manifiesto"
+    "wikibase-addition/manifest-url-input": "URL del manifiesto",
+    "warnings-messages/invalid-item-subject/title": "Identificadores de asunto no válidos para la edición de un elemento",
+    "wikibase-schema/add-caption": "añadir leyenda",
+    "wikibase-schema/add-mediainfo-button": "Agregar medios",
+    "wikibase-schema/some-value": "Algún valor",
+    "wikibase-schema/no-value": "Ningún valor",
+    "wikibase-schema/caption-if-new": "Leyenda (no anular)",
+    "wikibase-schema/input-placeholder-for-wikibase-mediainfo": "Escriba el nombre de archivo o arrastre la columna reconciliada",
+    "wikibase-schema/override-wikitext": "anular el wikitexto existente",
+    "wikibase-schema/caption-override": "Leyenda (anular si está presente)",
+    "wikibase-schema/input-placeholder-for-wikibase-item": "Escriba elemento o arrastre la columna reconciliada",
+    "wikibase-schema/input-placeholder-for-wikibase-property": "Escriba la propiedad o arrastre la columna reconciliada",
+    "wikibase-schema/input-placeholder-for-wikibase-lexeme": "escriba el lexema o arrastre la columna conciliada",
+    "wikibase-schema/input-placeholder-for-wikibase-form": "Escriba el formulario o arrastre la columna conciliada",
+    "wikibase-schema/entity-or-reconciled-column": "Escriba la entidad o arrastre la columna reconciliada aquí",
+    "wikibase-schema/file-name-placeholder": "Nombre del archivo en la wiki",
+    "wikibase-schema/wikitext-placeholder": "Wiki markup asociado al archivo",
+    "wikibase-schema/invalid-schema-warning": "Su esquema está incompleto:",
+    "wikibase-schema/file-path-placeholder": "Ruta absoluta o URL del archivo multimedia a cargar",
+    "wikibase-schema/incompatible-site-iri-reconciled-column": "Esta columna se concilia con el espacio identificador $1, pero esta entrada requiere una columna conciliada con $2.",
+    "warnings-messages/invalid-item-subject/body": "Los identificadores de entidad como <span class=\"wb-issue-preformat\">{ejemplo}</span> no pueden utilizarse como asunto para editar un elemento. El asunto debe ser un Qid.",
+    "warnings-messages/invalid-mediainfo-subject/title": "Identificadores de asunto no válidos para la edición de un archivo multimedia",
+    "warnings-messages/invalid-mediainfo-subject/body": "Los identificadores de entidad como <span class=\"wb-issue-preformat\">{example}</span> no se pueden usar como asunto para editar un archivo multimedia. El asunto debe ser un Qid.",
+    "warnings-messages/invalid-entity-id-format/title": "Identificadores de entidad no válidos",
+    "wikibase-schema/caption": "Leyenda",
+    "wikibase-schema/empty-captions": "no se agregaron subtítulos",
+    "wikibase-schema/configure-statement": "Configuración"
 }
diff --git a/extensions/wikibase/module/scripts/schema-alignment-tab.html b/extensions/wikibase/module/scripts/schema-alignment-tab.html
index 3f2d7f8a4..b5b56dc14 100644
--- a/extensions/wikibase/module/scripts/schema-alignment-tab.html
+++ b/extensions/wikibase/module/scripts/schema-alignment-tab.html
@@ -1,24 +1,27 @@
 <div id="schema-alignment-tab">
     <div bind="schemaHeader">
-        <p class="panel-explanation"><label bind="targetWikibaseLabel" for="wikibase-instance-selector"></label> <select bind="wikibaseSelect" name="wikibase-instance-selector" id="wikibase-instance-selector"></select></p>
-        <p class="panel-explanation" bind="dialogExplanation"></p>
-        <div class="panel-explanation">
-          <label bind="templateLabel" for="wikibase-template-select"></label>
-          <select bind="templateSelect" name="wikibase-template-select" id="wikibase-template-select"></select>
-          <button bind="saveNewTemplateButton" class="button button-primary"></button>
+        <div class="schema-alignment-tab-content">
+            <p class="panel-explanation"><label bind="targetWikibaseLabel" for="wikibase-instance-selector"></label> <select bind="wikibaseSelect" name="wikibase-instance-selector" id="wikibase-instance-selector"></select></p>
+            <div class="panel-explanation float-apart">
+                <div>
+                    <label bind="templateLabel" for="wikibase-template-select"></label>
+                    <select bind="templateSelect" name="wikibase-template-select" id="wikibase-template-select"></select>
+                </div>
+                <button bind="saveNewTemplateButton" class="button button-primary"></button>
+            </div>
         </div>
         <div style="clear: right"></div>
         <div class="schema-alignment-dialog-columns-area" bind="columnsArea">
         </div>
     </div>
-    <div class="schema-alignment-dialog-canvas" bind="canvas">
-        <div class="schema-alignment-dialog-entity-edits-area" bind="entityEditsArea">
-                <div id="schema-alignment-entity-edits-container" bind="entityEditsContainer">
-                </div>
-                <div id="schema-alignment-entity-add-buttons" bind="entityAddButtons">
-                <div class="schema-alignment-save-buttons">
-                    <div class="schema-alignment-save"><button class="button button-primary" bind="saveButton"></button></div>
-                    <div class="schema-alignment-discard"><button class="button button-primary" bind="discardButton"></button></div>
+    <div class="schema-alignment-dialog-canvas schema-alignment-tab-content" bind="canvas">
+        <div bind="entityEditsArea">
+            <div id="schema-alignment-entity-edits-container" bind="entityEditsContainer"></div>
+            <div class="float-apart schema-alignment-footer">
+                <div id="schema-alignment-entity-add-buttons" bind="entityAddButtons"></div>
+                <div>
+                    <button class="button button-primary" bind="saveButton"></button>
+                    <button class="button button-primary" bind="discardButton"></button>
                 </div>
             </div>
         </div>
diff --git a/extensions/wikibase/module/scripts/schema-alignment.js b/extensions/wikibase/module/scripts/schema-alignment.js
index 6c8bfc84b..2f640ff3a 100644
--- a/extensions/wikibase/module/scripts/schema-alignment.js
+++ b/extensions/wikibase/module/scripts/schema-alignment.js
@@ -120,9 +120,6 @@ SchemaAlignment._rerenderTabs = function() {
   var schemaTab = $(DOM.loadHTML("wikidata", "scripts/schema-alignment-tab.html")).appendTo(this._schemaPanel);
   var schemaElmts = this._schemaElmts = DOM.bind(schemaTab);
   schemaElmts.targetWikibaseLabel.text($.i18n('wikibase-schema/target-wikibase-instance'));
-  schemaElmts.dialogExplanation.html($.i18n('wikibase-schema/dialog-explanation',
-      WikibaseManager.getSelectedWikibaseMainPage(),
-      WikibaseManager.getSelectedWikibaseName()));
   let editableEntityTypes = WikibaseManager.getSelectedWikibaseEditableEntityTypes();
   for (let entityType of editableEntityTypes) {
     let addButton = $('<div></div>').addClass("wbs-toolbar");
diff --git a/extensions/wikibase/module/styles/schema-alignment.css b/extensions/wikibase/module/styles/schema-alignment.css
index daea05d24..2b57f7205 100644
--- a/extensions/wikibase/module/styles/schema-alignment.css
+++ b/extensions/wikibase/module/styles/schema-alignment.css
@@ -21,6 +21,10 @@
   overflow: hidden;
 }
 
+.schema-alignment-tab-content {
+  max-width: 70em;
+}
+
 .main-view-panel-tab-header {
   margin-top: 9px;
   margin-left: 7px;
@@ -48,10 +52,6 @@
   overflow-y: auto;
 }
 
-.schema-alignment-dialog-entity-edits-area {
-  max-width: 70em;
-}
-
 .schema-alignment-dialog-statements-area {
   padding: 10px;
   max-width: 900px;
@@ -66,45 +66,25 @@
   margin: 1em;
 }
 
-.schema-alignment-save-buttons{
-  display:flex; 
-  flex-direction: row; 
-  float: right; 
-  padding: 12px;
+.float-apart {
+  display: flex;
+  justify-content: space-between;
 }
 
-.schema-alignment-save {
-  padding-right: 10px; 
-}
-
-#schema-alignment-entity-add-buttons .wbs-toolbar{
-  float: left;
-  padding: 1em;  
-}
-
-.schema-alignment-save button:disabled {
-  color: gray;
+.schema-alignment-footer {
+  padding: 1em;
 }
 
-.schema-alignment-save button {
-  font-weight: normal;
-  width: 100%;
-}
-
-.schema-alignment-discard button:disabled {
-  color: gray;
-}
-
-.schema-alignment-discard button {
-  font-weight: normal;
-  width: 100%;
+.schema-alignment-footer button:disabled {
+  color: grey;
+  cursor: not-allowed;
 }
 
 .schema-alignment-dialog-columns-area {
   border: 1px solid #bcf;
   border-left: 0;
   border-right: 0;
-  padding: 5px;
+  padding: 5px 1em;
   max-height: 100px;
   overflow-y: auto;
 }
diff --git a/main/resources/com/google/refine/grel/ControlEvalError_es.properties b/main/resources/com/google/refine/grel/ControlEvalError_es.properties
index 8b1378917..e69de29bb 100644
--- a/main/resources/com/google/refine/grel/ControlEvalError_es.properties
+++ b/main/resources/com/google/refine/grel/ControlEvalError_es.properties
@@ -1,1 +0,0 @@
-
diff --git a/main/src/com/google/refine/util/PatternSyntaxExceptionParser.java b/main/src/com/google/refine/util/PatternSyntaxExceptionParser.java
index 325bc3aa6..062d082ba 100644
--- a/main/src/com/google/refine/util/PatternSyntaxExceptionParser.java
+++ b/main/src/com/google/refine/util/PatternSyntaxExceptionParser.java
@@ -80,6 +80,7 @@ public class PatternSyntaxExceptionParser {
                 msg = "The regular expression has a '*','+' or '?' in the wrong place.";
                 break;
             case "Unexpected internal error":
+            case "Unescaped trailing backslash":
                 msg = "The regular expression has a backslash '\\' at the end.";
                 break;
             case "Unclosed counted closure":
diff --git a/main/webapp/modules/core/scripts/project.js b/main/webapp/modules/core/scripts/project.js
index 421be1c45..b22e95bb4 100644
--- a/main/webapp/modules/core/scripts/project.js
+++ b/main/webapp/modules/core/scripts/project.js
@@ -194,55 +194,45 @@ Refine.setTitle = function(status) {
 };
 
 Refine.reinitializeProjectData = function(f, fError) {
-  $.getJSON(
-    "command/core/get-project-metadata?" + $.param({ project: theProject.id }), null,
-    function(data) {
-      if (data.status == "error") {
-        alert(data.message);
-        if (fError) {
-          fError();
-        }
-      } else {
-        theProject.metadata = data;
-        $.getJSON(
-          "command/core/get-models?" + $.param({ project: theProject.id }), null,
-          function(data) {
-            if (data.status == "error") {
-              alert(data.message);
-              if (fError) {
-                fError();
-              }
-            } else {
-              for (var n in data) {
-                if (data.hasOwnProperty(n)) {
-                  theProject[n] = data[n];
-                }
-              }
-              $.post(
-                "command/core/get-all-preferences", null,
-                function(preferences) {
-                  if (preferences.status == "error") {
-                    alert(preferences.message);
-                    if (fError) {
-                      fError();
-                    }
-                  } else {
-                    if (preferences != null) {
-                      thePreferences = preferences;
-                    }
-                    f();
-                  }
-                },
-                'json'
-              );
-            }
-          },
-          'json'
-        );
+  function handleError(status, message, fError) {
+    if (status === "error") {
+      alert(message);
+      if (fError) {
+        fError();
       }
-    },
-    'json'
-  );
+      return true;
+    }
+    return false;
+  }
+
+  $.when(
+    $.getJSON("command/core/get-project-metadata?" + $.param({ project: theProject.id }), null),
+    $.getJSON("command/core/get-models?" + $.param({ project: theProject.id }), null),
+    $.getJSON("command/core/get-all-preferences", null),
+  ).done(function(metadata, models, preferences) {
+    metadata = metadata[0], models = models[0], preferences = preferences[0];
+    if (
+      handleError(metadata.status, metadata.message, fError) ||
+      handleError(models.status, models.message, fError) ||
+      handleError(preferences.status, preferences.message, fError)
+    ) {
+      return;
+    }
+
+    theProject.metadata = metadata;
+
+    for (var n in models) {
+      if (models.hasOwnProperty(n)) {
+        theProject[n] = models[n];
+      }
+    }
+
+    if (preferences) {
+      thePreferences = preferences;
+    }
+
+    f();
+  });
 };
 
 Refine.getPreference = function(key, defaultValue) {
diff --git a/main/webapp/modules/core/scripts/util/url.js b/main/webapp/modules/core/scripts/util/url.js
index cf1bb34c6..f437977e0 100644
--- a/main/webapp/modules/core/scripts/util/url.js
+++ b/main/webapp/modules/core/scripts/util/url.js
@@ -37,6 +37,7 @@ var URLUtil = {
     "chrome":1,
     "file":1,
     "ftp":1,
+    "geo":0,
     "http":1,
     "https":1,
     "imap":1,
diff --git a/main/webapp/package-lock.json b/main/webapp/package-lock.json
index 7e0886a55..824f48858 100644
--- a/main/webapp/package-lock.json
+++ b/main/webapp/package-lock.json
@@ -17,7 +17,12 @@
         "tablesorter": "2.31.3",
         "underscore": "1.13.6"
       },
-      "devDependencies": {}
+      "devDependencies": {},
+      "engines": {
+        "node": ">=14.0.0",
+        "npm": ">=8.11.0",
+        "yarn": ">=1.22.15"
+      }
     },
     "node_modules/@wikimedia/jquery.i18n": {
       "version": "1.0.9",
diff --git a/main/webapp/package.json b/main/webapp/package.json
index f8589d8d0..52f8ccdc4 100644
--- a/main/webapp/package.json
+++ b/main/webapp/package.json
@@ -1,4 +1,9 @@
 {
+  "engines": {
+    "node": ">=14.0.0",
+    "npm":  ">=8.11.0",
+    "yarn": ">=1.22.15"
+  },
   "scripts": {
     "postinstall": "node copy-dependencies.js"
   },
diff --git a/pom.xml b/pom.xml
index 38137875e..e45bbf23e 100644
--- a/pom.xml
+++ b/pom.xml
@@ -64,7 +64,7 @@
 
   <properties>
     <java.minversion>11</java.minversion>
-    <java.maxversion>17</java.maxversion>
+    <java.maxversion>20</java.maxversion>
     <jee.path>/</jee.path>
     <jee.port>3333</jee.port>
     <refine.data>/tmp/refine</refine.data>
@@ -88,7 +88,7 @@
     <commons-validator.version>1.7</commons-validator.version>
     <org-jvnet-localizer.version>1.31</org-jvnet-localizer.version>
     <!-- v1.15 of commons-codec is needed for Jena 3.14+ - copied from org.apache.jena:jena:pom -->
-    <commons-codec.version>1.15</commons-codec.version>
+    <commons-codec.version>1.16.0</commons-codec.version>
     <commons-compress.version>1.23.0</commons-compress.version>
     <velocity.version>1.5</velocity.version>
     <marc4j.version>2.9.5</marc4j.version>
@@ -108,7 +108,7 @@
     <httpmime.version>4.5.14</httpmime.version>
     <owasp-encoder.version>1.2.3</owasp-encoder.version>
     <jasypt.version>1.9.3</jasypt.version>
-    <mockito.version>5.3.1</mockito.version>
+    <mockito.version>5.4.0</mockito.version>
 
     <!-- plugin versions -->
     <build-helper-maven-plugin.version>3.3.0</build-helper-maven-plugin.version>
@@ -120,7 +120,7 @@
     <coveralls-maven-plugin.version>4.3.0</coveralls-maven-plugin.version>
     <surefire.version>3.1.2</surefire.version>
     <maven-jar-plugin.version>3.3.0</maven-jar-plugin.version>
-    <maven-clean-plugin.version>3.2.0</maven-clean-plugin.version>
+    <maven-clean-plugin.version>3.3.1</maven-clean-plugin.version>
     <git-commit-id-plugin.version>4.9.10</git-commit-id-plugin.version>
     <maven-deploy-plugin.version>3.1.1</maven-deploy-plugin.version>
     <license-plugin.version>2.0.0</license-plugin.version>
diff --git a/refine.bat b/refine.bat
index 1b649f74e..ef9361f6f 100644
--- a/refine.bat
+++ b/refine.bat
@@ -159,14 +159,6 @@ set REFINE_WEBAPP=main\webapp
 :gotWebApp
 set OPTS=%OPTS% -Drefine.webapp=%REFINE_WEBAPP%
 
-for /f "tokens=2 delims==" %%i in ('wmic OS get FreePhysicalMemory /Value') do set /a freeRam=%%i/1024
-echo -------------------------------------------------------------------------------------------------
-echo You have %freeRam%M of free memory.
-echo Your current configuration is set to use %REFINE_MEMORY% of memory.
-echo OpenRefine can run better when given more memory. Read our FAQ on how to allocate more memory here:
-echo https://openrefine.org/docs/manual/installing\#increasing-memory-allocation
-echo -------------------------------------------------------------------------------------------------
-
 if not "%REFINE_CLASSES_DIR%" == "" goto gotClassesDir
 set REFINE_CLASSES_DIR=server\classes
 :gotClassesDir
@@ -205,6 +197,15 @@ if ""%ACTION%"" == """" goto doRun
   exit /B 1
 
 :doRun
+
+for /f "tokens=2 delims==" %%i in ('wmic OS get FreePhysicalMemory /Value') do set /a freeRam=%%i/1024
+echo -------------------------------------------------------------------------------------------------
+echo You have %freeRam%M of free memory.
+echo Your current configuration is set to use %REFINE_MEMORY% of memory.
+echo OpenRefine can run better when given more memory. Read our FAQ on how to allocate more memory here:
+echo https://openrefine.org/docs/manual/installing\#increasing-memory-allocation
+echo -------------------------------------------------------------------------------------------------
+
 rem --- Checking Java Version  ------------------------------------------
 set JAVA="%JAVA_HOME%\bin\java.exe"
 


Test patch:
diff --git a/.github/workflows/pull_request_e2e.yml b/.github/workflows/pull_request_e2e.yml
index aa942512a..3ef38c771 100644
--- a/.github/workflows/pull_request_e2e.yml
+++ b/.github/workflows/pull_request_e2e.yml
@@ -45,11 +45,11 @@ jobs:
           echo "CYPRESS_RECORD_KEY=$(echo YzE3ZDU4OGItZTBkOC00ZjJmLTg4NjYtNzJmNmFmYmRhNGQxCg== | base64 -d)" >> $GITHUB_ENV
           echo "CYPRESS_PROJECT_ID=s5du3k" >> $GITHUB_ENV
 
-      - name: Set up Java 11
+      - name: Set up Java 17
         uses: actions/setup-java@v3
         with:
           distribution: 'temurin'
-          java-version: 11
+          java-version: 17
           cache: 'maven'
 
       - name: Build OpenRefine
diff --git a/main/tests/cypress/cypress/support/commands.js b/main/tests/cypress/cypress/support/commands.js
index ec51f1bd4..f20915c01 100644
--- a/main/tests/cypress/cypress/support/commands.js
+++ b/main/tests/cypress/cypress/support/commands.js
@@ -9,7 +9,6 @@
 // ***********************************************
 
 import 'cypress-file-upload';
-import 'cypress-wait-until';
 
 // /**
 //  * Reconcile a column
diff --git a/main/tests/cypress/package.json b/main/tests/cypress/package.json
index 6c5022386..f54223ad5 100644
--- a/main/tests/cypress/package.json
+++ b/main/tests/cypress/package.json
@@ -5,25 +5,25 @@
     "license": "BSD-3-Clause",
     "author": "OpenRefine",
     "private": true,
+    "engines": {
+        "node": ">=14.0.0",
+        "npm":  ">=8.11.0",
+        "yarn": ">=1.22.15"
+    },
     "scripts": {
         "test": "cypress run --browser electron --headless --quiet",
         "fix-lint": "prettier --write . && eslint --fix .",
         "lint": "prettier --check . && eslint ."
     },
     "dependencies": {
-        "cypress": "12.14.0",
-        "cypress-file-upload": "^5.0.8",
-        "cypress-wait-until": "^1.7.2",
-        "dotenv": "^16.3.0",
-        "fs-extra": "^11.1.1",
-        "uniqid": "^5.4.0"
+        "cypress": "12.16.0",
+        "cypress-file-upload": "^5.0.8"
     },
     "devDependencies": {
-        "eslint": "^8.42.0",
+        "eslint": "^8.43.0",
         "eslint-config-google": "^0.14.0",
         "eslint-config-prettier": "^8.8.0",
         "eslint-plugin-cypress": "^2.13.3",
-        "jsdoc": "^4.0.2",
         "prettier": "2.8.8"
     }
 }
diff --git a/main/tests/cypress/yarn.lock b/main/tests/cypress/yarn.lock
index b8ff44d3a..067aadd14 100644
--- a/main/tests/cypress/yarn.lock
+++ b/main/tests/cypress/yarn.lock
@@ -2,11 +2,6 @@
 # yarn lockfile v1
 
 
-"@babel/parser@^7.20.15":
-  version "7.21.0"
-  resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.21.0.tgz#cc09288743b867763cb927ba101ccdf0b600b7e4"
-  integrity sha512-ONjtg4renj14A9pj3iA5T5+r5Eijxbr2eNIkMBTC74occDSsRZUpe8vowmowAjFR1imWlkD8eEmjYXiREZpGZg==
-
 "@cypress/request@^2.88.10":
   version "2.88.10"
   resolved "https://registry.yarnpkg.com/@cypress/request/-/request-2.88.10.tgz#b66d76b07f860d3a4b8d7a0604d020c662752cce"
@@ -66,10 +61,10 @@
     minimatch "^3.1.2"
     strip-json-comments "^3.1.1"
 
-"@eslint/js@8.42.0":
-  version "8.42.0"
-  resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.42.0.tgz#484a1d638de2911e6f5a30c12f49c7e4a3270fb6"
-  integrity sha512-6SWlXpWU5AvId8Ac7zjzmIOqMOba/JWY8XZ4A7q7Gn1Vlfg/SFFIlrtHXt9nPn4op9ZPAkl91Jao+QQv3r/ukw==
+"@eslint/js@8.43.0":
+  version "8.43.0"
+  resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.43.0.tgz#559ca3d9ddbd6bf907ad524320a0d14b85586af0"
+  integrity sha512-s2UHCoiXfxMvmfzqoN+vrQ84ahUSYde9qNO1MdxmoEhyHWsfmwOpFlwYV+ePJEVc7gFnATGUi376WowX1N7tFg==
 
 "@humanwhocodes/config-array@^0.11.10":
   version "0.11.10"
@@ -90,13 +85,6 @@
   resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45"
   integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==
 
-"@jsdoc/salty@^0.2.1":
-  version "0.2.1"
-  resolved "https://registry.yarnpkg.com/@jsdoc/salty/-/salty-0.2.1.tgz#815c487c859eca81ad3dfea540f830e1ff9d3392"
-  integrity sha512-JXwylDNSHa549N9uceDYu8D4GMXwSo3H8CCPYEQqxhhHpxD28+lRl2b3bS/caaPj5w1YD3SWtrficJNTnUjGpg==
-  dependencies:
-    lodash "^4.17.21"
-
 "@nodelib/fs.scandir@2.1.5":
   version "2.1.5"
   resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5"
@@ -123,24 +111,6 @@
   resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz"
   integrity sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==
 
-"@types/linkify-it@*":
-  version "3.0.2"
-  resolved "https://registry.yarnpkg.com/@types/linkify-it/-/linkify-it-3.0.2.tgz#fd2cd2edbaa7eaac7e7f3c1748b52a19143846c9"
-  integrity sha512-HZQYqbiFVWufzCwexrvh694SOim8z2d+xJl5UNamcvQFejLY/2YUtzXHYi3cHdI7PMlS8ejH2slRAOJQ32aNbA==
-
-"@types/markdown-it@^12.2.3":
-  version "12.2.3"
-  resolved "https://registry.yarnpkg.com/@types/markdown-it/-/markdown-it-12.2.3.tgz#0d6f6e5e413f8daaa26522904597be3d6cd93b51"
-  integrity sha512-GKMHFfv3458yYy+v/N8gjufHO6MSZKCOXpZc5GXIWWy8uldwfmPn98vp81gZ5f9SVw8YYBctgfJ22a2d7AOMeQ==
-  dependencies:
-    "@types/linkify-it" "*"
-    "@types/mdurl" "*"
-
-"@types/mdurl@*":
-  version "1.0.2"
-  resolved "https://registry.yarnpkg.com/@types/mdurl/-/mdurl-1.0.2.tgz#e2ce9d83a613bacf284c7be7d491945e39e1f8e9"
-  integrity sha512-eC4U9MlIcu2q0KQmXszyn5Akca/0jrQmwDRgpAMJai7qBWq4amIQhZyNau4VYGtCeALvW1/NtjzJJ567aZxfKA==
-
 "@types/node@*":
   version "15.12.4"
   resolved "https://registry.yarnpkg.com/@types/node/-/node-15.12.4.tgz#e1cf817d70a1e118e81922c4ff6683ce9d422e26"
@@ -343,13 +313,6 @@ caseless@~0.12.0:
   resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz"
   integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=
 
-catharsis@^0.9.0:
-  version "0.9.0"
-  resolved "https://registry.yarnpkg.com/catharsis/-/catharsis-0.9.0.tgz#40382a168be0e6da308c277d3a2b3eb40c7d2121"
-  integrity sha512-prMTQVpcns/tzFgFVkVp6ak6RykZyWb3gu8ckUpd6YkTlacOd3DXGJjIpD4Q6zJirizvaiAjSSHlOsA+6sNh2A==
-  dependencies:
-    lodash "^4.17.15"
-
 chalk@^4.0.0, chalk@^4.1.0:
   version "4.1.0"
   resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.0.tgz"
@@ -460,15 +423,10 @@ cypress-file-upload@^5.0.8:
   resolved "https://registry.yarnpkg.com/cypress-file-upload/-/cypress-file-upload-5.0.8.tgz#d8824cbeaab798e44be8009769f9a6c9daa1b4a1"
   integrity sha512-+8VzNabRk3zG6x8f8BWArF/xA/W0VK4IZNx3MV0jFWrJS/qKn8eHfa5nU73P9fOQAgwHFJx7zjg4lwOnljMO8g==
 
-cypress-wait-until@^1.7.2:
-  version "1.7.2"
-  resolved "https://registry.yarnpkg.com/cypress-wait-until/-/cypress-wait-until-1.7.2.tgz#7f534dd5a11c89b65359e7a0210f20d3dfc22107"
-  integrity sha512-uZ+M8/MqRcpf+FII/UZrU7g1qYZ4aVlHcgyVopnladyoBrpoaMJ4PKZDrdOJ05H5RHbr7s9Tid635X3E+ZLU/Q==
-
-cypress@12.14.0:
-  version "12.14.0"
-  resolved "https://registry.yarnpkg.com/cypress/-/cypress-12.14.0.tgz#37a19b85f5e9d881995e9fee1ddf41b3d3a623dd"
-  integrity sha512-HiLIXKXZaIT1RT7sw1sVPt+qKtis3uYNm6KwC4qoYjabwLKaqZlyS/P+uVvvlBNcHIwL/BC6nQZajpbUd7hOgQ==
+cypress@12.16.0:
+  version "12.16.0"
+  resolved "https://registry.yarnpkg.com/cypress/-/cypress-12.16.0.tgz#d0dcd0725a96497f4c60cf54742242259847924c"
+  integrity sha512-mwv1YNe48hm0LVaPgofEhGCtLwNIQEjmj2dJXnAkY1b4n/NE9OtgPph4TyS+tOtYp5CKtRmDvBzWseUXQTjbTg==
   dependencies:
     "@cypress/request" "^2.88.10"
     "@cypress/xvfb" "^1.2.4"
@@ -556,11 +514,6 @@ doctrine@^3.0.0:
   dependencies:
     esutils "^2.0.2"
 
-dotenv@^16.3.0:
-  version "16.3.0"
-  resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.3.0.tgz#1c61ae0a7b6f7b7e2285d50016ebab048f12ec6d"
-  integrity sha512-tHB+hmf8MRCkT3VVivGiG8kq9HiGTmQ3FzOKgztfpJQH1IWuZTOvKSJmHNnQPowecAmkCJhLrxdPhOr06LLqIQ==
-
 ecc-jsbn@~0.1.1:
   version "0.1.2"
   resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz"
@@ -588,21 +541,11 @@ enquirer@^2.3.6:
   dependencies:
     ansi-colors "^4.1.1"
 
-entities@~2.1.0:
-  version "2.1.0"
-  resolved "https://registry.yarnpkg.com/entities/-/entities-2.1.0.tgz#992d3129cf7df6870b96c57858c249a120f8b8b5"
-  integrity sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==
-
 escape-string-regexp@^1.0.5:
   version "1.0.5"
   resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz"
   integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=
 
-escape-string-regexp@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344"
-  integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==
-
 escape-string-regexp@^4.0.0:
   version "4.0.0"
   resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34"
@@ -638,15 +581,15 @@ eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1:
   resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz#c22c48f48942d08ca824cc526211ae400478a994"
   integrity sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==
 
-eslint@^8.42.0:
-  version "8.42.0"
-  resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.42.0.tgz#7bebdc3a55f9ed7167251fe7259f75219cade291"
-  integrity sha512-ulg9Ms6E1WPf67PHaEY4/6E2tEn5/f7FXGzr3t9cBMugOmf1INYvuUwwh1aXQN4MfJ6a5K2iNwP3w4AColvI9A==
+eslint@^8.43.0:
+  version "8.43.0"
+  resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.43.0.tgz#3e8c6066a57097adfd9d390b8fc93075f257a094"
+  integrity sha512-aaCpf2JqqKesMFGgmRPessmVKjcGXqdlAYLLC3THM8t5nBRZRQ+st5WM/hoJXkdioEXLLbXgclUpM0TXo5HX5Q==
   dependencies:
     "@eslint-community/eslint-utils" "^4.2.0"
     "@eslint-community/regexpp" "^4.4.0"
     "@eslint/eslintrc" "^2.0.3"
-    "@eslint/js" "8.42.0"
+    "@eslint/js" "8.43.0"
     "@humanwhocodes/config-array" "^0.11.10"
     "@humanwhocodes/module-importer" "^1.0.1"
     "@nodelib/fs.walk" "^1.2.8"
@@ -847,15 +790,6 @@ form-data@~2.3.2:
     combined-stream "^1.0.6"
     mime-types "^2.1.12"
 
-fs-extra@^11.1.1:
-  version "11.1.1"
-  resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.1.1.tgz#da69f7c39f3b002378b0954bb6ae7efdc0876e2d"
-  integrity sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==
-  dependencies:
-    graceful-fs "^4.2.0"
-    jsonfile "^6.0.1"
-    universalify "^2.0.0"
-
 fs-extra@^9.1.0:
   version "9.1.0"
   resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz"
@@ -930,7 +864,7 @@ globals@^13.19.0:
   dependencies:
     type-fest "^0.20.2"
 
-graceful-fs@^4.1.6, graceful-fs@^4.1.9, graceful-fs@^4.2.0:
+graceful-fs@^4.1.6, graceful-fs@^4.2.0:
   version "4.2.6"
   resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.6.tgz#ff040b2b0853b23c3d31027523706f1885d76bee"
   integrity sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==
@@ -1069,39 +1003,11 @@ js-yaml@^4.1.0:
   dependencies:
     argparse "^2.0.1"
 
-js2xmlparser@^4.0.2:
-  version "4.0.2"
-  resolved "https://registry.yarnpkg.com/js2xmlparser/-/js2xmlparser-4.0.2.tgz#2a1fdf01e90585ef2ae872a01bc169c6a8d5e60a"
-  integrity sha512-6n4D8gLlLf1n5mNLQPRfViYzu9RATblzPEtm1SthMX1Pjao0r9YI9nw7ZIfRxQMERS87mcswrg+r/OYrPRX6jA==
-  dependencies:
-    xmlcreate "^2.0.4"
-
 jsbn@~0.1.0:
   version "0.1.1"
   resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz"
   integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM=
 
-jsdoc@^4.0.2:
-  version "4.0.2"
-  resolved "https://registry.yarnpkg.com/jsdoc/-/jsdoc-4.0.2.tgz#a1273beba964cf433ddf7a70c23fd02c3c60296e"
-  integrity sha512-e8cIg2z62InH7azBBi3EsSEqrKx+nUtAS5bBcYTSpZFA+vhNPyhv8PTFZ0WsjOPDj04/dOLlm08EDcQJDqaGQg==
-  dependencies:
-    "@babel/parser" "^7.20.15"
-    "@jsdoc/salty" "^0.2.1"
-    "@types/markdown-it" "^12.2.3"
-    bluebird "^3.7.2"
-    catharsis "^0.9.0"
-    escape-string-regexp "^2.0.0"
-    js2xmlparser "^4.0.2"
-    klaw "^3.0.0"
-    markdown-it "^12.3.2"
-    markdown-it-anchor "^8.4.1"
-    marked "^4.0.10"
-    mkdirp "^1.0.4"
-    requizzle "^0.2.3"
-    strip-json-comments "^3.1.0"
-    underscore "~1.13.2"
-
 json-schema-traverse@^0.4.1:
   version "0.4.1"
   resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz"
@@ -1141,13 +1047,6 @@ jsprim@^2.0.2:
     json-schema "0.4.0"
     verror "1.10.0"
 
-klaw@^3.0.0:
-  version "3.0.0"
-  resolved "https://registry.yarnpkg.com/klaw/-/klaw-3.0.0.tgz#b11bec9cf2492f06756d6e809ab73a2910259146"
-  integrity sha512-0Fo5oir+O9jnXu5EefYbVK+mHMBeEVEy2cmctR1O1NECcCkPRreJKrS6Qt/j3KC2C148Dfo9i3pCmCMsdqGr0g==
-  dependencies:
-    graceful-fs "^4.1.9"
-
 lazy-ass@^1.6.0:
   version "1.6.0"
   resolved "https://registry.yarnpkg.com/lazy-ass/-/lazy-ass-1.6.0.tgz"
@@ -1161,13 +1060,6 @@ levn@^0.4.1:
     prelude-ls "^1.2.1"
     type-check "~0.4.0"
 
-linkify-it@^3.0.1:
-  version "3.0.3"
-  resolved "https://registry.yarnpkg.com/linkify-it/-/linkify-it-3.0.3.tgz#a98baf44ce45a550efb4d49c769d07524cc2fa2e"
-  integrity sha512-ynTsyrFSdE5oZ/O9GEf00kPngmOfVwazR5GKDq6EYfhlpFug3J2zybX56a2PRRpc9P+FuSoGNAwjlbDs9jJBPQ==
-  dependencies:
-    uc.micro "^1.0.1"
-
 listr2@^3.8.3:
   version "3.10.0"
   resolved "https://registry.yarnpkg.com/listr2/-/listr2-3.10.0.tgz#58105a53ed7fa1430d1b738c6055ef7bb006160f"
@@ -1198,7 +1090,7 @@ lodash.once@^4.1.1:
   resolved "https://registry.yarnpkg.com/lodash.once/-/lodash.once-4.1.1.tgz"
   integrity sha1-DdOXEhPHxW34gJd9UEyI+0cal6w=
 
-lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.21:
+lodash@^4.17.21:
   version "4.17.21"
   resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
   integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
@@ -1227,32 +1119,6 @@ lru-cache@^6.0.0:
   dependencies:
     yallist "^4.0.0"
 
-markdown-it-anchor@^8.4.1:
-  version "8.6.4"
-  resolved "https://registry.yarnpkg.com/markdown-it-anchor/-/markdown-it-anchor-8.6.4.tgz#affb8aa0910a504c114e9fcad53ac3a5b907b0e6"
-  integrity sha512-Ul4YVYZNxMJYALpKtu+ZRdrryYt/GlQ5CK+4l1bp/gWXOG2QWElt6AqF3Mih/wfUKdZbNAZVXGR73/n6U/8img==
-
-markdown-it@^12.3.2:
-  version "12.3.2"
-  resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-12.3.2.tgz#bf92ac92283fe983fe4de8ff8abfb5ad72cd0c90"
-  integrity sha512-TchMembfxfNVpHkbtriWltGWc+m3xszaRD0CZup7GFFhzIgQqxIfn3eGj1yZpfuflzPvfkt611B2Q/Bsk1YnGg==
-  dependencies:
-    argparse "^2.0.1"
-    entities "~2.1.0"
-    linkify-it "^3.0.1"
-    mdurl "^1.0.1"
-    uc.micro "^1.0.5"
-
-marked@^4.0.10:
-  version "4.0.18"
-  resolved "https://registry.yarnpkg.com/marked/-/marked-4.0.18.tgz#cd0ac54b2e5610cfb90e8fd46ccaa8292c9ed569"
-  integrity sha512-wbLDJ7Zh0sqA0Vdg6aqlbT+yPxqLblpAZh1mK2+AO2twQkPywvvqQNfEPVwSSRjZ7dZcdeVBIAgiO7MMp3Dszw==
-
-mdurl@^1.0.1:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-1.0.1.tgz#fe85b2ec75a59037f2adfec100fd6c601761152e"
-  integrity sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=
-
 merge-stream@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz"
@@ -1287,11 +1153,6 @@ minimist@^1.2.8:
   resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c"
   integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==
 
-mkdirp@^1.0.4:
-  version "1.0.4"
-  resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e"
-  integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==
-
 ms@2.1.2, ms@^2.1.1:
   version "2.1.2"
   resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz"
@@ -1453,13 +1314,6 @@ request-progress@^3.0.0:
   dependencies:
     throttleit "^1.0.0"
 
-requizzle@^0.2.3:
-  version "0.2.3"
-  resolved "https://registry.yarnpkg.com/requizzle/-/requizzle-0.2.3.tgz#4675c90aacafb2c036bd39ba2daa4a1cb777fded"
-  integrity sha512-YanoyJjykPxGHii0fZP0uUPEXpvqfBDxWV7s6GKAiiOsiqhX6vHNyW3Qzdmqp/iq/ExbhaGbVrjB4ruEVSM4GQ==
-  dependencies:
-    lodash "^4.17.14"
-
 resolve-from@^4.0.0:
   version "4.0.0"
   resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz"
@@ -1510,9 +1364,9 @@ safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0:
   integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
 
 semver@^7.3.2:
-  version "7.3.5"
-  resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7"
-  integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==
+  version "7.5.3"
+  resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.3.tgz#161ce8c2c6b4b3bdca6caadc9fa3317a4c4fe88e"
+  integrity sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==
   dependencies:
     lru-cache "^6.0.0"
 
@@ -1679,21 +1533,6 @@ type-fest@^0.21.3:
   resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37"
   integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==
 
-uc.micro@^1.0.1, uc.micro@^1.0.5:
-  version "1.0.6"
-  resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-1.0.6.tgz#9c411a802a409a91fc6cf74081baba34b24499ac"
-  integrity sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==
-
-underscore@~1.13.2:
-  version "1.13.4"
-  resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.13.4.tgz#7886b46bbdf07f768e0052f1828e1dcab40c0dee"
-  integrity sha512-BQFnUDuAQ4Yf/cYY5LNrK9NCJFKriaRbD9uR1fTeXnBeoa97W0i41qkZfGO9pSo8I5KzjAcSY2XYtdf0oKd7KQ==
-
-uniqid@^5.4.0:
-  version "5.4.0"
-  resolved "https://registry.yarnpkg.com/uniqid/-/uniqid-5.4.0.tgz#4e17bfcab66dfe33563411ae0c801f46ef964e66"
-  integrity sha512-38JRbJ4Fj94VmnC7G/J/5n5SC7Ab46OM5iNtSstB/ko3l1b5g7ALt4qzHFgGciFkyiRNtDXtLNb+VsxtMSE77A==
-
 universalify@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/universalify/-/universalify-1.0.0.tgz"
@@ -1765,11 +1604,6 @@ wrappy@1:
   resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz"
   integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=
 
-xmlcreate@^2.0.4:
-  version "2.0.4"
-  resolved "https://registry.yarnpkg.com/xmlcreate/-/xmlcreate-2.0.4.tgz#0c5ab0f99cdd02a81065fa9cd8f8ae87624889be"
-  integrity sha512-nquOebG4sngPmGPICTS5EnxqhKbCmz5Ox5hsszI2T6U5qdrJizBc+0ilYSEjTSzU0yZcmvppztXe/5Al5fUwdg==
-
 yallist@^4.0.0:
   version "4.0.0"
   resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72"