You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by dk...@apache.org on 2023/01/09 03:38:40 UTC

[sling-org-apache-sling-app-cms] branch master updated: Fixing use if sling:encode

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

dklco pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-app-cms.git


The following commit(s) were added to refs/heads/master by this push:
     new 540be07c Fixing use if sling:encode
540be07c is described below

commit 540be07c6fd0af01c8ddb6fca39b06d8e9a60e5c
Author: Dan Klco <kl...@adobe.com>
AuthorDate: Sun Jan 8 22:38:26 2023 -0500

    Fixing use if sling:encode
---
 it/{cypress/support/index.js => cypress.config.js} |   21 +-
 it/cypress.json                                    |    7 -
 it/cypress/e2e/admin.cy.js                         |  184 ++
 .../{integration/auth.spec.js => e2e/auth.cy.js}   |   16 +-
 it/cypress/e2e/authoring.cy.js                     |  116 ++
 it/cypress/e2e/editor.cy.js                        |  138 ++
 it/cypress/e2e/reference/form.cy.js                |  153 ++
 it/cypress/e2e/reference/general.cy.js             |   99 +
 it/cypress/e2e/reference/utils.js                  |   76 +
 .../taxonomy.spec.js => e2e/taxonomy.cy.js}        |   41 +-
 it/cypress/e2e/ugc.cy.js                           |  111 ++
 it/cypress/fixtures/example.json                   |    5 -
 .../__image_snapshots__/auth--401-page #0.png      |  Bin 31196 -> 0 bytes
 .../__image_snapshots__/auth--403-page #0.png      |  Bin 31196 -> 0 bytes
 .../__image_snapshots__/auth--home-page #0.png     |  Bin 68613 -> 0 bytes
 .../__image_snapshots__/auth--login-page #0.png    |  Bin 49213 -> 0 bytes
 .../__image_snapshots__/authoring--index #0.png    |  Bin 182505 -> 0 bytes
 .../__image_snapshots__/taxonomy--delete #0.png    |  Bin 44123 -> 0 bytes
 .../__image_snapshots__/taxonomy--edit #0.png      |  Bin 55684 -> 0 bytes
 .../taxonomy--edit-dialog #0.png                   |  Bin 40967 -> 0 bytes
 .../__image_snapshots__/taxonomy--list #0.png      |  Bin 54060 -> 0 bytes
 .../taxonomy--new-tag-dialog #0.png                |  Bin 43908 -> 0 bytes
 .../__image_snapshots__/taxonomy--save #0.png      |  Bin 27230 -> 0 bytes
 .../taxonomy--with-new-item #0.png                 |  Bin 64213 -> 0 bytes
 it/cypress/integration/authoring.spec.js           |   71 -
 it/cypress/support/{commands.js => e2e.js}         |    4 +-
 it/cypress/util/component-test-helper.js           |  118 ++
 .../{plugins/index.js => util/test-helper.js}      |   36 +-
 it/package-lock.json                               | 1883 +++++++++-----------
 it/package.json                                    |   14 +-
 .../forms/actions/sendemail/sendemail.jsp          |    8 +-
 .../forms/actions/updateprofile/updateprofile.jsp  |    2 +-
 .../usergeneratedcontent/usergeneratedcontent.jsp  |   18 +-
 .../components/forms/fields/honeypot/honeypot.jsp  |    6 +-
 .../components/forms/fields/selection/edit.json    |    5 +-
 .../forms/fields/selection/selection.jsp           |   18 +-
 .../components/forms/fields/textarea/textarea.jsp  |    6 +-
 .../forms/fields/textfield/textfield.jsp           |   12 +-
 .../apps/reference/components/forms/form/form.jsp  |   16 +-
 .../reference/components/forms/login/login.jsp     |   18 +-
 .../forms/providers/userprofile/userprofile.jsp    |    2 +-
 .../general/columncontrol/columncontrol.jsp        |    4 +-
 .../reference/components/general/image/image.jsp   |    2 +-
 .../reference/components/general/list/list.jsp     |    4 +-
 .../components/general/list/pagination.jsp         |   20 +-
 .../components/general/reference/types.jsp         |    2 +-
 .../reference/components/general/rss/rss.xml.jsp   |   16 +-
 .../components/general/search/pagination.jsp       |   22 +-
 .../reference/components/general/search/result.jsp |    6 +-
 .../reference/components/general/search/search.jsp |    2 +-
 .../components/general/searchform/searchform.jsp   |    2 +-
 .../components/general/sitemap/sitemap.xml.jsp     |    4 +-
 .../general/suffixheader/suffixheader.jsp          |    4 +-
 .../reference/components/general/tags/tags.jsp     |   10 +-
 .../apps/reference/components/pages/base/head.jsp  |    2 +-
 ui/bnd.bnd                                         |   14 +-
 ui/package-lock.json                               |  110 +-
 ui/package.json                                    |    4 +-
 ui/src/main/frontend/scss/cms.scss                 |    4 +-
 .../components/caconfig/rewriter/config/config.jsp |    4 +-
 .../caconfig/sitesettings/config/config.jsp        |    2 +-
 .../components/cms/actions/basic/basic.jsp         |    4 +-
 .../components/cms/actions/modal/modal.jsp         |    4 +-
 .../cms/columns/localetitle/localetitle.jsp        |    2 +-
 .../sling-cms/components/cms/columns/text/text.jsp |    4 +-
 .../cms/contentactions/contentactions.jsp          |   12 +-
 .../cms/contentbreadcrumb/contentbreadcrumb.jsp    |    2 +-
 .../components/cms/contentgrid/contentgrid.jsp     |   10 +-
 .../components/cms/contenttable/contenttable.jsp   |    4 +-
 .../sling-cms/components/cms/getform/getform.jsp   |    2 +-
 .../components/cms/i18ncontainer/i18ncontainer.jsp |   15 +-
 .../components/cms/optimizefile/optimizefile.jsp   |    2 +-
 .../components/cms/pageeditbar/pageeditbar.jsp     |    5 +-
 .../components/cms/querydebug/querydebug.jsp       |  120 +-
 .../components/cms/references/references.jsp       |    6 +-
 .../components/cms/startcontent/search.jsp         |    4 +-
 .../components/cms/startcontent/startcontent.jsp   |    2 +-
 .../components/cms/staticnav/staticnav.jsp         |    6 +-
 .../components/cms/suffixswitch/suffixswitch.jsp   |    2 +-
 .../sling-cms/components/cms/tilecard/tilecard.jsp |    2 +-
 .../cms/versionmanager/versionmanager.jsp          |    6 +-
 .../editor/fields/auth/members/options.jsp         |    2 +-
 .../editor/fields/auth/membership/options.jsp      |    2 +-
 .../components/editor/fields/base/base.jsp         |    2 +-
 .../components/editor/fields/combobox/options.jsp  |    2 +-
 .../components/editor/fields/combobox/values.jsp   |    2 +-
 .../components/editor/fields/labelfield/field.jsp  |    2 +-
 .../components/editor/fields/path/path.jsp         |    2 +-
 .../editor/fields/references/references.jsp        |   10 +-
 .../components/editor/fields/repeating/field.jsp   |    5 +-
 .../editor/fields/resourceparam/resourceparam.jsp  |    2 +-
 .../fields/richtext/toolbar/button/button.jsp      |    8 +-
 .../components/editor/fields/taxonomy/options.jsp  |    4 +-
 .../components/editor/fields/text/field.jsp        |    2 +-
 .../components/editor/fields/well/well.jsp         |    6 +-
 .../editor/scripts/componentConfigOptions.jsp      |    2 +-
 .../editor/scripts/configResourceTypeOptions.jsp   |    4 +-
 .../components/editor/scripts/localeOptions.jsp    |    4 +-
 .../editor/scripts/pageTemplateOptions.jsp         |    4 +-
 .../editor/scripts/resourceTypeOptions.jsp         |    4 +-
 .../components/editor/slingform/slingform.jsp      |    4 +-
 .../components/general/container/container.jsp     |    2 +-
 .../components/general/textelement/textelement.jsp |    6 +-
 .../components/insights/insight/insight.jsp        |    8 +-
 .../libs/sling-cms/components/jobs/jobOptions.jsp  |    5 +-
 .../libs/sling-cms/components/jobs/list/list.jsp   |    6 +-
 .../libs/sling-cms/components/jobs/view/view.jsp   |    7 +-
 .../libs/sling-cms/components/pages/base/head.jsp  |   26 +-
 .../libs/sling-cms/components/pages/base/nav.jsp   |    6 +-
 .../libs/sling-cms/components/pages/error/body.jsp |    2 +-
 .../libs/sling-cms/components/pages/error/nav.jsp  |    2 +-
 .../components/publication/agent/agent.jsp         |    6 +-
 .../publication/configuration/configuration.jsp    |    2 +-
 .../components/publication/exporter/exporter.jsp   |    2 +-
 .../sling-cms/components/publication/home/home.jsp |    2 +-
 .../components/publication/importer/importer.jsp   |    2 +-
 .../thumbnails/transformation/config/config.jsp    |    2 +-
 117 files changed, 2241 insertions(+), 1574 deletions(-)

diff --git a/it/cypress/support/index.js b/it/cypress.config.js
similarity index 59%
rename from it/cypress/support/index.js
rename to it/cypress.config.js
index 45c6bcbd..93d8ce7c 100644
--- a/it/cypress/support/index.js
+++ b/it/cypress.config.js
@@ -16,10 +16,23 @@
  * specific language governing permissions and limitations
  * under the License.
  */
+const { defineConfig } = require("cypress");
+const { pa11y, prepareAudit } = require("@cypress-audit/pa11y");
 
-import "./commands";
-import "cypress-plugin-snapshots/commands";
+module.exports = defineConfig({
+  e2e: {
+    baseUrl: "http://localhost:8080",
+    viewportWidth: 1000,
+    viewportHeight: 660,
+    excludeSpecPattern: ["**/__snapshots__/*", "**/__image_snapshots__/*"],
+    setupNodeEvents(on, _config) {
+      on("before:browser:launch", (_browser = {}, launchOptions) => {
+        prepareAudit(launchOptions);
+      });
 
-Cypress.Cookies.defaults({
-  preserve: "sling.formauth",
+      on("task", {
+        pa11y: pa11y(console.log.bind(console)),
+      });
+    },
+  },
 });
diff --git a/it/cypress.json b/it/cypress.json
deleted file mode 100644
index 66d32621..00000000
--- a/it/cypress.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
-  "baseUrl": "http://localhost:8080",
-  "viewportWidth": 1000,
-  "viewportHeight": 660,
-  "ignoreTestFiles": ["**/__snapshots__/*", "**/__image_snapshots__/*"],
-  "chromeWebSecurity": false
-}
diff --git a/it/cypress/e2e/admin.cy.js b/it/cypress/e2e/admin.cy.js
new file mode 100644
index 00000000..e5dbfb23
--- /dev/null
+++ b/it/cypress/e2e/admin.cy.js
@@ -0,0 +1,184 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+const { login } = require("../util/test-helper");
+const { doneLoading } = require("../utils");
+
+describe("Reference Component Tests", () => {
+  beforeEach(() => {
+    login();
+  });
+  describe("home", () => {
+    it("basic", () => {
+      cy.visit("/cms/start.html");
+      cy.get(
+        'form[action="/mnt/overlay/sling-cms/content/start/jcr:content/container/scrollcontainer/recent.search.html"]'
+      ).should("be.visible");
+      cy.get('nav[aria-label="Manage"]').should("be.visible");
+      cy.get('nav[aria-label="Tools"]').should("be.visible");
+      cy.pa11y();
+    });
+
+    it("profile", () => {
+      cy.visit("/cms/start.html");
+      cy.get(".navbar-burger").click();
+      cy.get('.navbar a[data-title="User Profile"]').click();
+      doneLoading();
+      cy.get(".modal").should("be.visible");
+    });
+  });
+  describe("Tools", () => {
+    it("Bulk Replace", () => {
+      cy.visit("/cms/admin/bulkreplace.html");
+      cy.pa11y();
+
+      cy.get("input[name='suffix'").type("/content");
+      cy.get("button[type=submit]").click();
+
+      cy.get('input[name="updateProperties"]').type("haystack");
+      cy.get('input[name="find"]').type("noodle");
+      cy.get('input[name="find"]').type("needle");
+      cy.get("button[type=submit]").click();
+      doneLoading();
+    });
+
+    it("Config", () => {
+      cy.visit("/cms/config/configs.html/conf");
+      cy.get('a[data-title="Add Config Context"]').should("be.visible");
+
+      cy.visit("/cms/config/buckets.html/conf/global");
+      cy.get('a[data-title="Add Bucket"]').should("be.visible");
+
+      cy.visit("/cms/config/bucket.html/conf/global/files");
+      cy.get('a[data-title="Add Config"]').should("be.visible");
+
+      cy.visit("/cms/config/edit.html/conf/global/files/editors");
+      cy.get("a.action-button").should("be.visible");
+      cy.pa11y();
+
+      cy.visit("/cms/config/edit.html/conf/global/files/transformations");
+      cy.get('a[data-title="Add Transformation"]').should("be.visible");
+
+      cy.visit(
+        "/cms/transformations/edit.html/conf/global/files/transformations/sling-cms-thumbnail"
+      );
+      cy.get("a.action-button").should("be.visible");
+      cy.pa11y();
+
+      cy.visit("/cms/config/bucket.html/conf/global/site");
+      cy.get('a[data-title="Add Config"]').should("be.visible");
+
+      cy.visit("/cms/config/edit.html/conf/global/site/policies");
+      cy.get("a.action-button").should("be.visible");
+      cy.pa11y();
+
+      cy.visit("/cms/config/edit.html/conf/global/site/rewrite");
+      cy.get("a.action-button").should("be.visible");
+      cy.pa11y();
+
+      cy.visit("/cms/config/edit.html/conf/global/site/settings");
+      cy.get("a.action-button").should("be.visible");
+      cy.pa11y();
+
+      cy.visit("/cms/config/edit.html/conf/global/site/templates");
+      cy.get('a[data-title="Add Template"]').should("be.visible");
+
+      cy.visit("/cms/template/edit.html/conf/global/site/templates/fragment");
+      cy.get("a.action-button").should("be.visible");
+      cy.pa11y();
+    });
+
+    it("i18n", () => {
+      cy.visit("/cms/i18n/dictionaries.html/apps/reference");
+      cy.get('a[data-title="Add i18n Dictionary"]').should("be.visible");
+      cy.get("main td[data-value='/apps/reference/i18n'] a").click();
+
+      cy.get('a[data-title="Add Language"]').should("be.visible");
+      cy.get('a[data-title="Add Entry"]').should("be.visible");
+      cy.get("button.is-primary").should("be.visible");
+    });
+
+    it("Jobs", () => {
+      cy.visit("/cms/jobs/list.html");
+      cy.get('a[data-title="Add Start Job"]').click();
+      cy.get("select[name='_job']").select("Bulk Publication");
+
+      cy.get(".repeating__add").click();
+      cy.get(".repeating__container input[name=paths]").type(
+        "/content/not/a/path"
+      );
+      cy.get("button[type=submit]").click();
+      doneLoading();
+      cy.wait(2000);
+      cy.get(".modal .close-modal.is-primary").click();
+      cy.get(".Main-Content tbody tr:first-child td:nth-child(2) a").click();
+      cy.get("dl").should("be.visible");
+      cy.pa11y();
+    });
+
+    it("Load Content", () => {
+      cy.visit("/cms/admin/loadcontent.html");
+      cy.pa11y();
+
+      cy.get("input[name='suffix'").type("/content/it");
+      cy.get("button[type=submit]").click();
+
+      const text = JSON.stringify({ "jcr:primaryType": "sling:Folder" });
+      cy.get("textarea[name=':content']").type(text, {
+        parseSpecialCharSequences: false,
+      });
+      cy.get("button[type=submit]").click();
+      doneLoading();
+      cy.pa11y();
+    });
+
+    it("Publication", () => {
+      cy.visit("/cms/publication/home.html");
+      cy.pa11y();
+    });
+
+    it("Query Debugger", () => {
+      cy.visit("/cms/admin/querydebug.html");
+
+      cy.get('textarea[name="statement"]').type("SELECT * FROM [sling:Page]");
+      cy.get("button[type=submit]").click();
+
+      doneLoading();
+      cy.get("#query-debug dl").should("be.visible");
+    });
+
+    it("Static", () => {
+      cy.visit("/cms/static/content.html/static/clientlibs/sling-cms");
+      cy.get('a[data-title="Add File"]').should("be.visible");
+      cy.get('a[data-title="Add Folder"]').should("be.visible");
+    });
+
+    it("Users/Groups", () => {
+      cy.visit("/cms/auth/list.html/home/users");
+
+      cy.get('a[data-title="Add User"]').click();
+      cy.get(".modal").should("be.visible");
+
+      cy.visit("/cms/auth/list.html/home/groups");
+
+      cy.get('a[data-title="Add Group"]').click();
+      cy.get(".modal").should("be.visible");
+    });
+  });
+});
diff --git a/it/cypress/integration/auth.spec.js b/it/cypress/e2e/auth.cy.js
similarity index 80%
rename from it/cypress/integration/auth.spec.js
rename to it/cypress/e2e/auth.cy.js
index 0dc0325f..8736e939 100644
--- a/it/cypress/integration/auth.spec.js
+++ b/it/cypress/e2e/auth.cy.js
@@ -18,7 +18,7 @@
  */
 
 const { expect } = require("chai");
-const lighthouseConfig = require("../lighthouse-cfg.json");
+const { login } = require("../utils");
 
 describe("Authorization Tests", () => {
   it("validate 403", () => {
@@ -28,31 +28,25 @@ describe("Authorization Tests", () => {
   });
   it("recieve error page", () => {
     cy.visit("/", { failOnStatusCode: false });
-    cy.document().toMatchImageSnapshot({ name: "auth--403-page" });
-
     cy.pa11y();
   });
   it("can click to login", () => {
+    cy.visit("/", { failOnStatusCode: false });
     cy.get("a").click();
-    cy.document().toMatchImageSnapshot({ name: "auth--login-page" });
+    cy.url().should("contain", "/system/sling/form/login");
     cy.pa11y();
-  });
-  it("can login", () => {
     cy.get("input[name=j_username]").invoke("attr", "value", "admin");
     cy.get("input[name=j_password]").invoke("attr", "value", "admin");
     cy.get("form").submit();
     cy.url().should("contain", "/cms/start.html");
-    cy.document().toMatchImageSnapshot({ name: "auth--home-page" });
-
-    cy.lighthouse(lighthouseConfig);
     cy.pa11y();
   });
   it("can logout", () => {
+    login();
+    cy.visit("/cms/start.html");
     cy.get(".navbar-burger").click();
     cy.get(".navbar-menu").should("be.visible");
     cy.get('a[href="/system/sling/logout"]').click();
-    cy.document().toMatchImageSnapshot({ name: "auth--401-page" });
-
     cy.pa11y();
   });
 });
diff --git a/it/cypress/e2e/authoring.cy.js b/it/cypress/e2e/authoring.cy.js
new file mode 100644
index 00000000..122d01a9
--- /dev/null
+++ b/it/cypress/e2e/authoring.cy.js
@@ -0,0 +1,116 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+const { doneLoading } = require("../utils");
+const { login, sendPost } = require("../util/test-helper");
+
+describe("Authoring Tests", () => {
+  before(() => {
+    login();
+    sendPost("/content/apache/sling-apache-org/it", {
+      ":operation": "delete",
+    });
+  });
+  beforeEach(() => {
+    login();
+  });
+  it("validate editor", () => {
+    cy.visit("/cms/page/edit.html/content/apache/sling-apache-org/index");
+    cy.get("iframe").should("not.be.undefined");
+  });
+
+  it("validate site view", () => {
+    cy.visit("/cms/site/sites.html/content");
+    cy.pa11y();
+  });
+
+  it("validate contents view", () => {
+    cy.visit("/cms/site/sites.html/content/apache");
+    cy.pa11y();
+  });
+
+  it("validate add page", () => {
+    cy.visit("/cms/site/content.html/content/apache/sling-apache-org");
+
+    cy.get('.level .buttons a[data-title="Add Page"]').click();
+
+    doneLoading();
+    cy.get("select[name=pageTemplate]").select("Base Page");
+
+    cy.get("input[name=title]").type("Integration Test");
+    cy.get('input[name=":name"]').type("it");
+
+    cy.get(".modal .is-primary").click();
+    doneLoading();
+
+    cy.get(".modal .close-modal.is-primary").click();
+    doneLoading();
+    cy.get('.card[data-value="/content/apache/sling-apache-org/it"]').should(
+      "not.be.undefined"
+    );
+
+    cy.visit("/cms/site/content.html/content/apache/sling-apache-org");
+    cy.get('.card[data-value="/content/apache/sling-apache-org/it"]').click();
+    cy.get('.level a[data-title="Delete the specified page"]').click();
+    doneLoading();
+    cy.get(".modal .is-primary").click();
+    doneLoading();
+    cy.get(".modal .close-modal.is-primary").click();
+  });
+
+  it("can view page references", () => {
+    cy.visit("/cms/site/content.html/content/apache/sling-apache-org");
+    cy.get(
+      '.card[data-value="/content/apache/sling-apache-org/index"]'
+    ).click();
+    cy.get('.level .buttons a[data-title="References"]').click();
+    doneLoading();
+    cy.get(".modal .modal-title").should("not.be.undefined");
+  });
+
+  it("can manage page versions", () => {
+    cy.visit("/cms/site/content.html/content/apache/sling-apache-org");
+    cy.get(
+      '.card[data-value="/content/apache/sling-apache-org/index"]'
+    ).click();
+    cy.get('.level .buttons a[data-title="Manage Versions"]').click();
+    doneLoading();
+    cy.get(".modal .modal-title").should("not.be.undefined");
+    cy.get(".modal .versionmanager>form button[type=submit]").click();
+    doneLoading();
+    cy.get(".modal .close-modal.is-primary").click();
+    cy.get(
+      '.card[data-value="/content/apache/sling-apache-org/index"]'
+    ).click();
+    cy.get('.level .buttons a[data-title="Manage Versions"]').click();
+    cy.get(".modal .modal-title").should("not.be.undefined");
+  });
+
+  it("can view move/copy", () => {
+    cy.visit("/cms/site/content.html/content/apache/sling-apache-org");
+    cy.get(
+      '.card[data-value="/content/apache/sling-apache-org/index"]'
+    ).click();
+    cy.get('.level .buttons a[data-title="Move / Copy Page"]').click();
+    doneLoading();
+    cy.get(".modal .modal-title").should("not.be.undefined");
+    cy.get("input[name=':dest']").should("not.be.undefined");
+    cy.get("input[name=':operation']").should("not.be.undefined");
+  });
+});
diff --git a/it/cypress/e2e/editor.cy.js b/it/cypress/e2e/editor.cy.js
new file mode 100644
index 00000000..133b5298
--- /dev/null
+++ b/it/cypress/e2e/editor.cy.js
@@ -0,0 +1,138 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+const { doneLoading } = require("../utils");
+const { login, sendPost } = require("../util/test-helper");
+
+function setupBasicTest(componentName, properties, subpath = "") {
+  const body = {
+    "jcr:primaryType": "nt:unstructured",
+    "sling:resourceType": "sling-cms/components/editor/slingform",
+    button: "Save",
+    "fields/jcr:primaryType": "nt:unstructured",
+    "fields/sling:resourceType": "sling-cms/components/general/container",
+    "fields/field/jcr:primaryType": "nt:unstructured",
+    "fields/field/sling:resourceType": `sling-cms/components/editor/fields/${subpath}${componentName}`,
+  };
+
+  Object.keys(properties).forEach((k) => {
+    body[`fields/field/${k}`] = properties[k];
+  });
+  sendPost(`/apps/it/${componentName}-basic`, body);
+
+  cy.visit(
+    `/cms/editor/edit.html/content/apache/sling-apache-org/it?editor=/apps/it/${componentName}-basic`
+  );
+}
+
+describe("Editor", () => {
+  before(() => {
+    login();
+    sendPost("/apps/it", {
+      ":operation": "delete",
+    });
+    sendPost("/apps/it", {
+      "jcr:primaryType": "sling:Folder",
+    });
+    sendPost("/content/apache/sling-apache-org/it", {
+      ":operation": "delete",
+    });
+    sendPost("/content/apache/sling-apache-org/it", {
+      "jcr:primaryType": "sling:Folder",
+      "jcr:content/jcr:primaryType": "nt:unstructured",
+    });
+  });
+  beforeEach(() => {
+    login();
+  });
+  describe("Fields", () => {
+    it("members", () => {
+      setupBasicTest("members", { name: "test" }, "auth/");
+      cy.get("input[name=test]").should("not.be.undefined");
+    });
+    it("membership", () => {
+      setupBasicTest("membership", { name: "test" }, "auth/");
+      cy.get("input[name=test]").should("not.be.undefined");
+    });
+    it("combobox", () => {
+      setupBasicTest("combobox", { label: "Test", name: "test" });
+      cy.get("input[name=test]").should("not.be.undefined");
+      cy.get("label[for=test]").should("not.be.undefined");
+    });
+    it("path", () => {
+      setupBasicTest("path", {
+        label: "Test",
+        name: "test",
+        basePath: "/content",
+        type: "page",
+      });
+      cy.get("input[name=test]").should("not.be.undefined");
+      cy.get("label[for=test]").should("not.be.undefined");
+      cy.get(".search-button").click();
+      doneLoading();
+      cy.get(".modal input[name=term]").type("apache");
+      cy.get(".modal select[name=type]").select("All");
+      cy.get(".modal button[type=submit]").click();
+      doneLoading();
+      cy.get(".modal .tile").should("not.be.undefined");
+    });
+    it("repeating", () => {
+      setupBasicTest("repeating", {
+        label: "Test",
+        name: "test",
+      });
+      cy.get("input[name=test]").should("not.be.undefined");
+      cy.get("label[for=test]").should("not.be.undefined");
+      cy.get("button.repeating__add").click();
+      cy.get(".repeating__container button.repeating__remove").click();
+    });
+    it("taxonomy", () => {
+      setupBasicTest("taxonomy", {
+        label: "Test",
+        name: "test",
+        basePath: "/etc/taxonomy",
+      });
+      cy.get("label[for=test]").should("not.be.undefined");
+      cy.get(".labelfield__field input[type=text]").type(
+        "/etc/taxonomy/reference"
+      );
+      cy.get(".labelfield__add").click();
+      cy.get('a[title="/etc/taxonomy/reference"]').should("not.be.undefined");
+      cy.get('a[title="/etc/taxonomy/reference"] button.delete').click();
+    });
+    it("text", () => {
+      setupBasicTest("text", {
+        label: "Test",
+        name: "test",
+      });
+      cy.get("label[for=test]").should("not.be.undefined");
+      cy.get("input[name=test]").should("not.be.undefined");
+    });
+    it("well", () => {
+      setupBasicTest("well", {
+        title: "Test",
+        collapse: "true",
+        "collapse@TypeHint": "Boolean",
+      });
+      cy.get(".card-content").should("not.be.visible");
+      cy.get(".card-header").click();
+      cy.get(".card-content").should("be.visible");
+    });
+  });
+});
diff --git a/it/cypress/e2e/reference/form.cy.js b/it/cypress/e2e/reference/form.cy.js
new file mode 100644
index 00000000..03e135ed
--- /dev/null
+++ b/it/cypress/e2e/reference/form.cy.js
@@ -0,0 +1,153 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+const { setupBasicTest, xssTest } = require("./utils");
+const { login, sendPost } = require("../../util/test-helper");
+
+describe("Reference Form Component Tests", () => {
+  before(() => {
+    login();
+    sendPost("/content/apache/sling-apache-org/it", {
+      ":operation": "delete",
+    });
+
+    sendPost("/content/apache/sling-apache-org/it", {
+      "jcr:primaryType": "sling:Folder",
+    });
+  });
+  beforeEach(() => {
+    login();
+  });
+
+  describe("Actions", () => {
+    describe("sendemail", () => {
+      it("basic", () => {
+        setupBasicTest("sendemail", "forms/actions/sendemail");
+      });
+      it("xss", () => {
+        xssTest("sendemail", "forms/actions/sendemail");
+      });
+    });
+
+    describe("updateprofile", () => {
+      it("basic", () => {
+        setupBasicTest("updateprofile", "forms/actions/updateprofile");
+      });
+      it("xss", () => {
+        xssTest("updateprofile", "forms/actions/updateprofile");
+      });
+    });
+
+    describe("usergeneratedcontent", () => {
+      it("basic", () => {
+        setupBasicTest(
+          "usergeneratedcontent",
+          "forms/actions/usergeneratedcontent"
+        );
+      });
+      it("xss", () => {
+        xssTest(
+          "honeypousergeneratedcontent",
+          "forms/actions/usergeneratedcontent"
+        );
+      });
+    });
+  });
+
+  describe("Fields", () => {
+    describe("honeypot", () => {
+      it("basic", () => {
+        setupBasicTest("honeypot", "forms/fields/honeypot");
+        cy.get(".main .honeypot-basic textarea");
+      });
+      it("xss", () => {
+        xssTest("honeypot", "forms/fields/honeypot");
+      });
+    });
+
+    describe("selection", () => {
+      it("basic", () => {
+        setupBasicTest("selection", "forms/fields/selection");
+        cy.get(".main select[name=selection-basic]");
+      });
+      it("xss", () => {
+        xssTest("selection", "forms/fields/selection");
+      });
+    });
+
+    describe("textarea", () => {
+      it("basic", () => {
+        setupBasicTest("textarea", "forms/fields/textarea");
+        cy.get(".main textarea[name=textarea-basic]");
+      });
+      it("xss", () => {
+        xssTest("textarea", "forms/fields/textarea");
+      });
+    });
+
+    describe("textfield", () => {
+      it("basic", () => {
+        setupBasicTest("textfield", "forms/fields/textfield");
+        cy.get(".main input[name=textfield-basic]");
+      });
+      it("xss", () => {
+        xssTest("textfield", "forms/fields/textfield");
+      });
+    });
+  });
+
+  describe("Providers", () => {
+    describe("userprofile", () => {
+      it("basic", () => {
+        setupBasicTest("profile", "forms/providers/userprofile");
+      });
+      it("xss", () => {
+        xssTest("profile", "forms/providers/userprofile");
+      });
+    });
+  });
+
+  describe("fieldset", () => {
+    it("basic", () => {
+      setupBasicTest("fieldset", "forms/fieldset");
+      cy.get(".main fieldset");
+    });
+    it("xss", () => {
+      xssTest("fieldset", "forms/fieldset");
+    });
+  });
+  describe("form", () => {
+    it("basic", () => {
+      setupBasicTest("login", "forms/form");
+      cy.get(".main form[data-analytics-id]");
+    });
+    it("xss", () => {
+      xssTest("form", "forms/form");
+    });
+  });
+  describe("login", () => {
+    it("basic", () => {
+      setupBasicTest("login", "forms/login");
+      cy.get(".main form[data-analytics-id='Login Form']");
+    });
+    it("xss", () => {
+      xssTest("login", "forms/login");
+    });
+  });
+});
diff --git a/it/cypress/e2e/reference/general.cy.js b/it/cypress/e2e/reference/general.cy.js
new file mode 100644
index 00000000..be77d47f
--- /dev/null
+++ b/it/cypress/e2e/reference/general.cy.js
@@ -0,0 +1,99 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+const { setupBasicTest, xssTest } = require("./utils");
+const {
+  createComponentPage,
+  configureComponentFromDialog,
+  COMPONENT_SUBPATH,
+} = require("../../util/component-test-helper");
+const { login, sendPost } = require("../../util/test-helper");
+
+describe("Reference General Component Tests", () => {
+  before(() => {
+    login();
+    sendPost("/content/apache/sling-apache-org/it", {
+      ":operation": "delete",
+    });
+
+    sendPost("/content/apache/sling-apache-org/it", {
+      "jcr:primaryType": "sling:Folder",
+    });
+  });
+  beforeEach(() => {
+    login();
+  });
+
+  describe("columncontrol", () => {
+    it("basic", () => {
+      setupBasicTest("columncontrol", "general/columncontrol");
+    });
+    it("xss", () => {
+      xssTest("columncontrol", "general/columncontrol");
+    });
+  });
+
+  describe("list", () => {
+    it("basic", () => {
+      setupBasicTest("list", "general/list", {
+        query: "SELECT * FROM [sling:Page]",
+        limit: "10",
+        tag: "div",
+      });
+    });
+    it("xss", () => {
+      xssTest("list", "general/list", {
+        query: "SELECT * FROM [sling:Page]",
+        limit: "10",
+      });
+    });
+  });
+
+  describe("RSS", () => {
+    it("basic", () => {
+      sendPost("/content/apache/sling-apache-org/it/feed-basic", {
+        "jcr:primaryType": "sling:Folder",
+        "sling:resourceType": "reference/components/general/rss",
+      });
+      cy.request("/content/apache/sling-apache-org/it/feed-basic.rss.xml").then(
+        (response) => {
+          const parser = new DOMParser();
+          parser.parseFromString(response.body, "text/xml");
+        }
+      );
+    });
+  });
+
+  describe("Search", () => {
+    it("basic", () => {
+      const page = createComponentPage(`search-basic`, {
+        "jcr:primaryType": "nt:unstructured",
+        "sling:resourceType": `reference/components/general/search`,
+      });
+      configureComponentFromDialog(
+        `${page}${COMPONENT_SUBPATH}`,
+        `/apps/reference/components/general/search/edit`,
+        "reference",
+        `search-basic`,
+        { limit: "2", basePath: "/content" }
+      );
+      cy.visit(`${page}.html?q=apache`);
+    });
+  });
+});
diff --git a/it/cypress/e2e/reference/utils.js b/it/cypress/e2e/reference/utils.js
new file mode 100644
index 00000000..fe5a434a
--- /dev/null
+++ b/it/cypress/e2e/reference/utils.js
@@ -0,0 +1,76 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+const {
+  createComponentPage,
+  configureComponentFromDialog,
+  COMPONENT_SUBPATH,
+  XSS_PAYLOAD,
+} = require("../../util/component-test-helper");
+
+export function assertNoAlert() {
+  let spy = cy.spy(window, "alert");
+  cy.wait(500).then(() => {
+    expect(spy).to.haveOwnProperty("callCount");
+    expect(spy).to.not.be.called;
+  });
+}
+
+/**
+ * Sets up a basic test by creating a page with the single component on it
+ * @param {string} componentName the name of the component
+ * @param {string} subpath the path of the component under reference/components/
+ * @param {Record<string,string> | undefined} additionalProperties any additional properties to pass into the configuration step
+ */
+export function setupBasicTest(componentName, subpath, additionalProperties) {
+  const page = createComponentPage(`${componentName}-basic`, {
+    "jcr:primaryType": "nt:unstructured",
+    "sling:resourceType": `reference/components/${subpath}`,
+  });
+  configureComponentFromDialog(
+    `${page}${COMPONENT_SUBPATH}`,
+    `/apps/reference/components/${subpath}/edit`,
+    "reference",
+    `${componentName}-basic`,
+    additionalProperties
+  );
+  cy.visit(`${page}.html`);
+}
+
+/**
+ * Sets up a basic test using the XSS payload and verifies no alerts appear
+ * @param {string} componentName the name of the component
+ * @param {string} subpath the path of the component under reference/components/
+ * @param {Record<string,string> | undefined} additionalProperties any additional properties to pass into the configuration step
+ */
+export function xssTest(componentName, subpath, additionalProperties) {
+  const page = createComponentPage(`${componentName}-xss`, {
+    "jcr:primaryType": "nt:unstructured",
+    "sling:resourceType": `reference/components/${subpath}`,
+  });
+  configureComponentFromDialog(
+    `${page}${COMPONENT_SUBPATH}`,
+    `/apps/reference/components/${subpath}/edit`,
+    "reference",
+    XSS_PAYLOAD,
+    additionalProperties
+  );
+  cy.visit(`${page}.html`);
+  assertNoAlert();
+}
diff --git a/it/cypress/integration/taxonomy.spec.js b/it/cypress/e2e/taxonomy.cy.js
similarity index 73%
rename from it/cypress/integration/taxonomy.spec.js
rename to it/cypress/e2e/taxonomy.cy.js
index 542b0e98..35c71757 100644
--- a/it/cypress/integration/taxonomy.spec.js
+++ b/it/cypress/e2e/taxonomy.cy.js
@@ -17,23 +17,18 @@
  * under the License.
  */
 
-const lighthouseConfig = require("../lighthouse-cfg.json");
-const { doneLoading, login } = require("../utils");
+const { login } = require("../util/test-helper");
+const { doneLoading } = require("../utils");
 
 describe("Taxonomy Tests", () => {
   beforeEach(() => {
     login();
   });
   it("view taxonomy list", () => {
+    cy.visit("/cms/start.html");
     cy.get(".toggle-Manage").click();
     cy.get(".nav-link-Taxonomy").click();
     cy.url().should("contain", "/cms/taxonomy/list.html/etc/taxonomy");
-
-    cy.document().toMatchImageSnapshot({
-      name: "taxonomy--list",
-      blackout: ["td[data-property=lastModified]"],
-    });
-
     cy.pa11y();
   });
   it("show select taxonomy item", () => {
@@ -45,10 +40,6 @@ describe("Taxonomy Tests", () => {
       "be.visible"
     );
     cy.get('.has-addons>a[title="Delete Taxonomy Item"]').should("be.visible");
-    cy.document().toMatchImageSnapshot({
-      name: "taxonomy--edit",
-      blackout: ["td[data-property=lastModified]"],
-    });
   });
   it("should show allow for editing", () => {
     cy.visit("/cms/taxonomy/list.html/etc/taxonomy");
@@ -56,20 +47,12 @@ describe("Taxonomy Tests", () => {
     cy.get('.has-addons>a[title="Edit Taxonomy Item"]').click();
     cy.get('input[name="jcr:title"]').should("be.visible");
     cy.pa11y();
-    cy.document().toMatchImageSnapshot({
-      name: "taxonomy--edit-dialog",
-      blackout: ["td[data-property=lastModified]"],
-    });
 
     cy.get('input[name="jcr:title"]').invoke("attr", "value", "Reference2");
     cy.get(".modal .Form-Ajax").submit();
 
     cy.get(".close-modal.is-primary").should("be.visible");
-    cy.document().toMatchImageSnapshot({
-      name: "taxonomy--save",
-      blackout: ["td[data-property=lastModified]"],
-    });
-    cy.lighthouse(lighthouseConfig);
+    cy.pa11y();
   });
   it("should show allow for adding new taxonomy item", () => {
     cy.visit("/cms/taxonomy/list.html/etc/taxonomy");
@@ -82,19 +65,11 @@ describe("Taxonomy Tests", () => {
       "A New Reference"
     );
     cy.get('input[name=":name"]').invoke("attr", "value", "new-reference");
-    cy.document().toMatchImageSnapshot({
-      name: "taxonomy--new-tag-dialog",
-      blackout: ["td[data-property=lastModified]"],
-    });
     cy.get(".modal .Form-Ajax").submit();
 
     cy.get(".close-modal.is-primary").should("be.visible");
     cy.get(".close-modal.is-primary").click();
-    doneLoading();
-    cy.document().toMatchImageSnapshot({
-      name: "taxonomy--with-new-item",
-      blackout: ["td[data-property=lastModified]"],
-    });
+    cy.pa11y();
   });
   it("should show allow for adding deleting a taxonomy item", () => {
     cy.visit("/cms/taxonomy/list.html/etc/taxonomy");
@@ -103,14 +78,10 @@ describe("Taxonomy Tests", () => {
 
     doneLoading();
     cy.get(".modal").should("be.visible");
-    cy.document().toMatchImageSnapshot({
-      name: "taxonomy--delete",
-      blackout: ["td[data-property=lastModified]"],
-    });
     cy.get(".modal .Form-Ajax").submit();
-
     cy.get(".close-modal.is-primary").should("be.visible");
     cy.get(".close-modal.is-primary").click();
     doneLoading();
+    cy.pa11y();
   });
 });
diff --git a/it/cypress/e2e/ugc.cy.js b/it/cypress/e2e/ugc.cy.js
new file mode 100644
index 00000000..4fe13889
--- /dev/null
+++ b/it/cypress/e2e/ugc.cy.js
@@ -0,0 +1,111 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+const { doneLoading } = require("../utils");
+const {
+  createComponentPage,
+  configureComponentFromDialog,
+  COMPONENT_SUBPATH,
+  XSS_PAYLOAD,
+} = require("../util/component-test-helper");
+const { login, sendPost } = require("../util/test-helper");
+
+describe("UGC Tests", () => {
+  before(() => {
+    login();
+    sendPost("/content/apache/sling-apache-org/it", {
+      ":operation": "delete",
+    });
+
+    sendPost("/content/apache/sling-apache-org/it", {
+      "jcr:primaryType": "sling:Folder",
+    });
+  });
+  beforeEach(() => {
+    login();
+    sendPost("/etc/usergenerated/it", {
+      ":operation": "delete",
+    });
+  });
+
+  it("Admin UI", () => {
+    cy.visit("/cms/usergenerated/content.html/etc/usergenerated");
+    cy.get('a[data-title="Add Bucket"]').click();
+
+    cy.get("input[name='jcr:content/jcr:title']").type("it");
+    cy.get("input[name=':name']").type("it");
+    cy.get(".modal button[type=submit]").click();
+
+    doneLoading();
+    cy.get(".modal .close-modal.is-primary").click();
+  });
+
+  it("Submission", () => {
+    const page = createComponentPage("ugc", {
+      "jcr:primaryType": "nt:unstructured",
+      submitText: "Submit",
+      successAction: "redirect",
+      successMessage: "Great Success!",
+      "sling:resourceType": "reference/components/forms/form",
+      fields: {
+        "jcr:primaryType": "nt:unstructured",
+        textfield: {
+          "jcr:primaryType": "nt:unstructured",
+          saveAs: "string",
+          required: true,
+          name: "name",
+          type: "text",
+          label: "Name",
+          "sling:resourceType": "reference/components/forms/fields/textfield",
+        },
+      },
+      actions: {
+        "jcr:primaryType": "nt:unstructured",
+        usergeneratedcontent: {
+          "jcr:primaryType": "nt:unstructured",
+          wrapPage: true,
+          bucket: "it",
+          pathDepth: "0",
+          contentType: "OTHER",
+          preview: "Preview!!",
+          name: "coolname",
+          targetPath: "/content",
+          approveAction: "MOVE",
+          "sling:resourceType":
+            "reference/components/forms/actions/usergeneratedcontent",
+        },
+      },
+    });
+
+    cy.visit(`${page}.html`);
+    cy.get('input[name="name"]').type("Hello World");
+    cy.get("button[type=submit]").click();
+    cy.get(".alert").should("be.visible");
+
+    cy.visit("/cms/usergenerated/content.html/etc/usergenerated/it");
+    cy.get("tbody tr:first-child").click();
+    cy.get(".buttons a[title='Review User Generated Content']")
+      .should("have.attr", "href")
+      .then((href) => {
+        cy.visit(href);
+      });
+
+    cy.get("form[data-callback=handleugc]").should("be.visible");
+  });
+});
diff --git a/it/cypress/fixtures/example.json b/it/cypress/fixtures/example.json
deleted file mode 100644
index 02e42543..00000000
--- a/it/cypress/fixtures/example.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
-  "name": "Using fixtures to represent data",
-  "email": "hello@cypress.io",
-  "body": "Fixtures are a great way to mock data for responses to routes"
-}
diff --git a/it/cypress/integration/__image_snapshots__/auth--401-page #0.png b/it/cypress/integration/__image_snapshots__/auth--401-page #0.png
deleted file mode 100644
index 5990ef01..00000000
Binary files a/it/cypress/integration/__image_snapshots__/auth--401-page #0.png and /dev/null differ
diff --git a/it/cypress/integration/__image_snapshots__/auth--403-page #0.png b/it/cypress/integration/__image_snapshots__/auth--403-page #0.png
deleted file mode 100644
index 5990ef01..00000000
Binary files a/it/cypress/integration/__image_snapshots__/auth--403-page #0.png and /dev/null differ
diff --git a/it/cypress/integration/__image_snapshots__/auth--home-page #0.png b/it/cypress/integration/__image_snapshots__/auth--home-page #0.png
deleted file mode 100644
index 0480b636..00000000
Binary files a/it/cypress/integration/__image_snapshots__/auth--home-page #0.png and /dev/null differ
diff --git a/it/cypress/integration/__image_snapshots__/auth--login-page #0.png b/it/cypress/integration/__image_snapshots__/auth--login-page #0.png
deleted file mode 100644
index a4148767..00000000
Binary files a/it/cypress/integration/__image_snapshots__/auth--login-page #0.png and /dev/null differ
diff --git a/it/cypress/integration/__image_snapshots__/authoring--index #0.png b/it/cypress/integration/__image_snapshots__/authoring--index #0.png
deleted file mode 100644
index 9b6aee93..00000000
Binary files a/it/cypress/integration/__image_snapshots__/authoring--index #0.png and /dev/null differ
diff --git a/it/cypress/integration/__image_snapshots__/taxonomy--delete #0.png b/it/cypress/integration/__image_snapshots__/taxonomy--delete #0.png
deleted file mode 100644
index 8049737e..00000000
Binary files a/it/cypress/integration/__image_snapshots__/taxonomy--delete #0.png and /dev/null differ
diff --git a/it/cypress/integration/__image_snapshots__/taxonomy--edit #0.png b/it/cypress/integration/__image_snapshots__/taxonomy--edit #0.png
deleted file mode 100644
index 98501eed..00000000
Binary files a/it/cypress/integration/__image_snapshots__/taxonomy--edit #0.png and /dev/null differ
diff --git a/it/cypress/integration/__image_snapshots__/taxonomy--edit-dialog #0.png b/it/cypress/integration/__image_snapshots__/taxonomy--edit-dialog #0.png
deleted file mode 100644
index 9758889b..00000000
Binary files a/it/cypress/integration/__image_snapshots__/taxonomy--edit-dialog #0.png and /dev/null differ
diff --git a/it/cypress/integration/__image_snapshots__/taxonomy--list #0.png b/it/cypress/integration/__image_snapshots__/taxonomy--list #0.png
deleted file mode 100644
index d3d6f099..00000000
Binary files a/it/cypress/integration/__image_snapshots__/taxonomy--list #0.png and /dev/null differ
diff --git a/it/cypress/integration/__image_snapshots__/taxonomy--new-tag-dialog #0.png b/it/cypress/integration/__image_snapshots__/taxonomy--new-tag-dialog #0.png
deleted file mode 100644
index 56b81cd9..00000000
Binary files a/it/cypress/integration/__image_snapshots__/taxonomy--new-tag-dialog #0.png and /dev/null differ
diff --git a/it/cypress/integration/__image_snapshots__/taxonomy--save #0.png b/it/cypress/integration/__image_snapshots__/taxonomy--save #0.png
deleted file mode 100644
index e212d3be..00000000
Binary files a/it/cypress/integration/__image_snapshots__/taxonomy--save #0.png and /dev/null differ
diff --git a/it/cypress/integration/__image_snapshots__/taxonomy--with-new-item #0.png b/it/cypress/integration/__image_snapshots__/taxonomy--with-new-item #0.png
deleted file mode 100644
index b0024ed4..00000000
Binary files a/it/cypress/integration/__image_snapshots__/taxonomy--with-new-item #0.png and /dev/null differ
diff --git a/it/cypress/integration/authoring.spec.js b/it/cypress/integration/authoring.spec.js
deleted file mode 100644
index 4ddee3f9..00000000
--- a/it/cypress/integration/authoring.spec.js
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-const { doneLoading, login } = require("../utils");
-
-describe("Authoring Tests", () => {
-  beforeEach(() => {
-    login();
-  });
-  it("validate basic", () => {
-    cy.visit("/cms/page/edit.html/content/apache/sling-apache-org/index");
-
-    cy.document().toMatchImageSnapshot({ name: "authoring--index" });
-  });
-
-  it("validate add page", () => {
-    cy.request({
-      url: "/cms/site/content.html/content/apache/sling-apache-org/it",
-      failOnStatusCode: false,
-    }).then((response) => {
-      console.error(response);
-      if (response.status === 200) {
-        cy.visit("/cms/site/content.html/content/apache/sling-apache-org");
-        cy.get(
-          '.card[data-value="/content/apache/sling-apache-org/it"]'
-        ).click();
-        cy.get('.level a[data-title="Delete the specified page"]').click();
-        doneLoading();
-        cy.get(".modal .is-primary").click();
-        doneLoading();
-        cy.get(".modal .close-modal.is-primary").click();
-      }
-    });
-
-    cy.visit("/cms/site/content.html/content/apache/sling-apache-org");
-
-    cy.get('.level .buttons a[data-title="Add Page"]').click();
-
-    doneLoading();
-    cy.get("select[name=pageTemplate]").select("Base Page");
-
-    cy.get("input[name=title]").type("Integration Test");
-    cy.get('input[name=":name"]').type("it");
-
-    cy.get(".modal .is-primary").click();
-    doneLoading();
-
-    cy.get(".modal .close-modal.is-primary").click();
-    doneLoading();
-    cy.get('.card[data-value="/content/apache/sling-apache-org/it"]').should(
-      "not.be.undefined"
-    );
-  });
-
-});
diff --git a/it/cypress/support/commands.js b/it/cypress/support/e2e.js
similarity index 95%
rename from it/cypress/support/commands.js
rename to it/cypress/support/e2e.js
index fa6a59fc..ce45ac74 100644
--- a/it/cypress/support/commands.js
+++ b/it/cypress/support/e2e.js
@@ -16,6 +16,4 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-
-import "cypress-audit/commands";
-
+import "@cypress-audit/pa11y/commands";
diff --git a/it/cypress/util/component-test-helper.js b/it/cypress/util/component-test-helper.js
new file mode 100644
index 00000000..6c865514
--- /dev/null
+++ b/it/cypress/util/component-test-helper.js
@@ -0,0 +1,118 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+const { v4: uuid } = require("uuid");
+
+const { sendPost } = require("./test-helper");
+
+export const COMPONENT_SUBPATH = "/jcr:content/container/component";
+
+export const XSS_PAYLOAD = '"/><\x3Cscript>javascript:alert(1)</script>';
+
+/**
+ * Creates a page with a single component in it
+ * @param {string} prefix the test prefix
+ * @param {*} componentContent the JSON content for the component
+ * @returns the path to the page
+ */
+export function createComponentPage(prefix, componentContent) {
+  const id = `${prefix}-${uuid()}`;
+  const content = {
+    "jcr:primaryType": "sling:Page",
+    "jcr:content": {
+      "jcr:primaryType": "nt:unstructured",
+      "jcr:title": `IT - ${prefix}`,
+      "sling:template": "/conf/asf/site/templates/base-page",
+      "sling:resourceType": "reference/components/pages/base",
+      published: true,
+      container: {
+        "jcr:primaryType": "nt:unstructured",
+        component: componentContent,
+      },
+    },
+  };
+  const url = `/content/apache/sling-apache-org/it/${id}`;
+  sendPost(url, {
+    ":operation": "import",
+    ":content": JSON.stringify(content),
+    ":contentType": "json",
+  });
+  sendPost(url, {
+    "jcr:primaryType": "sling:Page",
+  });
+  return url;
+}
+
+/**
+ * Configures a component using the dialog values
+ *
+ * @param {string} path the path to the resource to edit
+ * @param {string} editor the editor to read
+ * @param {'ui'|'reference'} project the project to read the editor configuration from
+ * @param {string} defaultValue a value to use for populating fields
+ * @param {Record<string,string>} values a map of values
+ */
+export function configureComponentFromDialog(
+  path,
+  editor,
+  project,
+  defaultValue,
+  values = {}
+) {
+  cy.readFile(`../${project}/src/main/resources/jcr_root/${editor}.json`).then(
+    (dialog) => {
+      cy.visit(`/cms/editor/edit.html${path}?editor=${editor}`);
+      Object.keys(dialog.fields)
+        .filter((k) => !k.includes(":"))
+        .forEach((k) => {
+          const field = dialog.fields[k];
+          switch (field["sling:resourceType"]) {
+            case "sling-cms/components/editor/fields/textarea":
+            case "sling-cms/components/editor/fields/text":
+              cy.get(`*[name=${field.name}]`).type(
+                values[field.name] || defaultValue
+              );
+              break;
+            case "sling-cms/components/editor/fields/select":
+              if (field.options) {
+                const value =
+                  values[field.name] ||
+                  field.options[Object.keys(field.options)[0]].value.toString();
+                cy.get(`select[name=${field.name}]`).select(value);
+              }
+              break;
+            case "sling-cms/components/editor/fields/path":
+              cy.get(`*[name=${field.name}]`).type(
+                values[field.name] ||
+                  `${field.basePath || "/content"}//${defaultValue}`
+              );
+              break;
+            case "sling-cms/components/editor/fields/hidden":
+              // do nothing for hidden fields
+              break;
+            default:
+              console.warn(
+                `Unsupported resource type ${field["sling:resourceType"]}.`
+              );
+          }
+        });
+      cy.get(".Form-Ajax").submit();
+    }
+  );
+}
diff --git a/it/cypress/plugins/index.js b/it/cypress/util/test-helper.js
similarity index 60%
rename from it/cypress/plugins/index.js
rename to it/cypress/util/test-helper.js
index 0c9ad273..93d00920 100644
--- a/it/cypress/plugins/index.js
+++ b/it/cypress/util/test-helper.js
@@ -17,19 +17,29 @@
  * under the License.
  */
 
-const { lighthouse, pa11y, prepareAudit } = require("cypress-audit");
-const { initPlugin } = require("cypress-plugin-snapshots/plugin");
 
-module.exports = (on, config) => {
-  initPlugin(on, config);
-
-  on("before:browser:launch", (browser = {}, launchOptions) => {
-    prepareAudit(launchOptions);
+/**
+ * Sends a post to the specified URL
+ * @param {string} url the URL to which to send the post
+ * @param {Record<string, string>} body the body of the post to send
+ */
+export function sendPost(url, body) {
+  cy.request({
+    method: "POST",
+    url,
+    form: true,
+    body,
+    headers: {
+      Referer: process.env.CYPRESS_BASE_URL || "http://localhost:8080",
+    },
   });
-
-  on("task", {
-    lighthouse: lighthouse(), // calling the function is important
-    pa11y: pa11y(), // calling the function is important
+}
+/**
+ * Login directly by posting to the login endpoint
+ */
+export function login() {
+  sendPost("/j_security_check", {
+    j_username: "admin",
+    j_password: "admin",
   });
-  return config;
-};
+}
diff --git a/it/package-lock.json b/it/package-lock.json
index d827f5de..ced1aff1 100644
--- a/it/package-lock.json
+++ b/it/package-lock.json
@@ -13,11 +13,30 @@
         "regenerator-runtime": "^0.13.4"
       }
     },
+    "@colors/colors": {
+      "version": "1.5.0",
+      "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz",
+      "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==",
+      "optional": true
+    },
+    "@cypress-audit/pa11y": {
+      "version": "1.3.1",
+      "resolved": "https://registry.npmjs.org/@cypress-audit/pa11y/-/pa11y-1.3.1.tgz",
+      "integrity": "sha512-VdyCekQoHWrxQBO9nXYULuMfGsp980V9wmve9cKgh2uQv64xhTH9GyBPOpnEICJcc02vtglclrBqG/DrqjbL7w==",
+      "requires": {
+        "@cypress-audit/shared": "^1.3.1",
+        "pa11y": "^6.2.3"
+      }
+    },
+    "@cypress-audit/shared": {
+      "version": "1.3.1",
+      "resolved": "https://registry.npmjs.org/@cypress-audit/shared/-/shared-1.3.1.tgz",
+      "integrity": "sha512-iE4yGh5hw+ICrP3xZXYmDbNHECyAXyKbpRQ604FvMOxrXQVCBZq24MSKKLLUBAgpcAkv09XCW3utx39OYozVTA=="
+    },
     "@cypress/request": {
-      "version": "2.88.5",
-      "resolved": "https://registry.npmjs.org/@cypress/request/-/request-2.88.5.tgz",
-      "integrity": "sha512-TzEC1XMi1hJkywWpRfD2clreTa/Z+lOrXDCxxBTBPEcY5azdPi56A6Xw+O4tWJnaJH3iIE7G5aDXZC6JgRZLcA==",
-      "dev": true,
+      "version": "2.88.10",
+      "resolved": "https://registry.npmjs.org/@cypress/request/-/request-2.88.10.tgz",
+      "integrity": "sha512-Zp7F+R93N0yZyG34GutyTNr+okam7s/Fzc1+i3kcqOP8vk6OuajuE9qZJ6Rs+10/1JFtXFYMdyarnU1rZuJesg==",
       "requires": {
         "aws-sign2": "~0.7.0",
         "aws4": "^1.8.0",
@@ -26,26 +45,30 @@
         "extend": "~3.0.2",
         "forever-agent": "~0.6.1",
         "form-data": "~2.3.2",
-        "har-validator": "~5.1.3",
-        "http-signature": "~1.2.0",
+        "http-signature": "~1.3.6",
         "is-typedarray": "~1.0.0",
         "isstream": "~0.1.2",
         "json-stringify-safe": "~5.0.1",
         "mime-types": "~2.1.19",
-        "oauth-sign": "~0.9.0",
         "performance-now": "^2.1.0",
         "qs": "~6.5.2",
         "safe-buffer": "^5.1.2",
         "tough-cookie": "~2.5.0",
         "tunnel-agent": "^0.6.0",
-        "uuid": "^3.3.2"
+        "uuid": "^8.3.2"
+      },
+      "dependencies": {
+        "uuid": {
+          "version": "8.3.2",
+          "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
+          "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg=="
+        }
       }
     },
     "@cypress/xvfb": {
       "version": "1.2.4",
       "resolved": "https://registry.npmjs.org/@cypress/xvfb/-/xvfb-1.2.4.tgz",
       "integrity": "sha512-skbBzPggOVYCbnGgV+0dmBdW/s77ZkAOXIC1knS8NagwDjBrNC1LuXtQJeiN6l+m7lzmHtaoUw/ctJKdqkG57Q==",
-      "dev": true,
       "requires": {
         "debug": "^3.1.0",
         "lodash.once": "^4.1.1"
@@ -55,7 +78,6 @@
           "version": "3.2.7",
           "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
           "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
-          "dev": true,
           "requires": {
             "ms": "^2.1.1"
           }
@@ -495,26 +517,22 @@
     "@types/node": {
       "version": "14.14.41",
       "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.41.tgz",
-      "integrity": "sha512-dueRKfaJL4RTtSa7bWeTK1M+VH+Gns73oCgzvYfHZywRCoPSd8EkXBL0mZ9unPTveBn+D9phZBaxuzpwjWkW0g==",
-      "dev": true
+      "integrity": "sha512-dueRKfaJL4RTtSa7bWeTK1M+VH+Gns73oCgzvYfHZywRCoPSd8EkXBL0mZ9unPTveBn+D9phZBaxuzpwjWkW0g=="
     },
     "@types/sinonjs__fake-timers": {
-      "version": "6.0.2",
-      "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-6.0.2.tgz",
-      "integrity": "sha512-dIPoZ3g5gcx9zZEszaxLSVTvMReD3xxyyDnQUjA6IYDG9Ba2AV0otMPs+77sG9ojB4Qr2N2Vk5RnKeuA0X/0bg==",
-      "dev": true
+      "version": "8.1.1",
+      "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.1.tgz",
+      "integrity": "sha512-0kSuKjAS0TrGLJ0M/+8MaFkGsQhZpB6pxOmvS3K8FYI72K//YmdfoW9X2qPsAKh1mkwxGD5zib9s1FIFed6E8g=="
     },
     "@types/sizzle": {
       "version": "2.3.3",
       "resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.3.tgz",
-      "integrity": "sha512-JYM8x9EGF163bEyhdJBpR2QX1R5naCJHC8ucJylJ3w9/CVBaskdQ8WqBf8MmQrd1kRvp/a4TS8HJ+bxzR7ZJYQ==",
-      "dev": true
+      "integrity": "sha512-JYM8x9EGF163bEyhdJBpR2QX1R5naCJHC8ucJylJ3w9/CVBaskdQ8WqBf8MmQrd1kRvp/a4TS8HJ+bxzR7ZJYQ=="
     },
     "@types/yauzl": {
-      "version": "2.9.2",
-      "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.9.2.tgz",
-      "integrity": "sha512-8uALY5LTvSuHgloDVUvWP3pIauILm+8/0pDMokuDYIoNsOkSwd5AiHBTSEJjKTDcZr5z8UpgOWZkxBF4iJftoA==",
-      "dev": true,
+      "version": "2.10.0",
+      "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.0.tgz",
+      "integrity": "sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw==",
       "optional": true,
       "requires": {
         "@types/node": "*"
@@ -543,111 +561,63 @@
       "dev": true
     },
     "agent-base": {
-      "version": "4.3.0",
-      "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz",
-      "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==",
-      "dev": true,
+      "version": "6.0.2",
+      "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
+      "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==",
       "requires": {
-        "es6-promisify": "^5.0.0"
+        "debug": "4"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "4.3.4",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+          "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+          "requires": {
+            "ms": "2.1.2"
+          }
+        }
       }
     },
     "aggregate-error": {
       "version": "3.1.0",
       "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz",
       "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==",
-      "dev": true,
       "requires": {
         "clean-stack": "^2.0.0",
         "indent-string": "^4.0.0"
       }
     },
-    "ajv": {
-      "version": "6.12.6",
-      "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
-      "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
-      "dev": true,
-      "requires": {
-        "fast-deep-equal": "^3.1.1",
-        "fast-json-stable-stringify": "^2.0.0",
-        "json-schema-traverse": "^0.4.1",
-        "uri-js": "^4.2.2"
-      }
-    },
     "ansi-align": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.0.tgz",
-      "integrity": "sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw==",
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz",
+      "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==",
       "dev": true,
       "requires": {
-        "string-width": "^3.0.0"
-      },
-      "dependencies": {
-        "ansi-regex": {
-          "version": "4.1.0",
-          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
-          "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
-          "dev": true
-        },
-        "emoji-regex": {
-          "version": "7.0.3",
-          "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
-          "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==",
-          "dev": true
-        },
-        "is-fullwidth-code-point": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
-          "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
-          "dev": true
-        },
-        "string-width": {
-          "version": "3.1.0",
-          "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
-          "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
-          "dev": true,
-          "requires": {
-            "emoji-regex": "^7.0.1",
-            "is-fullwidth-code-point": "^2.0.0",
-            "strip-ansi": "^5.1.0"
-          }
-        },
-        "strip-ansi": {
-          "version": "5.2.0",
-          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
-          "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
-          "dev": true,
-          "requires": {
-            "ansi-regex": "^4.1.0"
-          }
-        }
+        "string-width": "^4.1.0"
       }
     },
     "ansi-colors": {
       "version": "4.1.1",
       "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz",
-      "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==",
-      "dev": true
+      "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA=="
     },
     "ansi-escapes": {
       "version": "4.3.2",
       "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz",
       "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==",
-      "dev": true,
       "requires": {
         "type-fest": "^0.21.3"
       }
     },
     "ansi-regex": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
-      "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
-      "dev": true
+      "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+      "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="
     },
     "ansi-styles": {
       "version": "4.3.0",
       "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
       "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-      "dev": true,
       "requires": {
         "color-convert": "^2.0.1"
       }
@@ -661,8 +631,7 @@
     "arch": {
       "version": "2.2.0",
       "resolved": "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz",
-      "integrity": "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==",
-      "dev": true
+      "integrity": "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ=="
     },
     "arraybuffer.slice": {
       "version": "0.0.7",
@@ -671,10 +640,9 @@
       "dev": true
     },
     "asn1": {
-      "version": "0.2.4",
-      "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz",
-      "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==",
-      "dev": true,
+      "version": "0.2.6",
+      "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz",
+      "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==",
       "requires": {
         "safer-buffer": "~2.1.0"
       }
@@ -682,8 +650,7 @@
     "assert-plus": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
-      "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
-      "dev": true
+      "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw=="
     },
     "assertion-error": {
       "version": "1.1.0",
@@ -694,50 +661,37 @@
     "astral-regex": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz",
-      "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==",
-      "dev": true
+      "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ=="
     },
     "async": {
-      "version": "3.2.0",
-      "resolved": "https://registry.npmjs.org/async/-/async-3.2.0.tgz",
-      "integrity": "sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw==",
-      "dev": true
-    },
-    "async-limiter": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz",
-      "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==",
-      "dev": true
+      "version": "3.2.4",
+      "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz",
+      "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ=="
     },
     "asynckit": {
       "version": "0.4.0",
       "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
-      "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=",
-      "dev": true
+      "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
     },
     "at-least-node": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz",
-      "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==",
-      "dev": true
+      "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg=="
     },
     "aws-sign2": {
       "version": "0.7.0",
       "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
-      "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=",
-      "dev": true
+      "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA=="
     },
     "aws4": {
       "version": "1.11.0",
       "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz",
-      "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==",
-      "dev": true
+      "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA=="
     },
     "axe-core": {
-      "version": "3.5.5",
-      "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-3.5.5.tgz",
-      "integrity": "sha512-5P0QZ6J5xGikH780pghEdbEKijCTrruK9KxtPZCFWUpef0f6GipO+xEZ5GKCb020mmqgbiNO6TcA55CriL784Q==",
-      "dev": true
+      "version": "4.2.3",
+      "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.2.3.tgz",
+      "integrity": "sha512-pXnVMfJKSIWU2Ml4JHP7pZEPIrgBO1Fd3WGx+fPBsS+KRGhE4vxooD8XBGWbQOIVSZsVK7pUDBBkCicNu80yzQ=="
     },
     "backo2": {
       "version": "1.0.2",
@@ -748,8 +702,7 @@
     "balanced-match": {
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
-      "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
-      "dev": true
+      "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
     },
     "base64-arraybuffer": {
       "version": "0.1.4",
@@ -760,8 +713,7 @@
     "base64-js": {
       "version": "1.5.1",
       "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
-      "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
-      "dev": true
+      "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="
     },
     "base64id": {
       "version": "2.0.0",
@@ -772,21 +724,30 @@
     "bcrypt-pbkdf": {
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
-      "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=",
-      "dev": true,
+      "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==",
       "requires": {
         "tweetnacl": "^0.14.3"
       }
     },
     "bfj": {
-      "version": "4.2.4",
-      "resolved": "https://registry.npmjs.org/bfj/-/bfj-4.2.4.tgz",
-      "integrity": "sha1-hfeyNoPCr9wVhgOEotHD+sgO0zo=",
-      "dev": true,
+      "version": "7.0.2",
+      "resolved": "https://registry.npmjs.org/bfj/-/bfj-7.0.2.tgz",
+      "integrity": "sha512-+e/UqUzwmzJamNF50tBV6tZPTORow7gQ96iFow+8b562OdMpEK0BcJEq2OSPEDmAbSMBQ7PKZ87ubFkgxpYWgw==",
+      "requires": {
+        "bluebird": "^3.5.5",
+        "check-types": "^11.1.1",
+        "hoopy": "^0.1.4",
+        "tryer": "^1.0.1"
+      }
+    },
+    "bl": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz",
+      "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==",
       "requires": {
-        "check-types": "^7.3.0",
-        "hoopy": "^0.1.2",
-        "tryer": "^1.0.0"
+        "buffer": "^5.5.0",
+        "inherits": "^2.0.4",
+        "readable-stream": "^3.4.0"
       }
     },
     "blob": {
@@ -798,14 +759,12 @@
     "blob-util": {
       "version": "2.0.2",
       "resolved": "https://registry.npmjs.org/blob-util/-/blob-util-2.0.2.tgz",
-      "integrity": "sha512-T7JQa+zsXXEa6/8ZhHcQEW1UFfVM49Ts65uBkFL6fz2QmrElqmbajIDJvuA0tEhRe5eIjpV9ZF+0RfZR9voJFQ==",
-      "dev": true
+      "integrity": "sha512-T7JQa+zsXXEa6/8ZhHcQEW1UFfVM49Ts65uBkFL6fz2QmrElqmbajIDJvuA0tEhRe5eIjpV9ZF+0RfZR9voJFQ=="
     },
     "bluebird": {
       "version": "3.7.2",
       "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz",
-      "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==",
-      "dev": true
+      "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg=="
     },
     "bmp-js": {
       "version": "0.1.0",
@@ -829,31 +788,6 @@
         "widest-line": "^3.1.0"
       },
       "dependencies": {
-        "chalk": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
-          "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==",
-          "dev": true,
-          "requires": {
-            "ansi-styles": "^4.1.0",
-            "supports-color": "^7.1.0"
-          }
-        },
-        "has-flag": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
-          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
-          "dev": true
-        },
-        "supports-color": {
-          "version": "7.2.0",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
-          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
-          "dev": true,
-          "requires": {
-            "has-flag": "^4.0.0"
-          }
-        },
         "type-fest": {
           "version": "0.8.1",
           "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz",
@@ -866,7 +800,6 @@
       "version": "1.1.11",
       "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
       "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
-      "dev": true,
       "requires": {
         "balanced-match": "^1.0.0",
         "concat-map": "0.0.1"
@@ -876,7 +809,6 @@
       "version": "5.7.1",
       "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
       "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
-      "dev": true,
       "requires": {
         "base64-js": "^1.3.1",
         "ieee754": "^1.1.13"
@@ -885,8 +817,7 @@
     "buffer-crc32": {
       "version": "0.2.13",
       "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz",
-      "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=",
-      "dev": true
+      "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI="
     },
     "buffer-equal": {
       "version": "0.0.1",
@@ -935,8 +866,7 @@
     "cachedir": {
       "version": "2.3.0",
       "resolved": "https://registry.npmjs.org/cachedir/-/cachedir-2.3.0.tgz",
-      "integrity": "sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw==",
-      "dev": true
+      "integrity": "sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw=="
     },
     "camelcase": {
       "version": "5.3.1",
@@ -947,88 +877,64 @@
     "caseless": {
       "version": "0.12.0",
       "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
-      "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=",
-      "dev": true
+      "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw=="
     },
     "chai": {
-      "version": "4.3.4",
-      "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.4.tgz",
-      "integrity": "sha512-yS5H68VYOCtN1cjfwumDSuzn/9c+yza4f3reKXlE5rUg7SFcCEy90gJvydNgOYtblyf4Zi6jIWRnXOgErta0KA==",
+      "version": "4.3.7",
+      "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.7.tgz",
+      "integrity": "sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==",
       "dev": true,
       "requires": {
         "assertion-error": "^1.1.0",
         "check-error": "^1.0.2",
-        "deep-eql": "^3.0.1",
+        "deep-eql": "^4.1.2",
         "get-func-name": "^2.0.0",
+        "loupe": "^2.3.1",
         "pathval": "^1.1.1",
         "type-detect": "^4.0.5"
       }
     },
     "chalk": {
-      "version": "2.4.2",
-      "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
-      "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
+      "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==",
       "dev": true,
       "requires": {
-        "ansi-styles": "^3.2.1",
-        "escape-string-regexp": "^1.0.5",
-        "supports-color": "^5.3.0"
-      },
-      "dependencies": {
-        "ansi-styles": {
-          "version": "3.2.1",
-          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
-          "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
-          "dev": true,
-          "requires": {
-            "color-convert": "^1.9.0"
-          }
-        },
-        "color-convert": {
-          "version": "1.9.3",
-          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
-          "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
-          "dev": true,
-          "requires": {
-            "color-name": "1.1.3"
-          }
-        },
-        "color-name": {
-          "version": "1.1.3",
-          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
-          "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
-          "dev": true
-        }
+        "ansi-styles": "^4.1.0",
+        "supports-color": "^7.1.0"
       }
     },
     "charenc": {
       "version": "0.0.2",
       "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz",
-      "integrity": "sha1-wKHS86cJLgN3S/qD8UwPxXkKhmc=",
+      "integrity": "sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==",
       "dev": true
     },
     "check-error": {
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz",
-      "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=",
+      "integrity": "sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==",
       "dev": true
     },
     "check-more-types": {
       "version": "2.24.0",
       "resolved": "https://registry.npmjs.org/check-more-types/-/check-more-types-2.24.0.tgz",
-      "integrity": "sha1-FCD/sQ/URNz8ebQ4kbv//TKoRgA=",
-      "dev": true
+      "integrity": "sha512-Pj779qHxV2tuapviy1bSZNEL1maXr13bPYpsvSDB68HlYcYuhlDrmGd63i0JHMCLKzc7rUSNIrpdJlhVlNwrxA=="
     },
     "check-types": {
-      "version": "7.4.0",
-      "resolved": "https://registry.npmjs.org/check-types/-/check-types-7.4.0.tgz",
-      "integrity": "sha512-YbulWHdfP99UfZ73NcUDlNJhEIDgm9Doq9GhpyXbF+7Aegi3CVV7qqMCKTTqJxlvEvnQBp9IA+dxsGN6xK/nSg==",
-      "dev": true
+      "version": "11.2.2",
+      "resolved": "https://registry.npmjs.org/check-types/-/check-types-11.2.2.tgz",
+      "integrity": "sha512-HBiYvXvn9Z70Z88XKjz3AEKd4HJhBXsa3j7xFnITAzoS8+q6eIGi8qDB8FKPBAjtuxjI/zFpwuiCb8oDtKOYrA=="
+    },
+    "chownr": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz",
+      "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg=="
     },
     "chrome-launcher": {
-      "version": "0.14.0",
-      "resolved": "https://registry.npmjs.org/chrome-launcher/-/chrome-launcher-0.14.0.tgz",
-      "integrity": "sha512-W//HpflaW6qBGrmuskup7g+XJZN6w03ko9QSIe5CtcTal2u0up5SeReK3Ll1Why4Ey8dPkv8XSodZyHPnGbVHQ==",
+      "version": "0.14.2",
+      "resolved": "https://registry.npmjs.org/chrome-launcher/-/chrome-launcher-0.14.2.tgz",
+      "integrity": "sha512-Nk8DUCIfPR6p9WClPPFeP2ztpAdkT8xueoiDS03csea1uoJjm4w0p5Oy1hjykyjT1EQ0MMrEshLD3C8gHXyiZw==",
       "dev": true,
       "requires": {
         "@types/node": "*",
@@ -1054,8 +960,7 @@
     "clean-stack": {
       "version": "2.2.0",
       "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz",
-      "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==",
-      "dev": true
+      "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A=="
     },
     "cli-boxes": {
       "version": "2.2.1",
@@ -1067,19 +972,16 @@
       "version": "3.1.0",
       "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz",
       "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==",
-      "dev": true,
       "requires": {
         "restore-cursor": "^3.1.0"
       }
     },
     "cli-table3": {
-      "version": "0.6.0",
-      "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.0.tgz",
-      "integrity": "sha512-gnB85c3MGC7Nm9I/FkiasNBOKjOiO1RNuXXarQms37q4QMpWdlbBgD/VnOStA2faG1dpXMv31RFApjX1/QdgWQ==",
-      "dev": true,
+      "version": "0.6.3",
+      "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.3.tgz",
+      "integrity": "sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==",
       "requires": {
-        "colors": "^1.1.2",
-        "object-assign": "^4.1.0",
+        "@colors/colors": "1.5.0",
         "string-width": "^4.2.0"
       }
     },
@@ -1087,7 +989,6 @@
       "version": "2.1.0",
       "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz",
       "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==",
-      "dev": true,
       "requires": {
         "slice-ansi": "^3.0.0",
         "string-width": "^4.2.0"
@@ -1105,9 +1006,9 @@
       }
     },
     "clone-response": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz",
-      "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=",
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz",
+      "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==",
       "dev": true,
       "requires": {
         "mimic-response": "^1.0.0"
@@ -1117,7 +1018,6 @@
       "version": "2.0.1",
       "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
       "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-      "dev": true,
       "requires": {
         "color-name": "~1.1.4"
       }
@@ -1125,42 +1025,30 @@
     "color-name": {
       "version": "1.1.4",
       "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-      "dev": true
+      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
     },
     "colorette": {
-      "version": "1.2.2",
-      "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz",
-      "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==",
-      "dev": true
-    },
-    "colors": {
-      "version": "1.4.0",
-      "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz",
-      "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==",
-      "dev": true,
-      "optional": true
+      "version": "2.0.19",
+      "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz",
+      "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ=="
     },
     "combined-stream": {
       "version": "1.0.8",
       "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
       "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
-      "dev": true,
       "requires": {
         "delayed-stream": "~1.0.0"
       }
     },
     "commander": {
-      "version": "3.0.2",
-      "resolved": "https://registry.npmjs.org/commander/-/commander-3.0.2.tgz",
-      "integrity": "sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow==",
-      "dev": true
+      "version": "8.0.0",
+      "resolved": "https://registry.npmjs.org/commander/-/commander-8.0.0.tgz",
+      "integrity": "sha512-Xvf85aAtu6v22+E5hfVoLHqyul/jyxh91zvqk/ioJTQuJR7Z78n7H558vMPKanPSRgIEeZemT92I2g9Y8LPbSQ=="
     },
     "common-tags": {
-      "version": "1.8.0",
-      "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.0.tgz",
-      "integrity": "sha512-6P6g0uetGpW/sdyUy/iQQCbFF0kWVMSIVSyYz7Zgjcgh8mgw8PQzDNZeyZ5DQ2gM7LBoZPHmnjz8rUthkBG5tw==",
-      "dev": true
+      "version": "1.8.2",
+      "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz",
+      "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA=="
     },
     "component-bind": {
       "version": "1.0.0",
@@ -1177,26 +1065,13 @@
     "component-inherit": {
       "version": "0.0.3",
       "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz",
-      "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=",
+      "integrity": "sha512-w+LhYREhatpVqTESyGFg3NlP6Iu0kEKUHETY9GoZP/pQyW4mHFZuFWRUCIqVPZ36ueVLtoOEZaAqbCF2RDndaA==",
       "dev": true
     },
     "concat-map": {
       "version": "0.0.1",
       "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
-      "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
-      "dev": true
-    },
-    "concat-stream": {
-      "version": "1.6.2",
-      "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz",
-      "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==",
-      "dev": true,
-      "requires": {
-        "buffer-from": "^1.0.0",
-        "inherits": "^2.0.3",
-        "readable-stream": "^2.2.2",
-        "typedarray": "^0.0.6"
-      }
+      "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
     },
     "configstore": {
       "version": "5.0.1",
@@ -1215,7 +1090,7 @@
     "cookie": {
       "version": "0.3.1",
       "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz",
-      "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=",
+      "integrity": "sha512-+IJOX0OqlHCszo2mBUq+SrEbCj6w7Kpffqx60zYbPTFaO4+yYgRjHwcZNpWvaTylDHaV7PPmBHzSecZiMhtPgw==",
       "dev": true
     },
     "core-js": {
@@ -1227,14 +1102,12 @@
     "core-util-is": {
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
-      "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
-      "dev": true
+      "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ=="
     },
     "cross-spawn": {
       "version": "7.0.3",
       "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
       "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
-      "dev": true,
       "requires": {
         "path-key": "^3.1.0",
         "shebang-command": "^2.0.0",
@@ -1244,7 +1117,7 @@
     "crypt": {
       "version": "0.0.2",
       "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz",
-      "integrity": "sha1-iNf/fsDfuG9xPch7u0LQRNPmxBs=",
+      "integrity": "sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==",
       "dev": true
     },
     "crypto-random-string": {
@@ -1254,9 +1127,9 @@
       "dev": true
     },
     "csp_evaluator": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/csp_evaluator/-/csp_evaluator-1.0.1.tgz",
-      "integrity": "sha512-9L57/vkuwH1tJv9Sw9t13xKGKyRR7OKn/pizcLCHK/83WH+sqRav0JCFBmBLmpurQAcz5usU3efS1rabOPV/qA==",
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/csp_evaluator/-/csp_evaluator-1.1.0.tgz",
+      "integrity": "sha512-TcB+ZH9wZBG314jAUpKHPl1oYbRJV+nAT2YwZ9y4fmUN0FkEJa8e/hKZoOgzLYp1Z/CJdFhbhhGIGh0XG8W54Q==",
       "dev": true
     },
     "cssom": {
@@ -1275,30 +1148,30 @@
       }
     },
     "cypress": {
-      "version": "7.7.0",
-      "resolved": "https://registry.npmjs.org/cypress/-/cypress-7.7.0.tgz",
-      "integrity": "sha512-uYBYXNoI5ym0UxROwhQXWTi8JbUEjpC6l/bzoGZNxoKGsLrC1SDPgIDJMgLX/MeEdPL0UInXLDUWN/rSyZUCjQ==",
-      "dev": true,
+      "version": "12.2.0",
+      "resolved": "https://registry.npmjs.org/cypress/-/cypress-12.2.0.tgz",
+      "integrity": "sha512-kvl95ri95KK8mAy++tEU/wUgzAOMiIciZSL97LQvnOinb532m7dGvwN0mDSIGbOd71RREtmT9o4h088RjK5pKw==",
       "requires": {
-        "@cypress/request": "^2.88.5",
+        "@cypress/request": "^2.88.10",
         "@cypress/xvfb": "^1.2.4",
         "@types/node": "^14.14.31",
-        "@types/sinonjs__fake-timers": "^6.0.2",
+        "@types/sinonjs__fake-timers": "8.1.1",
         "@types/sizzle": "^2.3.2",
         "arch": "^2.2.0",
         "blob-util": "^2.0.2",
         "bluebird": "^3.7.2",
+        "buffer": "^5.6.0",
         "cachedir": "^2.3.0",
         "chalk": "^4.1.0",
         "check-more-types": "^2.24.0",
         "cli-cursor": "^3.1.0",
-        "cli-table3": "~0.6.0",
+        "cli-table3": "~0.6.1",
         "commander": "^5.1.0",
         "common-tags": "^1.8.0",
         "dayjs": "^1.10.4",
         "debug": "^4.3.2",
         "enquirer": "^2.3.6",
-        "eventemitter2": "^6.4.3",
+        "eventemitter2": "6.4.7",
         "execa": "4.1.0",
         "executable": "^4.1.1",
         "extract-zip": "2.0.1",
@@ -1311,23 +1184,22 @@
         "listr2": "^3.8.3",
         "lodash": "^4.17.21",
         "log-symbols": "^4.0.0",
-        "minimist": "^1.2.5",
+        "minimist": "^1.2.6",
         "ospath": "^1.2.2",
         "pretty-bytes": "^5.6.0",
-        "ramda": "~0.27.1",
+        "proxy-from-env": "1.0.0",
         "request-progress": "^3.0.0",
+        "semver": "^7.3.2",
         "supports-color": "^8.1.1",
         "tmp": "~0.2.1",
         "untildify": "^4.0.0",
-        "url": "^0.11.0",
         "yauzl": "^2.10.0"
       },
       "dependencies": {
         "chalk": {
-          "version": "4.1.1",
-          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz",
-          "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==",
-          "dev": true,
+          "version": "4.1.2",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+          "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
           "requires": {
             "ansi-styles": "^4.1.0",
             "supports-color": "^7.1.0"
@@ -1337,7 +1209,6 @@
               "version": "7.2.0",
               "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
               "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
-              "dev": true,
               "requires": {
                 "has-flag": "^4.0.0"
               }
@@ -1345,143 +1216,84 @@
           }
         },
         "ci-info": {
-          "version": "3.1.1",
-          "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.1.1.tgz",
-          "integrity": "sha512-kdRWLBIJwdsYJWYJFtAFFYxybguqeF91qpZaggjG5Nf8QKdizFG2hjqvaTXbxFIcYbSaD74KpAXv6BSm17DHEQ==",
-          "dev": true
+          "version": "3.7.0",
+          "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.7.0.tgz",
+          "integrity": "sha512-2CpRNYmImPx+RXKLq6jko/L07phmS9I02TyqkcNU20GCF/GgaWvc58hPtjxDX8lPpkdwc9sNh72V9k00S7ezog=="
         },
         "commander": {
           "version": "5.1.0",
           "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz",
-          "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==",
-          "dev": true
+          "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg=="
         },
         "debug": {
-          "version": "4.3.2",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz",
-          "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==",
-          "dev": true,
+          "version": "4.3.4",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+          "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
           "requires": {
             "ms": "2.1.2"
           }
         },
-        "extract-zip": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz",
-          "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==",
-          "dev": true,
-          "requires": {
-            "@types/yauzl": "^2.9.1",
-            "debug": "^4.1.1",
-            "get-stream": "^5.1.0",
-            "yauzl": "^2.10.0"
-          }
-        },
-        "fs-extra": {
-          "version": "9.1.0",
-          "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz",
-          "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==",
-          "dev": true,
-          "requires": {
-            "at-least-node": "^1.0.0",
-            "graceful-fs": "^4.2.0",
-            "jsonfile": "^6.0.1",
-            "universalify": "^2.0.0"
-          }
-        },
-        "get-stream": {
-          "version": "5.2.0",
-          "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
-          "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
-          "dev": true,
-          "requires": {
-            "pump": "^3.0.0"
-          }
-        },
         "global-dirs": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.0.tgz",
-          "integrity": "sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA==",
-          "dev": true,
+          "version": "3.0.1",
+          "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz",
+          "integrity": "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==",
           "requires": {
             "ini": "2.0.0"
           }
         },
-        "has-flag": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
-          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
-          "dev": true
-        },
         "ini": {
           "version": "2.0.0",
           "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz",
-          "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==",
-          "dev": true
+          "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA=="
         },
         "is-ci": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.0.tgz",
-          "integrity": "sha512-kDXyttuLeslKAHYL/K28F2YkM3x5jvFPEw3yXbRptXydjD9rpLEz+C5K5iutY9ZiUu6AP41JdvRQwF4Iqs4ZCQ==",
-          "dev": true,
+          "version": "3.0.1",
+          "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz",
+          "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==",
           "requires": {
-            "ci-info": "^3.1.1"
+            "ci-info": "^3.2.0"
           }
         },
         "is-installed-globally": {
           "version": "0.4.0",
           "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz",
           "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==",
-          "dev": true,
           "requires": {
             "global-dirs": "^3.0.0",
             "is-path-inside": "^3.0.2"
           }
         },
-        "jsonfile": {
-          "version": "6.1.0",
-          "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
-          "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
-          "dev": true,
+        "proxy-from-env": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.0.0.tgz",
+          "integrity": "sha512-F2JHgJQ1iqwnHDcQjVBsq3n/uoaFL+iPW/eAeL7kVxy/2RrWaN4WroKjjvbsoRtv0ftelNyC01bjRhn/bhcf4A=="
+        },
+        "semver": {
+          "version": "7.3.8",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz",
+          "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==",
           "requires": {
-            "graceful-fs": "^4.1.6",
-            "universalify": "^2.0.0"
+            "lru-cache": "^6.0.0"
           }
         },
         "supports-color": {
           "version": "8.1.1",
           "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
           "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
-          "dev": true,
           "requires": {
             "has-flag": "^4.0.0"
           }
-        },
-        "tmp": {
-          "version": "0.2.1",
-          "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz",
-          "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==",
-          "dev": true,
-          "requires": {
-            "rimraf": "^3.0.0"
-          }
-        },
-        "universalify": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz",
-          "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==",
-          "dev": true
         }
       }
     },
     "cypress-audit": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/cypress-audit/-/cypress-audit-1.0.0.tgz",
-      "integrity": "sha512-netcgyTXr+rpc39nVh0ts4m41MT0htmY7esVRAlJDcPmmgAlX8YIgGubPN1/uEWCkrJVhtSOs/vbSezLcxzrDQ==",
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/cypress-audit/-/cypress-audit-1.1.0.tgz",
+      "integrity": "sha512-W/GvSOOYfI1zq+pyO3T9Juo4xCPBPbMkUZWApxsuD9r/g/fy9aonK1K7NiOYG0aMsL0PILl6Na5VAGS1CYOGlg==",
       "dev": true,
       "requires": {
-        "lighthouse": "^8.0.0",
-        "pa11y": "^5.3.0"
+        "lighthouse": "^8.5.1",
+        "pa11y": "^6.0.1"
       }
     },
     "cypress-plugin-snapshots": {
@@ -1547,40 +1359,51 @@
     "dashdash": {
       "version": "1.14.1",
       "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
-      "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
-      "dev": true,
+      "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==",
       "requires": {
         "assert-plus": "^1.0.0"
       }
     },
+    "data-uri-to-buffer": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.0.tgz",
+      "integrity": "sha512-Vr3mLBA8qWmcuschSLAOogKgQ/Jwxulv3RNE4FXnYWRGujzrRWQI4m12fQqRkwX06C0KanhLr4hK+GydchZsaA=="
+    },
     "dayjs": {
-      "version": "1.10.4",
-      "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.10.4.tgz",
-      "integrity": "sha512-RI/Hh4kqRc1UKLOAf/T5zdMMX5DQIlDxwUe3wSyMMnEbGunnpENCdbUgM+dW7kXidZqCttBrmw7BhN4TMddkCw==",
-      "dev": true
+      "version": "1.11.7",
+      "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.7.tgz",
+      "integrity": "sha512-+Yw9U6YO5TQohxLcIkrXBeY73WP3ejHWVvx8XCk3gxvQDCTEmS48ZrSZCKciI7Bhl/uCMyxYtE9UqRILmFphkQ=="
     },
     "debug": {
-      "version": "4.3.1",
-      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz",
-      "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
+      "version": "2.6.9",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+      "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
       "dev": true,
       "requires": {
-        "ms": "2.1.2"
+        "ms": "2.0.0"
+      },
+      "dependencies": {
+        "ms": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+          "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+          "dev": true
+        }
       }
     },
     "decompress-response": {
       "version": "3.3.0",
       "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz",
-      "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=",
+      "integrity": "sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==",
       "dev": true,
       "requires": {
         "mimic-response": "^1.0.0"
       }
     },
     "deep-eql": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz",
-      "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==",
+      "version": "4.1.3",
+      "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz",
+      "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==",
       "dev": true,
       "requires": {
         "type-detect": "^4.0.0"
@@ -1601,8 +1424,12 @@
     "delayed-stream": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
-      "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=",
-      "dev": true
+      "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ=="
+    },
+    "devtools-protocol": {
+      "version": "0.0.869402",
+      "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.869402.tgz",
+      "integrity": "sha512-VvlVYY+VDJe639yHs5PHISzdWTLL3Aw8rO4cvUtwvoxFd6FHbE4OpHHcde52M6096uYYazAmd4l0o5VuFRO2WA=="
     },
     "diff2html": {
       "version": "2.12.2",
@@ -1640,16 +1467,15 @@
       }
     },
     "duplexer3": {
-      "version": "0.1.4",
-      "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz",
-      "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=",
+      "version": "0.1.5",
+      "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.5.tgz",
+      "integrity": "sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA==",
       "dev": true
     },
     "ecc-jsbn": {
       "version": "0.1.2",
       "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
-      "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=",
-      "dev": true,
+      "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==",
       "requires": {
         "jsbn": "~0.1.0",
         "safer-buffer": "^2.1.0"
@@ -1658,59 +1484,20 @@
     "emoji-regex": {
       "version": "8.0.0",
       "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
-      "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
-      "dev": true
+      "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="
     },
     "end-of-stream": {
       "version": "1.4.4",
       "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
       "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
-      "dev": true,
       "requires": {
         "once": "^1.4.0"
       }
     },
-    "engine.io": {
-      "version": "3.5.0",
-      "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.5.0.tgz",
-      "integrity": "sha512-21HlvPUKaitDGE4GXNtQ7PLP0Sz4aWLddMPw2VTyFz1FVZqu/kZsJUO8WNpKuE/OCL7nkfRaOui2ZCJloGznGA==",
-      "dev": true,
-      "requires": {
-        "accepts": "~1.3.4",
-        "base64id": "2.0.0",
-        "cookie": "~0.4.1",
-        "debug": "~4.1.0",
-        "engine.io-parser": "~2.2.0",
-        "ws": "~7.4.2"
-      },
-      "dependencies": {
-        "cookie": {
-          "version": "0.4.1",
-          "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz",
-          "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==",
-          "dev": true
-        },
-        "debug": {
-          "version": "4.1.1",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
-          "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
-          "dev": true,
-          "requires": {
-            "ms": "^2.1.1"
-          }
-        },
-        "ws": {
-          "version": "7.4.5",
-          "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.5.tgz",
-          "integrity": "sha512-xzyu3hFvomRfXKH8vOFMU3OguG6oOvhXMo3xsGy3xWExqaM2dxBbVxuD99O7m3ZUFMvvscsZDqxfgMaRr/Nr1g==",
-          "dev": true
-        }
-      }
-    },
     "engine.io-client": {
-      "version": "3.5.1",
-      "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.5.1.tgz",
-      "integrity": "sha512-oVu9kBkGbcggulyVF0kz6BV3ganqUeqXvD79WOFKa+11oK692w1NyFkuEj4xrkFRpZhn92QOqTk4RQq5LiBXbQ==",
+      "version": "3.5.3",
+      "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.5.3.tgz",
+      "integrity": "sha512-qsgyc/CEhJ6cgMUwxRRtOndGVhIu5hpL5tR4umSpmX/MvkFoIxUTM7oFMDQumHNzlNLwSVy6qhstFPoWTf7dOw==",
       "dev": true,
       "requires": {
         "component-emitter": "~1.3.0",
@@ -1722,7 +1509,7 @@
         "parseqs": "0.0.6",
         "parseuri": "0.0.6",
         "ws": "~7.4.2",
-        "xmlhttprequest-ssl": "~1.5.4",
+        "xmlhttprequest-ssl": "~1.6.2",
         "yeast": "0.1.2"
       },
       "dependencies": {
@@ -1738,13 +1525,13 @@
         "ms": {
           "version": "2.0.0",
           "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
-          "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+          "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
           "dev": true
         },
         "ws": {
-          "version": "7.4.5",
-          "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.5.tgz",
-          "integrity": "sha512-xzyu3hFvomRfXKH8vOFMU3OguG6oOvhXMo3xsGy3xWExqaM2dxBbVxuD99O7m3ZUFMvvscsZDqxfgMaRr/Nr1g==",
+          "version": "7.4.6",
+          "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz",
+          "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==",
           "dev": true
         }
       }
@@ -1766,25 +1553,14 @@
       "version": "2.3.6",
       "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz",
       "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==",
-      "dev": true,
       "requires": {
         "ansi-colors": "^4.1.1"
       }
     },
-    "es6-promise": {
-      "version": "4.2.8",
-      "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz",
-      "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==",
-      "dev": true
-    },
-    "es6-promisify": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz",
-      "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=",
-      "dev": true,
-      "requires": {
-        "es6-promise": "^4.0.3"
-      }
+    "envinfo": {
+      "version": "7.8.1",
+      "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz",
+      "integrity": "sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw=="
     },
     "escalade": {
       "version": "3.1.1",
@@ -1801,20 +1577,17 @@
     "escape-string-regexp": {
       "version": "1.0.5",
       "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
-      "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
-      "dev": true
+      "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg=="
     },
     "eventemitter2": {
-      "version": "6.4.4",
-      "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.4.tgz",
-      "integrity": "sha512-HLU3NDY6wARrLCEwyGKRBvuWYyvW6mHYv72SJJAH3iJN3a6eVUvkjFkcxah1bcTgGVBBrFdIopBJPhCQFMLyXw==",
-      "dev": true
+      "version": "6.4.7",
+      "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.7.tgz",
+      "integrity": "sha512-tYUSVOGeQPKt/eC1ABfhHy5Xd96N3oIijJvN3O9+TsC28T5V9yX9oEfEK5faP0EFSNVOG97qtAS68GBrQB2hDg=="
     },
     "execa": {
       "version": "4.1.0",
       "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz",
       "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==",
-      "dev": true,
       "requires": {
         "cross-spawn": "^7.0.0",
         "get-stream": "^5.0.0",
@@ -1831,7 +1604,6 @@
           "version": "5.2.0",
           "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
           "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
-          "dev": true,
           "requires": {
             "pump": "^3.0.0"
           }
@@ -1842,7 +1614,6 @@
       "version": "4.1.1",
       "resolved": "https://registry.npmjs.org/executable/-/executable-4.1.1.tgz",
       "integrity": "sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg==",
-      "dev": true,
       "requires": {
         "pify": "^2.2.0"
       }
@@ -1856,70 +1627,63 @@
     "extend": {
       "version": "3.0.2",
       "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
-      "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
-      "dev": true
+      "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="
     },
     "extract-zip": {
-      "version": "1.7.0",
-      "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.7.0.tgz",
-      "integrity": "sha512-xoh5G1W/PB0/27lXgMQyIhP5DSY/LhoCsOyZgb+6iMmRtCwVBo55uKaMoEYrDCKQhWvqEip5ZPKAc6eFNyf/MA==",
-      "dev": true,
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz",
+      "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==",
       "requires": {
-        "concat-stream": "^1.6.2",
-        "debug": "^2.6.9",
-        "mkdirp": "^0.5.4",
+        "@types/yauzl": "^2.9.1",
+        "debug": "^4.1.1",
+        "get-stream": "^5.1.0",
         "yauzl": "^2.10.0"
       },
       "dependencies": {
         "debug": {
-          "version": "2.6.9",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
-          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
-          "dev": true,
+          "version": "4.3.4",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+          "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
           "requires": {
-            "ms": "2.0.0"
+            "ms": "2.1.2"
           }
         },
-        "ms": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
-          "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
-          "dev": true
+        "get-stream": {
+          "version": "5.2.0",
+          "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
+          "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
+          "requires": {
+            "pump": "^3.0.0"
+          }
         }
       }
     },
     "extsprintf": {
       "version": "1.3.0",
       "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
-      "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=",
-      "dev": true
-    },
-    "fast-deep-equal": {
-      "version": "3.1.3",
-      "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
-      "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
-      "dev": true
-    },
-    "fast-json-stable-stringify": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
-      "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
-      "dev": true
+      "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g=="
     },
     "fd-slicer": {
       "version": "1.1.0",
       "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz",
       "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=",
-      "dev": true,
       "requires": {
         "pend": "~1.2.0"
       }
     },
+    "fetch-blob": {
+      "version": "3.2.0",
+      "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz",
+      "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==",
+      "requires": {
+        "node-domexception": "^1.0.0",
+        "web-streams-polyfill": "^3.0.3"
+      }
+    },
     "figures": {
       "version": "3.2.0",
       "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz",
       "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==",
-      "dev": true,
       "requires": {
         "escape-string-regexp": "^1.0.5"
       }
@@ -1930,34 +1694,79 @@
       "integrity": "sha512-Qe/5NJrgIOlwijpq3B7BEpzPFcgzggOTagZmkXQY4LA6bsXKTUstK7Wp12lEJ/mLKTpvIZxmIuRcLYWT6ov9lw==",
       "dev": true
     },
+    "find-up": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
+      "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+      "requires": {
+        "locate-path": "^5.0.0",
+        "path-exists": "^4.0.0"
+      }
+    },
     "forever-agent": {
       "version": "0.6.1",
       "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
-      "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=",
-      "dev": true
+      "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw=="
     },
     "form-data": {
       "version": "2.3.3",
       "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz",
       "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
-      "dev": true,
       "requires": {
         "asynckit": "^0.4.0",
         "combined-stream": "^1.0.6",
         "mime-types": "^2.1.12"
       }
     },
+    "formdata-polyfill": {
+      "version": "4.0.10",
+      "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz",
+      "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==",
+      "requires": {
+        "fetch-blob": "^3.1.2"
+      }
+    },
+    "fs-constants": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz",
+      "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow=="
+    },
+    "fs-extra": {
+      "version": "9.1.0",
+      "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz",
+      "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==",
+      "requires": {
+        "at-least-node": "^1.0.0",
+        "graceful-fs": "^4.2.0",
+        "jsonfile": "^6.0.1",
+        "universalify": "^2.0.0"
+      },
+      "dependencies": {
+        "jsonfile": {
+          "version": "6.1.0",
+          "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
+          "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
+          "requires": {
+            "graceful-fs": "^4.1.6",
+            "universalify": "^2.0.0"
+          }
+        },
+        "universalify": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz",
+          "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ=="
+        }
+      }
+    },
     "fs.realpath": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
-      "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
-      "dev": true
+      "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
     },
     "function-bind": {
       "version": "1.1.1",
       "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
-      "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
-      "dev": true
+      "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
     },
     "get-caller-file": {
       "version": "2.0.5",
@@ -1968,7 +1777,7 @@
     "get-func-name": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz",
-      "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=",
+      "integrity": "sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==",
       "dev": true
     },
     "get-stream": {
@@ -1984,7 +1793,6 @@
       "version": "3.2.1",
       "resolved": "https://registry.npmjs.org/getos/-/getos-3.2.1.tgz",
       "integrity": "sha512-U56CfOK17OKgTVqozZjUKNdkfEv6jk5WISBJ8SHoagjE6L69zOwl3Z+O8myjY9MEW3i2HPWQBt/LTbCgcC973Q==",
-      "dev": true,
       "requires": {
         "async": "^3.2.0"
       }
@@ -1992,8 +1800,7 @@
     "getpass": {
       "version": "0.1.7",
       "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
-      "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
-      "dev": true,
+      "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==",
       "requires": {
         "assert-plus": "^1.0.0"
       }
@@ -2002,7 +1809,6 @@
       "version": "7.1.6",
       "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
       "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
-      "dev": true,
       "requires": {
         "fs.realpath": "^1.0.0",
         "inflight": "^1.0.4",
@@ -2053,30 +1859,12 @@
     "graceful-fs": {
       "version": "4.2.6",
       "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz",
-      "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==",
-      "dev": true
-    },
-    "har-schema": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
-      "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=",
-      "dev": true
-    },
-    "har-validator": {
-      "version": "5.1.5",
-      "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz",
-      "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==",
-      "dev": true,
-      "requires": {
-        "ajv": "^6.12.3",
-        "har-schema": "^2.0.0"
-      }
+      "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ=="
     },
     "has": {
       "version": "1.0.3",
       "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
       "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
-      "dev": true,
       "requires": {
         "function-bind": "^1.1.1"
       }
@@ -2101,14 +1889,13 @@
     "has-cors": {
       "version": "1.1.0",
       "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz",
-      "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=",
+      "integrity": "sha512-g5VNKdkFuUuVCP9gYfDJHjK2nqdQJ7aDLTnycnc2+RvsOQbuLdF5pm7vuE5J76SEBIQjs4kQY/BWq74JUmjbXA==",
       "dev": true
     },
     "has-flag": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
-      "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
-      "dev": true
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+      "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
     },
     "has-yarn": {
       "version": "2.1.0",
@@ -2137,14 +1924,12 @@
     "hoopy": {
       "version": "0.1.4",
       "resolved": "https://registry.npmjs.org/hoopy/-/hoopy-0.1.4.tgz",
-      "integrity": "sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ==",
-      "dev": true
+      "integrity": "sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ=="
     },
     "html_codesniffer": {
-      "version": "2.4.1",
-      "resolved": "https://registry.npmjs.org/html_codesniffer/-/html_codesniffer-2.4.1.tgz",
-      "integrity": "sha512-7g4Z8+7agJFi7XJGu2r0onIqA7ig9b26vFEvUE6DgtFJlJzy1ELYEKzzd5Xwam4xjHiHQ/w8yHO7KTGNcXnwzg==",
-      "dev": true
+      "version": "2.5.1",
+      "resolved": "https://registry.npmjs.org/html_codesniffer/-/html_codesniffer-2.5.1.tgz",
+      "integrity": "sha512-vcz0yAaX/OaV6sdNHuT9alBOKkSxYb8h5Yq26dUqgi7XmCgGUSa7U9PiY1PBXQFMjKv1wVPs5/QzHlGuxPDUGg=="
     },
     "http-cache-semantics": {
       "version": "4.1.0",
@@ -2155,37 +1940,34 @@
     "http-link-header": {
       "version": "0.8.0",
       "resolved": "https://registry.npmjs.org/http-link-header/-/http-link-header-0.8.0.tgz",
-      "integrity": "sha1-oitBoMmx4tj6wb8baXxr1TLV9eQ=",
+      "integrity": "sha512-qsh/wKe1Mk1vtYEFr+LpQBFWTO1gxZQBdii2D0Umj+IUQ23r5sT088Rhpq4XzpSyIpaX7vwjB8Rrtx8u9JTg+Q==",
       "dev": true
     },
     "http-signature": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
-      "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=",
-      "dev": true,
+      "version": "1.3.6",
+      "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.3.6.tgz",
+      "integrity": "sha512-3adrsD6zqo4GsTqtO7FyrejHNv+NgiIfAfv68+jVlFmSr9OGy7zrxONceFRLKvnnZA5jbxQBX1u9PpB6Wi32Gw==",
       "requires": {
         "assert-plus": "^1.0.0",
-        "jsprim": "^1.2.2",
-        "sshpk": "^1.7.0"
+        "jsprim": "^2.0.2",
+        "sshpk": "^1.14.1"
       }
     },
     "https-proxy-agent": {
-      "version": "2.2.4",
-      "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz",
-      "integrity": "sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==",
-      "dev": true,
+      "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz",
+      "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==",
       "requires": {
-        "agent-base": "^4.3.0",
-        "debug": "^3.1.0"
+        "agent-base": "6",
+        "debug": "4"
       },
       "dependencies": {
         "debug": {
-          "version": "3.2.7",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
-          "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
-          "dev": true,
+          "version": "4.3.4",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+          "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
           "requires": {
-            "ms": "^2.1.1"
+            "ms": "2.1.2"
           }
         }
       }
@@ -2193,14 +1975,12 @@
     "human-signals": {
       "version": "1.1.1",
       "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz",
-      "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==",
-      "dev": true
+      "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw=="
     },
     "ieee754": {
       "version": "1.2.1",
       "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
-      "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
-      "dev": true
+      "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="
     },
     "image-size": {
       "version": "0.7.5",
@@ -2211,26 +1991,25 @@
     "image-ssim": {
       "version": "0.2.0",
       "resolved": "https://registry.npmjs.org/image-ssim/-/image-ssim-0.2.0.tgz",
-      "integrity": "sha1-g7Qsei5uS4VQVHf+aRf128VkIOU=",
+      "integrity": "sha512-W7+sO6/yhxy83L0G7xR8YAc5Z5QFtYEXXRV6EaE8tuYBZJnA3gVgp3q7X7muhLZVodeb9UfvjSbwt9VJwjIYAg==",
       "dev": true
     },
     "import-lazy": {
       "version": "2.1.0",
       "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz",
-      "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=",
+      "integrity": "sha512-m7ZEHgtw69qOGw+jwxXkHlrlIPdTGkyh66zXZ1ajZbxkDBNjSY/LGbmjc7h0s2ELsUDTAhFr55TrPSSqJGPG0A==",
       "dev": true
     },
     "imurmurhash": {
       "version": "0.1.4",
       "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
-      "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
+      "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
       "dev": true
     },
     "indent-string": {
       "version": "4.0.0",
       "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
-      "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==",
-      "dev": true
+      "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg=="
     },
     "indexof": {
       "version": "0.0.1",
@@ -2242,7 +2021,6 @@
       "version": "1.0.6",
       "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
       "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
-      "dev": true,
       "requires": {
         "once": "^1.3.0",
         "wrappy": "1"
@@ -2251,8 +2029,7 @@
     "inherits": {
       "version": "2.0.4",
       "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
-      "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
-      "dev": true
+      "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
     },
     "ini": {
       "version": "1.3.7",
@@ -2278,8 +2055,7 @@
     "is": {
       "version": "3.3.0",
       "resolved": "https://registry.npmjs.org/is/-/is-3.3.0.tgz",
-      "integrity": "sha512-nW24QBoPcFGGHJGUwnfpI7Yc5CdqWNdsyHQszVE/z2pKHXzh7FZ5GWhJqSyaQ9wMkQnsTx+kAI8bHlCX4tKdbg==",
-      "dev": true
+      "integrity": "sha512-nW24QBoPcFGGHJGUwnfpI7Yc5CdqWNdsyHQszVE/z2pKHXzh7FZ5GWhJqSyaQ9wMkQnsTx+kAI8bHlCX4tKdbg=="
     },
     "is-buffer": {
       "version": "1.1.6",
@@ -2305,8 +2081,7 @@
     "is-fullwidth-code-point": {
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
-      "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
-      "dev": true
+      "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="
     },
     "is-function": {
       "version": "1.0.2",
@@ -2339,20 +2114,22 @@
     "is-path-inside": {
       "version": "3.0.3",
       "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz",
-      "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==",
-      "dev": true
+      "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ=="
     },
     "is-stream": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz",
-      "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==",
-      "dev": true
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
+      "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg=="
     },
     "is-typedarray": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
-      "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=",
-      "dev": true
+      "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo="
+    },
+    "is-unicode-supported": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz",
+      "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw=="
     },
     "is-wsl": {
       "version": "2.2.0",
@@ -2369,23 +2146,15 @@
       "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==",
       "dev": true
     },
-    "isarray": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
-      "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
-      "dev": true
-    },
     "isexe": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
-      "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
-      "dev": true
+      "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="
     },
     "isstream": {
       "version": "0.1.2",
       "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
-      "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=",
-      "dev": true
+      "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g=="
     },
     "jimp": {
       "version": "0.10.3",
@@ -2402,9 +2171,9 @@
       }
     },
     "jpeg-js": {
-      "version": "0.4.3",
-      "resolved": "https://registry.npmjs.org/jpeg-js/-/jpeg-js-0.4.3.tgz",
-      "integrity": "sha512-ru1HWKek8octvUHFHvE5ZzQ1yAsJmIvRdGWvSoKV52XKyuyYA437QWDttXT8eZXDSbuMpHlLzPDZUPd6idIz+Q==",
+      "version": "0.4.4",
+      "resolved": "https://registry.npmjs.org/jpeg-js/-/jpeg-js-0.4.4.tgz",
+      "integrity": "sha512-WZzeDOEtTOBK4Mdsar0IqEU5sMr3vSV2RqkAIzUEV2BHnUfKGyswWFPFwK5EeDo93K3FohSHbLAjj0s1Wzd+dg==",
       "dev": true
     },
     "js-base64": {
@@ -2414,40 +2183,31 @@
       "dev": true
     },
     "js-library-detector": {
-      "version": "6.4.0",
-      "resolved": "https://registry.npmjs.org/js-library-detector/-/js-library-detector-6.4.0.tgz",
-      "integrity": "sha512-NB2sYpmgqiTd7PNNhgp6bnEZmjvTUdAbzxABvYXWLpTL/t158T6mPnD8uYNd0FDP73YWyMrTYDvPxqdvCTbv2g==",
+      "version": "6.5.0",
+      "resolved": "https://registry.npmjs.org/js-library-detector/-/js-library-detector-6.5.0.tgz",
+      "integrity": "sha512-Kq7VckJ5kb26kHMAu1sDO8t2qr7M5Uw6Gf7fVGtu1YceoHdqTcobwnB5kStcktusPuPmiCE8PbCaiLzhiBsSAw==",
       "dev": true
     },
     "jsbn": {
       "version": "0.1.1",
       "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
-      "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=",
-      "dev": true
+      "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg=="
     },
     "json-buffer": {
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz",
-      "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=",
+      "integrity": "sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ==",
       "dev": true
     },
     "json-schema": {
-      "version": "0.2.3",
-      "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz",
-      "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=",
-      "dev": true
-    },
-    "json-schema-traverse": {
-      "version": "0.4.1",
-      "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
-      "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
-      "dev": true
+      "version": "0.4.0",
+      "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz",
+      "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA=="
     },
     "json-stringify-safe": {
       "version": "5.0.1",
       "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
-      "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=",
-      "dev": true
+      "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA=="
     },
     "jsonfile": {
       "version": "4.0.0",
@@ -2459,14 +2219,13 @@
       }
     },
     "jsprim": {
-      "version": "1.4.1",
-      "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz",
-      "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=",
-      "dev": true,
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-2.0.2.tgz",
+      "integrity": "sha512-gqXddjPqQ6G40VdnI6T6yObEC+pDNvyP95wdQhkWkg7crHH3km5qP1FsOXEkzEQwnz6gz5qGTn1c2Y52wP3OyQ==",
       "requires": {
         "assert-plus": "1.0.0",
         "extsprintf": "1.3.0",
-        "json-schema": "0.2.3",
+        "json-schema": "0.4.0",
         "verror": "1.10.0"
       }
     },
@@ -2479,6 +2238,11 @@
         "json-buffer": "3.0.0"
       }
     },
+    "kleur": {
+      "version": "4.1.5",
+      "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz",
+      "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ=="
+    },
     "latest-version": {
       "version": "5.1.0",
       "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz",
@@ -2491,26 +2255,25 @@
     "lazy-ass": {
       "version": "1.6.0",
       "resolved": "https://registry.npmjs.org/lazy-ass/-/lazy-ass-1.6.0.tgz",
-      "integrity": "sha1-eZllXoZGwX8In90YfRUNMyTVRRM=",
-      "dev": true
+      "integrity": "sha512-cc8oEVoctTvsFZ/Oje/kGnHbpWHYBe8IAJe4C0QNc3t8uM/0Y8+erSz/7Y1ALuXTEZTMvxXwO6YbX1ey3ujiZw=="
     },
     "lighthouse": {
-      "version": "8.1.0",
-      "resolved": "https://registry.npmjs.org/lighthouse/-/lighthouse-8.1.0.tgz",
-      "integrity": "sha512-kAe06yax70VFdfX38OWIDqzQ77H313BXTXbGxqs4l1SOnhnu/ao6qF7VZ6TNz3+YGbSXPJgC3KOYif/sE79KTA==",
+      "version": "8.6.0",
+      "resolved": "https://registry.npmjs.org/lighthouse/-/lighthouse-8.6.0.tgz",
+      "integrity": "sha512-/H7aDL3//Gr0M1v8GGq6k0OTNty7nDVuU/o1cg6opYkfHRz1V3Nhydqz6aBzfXhUQx6iJRnxgRCPya+ZLA2vbg==",
       "dev": true,
       "requires": {
         "axe-core": "4.2.3",
         "chrome-launcher": "^0.14.0",
         "configstore": "^5.0.1",
-        "csp_evaluator": "^1.0.1",
+        "csp_evaluator": "1.1.0",
         "cssstyle": "1.2.1",
         "enquirer": "^2.3.6",
         "http-link-header": "^0.8.0",
         "intl-messageformat": "^4.4.0",
         "jpeg-js": "^0.4.1",
         "js-library-detector": "^6.4.0",
-        "lighthouse-logger": "^1.2.0",
+        "lighthouse-logger": "^1.3.0",
         "lighthouse-stack-packs": "^1.5.0",
         "lodash.clonedeep": "^4.5.0",
         "lodash.get": "^4.4.2",
@@ -2525,71 +2288,40 @@
         "robots-parser": "^2.0.1",
         "semver": "^5.3.0",
         "speedline-core": "^1.4.3",
-        "third-party-web": "^0.12.2",
+        "third-party-web": "^0.12.4",
         "update-notifier": "^4.1.0",
         "ws": "^7.0.0",
         "yargs": "^16.1.1",
         "yargs-parser": "^20.2.4"
-      },
-      "dependencies": {
-        "axe-core": {
-          "version": "4.2.3",
-          "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.2.3.tgz",
-          "integrity": "sha512-pXnVMfJKSIWU2Ml4JHP7pZEPIrgBO1Fd3WGx+fPBsS+KRGhE4vxooD8XBGWbQOIVSZsVK7pUDBBkCicNu80yzQ==",
-          "dev": true
-        },
-        "ws": {
-          "version": "7.5.3",
-          "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.3.tgz",
-          "integrity": "sha512-kQ/dHIzuLrS6Je9+uv81ueZomEwH0qVYstcAQ4/Z93K8zeko9gtAbttJWzoC5ukqXY1PpoouV3+VSOqEAFt5wg==",
-          "dev": true
-        }
       }
     },
     "lighthouse-logger": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/lighthouse-logger/-/lighthouse-logger-1.2.0.tgz",
-      "integrity": "sha512-wzUvdIeJZhRsG6gpZfmSCfysaxNEr43i+QT+Hie94wvHDKFLi4n7C2GqZ4sTC+PH5b5iktmXJvU87rWvhP3lHw==",
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/lighthouse-logger/-/lighthouse-logger-1.3.0.tgz",
+      "integrity": "sha512-BbqAKApLb9ywUli+0a+PcV04SyJ/N1q/8qgCNe6U97KbPCS1BTksEuHFLYdvc8DltuhfxIUBqDZsC0bBGtl3lA==",
       "dev": true,
       "requires": {
-        "debug": "^2.6.8",
-        "marky": "^1.2.0"
-      },
-      "dependencies": {
-        "debug": {
-          "version": "2.6.9",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
-          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
-          "dev": true,
-          "requires": {
-            "ms": "2.0.0"
-          }
-        },
-        "ms": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
-          "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
-          "dev": true
-        }
+        "debug": "^2.6.9",
+        "marky": "^1.2.2"
       }
     },
     "lighthouse-stack-packs": {
-      "version": "1.5.0",
-      "resolved": "https://registry.npmjs.org/lighthouse-stack-packs/-/lighthouse-stack-packs-1.5.0.tgz",
-      "integrity": "sha512-ntVOqFsrrTQYrNf+W+sNE9GjddW+ab5QN0WrrCikjMFsUvEQ28CvT0SXcHPZXFtcsb1lMSuVaNCmEuj7oXtYGQ==",
+      "version": "1.8.2",
+      "resolved": "https://registry.npmjs.org/lighthouse-stack-packs/-/lighthouse-stack-packs-1.8.2.tgz",
+      "integrity": "sha512-vlCUxxQAB8Nu6LQHqPpDRiMi06Du593/my/6JbMttQeEfJ7pf4OS8obSTh5xSOS80U/O7fq59Q8rQGAUxQatUQ==",
       "dev": true
     },
     "listr2": {
-      "version": "3.10.0",
-      "resolved": "https://registry.npmjs.org/listr2/-/listr2-3.10.0.tgz",
-      "integrity": "sha512-eP40ZHihu70sSmqFNbNy2NL1YwImmlMmPh9WO5sLmPDleurMHt3n+SwEWNu2kzKScexZnkyFtc1VI0z/TGlmpw==",
-      "dev": true,
+      "version": "3.14.0",
+      "resolved": "https://registry.npmjs.org/listr2/-/listr2-3.14.0.tgz",
+      "integrity": "sha512-TyWI8G99GX9GjE54cJ+RrNMcIFBfwMPxc3XTFiAYGN4s10hWROGtOg7+O6u6LE3mNkyld7RSLE6nrKBvTfcs3g==",
       "requires": {
         "cli-truncate": "^2.1.0",
-        "colorette": "^1.2.2",
+        "colorette": "^2.0.16",
         "log-update": "^4.0.0",
         "p-map": "^4.0.0",
-        "rxjs": "^6.6.7",
+        "rfdc": "^1.3.0",
+        "rxjs": "^7.5.1",
         "through": "^2.3.8",
         "wrap-ansi": "^7.0.0"
       }
@@ -2618,75 +2350,65 @@
         }
       }
     },
+    "locate-path": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
+      "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+      "requires": {
+        "p-locate": "^4.1.0"
+      }
+    },
     "lodash": {
       "version": "4.17.21",
       "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
-      "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
-      "dev": true
+      "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
     },
     "lodash.clonedeep": {
       "version": "4.5.0",
       "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz",
-      "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=",
+      "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==",
       "dev": true
     },
     "lodash.get": {
       "version": "4.4.2",
       "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz",
-      "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=",
+      "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==",
       "dev": true
     },
     "lodash.isequal": {
       "version": "4.5.0",
       "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz",
-      "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA=",
+      "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==",
       "dev": true
     },
     "lodash.once": {
       "version": "4.1.1",
       "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz",
-      "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w=",
-      "dev": true
+      "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg=="
     },
     "lodash.set": {
       "version": "4.3.2",
       "resolved": "https://registry.npmjs.org/lodash.set/-/lodash.set-4.3.2.tgz",
-      "integrity": "sha1-2HV7HagH3eJIFrDWqEvqGnYjCyM=",
+      "integrity": "sha512-4hNPN5jlm/N/HLMCO43v8BXKq9Z7QdAGc/VGrRD61w8gN9g/6jF9A4L1pbUgBLCffi0w9VsXfTOij5x8iTyFvg==",
       "dev": true
     },
     "log-symbols": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz",
-      "integrity": "sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==",
-      "dev": true,
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz",
+      "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==",
       "requires": {
-        "chalk": "^4.0.0"
+        "chalk": "^4.1.0",
+        "is-unicode-supported": "^0.1.0"
       },
       "dependencies": {
         "chalk": {
-          "version": "4.1.0",
-          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
-          "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
-          "dev": true,
+          "version": "4.1.2",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+          "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
           "requires": {
             "ansi-styles": "^4.1.0",
             "supports-color": "^7.1.0"
           }
-        },
-        "has-flag": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
-          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
-          "dev": true
-        },
-        "supports-color": {
-          "version": "7.2.0",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
-          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
-          "dev": true,
-          "requires": {
-            "has-flag": "^4.0.0"
-          }
         }
       }
     },
@@ -2694,7 +2416,6 @@
       "version": "4.0.0",
       "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz",
       "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==",
-      "dev": true,
       "requires": {
         "ansi-escapes": "^4.3.0",
         "cli-cursor": "^3.1.0",
@@ -2706,7 +2427,6 @@
           "version": "4.0.0",
           "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz",
           "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==",
-          "dev": true,
           "requires": {
             "ansi-styles": "^4.0.0",
             "astral-regex": "^2.0.0",
@@ -2717,7 +2437,6 @@
           "version": "6.2.0",
           "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
           "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==",
-          "dev": true,
           "requires": {
             "ansi-styles": "^4.0.0",
             "string-width": "^4.1.0",
@@ -2732,12 +2451,29 @@
       "integrity": "sha512-bWoFbSGe6f1GvMGzj17LrwMX4FhDXDwZyH04ySVCPbtOJADcSRguZNKewoJ3Ful/MOxD/wRHvFPadk/kYZUbuQ==",
       "dev": true
     },
+    "loupe": {
+      "version": "2.3.6",
+      "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.6.tgz",
+      "integrity": "sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==",
+      "dev": true,
+      "requires": {
+        "get-func-name": "^2.0.0"
+      }
+    },
     "lowercase-keys": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz",
       "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==",
       "dev": true
     },
+    "lru-cache": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+      "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+      "requires": {
+        "yallist": "^4.0.0"
+      }
+    },
     "make-dir": {
       "version": "3.1.0",
       "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
@@ -2756,9 +2492,9 @@
       }
     },
     "marky": {
-      "version": "1.2.2",
-      "resolved": "https://registry.npmjs.org/marky/-/marky-1.2.2.tgz",
-      "integrity": "sha512-k1dB2HNeaNyORco8ulVEhctyEGkKHb2YWAhDsxeFlW2nROIirsctBYzKwwS3Vza+sKTS1zO4Z+n9/+9WbGLIxQ==",
+      "version": "1.2.5",
+      "resolved": "https://registry.npmjs.org/marky/-/marky-1.2.5.tgz",
+      "integrity": "sha512-q9JtQJKjpsVxCRVgQ+WapguSbKC3SQ5HEzFGPAJMStgh3QjCawp00UKv3MTTAArTmGmmPUvllHZoNbZ3gs0I+Q==",
       "dev": true
     },
     "md5": {
@@ -2781,32 +2517,23 @@
     "merge-stream": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
-      "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
-      "dev": true
+      "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w=="
     },
     "metaviewport-parser": {
       "version": "0.2.0",
       "resolved": "https://registry.npmjs.org/metaviewport-parser/-/metaviewport-parser-0.2.0.tgz",
-      "integrity": "sha1-U1w84cz2IjpQJf3cahw2UF9+fbE=",
-      "dev": true
-    },
-    "mime": {
-      "version": "2.5.2",
-      "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.2.tgz",
-      "integrity": "sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==",
+      "integrity": "sha512-qL5NtY18LGs7lvZCkj3ep2H4Pes9rIiSLZRUyfDdvVw7pWFA0eLwmqaIxApD74RGvUrNEtk9e5Wt1rT+VlCvGw==",
       "dev": true
     },
     "mime-db": {
       "version": "1.47.0",
       "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.47.0.tgz",
-      "integrity": "sha512-QBmA/G2y+IfeS4oktet3qRZ+P5kPhCKRXxXnQEudYqUaEioAU1/Lq2us3D/t1Jfo4hE9REQPrbB7K5sOczJVIw==",
-      "dev": true
+      "integrity": "sha512-QBmA/G2y+IfeS4oktet3qRZ+P5kPhCKRXxXnQEudYqUaEioAU1/Lq2us3D/t1Jfo4hE9REQPrbB7K5sOczJVIw=="
     },
     "mime-types": {
       "version": "2.1.30",
       "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.30.tgz",
       "integrity": "sha512-crmjA4bLtR8m9qLpHvgxSChT+XoSlZi8J4n/aIdn3z92e/U47Z0V/yl+Wh9W046GgFVAmoNR/fmdbZYcSSIUeg==",
-      "dev": true,
       "requires": {
         "mime-db": "1.47.0"
       }
@@ -2814,8 +2541,7 @@
     "mimic-fn": {
       "version": "2.1.0",
       "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
-      "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
-      "dev": true
+      "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg=="
     },
     "mimic-response": {
       "version": "1.0.1",
@@ -2833,19 +2559,17 @@
       }
     },
     "minimatch": {
-      "version": "3.0.4",
-      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
-      "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
-      "dev": true,
+      "version": "3.1.2",
+      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+      "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
       "requires": {
         "brace-expansion": "^1.1.7"
       }
     },
     "minimist": {
-      "version": "1.2.5",
-      "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
-      "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
-      "dev": true
+      "version": "1.2.7",
+      "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz",
+      "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g=="
     },
     "mkdirp": {
       "version": "0.5.5",
@@ -2856,11 +2580,20 @@
         "minimist": "^1.2.5"
       }
     },
+    "mkdirp-classic": {
+      "version": "0.5.3",
+      "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz",
+      "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A=="
+    },
     "ms": {
       "version": "2.1.2",
       "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
-      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
-      "dev": true
+      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
+    },
+    "mustache": {
+      "version": "4.2.0",
+      "resolved": "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz",
+      "integrity": "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ=="
     },
     "negotiator": {
       "version": "0.6.2",
@@ -2868,17 +2601,25 @@
       "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==",
       "dev": true
     },
+    "node-domexception": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz",
+      "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ=="
+    },
     "node-fetch": {
-      "version": "2.6.1",
-      "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz",
-      "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==",
-      "dev": true
+      "version": "3.3.0",
+      "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.0.tgz",
+      "integrity": "sha512-BKwRP/O0UvoMKp7GNdwPlObhYGB5DQqwhEDQlNKuoqwVYSxkSZCSbHjnFFmUEtwSKRPU4kNK8PbDYYitwaE3QA==",
+      "requires": {
+        "data-uri-to-buffer": "^4.0.0",
+        "fetch-blob": "^3.1.4",
+        "formdata-polyfill": "^4.0.10"
+      }
     },
     "node.extend": {
       "version": "2.0.2",
       "resolved": "https://registry.npmjs.org/node.extend/-/node.extend-2.0.2.tgz",
       "integrity": "sha512-pDT4Dchl94/+kkgdwyS2PauDFjZG0Hk0IcHIB+LkW27HLDtdoeMxHTxZh39DYbPP8UflWXWj9JcdDozF+YDOpQ==",
-      "dev": true,
       "requires": {
         "has": "^1.0.3",
         "is": "^3.2.1"
@@ -2903,23 +2644,10 @@
       "version": "4.0.1",
       "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
       "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
-      "dev": true,
       "requires": {
         "path-key": "^3.0.0"
       }
     },
-    "oauth-sign": {
-      "version": "0.9.0",
-      "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
-      "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==",
-      "dev": true
-    },
-    "object-assign": {
-      "version": "4.1.1",
-      "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
-      "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
-      "dev": true
-    },
     "omggif": {
       "version": "1.0.10",
       "resolved": "https://registry.npmjs.org/omggif/-/omggif-1.0.10.tgz",
@@ -2930,7 +2658,6 @@
       "version": "1.4.0",
       "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
       "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
-      "dev": true,
       "requires": {
         "wrappy": "1"
       }
@@ -2939,7 +2666,6 @@
       "version": "5.1.2",
       "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
       "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
-      "dev": true,
       "requires": {
         "mimic-fn": "^2.1.0"
       }
@@ -2956,7 +2682,7 @@
         "is-wsl": {
           "version": "1.1.0",
           "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz",
-          "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=",
+          "integrity": "sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==",
           "dev": true
         }
       }
@@ -2964,8 +2690,7 @@
     "ospath": {
       "version": "1.2.2",
       "resolved": "https://registry.npmjs.org/ospath/-/ospath-1.2.2.tgz",
-      "integrity": "sha1-EnZjl3Sj+O8lcvf+QoDg6kVQwHs=",
-      "dev": true
+      "integrity": "sha512-o6E5qJV5zkAbIDNhGSIlyOhScKXgQrSRMilfph0clDfM0nEnBOlKlH4sWDmG95BW/CvwNz0vmm7dJVtU2KlMiA=="
     },
     "p-cancelable": {
       "version": "1.1.0",
@@ -2973,88 +2698,66 @@
       "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==",
       "dev": true
     },
-    "p-finally": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
-      "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=",
-      "dev": true
+    "p-limit": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+      "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+      "requires": {
+        "p-try": "^2.0.0"
+      }
+    },
+    "p-locate": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
+      "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
+      "requires": {
+        "p-limit": "^2.2.0"
+      }
     },
     "p-map": {
       "version": "4.0.0",
       "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz",
       "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==",
-      "dev": true,
       "requires": {
         "aggregate-error": "^3.0.0"
       }
     },
     "p-timeout": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-2.0.1.tgz",
-      "integrity": "sha512-88em58dDVB/KzPEx1X0N3LwFfYZPyDc4B6eF38M1rk9VTZMbxXXgjugz8mmwpS9Ox4BDZ+t6t3QP5+/gazweIA==",
-      "dev": true,
-      "requires": {
-        "p-finally": "^1.0.0"
-      }
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-4.1.0.tgz",
+      "integrity": "sha512-+/wmHtzJuWii1sXn3HCuH/FTwGhrp4tmJTxSKJbfS+vkipci6osxXM5mY0jUiRzWKMTgUT8l7HFbeSwZAynqHw=="
+    },
+    "p-try": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
+      "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ=="
     },
     "pa11y": {
-      "version": "5.3.1",
-      "resolved": "https://registry.npmjs.org/pa11y/-/pa11y-5.3.1.tgz",
-      "integrity": "sha512-hRxe9mYUqwODrlIXiTKUrlJX8zgrJZG84s0IrJnvvI8reO6n4RtiF20juTaGukjuHtH8p3tgFh+i2gPcRZSyUg==",
-      "dev": true,
-      "requires": {
-        "commander": "~3.0.2",
+      "version": "6.2.3",
+      "resolved": "https://registry.npmjs.org/pa11y/-/pa11y-6.2.3.tgz",
+      "integrity": "sha512-69JoUlfW2QVmrgQAm+17XBxIvmd1u0ImFBYIHPyjC61CzAkmxO3kkbqDVxIcl0OKLvAMYSMbvfCH8kMFE9xsbg==",
+      "requires": {
+        "axe-core": "~4.2.1",
+        "bfj": "~7.0.2",
+        "commander": "~8.0.0",
+        "envinfo": "~7.8.1",
+        "html_codesniffer": "~2.5.1",
+        "kleur": "~4.1.4",
+        "mustache": "~4.2.0",
         "node.extend": "~2.0.2",
-        "p-timeout": "~2.0.1",
-        "pa11y-reporter-cli": "~1.0.1",
-        "pa11y-reporter-csv": "~1.0.0",
-        "pa11y-reporter-json": "~1.0.0",
-        "pa11y-runner-axe": "~1.0.1",
-        "pa11y-runner-htmlcs": "~1.2.1",
-        "puppeteer": "~1.19.0",
-        "semver": "~5.7.0"
-      }
-    },
-    "pa11y-reporter-cli": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/pa11y-reporter-cli/-/pa11y-reporter-cli-1.0.1.tgz",
-      "integrity": "sha512-k+XPl5pBU2R1J6iagGv/GpN/dP7z2cX9WXqO0ALpBwHlHN3ZSukcHCOhuLMmkOZNvufwsvobaF5mnaZxT70YyA==",
-      "dev": true,
-      "requires": {
-        "chalk": "^2.1.0"
-      }
-    },
-    "pa11y-reporter-csv": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/pa11y-reporter-csv/-/pa11y-reporter-csv-1.0.0.tgz",
-      "integrity": "sha512-S2gFgbAvONBzAVsVbF8zsYabszrzj7SKhQxrEbw19zF0OFI8wCWn8dFywujYYkg674rmyjweSxSdD+kHTcx4qA==",
-      "dev": true
-    },
-    "pa11y-reporter-json": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/pa11y-reporter-json/-/pa11y-reporter-json-1.0.0.tgz",
-      "integrity": "sha512-EdLrzh1hyZ8DudCSSrcakgtsHDiSsYNsWLSoEAo1JnFTIK8hYpD7vL+xgd0u+LXDxz9wLLFnckdubpklaRpl/w==",
-      "dev": true,
-      "requires": {
-        "bfj": "^4.2.3"
-      }
-    },
-    "pa11y-runner-axe": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/pa11y-runner-axe/-/pa11y-runner-axe-1.0.2.tgz",
-      "integrity": "sha512-HMw5kQZz16vS5Bhe067esgeuULNzFYP4ixOFAHxOurwGDptlyc2OqH6zfUuK4szB9tbgb5F23v3qz9hCbkGRpw==",
-      "dev": true,
-      "requires": {
-        "axe-core": "^3.5.1"
-      }
-    },
-    "pa11y-runner-htmlcs": {
-      "version": "1.2.1",
-      "resolved": "https://registry.npmjs.org/pa11y-runner-htmlcs/-/pa11y-runner-htmlcs-1.2.1.tgz",
-      "integrity": "sha512-flatSp6moEbqzny18b2IEoDXEWj6xJbJrszdBjUAPQBCN11QRW+SZ0U4uFnxNTLPpXs30N/a9IlH4vYiRr2nPg==",
-      "dev": true,
-      "requires": {
-        "html_codesniffer": "~2.4.1"
+        "p-timeout": "~4.1.0",
+        "puppeteer": "~9.1.1",
+        "semver": "~7.3.5"
+      },
+      "dependencies": {
+        "semver": {
+          "version": "7.3.8",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz",
+          "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==",
+          "requires": {
+            "lru-cache": "^6.0.0"
+          }
+        }
       }
     },
     "package-json": {
@@ -3108,7 +2811,7 @@
     "parse-cache-control": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz",
-      "integrity": "sha1-juqz5U+laSD+Fro493+iGqzC104=",
+      "integrity": "sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg==",
       "dev": true
     },
     "parse-headers": {
@@ -3129,17 +2832,20 @@
       "integrity": "sha512-AUjen8sAkGgao7UyCX6Ahv0gIK2fABKmYjvP4xmy5JaKvcbTRueIqIPHLAfq30xJddqSE033IOMUSOMCcK3Sow==",
       "dev": true
     },
+    "path-exists": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+      "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="
+    },
     "path-is-absolute": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
-      "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
-      "dev": true
+      "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18="
     },
     "path-key": {
       "version": "3.1.1",
       "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
-      "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
-      "dev": true
+      "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="
     },
     "pathval": {
       "version": "1.1.1",
@@ -3150,14 +2856,12 @@
     "pend": {
       "version": "1.2.0",
       "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz",
-      "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=",
-      "dev": true
+      "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA="
     },
     "performance-now": {
       "version": "2.1.0",
       "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
-      "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=",
-      "dev": true
+      "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow=="
     },
     "phin": {
       "version": "2.9.3",
@@ -3168,13 +2872,20 @@
     "pify": {
       "version": "2.3.0",
       "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
-      "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
-      "dev": true
+      "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog=="
+    },
+    "pkg-dir": {
+      "version": "4.2.0",
+      "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz",
+      "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==",
+      "requires": {
+        "find-up": "^4.0.0"
+      }
     },
     "prepend-http": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz",
-      "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=",
+      "integrity": "sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA==",
       "dev": true
     },
     "prettier": {
@@ -3186,8 +2897,7 @@
     "pretty-bytes": {
       "version": "5.6.0",
       "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz",
-      "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==",
-      "dev": true
+      "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg=="
     },
     "process": {
       "version": "0.11.10",
@@ -3195,23 +2905,15 @@
       "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=",
       "dev": true
     },
-    "process-nextick-args": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
-      "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
-      "dev": true
-    },
     "progress": {
       "version": "2.0.3",
       "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz",
-      "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==",
-      "dev": true
+      "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA=="
     },
     "proxy-from-env": {
       "version": "1.1.0",
       "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
-      "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==",
-      "dev": true
+      "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="
     },
     "ps-list": {
       "version": "7.2.0",
@@ -3220,16 +2922,14 @@
       "dev": true
     },
     "psl": {
-      "version": "1.8.0",
-      "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz",
-      "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==",
-      "dev": true
+      "version": "1.9.0",
+      "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz",
+      "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag=="
     },
     "pump": {
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
       "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
-      "dev": true,
       "requires": {
         "end-of-stream": "^1.1.0",
         "once": "^1.3.1"
@@ -3238,8 +2938,7 @@
     "punycode": {
       "version": "2.1.1",
       "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
-      "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
-      "dev": true
+      "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A=="
     },
     "pupa": {
       "version": "2.1.1",
@@ -3251,49 +2950,46 @@
       }
     },
     "puppeteer": {
-      "version": "1.19.0",
-      "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-1.19.0.tgz",
-      "integrity": "sha512-2S6E6ygpoqcECaagDbBopoSOPDv0pAZvTbnBgUY+6hq0/XDFDOLEMNlHF/SKJlzcaZ9ckiKjKDuueWI3FN/WXw==",
-      "dev": true,
+      "version": "9.1.1",
+      "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-9.1.1.tgz",
+      "integrity": "sha512-W+nOulP2tYd/ZG99WuZC/I5ljjQQ7EUw/jQGcIb9eu8mDlZxNY2SgcJXTLG9h5gRvqA3uJOe4hZXYsd3EqioMw==",
       "requires": {
         "debug": "^4.1.0",
-        "extract-zip": "^1.6.6",
-        "https-proxy-agent": "^2.2.1",
-        "mime": "^2.0.3",
+        "devtools-protocol": "0.0.869402",
+        "extract-zip": "^2.0.0",
+        "https-proxy-agent": "^5.0.0",
+        "node-fetch": "^2.6.1",
+        "pkg-dir": "^4.2.0",
         "progress": "^2.0.1",
-        "proxy-from-env": "^1.0.0",
-        "rimraf": "^2.6.1",
-        "ws": "^6.1.0"
+        "proxy-from-env": "^1.1.0",
+        "rimraf": "^3.0.2",
+        "tar-fs": "^2.0.0",
+        "unbzip2-stream": "^1.3.3",
+        "ws": "^7.2.3"
       },
       "dependencies": {
-        "rimraf": {
-          "version": "2.7.1",
-          "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
-          "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
-          "dev": true,
+        "debug": {
+          "version": "4.3.4",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+          "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
           "requires": {
-            "glob": "^7.1.3"
+            "ms": "2.1.2"
+          }
+        },
+        "node-fetch": {
+          "version": "2.6.7",
+          "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz",
+          "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==",
+          "requires": {
+            "whatwg-url": "^5.0.0"
           }
         }
       }
     },
     "qs": {
-      "version": "6.5.2",
-      "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
-      "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==",
-      "dev": true
-    },
-    "querystring": {
-      "version": "0.2.0",
-      "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz",
-      "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=",
-      "dev": true
-    },
-    "ramda": {
-      "version": "0.27.1",
-      "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.27.1.tgz",
-      "integrity": "sha512-PgIdVpn5y5Yns8vqb8FzBUEYn98V3xcPgawAkkgj0YJ0qDsnHCiNmZYfOGMgOvoB0eWFLpYbhxUR3mxfDIMvpw==",
-      "dev": true
+      "version": "6.5.3",
+      "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz",
+      "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA=="
     },
     "raven": {
       "version": "2.6.4",
@@ -3306,6 +3002,14 @@
         "stack-trace": "0.0.10",
         "timed-out": "4.0.1",
         "uuid": "3.3.2"
+      },
+      "dependencies": {
+        "uuid": {
+          "version": "3.3.2",
+          "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz",
+          "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==",
+          "dev": true
+        }
       }
     },
     "rc": {
@@ -3321,18 +3025,13 @@
       }
     },
     "readable-stream": {
-      "version": "2.3.7",
-      "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
-      "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
-      "dev": true,
+      "version": "3.6.0",
+      "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
+      "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
       "requires": {
-        "core-util-is": "~1.0.0",
-        "inherits": "~2.0.3",
-        "isarray": "~1.0.0",
-        "process-nextick-args": "~2.0.0",
-        "safe-buffer": "~5.1.1",
-        "string_decoder": "~1.1.1",
-        "util-deprecate": "~1.0.1"
+        "inherits": "^2.0.3",
+        "string_decoder": "^1.1.1",
+        "util-deprecate": "^1.0.1"
       }
     },
     "regenerator-runtime": {
@@ -3342,12 +3041,12 @@
       "dev": true
     },
     "registry-auth-token": {
-      "version": "4.2.1",
-      "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.1.tgz",
-      "integrity": "sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw==",
+      "version": "4.2.2",
+      "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.2.tgz",
+      "integrity": "sha512-PC5ZysNb42zpFME6D/XlIgtNGdTl8bBOCw90xQLVMpzuuubJKYDWFAEuUNc+Cn8Z8724tg2SDhDRrkVEsqfDMg==",
       "dev": true,
       "requires": {
-        "rc": "^1.2.8"
+        "rc": "1.2.8"
       }
     },
     "registry-url": {
@@ -3362,8 +3061,7 @@
     "request-progress": {
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/request-progress/-/request-progress-3.0.0.tgz",
-      "integrity": "sha1-TKdUCBx/7GP1BeT6qCWqBs1mnb4=",
-      "dev": true,
+      "integrity": "sha512-MnWzEHHaxHO2iWiQuHrUPBi/1WeBf5PkxQqNyNvLl9VAYSdXkP8tQ3pBSeCPD+yw0v0Aq1zosWLz0BdeXpWwZg==",
       "requires": {
         "throttleit": "^1.0.0"
       }
@@ -3371,13 +3069,13 @@
     "require-directory": {
       "version": "2.1.1",
       "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
-      "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=",
+      "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
       "dev": true
     },
     "responselike": {
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz",
-      "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=",
+      "integrity": "sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ==",
       "dev": true,
       "requires": {
         "lowercase-keys": "^1.0.0"
@@ -3387,47 +3085,47 @@
       "version": "3.1.0",
       "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz",
       "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==",
-      "dev": true,
       "requires": {
         "onetime": "^5.1.0",
         "signal-exit": "^3.0.2"
       }
     },
+    "rfdc": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz",
+      "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA=="
+    },
     "rimraf": {
       "version": "3.0.2",
       "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
       "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
-      "dev": true,
       "requires": {
         "glob": "^7.1.3"
       }
     },
     "robots-parser": {
-      "version": "2.3.0",
-      "resolved": "https://registry.npmjs.org/robots-parser/-/robots-parser-2.3.0.tgz",
-      "integrity": "sha512-RvuCITckrHM9k8DxCCU9rqWpuuKRfVX9iHG751dC3/EdERxp9gJATxYYdYOT3L0T+TAT4+27lENisk/VbHm47A==",
+      "version": "2.4.0",
+      "resolved": "https://registry.npmjs.org/robots-parser/-/robots-parser-2.4.0.tgz",
+      "integrity": "sha512-oO8f2SI04dJk3pbj2KOMJ4G6QfPAgqcGmrYGmansIcpRewIPT2ljWEt5I+ip6EgiyaLo+RXkkUWw74M25HDkMA==",
       "dev": true
     },
     "rxjs": {
-      "version": "6.6.7",
-      "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz",
-      "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==",
-      "dev": true,
+      "version": "7.8.0",
+      "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.0.tgz",
+      "integrity": "sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg==",
       "requires": {
-        "tslib": "^1.9.0"
+        "tslib": "^2.1.0"
       }
     },
     "safe-buffer": {
-      "version": "5.1.2",
-      "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
-      "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
-      "dev": true
+      "version": "5.2.1",
+      "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+      "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="
     },
     "safer-buffer": {
       "version": "2.1.2",
       "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
-      "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
-      "dev": true
+      "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
     },
     "sanitize-filename": {
       "version": "1.6.3",
@@ -3471,7 +3169,6 @@
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
       "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
-      "dev": true,
       "requires": {
         "shebang-regex": "^3.0.0"
       }
@@ -3479,20 +3176,17 @@
     "shebang-regex": {
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
-      "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
-      "dev": true
+      "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="
     },
     "signal-exit": {
       "version": "3.0.3",
       "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz",
-      "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==",
-      "dev": true
+      "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA=="
     },
     "slice-ansi": {
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz",
       "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==",
-      "dev": true,
       "requires": {
         "ansi-styles": "^4.0.0",
         "astral-regex": "^2.0.0",
@@ -3500,19 +3194,25 @@
       }
     },
     "socket.io": {
-      "version": "2.4.1",
-      "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.4.1.tgz",
-      "integrity": "sha512-Si18v0mMXGAqLqCVpTxBa8MGqriHGQh8ccEOhmsmNS3thNCGBwO8WGrwMibANsWtQQ5NStdZwHqZR3naJVFc3w==",
+      "version": "2.5.0",
+      "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.5.0.tgz",
+      "integrity": "sha512-gGunfS0od3VpwDBpGwVkzSZx6Aqo9uOcf1afJj2cKnKFAoyl16fvhpsUhmUFd4Ldbvl5JvRQed6eQw6oQp6n8w==",
       "dev": true,
       "requires": {
         "debug": "~4.1.0",
-        "engine.io": "~3.5.0",
+        "engine.io": "~3.6.0",
         "has-binary2": "~1.0.2",
         "socket.io-adapter": "~1.1.0",
-        "socket.io-client": "2.4.0",
+        "socket.io-client": "2.5.0",
         "socket.io-parser": "~3.4.0"
       },
       "dependencies": {
+        "cookie": {
+          "version": "0.4.2",
+          "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz",
+          "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==",
+          "dev": true
+        },
         "debug": {
           "version": "4.1.1",
           "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
@@ -3521,6 +3221,26 @@
           "requires": {
             "ms": "^2.1.1"
           }
+        },
+        "engine.io": {
+          "version": "3.6.1",
+          "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.6.1.tgz",
+          "integrity": "sha512-dfs8EVg/i7QjFsXxn7cCRQ+Wai1G1TlEvHhdYEi80fxn5R1vZ2K661O6v/rezj1FP234SZ14r9CmJke99iYDGg==",
+          "dev": true,
+          "requires": {
+            "accepts": "~1.3.4",
+            "base64id": "2.0.0",
+            "cookie": "~0.4.1",
+            "debug": "~4.1.0",
+            "engine.io-parser": "~2.2.0",
+            "ws": "~7.4.2"
+          }
+        },
+        "ws": {
+          "version": "7.4.6",
+          "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz",
+          "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==",
+          "dev": true
         }
       }
     },
@@ -3531,9 +3251,9 @@
       "dev": true
     },
     "socket.io-client": {
-      "version": "2.4.0",
-      "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.4.0.tgz",
-      "integrity": "sha512-M6xhnKQHuuZd4Ba9vltCLT9oa+YvTsP8j9NcEiLElfIg8KeYPyhWOes6x4t+LTAC8enQbE/995AdTem2uNyKKQ==",
+      "version": "2.5.0",
+      "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.5.0.tgz",
+      "integrity": "sha512-lOO9clmdgssDykiOmVQQitwBAF3I6mYcQAo7hQ7AM6Ny5X7fp8hIJ3HcQs3Rjz4SoggoxA1OgrQyY8EgTbcPYw==",
       "dev": true,
       "requires": {
         "backo2": "1.0.2",
@@ -3561,19 +3281,19 @@
         "isarray": {
           "version": "2.0.1",
           "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz",
-          "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=",
+          "integrity": "sha512-c2cu3UxbI+b6kR3fy0nRnAhodsvR9dx7U5+znCOzdj6IfP3upFURTr0Xl5BlQZNKZjEtxrmVyfSdeE3O57smoQ==",
           "dev": true
         },
         "ms": {
           "version": "2.0.0",
           "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
-          "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+          "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
           "dev": true
         },
         "socket.io-parser": {
-          "version": "3.3.2",
-          "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.3.2.tgz",
-          "integrity": "sha512-FJvDBuOALxdCI9qwRrO/Rfp9yfndRtc1jSgVgV8FDraihmSP/MLGD5PEuJrNfjALvcQ+vMDM/33AWOYP/JSjDg==",
+          "version": "3.3.3",
+          "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.3.3.tgz",
+          "integrity": "sha512-qOg87q1PMWWTeO01768Yh9ogn7chB9zkKtQnya41Y355S0UmpXgpcrFwAgjYJxu9BdKug5r5e9YtVSeWhKBUZg==",
           "dev": true,
           "requires": {
             "component-emitter": "~1.3.0",
@@ -3584,9 +3304,9 @@
       }
     },
     "socket.io-parser": {
-      "version": "3.4.1",
-      "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.4.1.tgz",
-      "integrity": "sha512-11hMgzL+WCLWf1uFtHSNvliI++tcRUWdoeYuwIl+Axvwy9z2gQM+7nJyN3STj1tLj5JyIUH8/gpDGxzAlDdi0A==",
+      "version": "3.4.2",
+      "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.4.2.tgz",
+      "integrity": "sha512-QFZBaZDNqZXeemwejc7D39jrq2eGK/qZuVDiMPKzZK1hLlNvjGilGt4ckfQZeVX4dGmuPzCytN9ZW1nQlEWjgA==",
       "dev": true,
       "requires": {
         "component-emitter": "1.2.1",
@@ -3597,7 +3317,7 @@
         "component-emitter": {
           "version": "1.2.1",
           "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz",
-          "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=",
+          "integrity": "sha512-jPatnhd33viNplKjqXKRkGU345p263OIWzDL2wH3LGIGp5Kojo+uXizHmOADRvhGFFTnJqX3jBAKP6vvmSDKcA==",
           "dev": true
         },
         "debug": {
@@ -3612,7 +3332,7 @@
         "isarray": {
           "version": "2.0.1",
           "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz",
-          "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=",
+          "integrity": "sha512-c2cu3UxbI+b6kR3fy0nRnAhodsvR9dx7U5+znCOzdj6IfP3upFURTr0Xl5BlQZNKZjEtxrmVyfSdeE3O57smoQ==",
           "dev": true
         }
       }
@@ -3645,10 +3365,9 @@
       }
     },
     "sshpk": {
-      "version": "1.16.1",
-      "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz",
-      "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==",
-      "dev": true,
+      "version": "1.17.0",
+      "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz",
+      "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==",
       "requires": {
         "asn1": "~0.2.3",
         "assert-plus": "^1.0.0",
@@ -3664,14 +3383,13 @@
     "stack-trace": {
       "version": "0.0.10",
       "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz",
-      "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=",
+      "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==",
       "dev": true
     },
     "string-width": {
       "version": "4.2.2",
       "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz",
       "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==",
-      "dev": true,
       "requires": {
         "emoji-regex": "^8.0.0",
         "is-fullwidth-code-point": "^3.0.0",
@@ -3679,19 +3397,17 @@
       }
     },
     "string_decoder": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
-      "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
-      "dev": true,
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
+      "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
       "requires": {
-        "safe-buffer": "~5.1.0"
+        "safe-buffer": "~5.2.0"
       }
     },
     "strip-ansi": {
       "version": "6.0.0",
       "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
       "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
-      "dev": true,
       "requires": {
         "ansi-regex": "^5.0.0"
       }
@@ -3699,22 +3415,43 @@
     "strip-final-newline": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz",
-      "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==",
-      "dev": true
+      "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA=="
     },
     "strip-json-comments": {
       "version": "2.0.1",
       "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
-      "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=",
+      "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==",
       "dev": true
     },
     "supports-color": {
-      "version": "5.5.0",
-      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
-      "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
-      "dev": true,
+      "version": "7.2.0",
+      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+      "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
       "requires": {
-        "has-flag": "^3.0.0"
+        "has-flag": "^4.0.0"
+      }
+    },
+    "tar-fs": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz",
+      "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==",
+      "requires": {
+        "chownr": "^1.1.1",
+        "mkdirp-classic": "^0.5.2",
+        "pump": "^3.0.0",
+        "tar-stream": "^2.1.4"
+      }
+    },
+    "tar-stream": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz",
+      "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==",
+      "requires": {
+        "bl": "^4.0.3",
+        "end-of-stream": "^1.4.1",
+        "fs-constants": "^1.0.0",
+        "inherits": "^2.0.3",
+        "readable-stream": "^3.1.1"
       }
     },
     "term-size": {
@@ -3724,27 +3461,25 @@
       "dev": true
     },
     "third-party-web": {
-      "version": "0.12.4",
-      "resolved": "https://registry.npmjs.org/third-party-web/-/third-party-web-0.12.4.tgz",
-      "integrity": "sha512-SaJdgPjCus/5ftexuCk8wJnYwe/nW9ZNDcWZc/dq90SREN6PvFEUva+kgaPZfT8opLDHvjJVAG9mNVvMnHeVgw==",
+      "version": "0.12.7",
+      "resolved": "https://registry.npmjs.org/third-party-web/-/third-party-web-0.12.7.tgz",
+      "integrity": "sha512-9d/OfjEOjyeOpnm4F9o0KSK6BI6ytvi9DINSB5h1+jdlCvQlhKpViMSxWpBN9WstdfDQ61BS6NxWqcPCuQCAJg==",
       "dev": true
     },
     "throttleit": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-1.0.0.tgz",
-      "integrity": "sha1-nnhYNtr0Z0MUWlmEtiaNgoUorGw=",
-      "dev": true
+      "integrity": "sha512-rkTVqu6IjfQ/6+uNuuc3sZek4CEYxTJom3IktzgdSxcZqdARuebbA/f4QmAxMQIxqq9ZLEUkSYqvuk1I6VKq4g=="
     },
     "through": {
       "version": "2.3.8",
       "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
-      "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=",
-      "dev": true
+      "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg=="
     },
     "timed-out": {
       "version": "4.0.1",
       "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz",
-      "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=",
+      "integrity": "sha512-G7r3AhovYtr5YKOWQkta8RKAPb+J9IsO4uVmzjl8AZwfhs8UcUwTiD6gcJYSgOtzyjvQKrKYn41syHbUWMkafA==",
       "dev": true
     },
     "timm": {
@@ -3759,6 +3494,14 @@
       "integrity": "sha512-vJhccZPs965sV/L2sU4oRQVAos0pQXwsvTLkWYdqJ+a8Q5kPFzJTuOFwy7UniPli44NKQGAglksjvOcpo95aZA==",
       "dev": true
     },
+    "tmp": {
+      "version": "0.2.1",
+      "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz",
+      "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==",
+      "requires": {
+        "rimraf": "^3.0.0"
+      }
+    },
     "to-array": {
       "version": "0.1.4",
       "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz",
@@ -3775,12 +3518,16 @@
       "version": "2.5.0",
       "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz",
       "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==",
-      "dev": true,
       "requires": {
         "psl": "^1.1.28",
         "punycode": "^2.1.1"
       }
     },
+    "tr46": {
+      "version": "0.0.3",
+      "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
+      "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="
+    },
     "truncate-utf8-bytes": {
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz",
@@ -3793,20 +3540,17 @@
     "tryer": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/tryer/-/tryer-1.0.1.tgz",
-      "integrity": "sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==",
-      "dev": true
+      "integrity": "sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA=="
     },
     "tslib": {
-      "version": "1.14.1",
-      "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
-      "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
-      "dev": true
+      "version": "2.4.1",
+      "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz",
+      "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA=="
     },
     "tunnel-agent": {
       "version": "0.6.0",
       "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
-      "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
-      "dev": true,
+      "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==",
       "requires": {
         "safe-buffer": "^5.0.1"
       }
@@ -3814,8 +3558,7 @@
     "tweetnacl": {
       "version": "0.14.5",
       "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
-      "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=",
-      "dev": true
+      "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA=="
     },
     "type-detect": {
       "version": "4.0.8",
@@ -3826,14 +3569,7 @@
     "type-fest": {
       "version": "0.21.3",
       "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz",
-      "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==",
-      "dev": true
-    },
-    "typedarray": {
-      "version": "0.0.6",
-      "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
-      "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=",
-      "dev": true
+      "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w=="
     },
     "typedarray-to-buffer": {
       "version": "3.1.5",
@@ -3844,6 +3580,15 @@
         "is-typedarray": "^1.0.0"
       }
     },
+    "unbzip2-stream": {
+      "version": "1.4.3",
+      "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz",
+      "integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==",
+      "requires": {
+        "buffer": "^5.2.1",
+        "through": "^2.3.8"
+      }
+    },
     "unidiff": {
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/unidiff/-/unidiff-1.0.2.tgz",
@@ -3879,8 +3624,7 @@
     "untildify": {
       "version": "4.0.0",
       "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz",
-      "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==",
-      "dev": true
+      "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw=="
     },
     "update-notifier": {
       "version": "4.1.3",
@@ -3901,66 +3645,12 @@
         "pupa": "^2.0.1",
         "semver-diff": "^3.1.1",
         "xdg-basedir": "^4.0.0"
-      },
-      "dependencies": {
-        "chalk": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
-          "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==",
-          "dev": true,
-          "requires": {
-            "ansi-styles": "^4.1.0",
-            "supports-color": "^7.1.0"
-          }
-        },
-        "has-flag": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
-          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
-          "dev": true
-        },
-        "supports-color": {
-          "version": "7.2.0",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
-          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
-          "dev": true,
-          "requires": {
-            "has-flag": "^4.0.0"
-          }
-        }
-      }
-    },
-    "uri-js": {
-      "version": "4.4.1",
-      "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
-      "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
-      "dev": true,
-      "requires": {
-        "punycode": "^2.1.0"
-      }
-    },
-    "url": {
-      "version": "0.11.0",
-      "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz",
-      "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=",
-      "dev": true,
-      "requires": {
-        "punycode": "1.3.2",
-        "querystring": "0.2.0"
-      },
-      "dependencies": {
-        "punycode": {
-          "version": "1.3.2",
-          "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz",
-          "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=",
-          "dev": true
-        }
       }
     },
     "url-parse-lax": {
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz",
-      "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=",
+      "integrity": "sha512-NjFKA0DidqPa5ciFcSrXnAltTtzz84ogy+NebPvfEgAck0+TNg4UJ4IN+fB7zRZfbgUf0syOo9MDxFkDSMuFaQ==",
       "dev": true,
       "requires": {
         "prepend-http": "^2.0.0"
@@ -3984,37 +3674,52 @@
     "util-deprecate": {
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
-      "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
-      "dev": true
+      "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="
     },
     "uuid": {
-      "version": "3.3.2",
-      "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz",
-      "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==",
-      "dev": true
+      "version": "9.0.0",
+      "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz",
+      "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg=="
     },
     "verror": {
       "version": "1.10.0",
       "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
-      "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=",
-      "dev": true,
+      "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==",
       "requires": {
         "assert-plus": "^1.0.0",
         "core-util-is": "1.0.2",
         "extsprintf": "^1.2.0"
       }
     },
+    "web-streams-polyfill": {
+      "version": "3.2.1",
+      "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz",
+      "integrity": "sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q=="
+    },
+    "webidl-conversions": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
+      "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="
+    },
     "whatwg-fetch": {
       "version": "3.6.2",
       "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.2.tgz",
       "integrity": "sha512-bJlen0FcuU/0EMLrdbJ7zOnW6ITZLrZMIarMUVmdKtsGvZna8vxKYaexICWPfZ8qwf9fzNq+UEIZrnSaApt6RA==",
       "dev": true
     },
+    "whatwg-url": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
+      "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==",
+      "requires": {
+        "tr46": "~0.0.3",
+        "webidl-conversions": "^3.0.0"
+      }
+    },
     "which": {
       "version": "2.0.2",
       "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
       "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
-      "dev": true,
       "requires": {
         "isexe": "^2.0.0"
       }
@@ -4032,7 +3737,6 @@
       "version": "7.0.0",
       "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
       "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
-      "dev": true,
       "requires": {
         "ansi-styles": "^4.0.0",
         "string-width": "^4.1.0",
@@ -4042,8 +3746,7 @@
     "wrappy": {
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
-      "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
-      "dev": true
+      "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
     },
     "write-file-atomic": {
       "version": "3.0.3",
@@ -4058,13 +3761,9 @@
       }
     },
     "ws": {
-      "version": "6.2.1",
-      "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz",
-      "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==",
-      "dev": true,
-      "requires": {
-        "async-limiter": "~1.0.0"
-      }
+      "version": "7.5.9",
+      "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz",
+      "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q=="
     },
     "xdg-basedir": {
       "version": "4.0.0",
@@ -4107,9 +3806,9 @@
       "dev": true
     },
     "xmlhttprequest-ssl": {
-      "version": "1.5.5",
-      "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz",
-      "integrity": "sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4=",
+      "version": "1.6.3",
+      "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.6.3.tgz",
+      "integrity": "sha512-3XfeQE/wNkvrIktn2Kf0869fC0BN6UpydVasGIeSm2B1Llihf7/0UfZM+eCkOw3P7bP4+qPgqhm7ZoxuJtFU0Q==",
       "dev": true
     },
     "xtend": {
@@ -4124,6 +3823,11 @@
       "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
       "dev": true
     },
+    "yallist": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+      "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
+    },
     "yargs": {
       "version": "16.2.0",
       "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
@@ -4149,7 +3853,6 @@
       "version": "2.10.0",
       "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz",
       "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=",
-      "dev": true,
       "requires": {
         "buffer-crc32": "~0.2.3",
         "fd-slicer": "~1.1.0"
@@ -4158,7 +3861,7 @@
     "yeast": {
       "version": "0.1.2",
       "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz",
-      "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=",
+      "integrity": "sha512-8HFIh676uyGYP6wP13R/j6OJ/1HwJ46snpvzE7aHAN3Ryqh2yX6Xox2B4CUmTwwOIzlG3Bs7ocsP5dZH/R1Qbg==",
       "dev": true
     }
   }
diff --git a/it/package.json b/it/package.json
index d644487e..7691e3d7 100644
--- a/it/package.json
+++ b/it/package.json
@@ -11,10 +11,14 @@
   "author": "",
   "license": "ISC",
   "devDependencies": {
-    "chai": "^4.3.4",
-    "cypress": "^7.7.0",
-    "cypress-audit": "^1.0.0",
-    "cypress-plugin-snapshots": "^1.4.4",
-    "node-fetch": "^2.6.1"
+    "chai": "^4.3.7",
+    "cypress-audit": "^1.1.0",
+    "cypress-plugin-snapshots": "^1.4.4"
+  },
+  "dependencies": {
+    "@cypress-audit/pa11y": "^1.3.1",
+    "cypress": "^12.2.0",
+    "node-fetch": "^3.3.0",
+    "uuid": "^9.0.0"
   }
 }
diff --git a/reference/src/main/resources/jcr_root/apps/reference/components/forms/actions/sendemail/sendemail.jsp b/reference/src/main/resources/jcr_root/apps/reference/components/forms/actions/sendemail/sendemail.jsp
index b63a58ab..715a30f7 100644
--- a/reference/src/main/resources/jcr_root/apps/reference/components/forms/actions/sendemail/sendemail.jsp
+++ b/reference/src/main/resources/jcr_root/apps/reference/components/forms/actions/sendemail/sendemail.jsp
@@ -21,12 +21,12 @@
     <h3><fmt:message key="Send Main" /></h3>
     <dl>
         <dt><fmt:message key="From" /></dt>
-        <dd>${properties.from}</dd>
+        <dd>${sling:encode(properties.from,'HTML')}</dd>
         <dt><fmt:message key="To" /></dt>
-        <dd>${properties.to}</dd>
+        <dd>${sling:encode(properties.to,'HTML')}</dd>
         <dt><fmt:message key="Subject" /></dt>
-        <dd>${properties.subject}</dd>
+        <dd>${sling:encode(properties.subject,'HTML')}</dd>
         <dt><fmt:message key="Message" /></dt>
-        <dd>${properties.message}</dd>
+        <dd>${sling:encode(properties.message,'HTML')}</dd>
     </dl>
 </c:if>
\ No newline at end of file
diff --git a/reference/src/main/resources/jcr_root/apps/reference/components/forms/actions/updateprofile/updateprofile.jsp b/reference/src/main/resources/jcr_root/apps/reference/components/forms/actions/updateprofile/updateprofile.jsp
index 14c0de02..e62e797a 100644
--- a/reference/src/main/resources/jcr_root/apps/reference/components/forms/actions/updateprofile/updateprofile.jsp
+++ b/reference/src/main/resources/jcr_root/apps/reference/components/forms/actions/updateprofile/updateprofile.jsp
@@ -21,6 +21,6 @@
     <h3><fmt:message key="Update Profile" /></h3>
     <dl>
         <dt><fmt:message key="Subpath" /></dt>
-        <dd>${properties.subpath}</dd>
+        <dd>${sling:encode(properties.subpath,'HTML')}</dd>
     </dl>
 </c:if>
\ No newline at end of file
diff --git a/reference/src/main/resources/jcr_root/apps/reference/components/forms/actions/usergeneratedcontent/usergeneratedcontent.jsp b/reference/src/main/resources/jcr_root/apps/reference/components/forms/actions/usergeneratedcontent/usergeneratedcontent.jsp
index becba49a..ced803b8 100644
--- a/reference/src/main/resources/jcr_root/apps/reference/components/forms/actions/usergeneratedcontent/usergeneratedcontent.jsp
+++ b/reference/src/main/resources/jcr_root/apps/reference/components/forms/actions/usergeneratedcontent/usergeneratedcontent.jsp
@@ -21,26 +21,26 @@
     <h3><fmt:message key="Create User Generated Content" /></h3>
     <dl>
         <dt><fmt:message key="Action" /></dt>
-        <dd>${properties.approveAction}</dd>
+        <dd>${sling:encode(properties.approveAction,'HTML')}</dd>
         <dt><fmt:message key="Additional Properties" /></dt>
         <dd>
             <c:if test="${not empty properties.additionalProperties}">
-                ${fn:join(properties.additionalProperties,', ')}
+                ${sling:encode(fn:join(properties.additionalProperties,', '),'HTML')}
             </c:if>
         </dd>
         <dt><fmt:message key="Bucket" /></dt>
-        <dd>${properties.bucket}</dd>
+        <dd>${sling:encode(properties.bucket,'HTML')}</dd>
         <dt><fmt:message key="Content Type" /></dt>
-        <dd>${properties.contentType}</dd>
+        <dd>${sling:encode(properties.contentType,'HTML')}</dd>
         <dt><fmt:message key="Name" /></dt>
-        <dd>${properties.name}</dd>
+        <dd>${sling:encode(properties.name,'HTML')}</dd>
         <dt><fmt:message key="Path Depth" /></dt>
-        <dd>${properties.pathDepth}</dd>
+        <dd>${sling:encode(properties.pathDepth,'HTML')}</dd>
         <dt><fmt:message key="Preview" /></dt>
-        <dd>${properties.preview}</dd>
+        <dd>${sling:encode(properties.preview,'HTML')}</dd>
         <dt><fmt:message key="Target Path" /></dt>
-        <dd>${properties.targetPath}</dd>
+        <dd>${sling:encode(properties.targetPath,'HTML')}</dd>
         <dt><fmt:message key="Wrap in Page?" /></dt>
-        <dd>${properties.wrapPage}</dd>
+        <dd>${sling:encode(properties.wrapPage,'HTML')}</dd>
     </dl>
 </c:if>
\ No newline at end of file
diff --git a/reference/src/main/resources/jcr_root/apps/reference/components/forms/fields/honeypot/honeypot.jsp b/reference/src/main/resources/jcr_root/apps/reference/components/forms/fields/honeypot/honeypot.jsp
index a866eec6..50756b49 100644
--- a/reference/src/main/resources/jcr_root/apps/reference/components/forms/fields/honeypot/honeypot.jsp
+++ b/reference/src/main/resources/jcr_root/apps/reference/components/forms/fields/honeypot/honeypot.jsp
@@ -17,7 +17,7 @@
  * under the License.
  */ --%>
 <%@include file="/libs/sling-cms/global.jsp"%>
-<div class="${properties.containerClass}">
-    <label for="${properties.name}"><fmt:message key="Do not fill this out!" /></label>   
-    <textarea name="${properties.name}" id="${properties.name}" rows="1" cols="1"></textarea>
+<div class="${sling:encode(properties.containerClass,'HTML_ATTR')}">
+    <label for="${sling:encode(properties.name,'HTML_ATTR')}"><fmt:message key="Do not fill this out!" /></label>   
+    <textarea name="${sling:encode(properties.name,'HTML_ATTR')}" id="${sling:encode(properties.name,'HTML_ATTR')}" rows="1" cols="1"></textarea>
 </div>
\ No newline at end of file
diff --git a/reference/src/main/resources/jcr_root/apps/reference/components/forms/fields/selection/edit.json b/reference/src/main/resources/jcr_root/apps/reference/components/forms/fields/selection/edit.json
index a3cfcfa6..0859ac04 100644
--- a/reference/src/main/resources/jcr_root/apps/reference/components/forms/fields/selection/edit.json
+++ b/reference/src/main/resources/jcr_root/apps/reference/components/forms/fields/selection/edit.json
@@ -1,4 +1,4 @@
- {
+{
     "jcr:primaryType": "nt:unstructured",
     "sling:resourceType": "sling-cms/components/editor/slingform",
     "button": "Save",
@@ -53,7 +53,8 @@
             "name": "tagRoot",
             "basePath": "/etc/taxonomy",
             "type": "sling:Taxonomy",
-            "titleProperty": "jcr:title"
+            "titleProperty": "jcr:title",
+            "required": true
         },
         "required": {
             "jcr:primaryType": "nt:unstructured",
diff --git a/reference/src/main/resources/jcr_root/apps/reference/components/forms/fields/selection/selection.jsp b/reference/src/main/resources/jcr_root/apps/reference/components/forms/fields/selection/selection.jsp
index e565a4ca..aea093f6 100644
--- a/reference/src/main/resources/jcr_root/apps/reference/components/forms/fields/selection/selection.jsp
+++ b/reference/src/main/resources/jcr_root/apps/reference/components/forms/fields/selection/selection.jsp
@@ -19,12 +19,12 @@
 <%@include file="/libs/sling-cms/global.jsp"%>
 <c:if test="${not empty properties.tagRoot}">
     <c:set var="children" value="${sling:listChildren(sling:getResource(resourceResolver,properties.tagRoot))}" />
-    <div class="${formConfig.fieldGroupClass} ${properties.addClasses}">
+    <div class="${sling:encode(formConfig.fieldGroupClass,'HTML_ATTR')} ${sling:encode(properties.addClasses,'HTML_ATTR')}">
         <c:if test="${not empty properties.label}">
-            <label for="${properties.name}">
+            <label for="${sling:encode(properties.name,'HTML_ATTR')}">
                 <sling:encode value="${properties.label}" mode="HTML" />
                 <c:if test="${properties.required}">
-                    <span class="${formConfig.fieldRequiredClass}">
+                    <span class="${sling:encode(formConfig.fieldRequiredClass,'HTML_ATTR')}">
                         *
                     </span>
                 </c:if>
@@ -33,7 +33,7 @@
         <c:choose>
             <c:when test="${properties.display == 'radioCheckbox'}">
                 <c:forEach var="tag" items="${children}">
-                    <div class="${formConfig.checkFieldClass}">
+                    <div class="${sling:encode(formConfig.checkFieldClass,'HTML_ATTR')}">
                         <c:set var="selected" value="${false}" />
                         <c:choose>
                             <c:when test="${properties.multiple}">
@@ -47,15 +47,15 @@
                                 <c:set var="selected" value="${true}" />
                             </c:when>
                         </c:choose>
-                        <input class="${formConfig.checkInputClass}" type="${properties.multiple ? 'checkbox' : 'radio'}" name="${properties.name}" id="${properties.name}-${tag.name}" value="${tag.name}" ${selected ? 'checked="checked"' : ''} ${properties.required ? 'required="required"' : ''} />
-                        <label class="${formConfig.checkLabelClass}" for="${properties.name}-${tag.name}">
+                        <input class="${sling:encode(formConfig.checkInputClass,'HTML_ATTR')}" type="${properties.multiple ? 'checkbox' : 'radio'}" name="${sling:encode(properties.name,'HTML_ATTR')}" id="${sling:encode(properties.name,'HTML_ATTR')}-${sling:encode(tag.name,'HTML_ATTR')}" value="${sling:encode(tag.name,'HTML_ATTR')}" ${selected ? 'checked="checked"' : ''} ${properties.required ? 'required="required"' : ''} />
+                        <label class="${sling:encode(formConfig.checkLabelClass,'HTML_ATTR')}" for="${sling:encode(properties.name,'HTML_ATTR')}-${sling:encode(tag.name,'HTML_ATTR')}">
                             <sling:encode value="${tag.valueMap['jcr:title']}" mode="HTML" />
                         </label>
                     </div>
                 </c:forEach>
             </c:when>
             <c:otherwise>
-                <select id="${properties.name}" class="form-control" ${properties.multiple ? 'multiple="multiple"' : ''} ${properties.required ? 'required="required"' : ''} name="${properties.name}">
+                <select id="${sling:encode(properties.name,'HTML_ATTR')}" class="form-control" ${properties.multiple ? 'multiple="multiple"' : ''} ${properties.required ? 'required="required"' : ''} name="${sling:encode(properties.name,'HTML_ATTR')}">
                     <c:if test="${not empty properties.noSelection && !properties.muliple}">
                         <option value="">
                             <sling:encode value="${properties.noSelection}" mode="HTML" />
@@ -75,8 +75,8 @@
                                 <c:set var="selected" value="${true}" />
                             </c:when>
                         </c:choose>
-                        <option value="${tag.name}" ${selected ? 'selected="selected"' : ''} >
-                            <sling:encode value="${tag.valueMap['jcr:title']}" mode="HTML" />
+                        <option value="${sling:encode(tag.name,'HTML_ATTR')}" ${selected ? 'selected="selected"' : ''} >
+                            <sling:encode value="${sling:encode(tag.valueMap['jcr:title'],'HTML_ATTR')}" mode="HTML" />
                         </option>
                     </c:forEach>
                 </select>
diff --git a/reference/src/main/resources/jcr_root/apps/reference/components/forms/fields/textarea/textarea.jsp b/reference/src/main/resources/jcr_root/apps/reference/components/forms/fields/textarea/textarea.jsp
index e2ca9cfc..d86ede56 100644
--- a/reference/src/main/resources/jcr_root/apps/reference/components/forms/fields/textarea/textarea.jsp
+++ b/reference/src/main/resources/jcr_root/apps/reference/components/forms/fields/textarea/textarea.jsp
@@ -17,12 +17,12 @@
  * under the License.
  */ --%>
  <%@include file="/libs/sling-cms/global.jsp"%>
-<div class="${formConfig.fieldGroupClass} ${properties.addClasses}">
+<div class="${sling:encode(formConfig.fieldGroupClass,'HTML_ATTR')} ${sling:encode(properties.addClasses,'HTML_ATTR')}">
     <c:if test="${not empty properties.label}">
-        <label for="${properties.name}">
+        <label for="${sling:encode(properties.name,'HTML_ATTR')}">
             <sling:encode value="${properties.label}" mode="HTML" />
             <c:if test="${properties.required}">
-                <span class="${formConfig.fieldRequiredClass}">
+                <span class="${sling:encode(formConfig.fieldRequiredClass,'HTML_ATTR')}">
                     *
                 </span>
             </c:if>
diff --git a/reference/src/main/resources/jcr_root/apps/reference/components/forms/fields/textfield/textfield.jsp b/reference/src/main/resources/jcr_root/apps/reference/components/forms/fields/textfield/textfield.jsp
index 4adc29c3..26c2aac5 100644
--- a/reference/src/main/resources/jcr_root/apps/reference/components/forms/fields/textfield/textfield.jsp
+++ b/reference/src/main/resources/jcr_root/apps/reference/components/forms/fields/textfield/textfield.jsp
@@ -17,19 +17,19 @@
  * under the License.
  */ --%>
  <%@include file="/libs/sling-cms/global.jsp"%>
-<div class="${formConfig.fieldGroupClass} ${properties.addClasses}">
+<div class="${sling:encode(formConfig.fieldGroupClass,'HTML_ATTR')} ${sling:encode(properties.addClasses,'HTML_ATTR')}">
     <c:if test="${not empty properties.label}">
-        <label for="${properties.name}">
+        <label for="${sling:encode(properties.addClasses,'HTML_ATTR')}">
             <sling:encode value="${properties.label}" mode="HTML" />
             <c:if test="${properties.required}">
-                <span class="${formConfig.fieldRequiredClass}">
+                <span class="${sling:encode(formConfig.fieldRequiredClass,'HTML_ATTR')}">
                     *
                 </span>
             </c:if>
         </label>
     </c:if>
-    <c:set var="placeholderStr" value="placeholder='${properties.placeholder}'" />
-    <c:set var="patternStr" value="pattern='${properties.pattern}'" />
+    <c:set var="placeholderStr" value="placeholder='${sling:encode(properties.placeholder,'HTML_ATTR')}'" />
+    <c:set var="patternStr" value="pattern='${sling:encode(properties.pattern,'HTML_ATTR')}'" />
     <c:choose>
         <c:when test="${not empty formData[properties.name]}">
             <c:set var="fieldValue" value="${formData[properties.name]}" />
@@ -43,7 +43,7 @@
     </c:choose>
     <input type="${sling:encode(properties.type,'HTML_ATTR')}" class="${sling:encode(formConfig.fieldClass,'HTML_ATTR')}" id="${sling:encode(properties.name,'HTML_ATTR')}" name="${sling:encode(properties.name,'HTML_ATTR')}" value="${sling:encode(fieldValue,'HTML_ATTR')}" ${not empty properties.pattern ? patternStr : ''} ${not empty properties.placeholder ? placeholderStr : ''} ${properties.required ? 'required="required"' : ''}
         <c:forEach var="attr" items="${properties.additionalAttributes}">
-            ${fn:split(attr,'\\=')[0]}="${fn:split(attr,'\\=')[1]}"
+            ${sling:encode(fn:split(attr,'\\=')[0],'HTML_ATTR')}="${sling:encode(fn:split(attr,'\\=')[1],'HTML_ATTR')}"
         </c:forEach> 
         />
 </div>
\ No newline at end of file
diff --git a/reference/src/main/resources/jcr_root/apps/reference/components/forms/form/form.jsp b/reference/src/main/resources/jcr_root/apps/reference/components/forms/form/form.jsp
index c388f353..f805cd9d 100644
--- a/reference/src/main/resources/jcr_root/apps/reference/components/forms/form/form.jsp
+++ b/reference/src/main/resources/jcr_root/apps/reference/components/forms/form/form.jsp
@@ -21,18 +21,18 @@
 <c:set var="formData" value="${sling:adaptTo(slingRequest,'org.apache.sling.cms.reference.forms.FormRequest').formData}" scope="request" />
 <form class="${formConfig.formClass}" action="${sling:encode(resource.path,'HTML_ATTR')}.allowpost.html" method="post" data-analytics-id="${sling:encode(properties.formId,'HTML_ATTR')}" enctype="multipart/form-data">
     <c:if test="${param.message == 'success'}">
-        <div class="${formConfig.alertClass}">
-            ${properties.successMessage}
+        <div class="${sling:encode(formConfig.alertClass,'HTML_ATTR')}">
+            <sling:encode value="${properties.successMessage}" mode="HTML" />
         </div>
     </c:if>
     <c:if test="${param.error == 'actions'}">
-        <div class="${formConfig.alertClass}">
-            ${properties.actionsErrorMessage}
+        <div class="${sling:encode(formConfig.alertClass,'HTML_ATTR')}">
+            <sling:encode value="${properties.actionsErrorMessage}" mode="HTML" />
         </div>
     </c:if>
     <c:if test="${param.error == 'fields'}">
-        <div class="${formConfig.alertClass}">
-            ${properties.fieldsErrorMessage}
+        <div class="${sling:encode(formConfig.alertClass,'HTML_ATTR')}">
+            <sling:encode value="${properties.fieldsErrorMessage}" mode="HTML" />
         </div>
     </c:if>
 
@@ -57,6 +57,8 @@
     <sling:include path="actions" resourceType="sling-cms/components/general/reloadcontainer" />
     <c:set var="availableTypes" value="${oldAvailableTypes}" scope="request" />
     
-    <button type="submit" class="${formConfig.submitClass}">${properties.submitText}</button>
+    <button type="submit" class="${sling:encode(formConfig.submitClass,'HTML_ATTR')}">
+        <sling:encode value="${properties.submitText}" mode="HTML" />
+    </button>
     
 </form>
\ No newline at end of file
diff --git a/reference/src/main/resources/jcr_root/apps/reference/components/forms/login/login.jsp b/reference/src/main/resources/jcr_root/apps/reference/components/forms/login/login.jsp
index 15d09573..663cf071 100644
--- a/reference/src/main/resources/jcr_root/apps/reference/components/forms/login/login.jsp
+++ b/reference/src/main/resources/jcr_root/apps/reference/components/forms/login/login.jsp
@@ -20,23 +20,23 @@
 <sling:adaptTo adaptable="${resource}" adaptTo="org.apache.sling.cms.PageManager" var="pageManager" />
 <sling:adaptTo adaptable="${resource}" adaptTo="org.apache.sling.cms.ComponentPolicyManager" var="componentPolicyMgr" />
 <c:set var="formConfig" value="${componentPolicyMgr.componentPolicy.componentConfigs['reference/components/forms/form'].valueMap}" />
-<form class="${formConfig.formClass}" action="${pageManager.page.path}.allowpost.html/j_security_check" method="post" data-analytics-id="Login Form">  
+<form class="${sling:encode(formConfig.formClass,'HTML_ATTR')}" action="${sling:encode(pageManager.page.path,'HTML_ATTR')}.allowpost.html/j_security_check" method="post" data-analytics-id="Login Form">  
     <c:if test="${not empty param.j_reason}">
         <div class="${formConfig.alertClass}">
             ${sling:encode(properties.errorMessage,'HTML')}
         </div>
     </c:if>
-    <div class="${formConfig.fieldGroupClass}">
-        <label for="j_username" class="label">${sling:encode(properties.usernameLabel,'HTML')} <span class="${formConfig.fieldRequiredClass}">*</span></label>
-        <input type="text" class="${formConfig.fieldClass}" required="required" name="j_username" />
+    <div class="${sling:encode(formConfig.fieldGroupClass,'HTML_ATTR')}">
+        <label for="j_username" class="label">${sling:encode(properties.usernameLabel,'HTML')} <span class="${sling:encode(formConfig.fieldRequiredClass,'HTML_ATTR')}">*</span></label>
+        <input type="text" class="${sling:encode(formConfig.fieldClass,'HTML')}" required="required" name="j_username" />
     </div>
-    <div class="${formConfig.fieldGroupClass}">
-        <label for="j_password" class="label">${sling:encode(properties.passwordLabel,'HTML')} <span class="${formConfig.fieldRequiredClass}">*</span></label>
-        <input type="password" class="${formConfig.fieldClass}" required="required" name="j_password" />
+    <div class="${sling:encode(formConfig.fieldGroupClass,'HTML_ATTR')}">
+        <label for="j_password" class="label">${sling:encode(properties.passwordLabel,'HTML')} <span class="${sling:encode(formConfig.fieldRequiredClass,'HTML_ATTR')}">*</span></label>
+        <input type="password" class="${sling:encode(formConfig.fieldClass,'HTML')}" required="required" name="j_password" />
     </div>
     <input type="hidden" name="resource" value="${sling:encode(properties.successPage,'HTML_ATTR')}.html" />
     <input type="hidden" name="j_validate" value="true" />
-    <div class="${formConfig.fieldGroupClass}">
-        <button class="${formConfig.submitClass}">${sling:encode(properties.submitLabel,'HTML')}</button>
+    <div class="${sling:encode(formConfig.fieldGroupClass,'HTML_ATTR')}">
+        <button class="${sling:encode(formConfig.submitClass,'HTML_ATTR')}">${sling:encode(properties.submitLabel,'HTML')}</button>
     </div>
 </form>
\ No newline at end of file
diff --git a/reference/src/main/resources/jcr_root/apps/reference/components/forms/providers/userprofile/userprofile.jsp b/reference/src/main/resources/jcr_root/apps/reference/components/forms/providers/userprofile/userprofile.jsp
index 6319b6eb..3606fe80 100644
--- a/reference/src/main/resources/jcr_root/apps/reference/components/forms/providers/userprofile/userprofile.jsp
+++ b/reference/src/main/resources/jcr_root/apps/reference/components/forms/providers/userprofile/userprofile.jsp
@@ -21,6 +21,6 @@
     <h3><fmt:message key="User Profile" /></h3>
     <dl>
         <dt><fmt:message key="Subpath" /></dt>
-        <dd>${properties.subpath}</dd>
+        <dd>${sling:encode(properties.subpath)}</dd>
     </dl>
 </c:if>
\ No newline at end of file
diff --git a/reference/src/main/resources/jcr_root/apps/reference/components/general/columncontrol/columncontrol.jsp b/reference/src/main/resources/jcr_root/apps/reference/components/general/columncontrol/columncontrol.jsp
index 9595576d..de2bedca 100644
--- a/reference/src/main/resources/jcr_root/apps/reference/components/general/columncontrol/columncontrol.jsp
+++ b/reference/src/main/resources/jcr_root/apps/reference/components/general/columncontrol/columncontrol.jsp
@@ -21,7 +21,7 @@
 <c:set var="configRsrc" value="${componentPolicyMgr.componentPolicy.componentConfigs['reference/components/general/columncontrol']}" />
 <c:choose>
     <c:when test="${properties.container == true}">
-        <div class="${configRsrc.valueMap.containerclass}">
+        <div class="${sling:encode(configRsrc.valueMap.containerclass,'HTML_ATTR')}">
             <div class="${configRsrc.valueMap.rowClass}">
                 <c:forEach var="col" items="${fn:split(properties.layout,',')}" varStatus="status">
                     <div class="${sling:encode(col,'HTML_ATTR')}">
@@ -32,7 +32,7 @@
          </div>
      </c:when>
      <c:otherwise>
-         <div class="${configRsrc.valueMap.rowClass}">
+         <div class="${sling:encode(configRsrc.valueMap.containerclass,'HTML_ATTR')}">
             <c:forEach var="col" items="${fn:split(properties.layout,',')}" varStatus="status">
                 <div class="${sling:encode(col,'HTML_ATTR')}">
                     <sling:include path="col-${status.index}" resourceType="sling-cms/components/general/container" />
diff --git a/reference/src/main/resources/jcr_root/apps/reference/components/general/image/image.jsp b/reference/src/main/resources/jcr_root/apps/reference/components/general/image/image.jsp
index 320152a0..eb0c73a8 100644
--- a/reference/src/main/resources/jcr_root/apps/reference/components/general/image/image.jsp
+++ b/reference/src/main/resources/jcr_root/apps/reference/components/general/image/image.jsp
@@ -28,5 +28,5 @@
             </c:otherwise>
         </c:choose>
     </c:if>
-    <img src="${sling:encode(properties.src,'HTML_ATTR')}${transform}" alt="${sling:encode(properties.alt,'HTML_ATTR')}" class="${sling:encode(properties.imageClass,'HTML_ATTR')}" />
+    <img src="${sling:encode(properties.src,'HTML_ATTR')}${sling:encode(transform,'HTML_ATTR')}" alt="${sling:encode(properties.alt,'HTML_ATTR')}" class="${sling:encode(properties.imageClass,'HTML_ATTR')}" />
 </c:if>
\ No newline at end of file
diff --git a/reference/src/main/resources/jcr_root/apps/reference/components/general/list/list.jsp b/reference/src/main/resources/jcr_root/apps/reference/components/general/list/list.jsp
index 71a24f33..ced1b1f6 100644
--- a/reference/src/main/resources/jcr_root/apps/reference/components/general/list/list.jsp
+++ b/reference/src/main/resources/jcr_root/apps/reference/components/general/list/list.jsp
@@ -19,7 +19,7 @@
  <%@include file="/libs/sling-cms/global.jsp"%>
 <sling:call script="init.jsp" />
 <c:if test="${list != null}">
-    <${tag} class="list ${clazz}">
+    <${sling:encode(tag,'HTML')} class="list ${sling:encode(clazz,'HTML')}">
         <c:forEach var="it" items="${list.items}">
             <c:set var="item" value="${it}" scope="request" />
             <sling:call script="item.jsp" />
@@ -27,5 +27,5 @@
         <c:if test="${includePagination}">
             <sling:call script="pagination.jsp" />
         </c:if>
-    </${tag}>
+    </${sling:encode(tag,'HTML')}>
 </c:if>
\ No newline at end of file
diff --git a/reference/src/main/resources/jcr_root/apps/reference/components/general/list/pagination.jsp b/reference/src/main/resources/jcr_root/apps/reference/components/general/list/pagination.jsp
index 1081d591..dd8a674b 100644
--- a/reference/src/main/resources/jcr_root/apps/reference/components/general/list/pagination.jsp
+++ b/reference/src/main/resources/jcr_root/apps/reference/components/general/list/pagination.jsp
@@ -21,36 +21,36 @@
     <ul class="${listConfig.valueMap.paginationClass}">
         <c:choose>
             <c:when test="${list.first == true}">
-                <li class="${listConfig.valueMap.pageItemClass} disabled">
-                    <span class="${listConfig.valueMap.pageLinkClass}">
+                <li class="${sling:encode(listConfig.valueMap.pageItemClass,'HTML_ATTR')} disabled">
+                    <span class="${sling:encode(listConfig.valueMap.pageLinkClass,'HTML_ATTR')}">
                         &lt;
                     </span>
                 </li>
             </c:when>
             <c:otherwise>
-                <li class="${listConfig.valueMap.pageItemClass}">
-                    <a class="${listConfig.valueMap.pageLinkClass}" href="?page=${list.currentPage - 1}">&lt;</a>
+                <li class="${sling:encode(listConfig.valueMap.pageItemClass,'HTML_ATTR')}">
+                    <a class="${sling:encode(listConfig.valueMap.pageLinkClass,'HTML_ATTR')}" href="?page=${list.currentPage - 1}">&lt;</a>
                 </li>
             </c:otherwise>
         </c:choose>
         <c:forEach var="page" items="${list.pages}">
-            <li class="${listConfig.valueMap.pageItemClass} ${page == list.currentPage ? 'active' : ''}">
-                <a href="?page=${page}" class="${listConfig.valueMap.pageLinkClass}">
+            <li class="${sling:encode(listConfig.valueMap.pageItemClass,'HTML_ATTR')} ${page == list.currentPage ? 'active' : ''}">
+                <a href="?page=${page}" class="${sling:encode(listConfig.valueMap.pageLinkClass,'HTML_ATTR')}">
                     ${page}
                 </a>
             </li>
         </c:forEach>
         <c:choose>
             <c:when test="${list.last}">
-                <li class="${listConfig.valueMap.pageItemClass} disabled">
-                    <span class="${listConfig.valueMap.pageLinkClass}">
+                <li class="${sling:encode(listConfig.valueMap.pageItemClass,'HTML_ATTR')} disabled">
+                    <span class="${sling:encode(listConfig.valueMap.pageLinkClass,'HTML_ATTR')}">
                         &gt;
                     </span>
                 </li>
             </c:when>
             <c:otherwise>
-                <li class="${listConfig.valueMap.pageItemClass}">
-                    <a class="${listConfig.valueMap.pageLinkClass}" href="?page=${list.currentPage + 1}">&gt;</a>
+                <li class="${sling:encode(listConfig.valueMap.pageItemClass,'HTML_ATTR')}">
+                    <a class="${sling:encode(listConfig.valueMap.pageLinkClass,'HTML_ATTR')}" href="?page=${list.currentPage + 1}">&gt;</a>
                 </li>
             </c:otherwise>
         </c:choose>
diff --git a/reference/src/main/resources/jcr_root/apps/reference/components/general/reference/types.jsp b/reference/src/main/resources/jcr_root/apps/reference/components/general/reference/types.jsp
index bc70b0f8..6e0dcd61 100644
--- a/reference/src/main/resources/jcr_root/apps/reference/components/general/reference/types.jsp
+++ b/reference/src/main/resources/jcr_root/apps/reference/components/general/reference/types.jsp
@@ -38,7 +38,7 @@
             <c:set var="type" value="${fn:substringAfter(component.path, '/apps/')}" />
         </c:otherwise>
     </c:choose>
-    <option ${slingRequest.requestPathInfo.suffixResource.valueMap.overrideType == type ? 'selected' : ''} value="${type}">
+    <option ${slingRequest.requestPathInfo.suffixResource.valueMap.overrideType == type ? 'selected' : ''} value="${sling:encode(type,'HTML_ATTR')}">
         ${sling:encode(component.valueMap['jcr:title'],'HTML')}
     </option>
 </c:forEach>
\ No newline at end of file
diff --git a/reference/src/main/resources/jcr_root/apps/reference/components/general/rss/rss.xml.jsp b/reference/src/main/resources/jcr_root/apps/reference/components/general/rss/rss.xml.jsp
index 1f3c6a2f..df7afe00 100644
--- a/reference/src/main/resources/jcr_root/apps/reference/components/general/rss/rss.xml.jsp
+++ b/reference/src/main/resources/jcr_root/apps/reference/components/general/rss/rss.xml.jsp
@@ -23,11 +23,11 @@
         <title>${sling:encode(site.title,'XML')}</title>
         <description>${sling:encode(site.description,'XML')}</description>
         <language>${site.locale.language}</language>
-        <link>${site.url}</link>
+        <link>${sling:encode(site.url,'XML')}</link>
         <image>
-            <url>${site.url}${fn:replace(properties.image,site.path,'')}</url>
+            <url>${sling:encode(site.url,'XML')}${sling:encode(fn:replace(properties.image,site.path,''),'HTML')}</url>
             <title>${sling:encode(site.title,'XML')}</title>
-            <link>${site.url}</link>
+            <link>${sling:encode(site.url,'XML')}</link>
         </image>
         <atom:link href="${site.url}${fn:replace(resource.path,site.path,'')}.xml" rel="self" type="application/rss+xml" />
         <c:set var="query" value="SELECT * FROM [sling:Page] WHERE ISDESCENDANTNODE([${site.path}/${properties.subpath}]) AND ([jcr:content/published]=true OR [jcr:content/sling:published]=true ) ORDER BY [jcr:content/publishDate] DESC" />
@@ -57,14 +57,14 @@
                 </c:choose>
                 <content:encoded>
                     <![CDATA[
-                        <img src="${thumbLink}" title="${sling:encode(post.title,'XML_ATTR')}" />
+                        <img src="${sling:encode(thumbLink,'XML_ATTR')}" title="${sling:encode(post.title,'XML_ATTR')}" />
                         <c:choose>
                             <c:when test="${not empty post.properties.snippet}">
-                                    <sling:encode value="${post.properties.snippet}" mode="XML" />
+                                <sling:encode value="${post.properties.snippet}" mode="XML" />
                             </c:when>
                             <c:otherwise>
                                 <c:set var="insight" value="${sling:adaptTo(postRsrc,'org.apache.sling.cms.insights.PageInsightRequest')}" />
-                                ${insight.pageBodyHtml}
+                                <sling:encode value="${insight.pageBodyHtml}" mode="XML" />
                             </c:otherwise>
                         </c:choose>
                     ]]>
@@ -74,8 +74,8 @@
                 </c:if>
                 <fmt:parseDate value="${post.properties.publishDate}" var="publishDate" pattern="yyyy-MM-dd" />
                 <pubDate><fmt:formatDate value="${publishDate}" pattern="EEE, dd MMM yyyy HH:mm:ss Z" /></pubDate>
-                <link>${site.url}${post.publishedPath}</link>
-                <guid isPermaLink="true">${site.url}${post.publishedPath}</guid>
+                <link>${sling:encode(site.url,'XML')}${sling:encode(post.publishedPath,'XML')}</link>
+                <guid isPermaLink="true">${sling:encode(site.url,'XML')}${sling:encode(post.publishedPath,'XML')}</guid>
             </item>
         </c:forEach>
     </channel>
diff --git a/reference/src/main/resources/jcr_root/apps/reference/components/general/search/pagination.jsp b/reference/src/main/resources/jcr_root/apps/reference/components/general/search/pagination.jsp
index d74ebfdb..72530a1d 100644
--- a/reference/src/main/resources/jcr_root/apps/reference/components/general/search/pagination.jsp
+++ b/reference/src/main/resources/jcr_root/apps/reference/components/general/search/pagination.jsp
@@ -19,39 +19,39 @@
 <%@include file="/libs/sling-cms/global.jsp"%>
 <c:set var="pageParam" value="${not empty param.q ? param.q : '1'}" />
 <nav>
-    <ul class="${searchConfig.paginationClass}">
+    <ul class="${sling:encode(searchConfig.paginationClass,'HTML_ATTR')}">
         <c:choose>
             <c:when test="${search.first == true}">
-                <li class="${searchConfig.pageItemClass} disabled">
-                    <span class="${searchConfig.pageLinkClass}">
+                <li class="${sling:encode(searchConfig.pageItemClass,'HTML_ATTR')} disabled">
+                    <span class="${sling:encode(searchConfig.pageLinkClass,'HTML_ATTR')}">
                         &lt;
                     </span>
                 </li>
             </c:when>
             <c:otherwise>
-                <li class="${searchConfig.pageItemClass}">
-                    <a class="${searchConfig.pageLinkClass}" href="?q=${sling:encode(search.term,'HTML_ATTR')}">&lt;</a>
+                <li class="${sling:encode(searchConfig.pageItemClass,'HTML_ATTR')}">
+                    <a class="${sling:encode(searchConfig.pageLinkClass,'HTML_ATTR')}" href="?q=${sling:encode(search.term,'HTML_ATTR')}">&lt;</a>
                 </li>
             </c:otherwise>
         </c:choose>
         <c:forEach var="page" items="${search.pages}">
-            <li class="${searchConfig.pageItemClass}${page == pageParam ? ' active' : ''}">
-                <a href="?q=${sling:encode(search.term,'HTML_ATTR')}&page=${page}" class="${searchConfig.pageLinkClass}${page == param.page ? ' active' : ''}">
+            <li class="${sling:encode(searchConfig.pageItemClass,'HTML_ATTR')}${page == pageParam ? ' active' : ''}">
+                <a href="?q=${sling:encode(search.term,'HTML_ATTR')}&page=${page}" class="${sling:encode(searchConfig.pageLinkClass,'HTML_ATTR')}${page == param.page ? ' active' : ''}">
                     ${page}
                 </a>
             </li>
         </c:forEach>
         <c:choose>
             <c:when test="${search.last}">
-                <li class="${searchConfig.pageItemClass} disabled">
-                    <span class="${searchConfig.pageLinkClass}">
+                <li class="${sling:encode(searchConfig.pageItemClass,'HTML_ATTR')} disabled">
+                    <span class="${sling:encode(searchConfig.pageLinkClass,'HTML_ATTR')}">
                         &gt;
                     </span>
                 </li>
             </c:when>
             <c:otherwise>
-                <li class="${searchConfig.pageItemClass}">
-                    <a class="${searchConfig.pageLinkClass}" href="?q=${sling:encode(search.term,'HTML_ATTR')}&page=${search.currentPage + 1}">&gt;</a>
+                <li class="${sling:encode(searchConfig.pageItemClass,'HTML_ATTR')}">
+                    <a class="${sling:encode(searchConfig.pageLinkClass,'HTML_ATTR')}" href="?q=${sling:encode(search.term,'HTML_ATTR')}&page=${search.currentPage + 1}">&gt;</a>
                 </li>
             </c:otherwise>
         </c:choose>
diff --git a/reference/src/main/resources/jcr_root/apps/reference/components/general/search/result.jsp b/reference/src/main/resources/jcr_root/apps/reference/components/general/search/result.jsp
index eaa2c1a0..56888590 100644
--- a/reference/src/main/resources/jcr_root/apps/reference/components/general/search/result.jsp
+++ b/reference/src/main/resources/jcr_root/apps/reference/components/general/search/result.jsp
@@ -17,8 +17,8 @@
  * under the License.
  */ --%>
 <%@include file="/libs/sling-cms/global.jsp"%>
-<div class="searchresult ${searchConfig.resultClass}">
-    <div class="searchresult__header ${searchConfig.resultHeaderClass}">
+<div class="searchresult ${sling:encode(searchConfig.resultClass,'HTML_ATTR')}">
+    <div class="searchresult__header ${sling:encode(searchConfig.resultHeaderClass,'HTML_ATTR')}">
         <a href="${sling:encode(result.path,'HTML_ATTR')}.html" class="searchresult__link">
             <sling:encode value="${result.valueMap['jcr:content/jcr:title']}" mode="HTML" />
         </a>
@@ -27,6 +27,6 @@
         <sling:encode value="${result.valueMap['jcr:content/jcr:description']}" mode="HTML" />
     </p>
     <a href="${sling:encode(result.path,'HTML_ATTR')}.html" class="searchresult__link">
-        ${fn:replace(result.path,sling:getAbsoluteParent(result,3).path,'')}.html
+        ${sling:encode(fn:replace(result.path,sling:getAbsoluteParent(result,3).path,''),'HTML')}.html
     </a>
 </div>
\ No newline at end of file
diff --git a/reference/src/main/resources/jcr_root/apps/reference/components/general/search/search.jsp b/reference/src/main/resources/jcr_root/apps/reference/components/general/search/search.jsp
index 8f501eab..08772724 100644
--- a/reference/src/main/resources/jcr_root/apps/reference/components/general/search/search.jsp
+++ b/reference/src/main/resources/jcr_root/apps/reference/components/general/search/search.jsp
@@ -21,7 +21,7 @@
 <c:set var="searchConfig" value="${sling:adaptTo(resource,'org.apache.sling.cms.ComponentConfiguration').properties}" scope="request" />
 <c:if test="${not empty properties.limit && not empty param.q}">
     <c:set var="search" value="${sling:adaptTo(slingRequest, 'org.apache.sling.cms.reference.models.Search')}" scope="request"  />
-    <div class="search ${searchConfig.searchClass}">
+    <div class="search ${sling:encode(searchConfig.searchClass,'HTML_ATTR')}">
         <div class="search__header">
             <fmt:message key="Found {3} results for \"{0}\". Showing results {1} - {2}.">
                 <fmt:param value="${sling:encode(search.term,'HTML')}" />
diff --git a/reference/src/main/resources/jcr_root/apps/reference/components/general/searchform/searchform.jsp b/reference/src/main/resources/jcr_root/apps/reference/components/general/searchform/searchform.jsp
index 2722d6b4..77d8cd2f 100644
--- a/reference/src/main/resources/jcr_root/apps/reference/components/general/searchform/searchform.jsp
+++ b/reference/src/main/resources/jcr_root/apps/reference/components/general/searchform/searchform.jsp
@@ -18,7 +18,7 @@
  */ --%>
  <%@include file="/libs/sling-cms/global.jsp"%>
 <c:set var="searchConfig" value="${sling:adaptTo(resource,'org.apache.sling.cms.ComponentConfiguration').properties}" scope="request" />
-<form action="${searchConfig.searchPage}.html" method="GET" class="${sling:encode(searchConfig.formClass,'HTML_ATTR')}">
+<form action="${sling:encode(searchConfig.searchPage,'HTML_ATTR')}.html" method="GET" class="${sling:encode(searchConfig.formClass,'HTML_ATTR')}">
     <fmt:message key="Search" var="searchMessage" />
     <input type="text" name="q" class="${sling:encode(searchConfig.inputClass,'HTML_ATTR')}" placeholder="${sling:encode(searchMessage,'HTML_ATTR')}" />
     <input type="submit" class="${searchConfig.buttonClass}" value="${sling:encode(searchMessage,'HTML_ATTR')}" />
diff --git a/reference/src/main/resources/jcr_root/apps/reference/components/general/sitemap/sitemap.xml.jsp b/reference/src/main/resources/jcr_root/apps/reference/components/general/sitemap/sitemap.xml.jsp
index 060059c8..09b55503 100644
--- a/reference/src/main/resources/jcr_root/apps/reference/components/general/sitemap/sitemap.xml.jsp
+++ b/reference/src/main/resources/jcr_root/apps/reference/components/general/sitemap/sitemap.xml.jsp
@@ -24,12 +24,12 @@
 	<c:forEach var="pageRsrc" items="${sling:findResources(resourceResolver,query,'JCR-SQL2')}">
 		<c:set var="page" value="${sling:adaptTo(pageRsrc,'org.apache.sling.cms.PageManager').page}" />
 		<url>
-			<loc>${site.url}${fn:replace(page.publishedPath,'index.html','')}</loc>
+			<loc>${sling:encode(site.url,'XML')}${sling:encode(fn:replace(page.publishedPath,'index.html',''),'XML')}</loc>
 			<changefreq>monthly</changefreq>
 		</url>
 	</c:forEach>
 	<url>
-		<loc>${site.url}/</loc>
+		<loc>${sling:encode(site.url,'XML')}/</loc>
 		<changefreq>always</changefreq>
 	</url>
 </urlset>
diff --git a/reference/src/main/resources/jcr_root/apps/reference/components/general/suffixheader/suffixheader.jsp b/reference/src/main/resources/jcr_root/apps/reference/components/general/suffixheader/suffixheader.jsp
index 5bbdadef..1a3c0cc4 100644
--- a/reference/src/main/resources/jcr_root/apps/reference/components/general/suffixheader/suffixheader.jsp
+++ b/reference/src/main/resources/jcr_root/apps/reference/components/general/suffixheader/suffixheader.jsp
@@ -25,6 +25,6 @@
         <c:set var="value" value="${slingRequest.requestPathInfo.suffixResource.name}" />
     </c:otherwise>
 </c:choose>
-<${properties.tag}>
+<${sling:encode(properties.tag,'HTML')}>
     <sling:encode value="${fn:replace(properties.subString,'{SUFFIX}',value)}" mode="HTML" />
-</${properties.tag}>
+</${sling:encode(properties.tag,'HTML')}>
diff --git a/reference/src/main/resources/jcr_root/apps/reference/components/general/tags/tags.jsp b/reference/src/main/resources/jcr_root/apps/reference/components/general/tags/tags.jsp
index cd49bdd5..4d94f7b0 100644
--- a/reference/src/main/resources/jcr_root/apps/reference/components/general/tags/tags.jsp
+++ b/reference/src/main/resources/jcr_root/apps/reference/components/general/tags/tags.jsp
@@ -23,13 +23,13 @@
 <c:set var="contentResource" value="${sling:getRelativeResource(pageMgr.page.resource,'jcr:content')}" />
 <c:set var="listTag" value="${empty config.listTag ? 'div' : config.listTag}" />
 <c:set var="itemTag" value="${empty config.listTag ? 'span' : config.itemTag}"  />
-<${listTag} class="${sling:encode(config.listClass,'HTML_ATTR')}">
+<${sling:encode(listTag,'HTML')} class="${sling:encode(config.listClass,'HTML_ATTR')}">
     <c:forEach var="tagPath" items="${contentResource.valueMap['sling:taxonomy']}">
         <c:set var="tag" value="${sling:getResource(resourceResolver,tagPath)}" />
-        <${itemTag} class="${config.itemClass}">
-            <a href="${config.tagPage}.html${sling:encode(tag.path,'HTML_ATTR')}">
+        <${sling:encode(itemTag,'HTML')} class="${sling:encode(config.itemClass,'HTML_ATTR')}">
+            <a href="${sling:encode(config.tagPage,'HTML_ATTR')}.html${sling:encode(tag.path,'HTML_ATTR')}">
                 <sling:encode value="${tag.valueMap['jcr:title']}" default="${tag.name}" mode="HTML" />
             </a>
-        </${itemTag}>
+        </${sling:encode(itemTag,'HTML')}>
     </c:forEach>
-</${listTag}>
\ No newline at end of file
+</${sling:encode(listTag,'HTML')}>
\ No newline at end of file
diff --git a/reference/src/main/resources/jcr_root/apps/reference/components/pages/base/head.jsp b/reference/src/main/resources/jcr_root/apps/reference/components/pages/base/head.jsp
index 0d2974a4..a77c7438 100644
--- a/reference/src/main/resources/jcr_root/apps/reference/components/pages/base/head.jsp
+++ b/reference/src/main/resources/jcr_root/apps/reference/components/pages/base/head.jsp
@@ -21,7 +21,7 @@
 	<meta charset="utf-8" />
     <meta http-equiv="X-UA-Compatible" content="IE=edge" />
     <meta name="viewport" content="width=device-width, initial-scale=1" />
-    <title>Apache Sling :: ${resource.valueMap['jcr:title']}</title>
+    <title>Apache Sling :: ${sling:encode(resource.valueMap['jcr:title'],'HTML')}</title>
     <link rel="icon" href="/static/clientlibs/reference/img/favicon.ico"/>
     <link rel="stylesheet" href="/static/clientlibs/reference/site.css"/>
     <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/default.min.css"/>
diff --git a/ui/bnd.bnd b/ui/bnd.bnd
index ba52afba..130f2a74 100644
--- a/ui/bnd.bnd
+++ b/ui/bnd.bnd
@@ -1,14 +1,14 @@
 Sling-Nodetypes: SLING-INF/nodetypes/nodetypes.cnd
-Sling-Initial-Content: jcr_root;overwriteProperties:=true;overwrite:=false;ignoreImportProviders:=xml,\
-    jcr_root/conf/global.json;overwrite:=true;ignoreImportProviders:=xml;path:=/conf/global,\
+Sling-Initial-Content: jcr_root/conf/global.json;overwrite:=true;ignoreImportProviders:=xml;path:=/conf/global,\
     jcr_root/etc/taxonomy;overwrite:=false;path:=/etc/taxonomy,\
     jcr_root/libs/sling-cms;overwrite:=true;path:=/libs/sling-cms,\
     jcr_root/libs/sling/thumbnails;overwrite:=true;path:=/libs/sling/thumbnails,\
-    jcr_root/oak:index/ntHierarchyNode.json;overwrite:=true;path:=/oak:index/ntHierarchyNode,\
-    jcr_root/oak:index/slingComponent.json;overwrite:=true;path:=/oak:index/slingComponent,\
-    jcr_root/oak:index/slingFile.json;overwrite:=true;path:=/oak:index/slingFile,\
-    jcr_root/oak:index/slingPage.json;overwrite:=true;path:=/oak:index/slingPage,\
-    jcr_root/oak:index/slingTaxonomy.json;overwrite:=true;path:=/oak:index/slingTaxonomy,\
+    jcr_root/_oak_index/ntHierarchyNode.json;overwrite:=true;path:=/oak:index/ntHierarchyNode,\
+    jcr_root/_oak_index/slingComponent.json;overwrite:=true;path:=/oak:index/slingComponent,\
+    jcr_root/_oak_index/slingeventJob.json;overwrite:=true;path:=/oak:index/slingeventJob,\
+    jcr_root/_oak_index/slingFile.json;overwrite:=true;path:=/oak:index/slingFile,\
+    jcr_root/_oak_index/slingPage.json;overwrite:=true;path:=/oak:index/slingPage,\
+    jcr_root/_oak_index/slingTaxonomy.json;overwrite:=true;path:=/oak:index/slingTaxonomy,\
     jcr_root/static/clientlibs/sling-cms;overwrite:=true;path:=/static/clientlibs/sling-cms;ignoreImportProviders:=xml,\
     jcr_root/static/clientlibs/sling-cms-editor;overwrite:=true;path:=/static/clientlibs/sling-cms-editor;ignoreImportProviders:=xml,\
     jcr_root/static/sling-cms;overwrite:=true;path:=/static/sling-cms;ignoreImportProviders:=xml
diff --git a/ui/package-lock.json b/ui/package-lock.json
index 3faf089a..f3cf6ae0 100644
--- a/ui/package-lock.json
+++ b/ui/package-lock.json
@@ -4,6 +4,61 @@
     "lockfileVersion": 1,
     "requires": true,
     "dependencies": {
+        "@jridgewell/gen-mapping": {
+            "version": "0.3.2",
+            "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz",
+            "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==",
+            "dev": true,
+            "requires": {
+                "@jridgewell/set-array": "^1.0.1",
+                "@jridgewell/sourcemap-codec": "^1.4.10",
+                "@jridgewell/trace-mapping": "^0.3.9"
+            }
+        },
+        "@jridgewell/resolve-uri": {
+            "version": "3.1.0",
+            "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz",
+            "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==",
+            "dev": true
+        },
+        "@jridgewell/set-array": {
+            "version": "1.1.2",
+            "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz",
+            "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==",
+            "dev": true
+        },
+        "@jridgewell/source-map": {
+            "version": "0.3.2",
+            "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz",
+            "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==",
+            "dev": true,
+            "requires": {
+                "@jridgewell/gen-mapping": "^0.3.0",
+                "@jridgewell/trace-mapping": "^0.3.9"
+            }
+        },
+        "@jridgewell/sourcemap-codec": {
+            "version": "1.4.14",
+            "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz",
+            "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==",
+            "dev": true
+        },
+        "@jridgewell/trace-mapping": {
+            "version": "0.3.17",
+            "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz",
+            "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==",
+            "dev": true,
+            "requires": {
+                "@jridgewell/resolve-uri": "3.1.0",
+                "@jridgewell/sourcemap-codec": "1.4.14"
+            }
+        },
+        "acorn": {
+            "version": "8.8.1",
+            "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz",
+            "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==",
+            "dev": true
+        },
         "ansi-colors": {
             "version": "1.1.0",
             "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz",
@@ -315,9 +370,9 @@
             "dev": true
         },
         "bulma": {
-            "version": "0.9.3",
-            "resolved": "https://registry.npmjs.org/bulma/-/bulma-0.9.3.tgz",
-            "integrity": "sha512-0d7GNW1PY4ud8TWxdNcP6Cc8Bu7MxcntD/RRLGWuiw/s0a9P+XlH/6QoOIrmbj6o8WWJzJYhytiu9nFjTszk1g=="
+            "version": "0.9.4",
+            "resolved": "https://registry.npmjs.org/bulma/-/bulma-0.9.4.tgz",
+            "integrity": "sha512-86FlT5+1GrsgKbPLRRY7cGDg8fsJiP/jzTqXXVqiUZZ2aZT8uemEOHlU1CDU+TxklPEZ11HZNNWclRBBecP4CQ=="
         },
         "cache-base": {
             "version": "1.0.1",
@@ -554,7 +609,7 @@
         "concat-map": {
             "version": "0.0.1",
             "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
-            "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
+            "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
             "dev": true
         },
         "concat-stream": {
@@ -1482,9 +1537,9 @@
             "dev": true
         },
         "immutable": {
-            "version": "4.0.0",
-            "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.0.0.tgz",
-            "integrity": "sha512-zIE9hX70qew5qTUjSS7wi1iwj/l7+m54KWU247nhM3v806UdGj1yDndXj+IOYxxtW9zyLI+xqFNZjTuDaLUqFw==",
+            "version": "4.2.1",
+            "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.2.1.tgz",
+            "integrity": "sha512-7WYV7Q5BTs0nlQm7tl92rDYYoyELLKHoDMBKhrxEoiV4mrfVdRz8hzPiYOzH7yWjzoVEamxRuAqhxL2PLRwZYQ==",
             "dev": true
         },
         "inflight": {
@@ -2003,18 +2058,18 @@
             }
         },
         "minimatch": {
-            "version": "3.0.4",
-            "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
-            "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+            "version": "3.1.2",
+            "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+            "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
             "dev": true,
             "requires": {
                 "brace-expansion": "^1.1.7"
             }
         },
         "minimist": {
-            "version": "1.2.5",
-            "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
-            "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw=="
+            "version": "1.2.7",
+            "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz",
+            "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g=="
         },
         "mixin-deep": {
             "version": "1.3.2",
@@ -2770,9 +2825,9 @@
             }
         },
         "sass": {
-            "version": "1.49.9",
-            "resolved": "https://registry.npmjs.org/sass/-/sass-1.49.9.tgz",
-            "integrity": "sha512-YlYWkkHP9fbwaFRZQRXgDi3mXZShslVmmo+FVK3kHLUELHHEYrCmL1x6IUjC7wLS6VuJSAFXRQS/DxdsC4xL1A==",
+            "version": "1.57.1",
+            "resolved": "https://registry.npmjs.org/sass/-/sass-1.57.1.tgz",
+            "integrity": "sha512-O2+LwLS79op7GI0xZ8fqzF7X2m/m8WFfI02dHOdsK5R2ECeS5F62zrwg/relM1rjSLy7Vd/DiMNIvPrQGsA0jw==",
             "dev": true,
             "requires": {
                 "chokidar": ">=3.0.0 <4.0.0",
@@ -2781,9 +2836,9 @@
             },
             "dependencies": {
                 "anymatch": {
-                    "version": "3.1.2",
-                    "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz",
-                    "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==",
+                    "version": "3.1.3",
+                    "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
+                    "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
                     "dev": true,
                     "requires": {
                         "normalize-path": "^3.0.0",
@@ -3339,22 +3394,15 @@
             }
         },
         "terser": {
-            "version": "5.10.0",
-            "resolved": "https://registry.npmjs.org/terser/-/terser-5.10.0.tgz",
-            "integrity": "sha512-AMmF99DMfEDiRJfxfY5jj5wNH/bYO09cniSqhfoyxc8sFoYIgkJy86G04UoZU5VjlpnplVu0K6Tx6E9b5+DlHA==",
+            "version": "5.16.1",
+            "resolved": "https://registry.npmjs.org/terser/-/terser-5.16.1.tgz",
+            "integrity": "sha512-xvQfyfA1ayT0qdK47zskQgRZeWLoOQ8JQ6mIgRGVNwZKdQMU+5FkCBjmv4QjcrTzyZquRw2FVtlJSRUmMKQslw==",
             "dev": true,
             "requires": {
+                "@jridgewell/source-map": "^0.3.2",
+                "acorn": "^8.5.0",
                 "commander": "^2.20.0",
-                "source-map": "~0.7.2",
                 "source-map-support": "~0.5.20"
-            },
-            "dependencies": {
-                "source-map": {
-                    "version": "0.7.3",
-                    "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz",
-                    "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==",
-                    "dev": true
-                }
             }
         },
         "through2": {
diff --git a/ui/package.json b/ui/package.json
index 58105452..c4126a51 100644
--- a/ui/package.json
+++ b/ui/package.json
@@ -3,7 +3,7 @@
     "version": "1.0.0",
     "description": "Scripts to power the front-end of Apache Sling's CMS example.",
     "dependencies": {
-        "bulma": "^0.9.1",
+        "bulma": "^0.9.4",
         "handlebars": "^4.7.6",
         "jam-icons": "^2.0.0",
         "js-autocomplete": "^1.0.4",
@@ -21,7 +21,7 @@
         "gulp-rename": "^2.0.0",
         "gulp-sass": "^5.1.0",
         "gulp-terser": "^2.1.0",
-        "sass": "^1.49.9",
+        "sass": "^1.57.1",
         "streamqueue": "^1.1.2"
     },
     "license": "Apache-2.0"
diff --git a/ui/src/main/frontend/scss/cms.scss b/ui/src/main/frontend/scss/cms.scss
index a77dde75..20dddc6e 100644
--- a/ui/src/main/frontend/scss/cms.scss
+++ b/ui/src/main/frontend/scss/cms.scss
@@ -67,7 +67,6 @@ fieldset {
   min-inline-size: auto;
 }
 
-
 h1 {
   font-size: 200%;
   margin-bottom: 1em;
@@ -265,6 +264,9 @@ nav .level-right {
   height: calc(100vh - 500px);
 }
 
+#query-debug h2 {
+  color: #363636;
+}
 .rte-form {
   margin: 0.5em 0;
 }
diff --git a/ui/src/main/resources/jcr_root/libs/sling-cms/components/caconfig/rewriter/config/config.jsp b/ui/src/main/resources/jcr_root/libs/sling-cms/components/caconfig/rewriter/config/config.jsp
index d632e141..b151632a 100644
--- a/ui/src/main/resources/jcr_root/libs/sling-cms/components/caconfig/rewriter/config/config.jsp
+++ b/ui/src/main/resources/jcr_root/libs/sling-cms/components/caconfig/rewriter/config/config.jsp
@@ -27,7 +27,9 @@
     <dd>
         <ul>
             <c:forEach var="attribute" items="${resource.valueMap.attributes}">
-                <sling:encode value="${attribute}" mode="HTML" />
+                <li>
+                    <sling:encode value="${attribute}" mode="HTML" />
+                </li>
             </c:forEach>
         </ul>
     </dd>
diff --git a/ui/src/main/resources/jcr_root/libs/sling-cms/components/caconfig/sitesettings/config/config.jsp b/ui/src/main/resources/jcr_root/libs/sling-cms/components/caconfig/sitesettings/config/config.jsp
index 119d2166..1b58b42d 100644
--- a/ui/src/main/resources/jcr_root/libs/sling-cms/components/caconfig/sitesettings/config/config.jsp
+++ b/ui/src/main/resources/jcr_root/libs/sling-cms/components/caconfig/sitesettings/config/config.jsp
@@ -21,6 +21,6 @@
 <dl>
     <dt><fmt:message key="Taxonomy Root" /></dt>
     <dd>
-        ${properties.taxonomyroot}
+        ${sling:encode(properties.taxonomyroot,'HTML')}
     </dd>
 </dl>
\ No newline at end of file
diff --git a/ui/src/main/resources/jcr_root/libs/sling-cms/components/cms/actions/basic/basic.jsp b/ui/src/main/resources/jcr_root/libs/sling-cms/components/cms/actions/basic/basic.jsp
index 623ed558..7ee1c03c 100644
--- a/ui/src/main/resources/jcr_root/libs/sling-cms/components/cms/actions/basic/basic.jsp
+++ b/ui/src/main/resources/jcr_root/libs/sling-cms/components/cms/actions/basic/basic.jsp
@@ -17,8 +17,8 @@
  * under the License.
  */ --%>
 <%@include file="/libs/sling-cms/global.jsp"%>
-<a class="button" ${actionConfig.valueMap.new != false ? 'target="_blank"' : ''} href="${actionConfig.valueMap.prefix}${sling:encode(resource.path,'HTML_ATTR')}${actionConfig.valueMap.suffix}" title="${sling:encode(actionConfig.valueMap.title,'HTML_ATTR')}">
-    <span class="jam jam-${actionConfig.valueMap.icon}">
+<a class="button" ${actionConfig.valueMap.new != false ? 'target="_blank"' : ''} href="${actionConfig.valueMap.prefix}${sling:encode(resource.path,'HTML_ATTR')}${sling:encode(actionConfig.valueMap.suffix,'HTML_ATTR')}" title="${sling:encode(actionConfig.valueMap.title,'HTML_ATTR')}">
+    <span class="jam jam-${sling:encode(actionConfig.valueMap.icon,'HTML_ATTR')}">
         <span class="is-sr-only">
             ${sling:encode(actionConfig.valueMap.title,'HTML')}
         </span>
diff --git a/ui/src/main/resources/jcr_root/libs/sling-cms/components/cms/actions/modal/modal.jsp b/ui/src/main/resources/jcr_root/libs/sling-cms/components/cms/actions/modal/modal.jsp
index fe3a01b9..ff3a888b 100644
--- a/ui/src/main/resources/jcr_root/libs/sling-cms/components/cms/actions/modal/modal.jsp
+++ b/ui/src/main/resources/jcr_root/libs/sling-cms/components/cms/actions/modal/modal.jsp
@@ -17,8 +17,8 @@
  * under the License.
  */ --%>
 <%@include file="/libs/sling-cms/global.jsp"%>
-<a class="button Fetch-Modal" data-title="${sling:encode(actionConfig.valueMap.title,'HTML_ATTR')}" data-path="${actionConfig.valueMap.ajaxPath != null ? actionConfig.valueMap.ajaxPath : '.Main-Content form'}" href="${actionConfig.valueMap.prefix}${sling:encode(resource.path,'HTML_ATTR')}${actionConfig.valueMap.suffix}" title="${sling:encode(actionConfig.valueMap.title,'HTML_ATTR')}">
-    <span class="jam jam-${actionConfig.valueMap.icon}">
+<a class="button Fetch-Modal" data-title="${sling:encode(actionConfig.valueMap.title,'HTML_ATTR')}" data-path="${sling:encode((actionConfig.valueMap.ajaxPath != null ? actionConfig.valueMap.ajaxPath : '.Main-Content form'),'HTML_ATTR')}" href="${sling:encode(actionConfig.valueMap.prefix,'HTML_ATTR')}${sling:encode(resource.path,'HTML_ATTR')}${sling:encode(actionConfig.valueMap.suffix,'HTML_ATTR')}" title="${sling:encode(actionConfig.valueMap.title,'HTML_ATTR')}">
+    <span class="jam jam-${sling:encode(actionConfig.valueMap.icon,'HTML_ATTR')}">
         <span class="is-sr-only">
             ${sling:encode(actionConfig.valueMap.title,'HTML')}
         </span>
diff --git a/ui/src/main/resources/jcr_root/libs/sling-cms/components/cms/columns/localetitle/localetitle.jsp b/ui/src/main/resources/jcr_root/libs/sling-cms/components/cms/columns/localetitle/localetitle.jsp
index 0379752a..c6665f26 100644
--- a/ui/src/main/resources/jcr_root/libs/sling-cms/components/cms/columns/localetitle/localetitle.jsp
+++ b/ui/src/main/resources/jcr_root/libs/sling-cms/components/cms/columns/localetitle/localetitle.jsp
@@ -18,6 +18,6 @@
  */ --%>
 <%@include file="/libs/sling-cms/global.jsp"%>
 <sling:adaptTo adaptable="${resource}" adaptTo="org.apache.sling.cms.core.models.LocaleResource" var="localeResource" />
-<td title="${sling:encode(localeResource.locale.displayLanguage,'HTML_ATTR')} ${sling:encode(localeResource.locale.displayCountry,'HTML_ATTR')}" data-value="${localeResource.locale}">
+<td title="${sling:encode(localeResource.locale.displayLanguage,'HTML_ATTR')} ${sling:encode(localeResource.locale.displayCountry,'HTML_ATTR')}" data-value="${sling:encode(localeResource.locale,'HTML_ATTR')}">
 	${localeResource.locale.displayLanguage} ${localeResource.locale.displayCountry}
 </td>
\ No newline at end of file
diff --git a/ui/src/main/resources/jcr_root/libs/sling-cms/components/cms/columns/text/text.jsp b/ui/src/main/resources/jcr_root/libs/sling-cms/components/cms/columns/text/text.jsp
index a1f91050..17ce52ba 100644
--- a/ui/src/main/resources/jcr_root/libs/sling-cms/components/cms/columns/text/text.jsp
+++ b/ui/src/main/resources/jcr_root/libs/sling-cms/components/cms/columns/text/text.jsp
@@ -18,10 +18,10 @@
  */ --%>
 <%@include file="/libs/sling-cms/global.jsp"%>
 <c:set var="colValue" value="${resource.valueMap[colConfig.valueMap.property]}" />
-<td title="${sling:encode(colValue,'HTML_ATTR')}" data-property="${colConfig.valueMap.property}">
+<td title="${sling:encode(colValue,'HTML_ATTR')}" data-property="${sling:encode(colConfig.valueMap.property,'HTML_ATTR')}">
 	<c:choose>
 		<c:when test="${colConfig.valueMap.link}">
-			<a href="${colConfig.valueMap.prefix}${sling:encode(resource.path,'HTML_ATTR')}">
+			<a href="${sling:encode(colConfig.valueMap.prefix,'HTML_ATTR')}${sling:encode(resource.path,'HTML_ATTR')}">
 				<sling:encode value="${colValue}" mode="HTML" />
 			</a>
 		</c:when>
diff --git a/ui/src/main/resources/jcr_root/libs/sling-cms/components/cms/contentactions/contentactions.jsp b/ui/src/main/resources/jcr_root/libs/sling-cms/components/cms/contentactions/contentactions.jsp
index 06fb6c68..e046f1fc 100644
--- a/ui/src/main/resources/jcr_root/libs/sling-cms/components/cms/contentactions/contentactions.jsp
+++ b/ui/src/main/resources/jcr_root/libs/sling-cms/components/cms/contentactions/contentactions.jsp
@@ -23,7 +23,7 @@
             <div class="buttons has-addons">
                 <c:forEach var="action" items="${sling:listChildren(sling:getRelativeResource(resource,'actions'))}" varStatus="status">
                     <a class="button Fetch-Modal" data-title="Add ${action.valueMap.label}" data-path=".Main-Content form" href="${action.valueMap.prefix}${sling:encode(slingRequest.requestPathInfo.suffix,'HTML_ATTR')}${action.valueMap.suffix}">
-                        + <fmt:message key="${action.valueMap.label}" />
+                        + <fmt:message key="${action.valueMap.label}" var="label" />${sling:encode(label,'HTML_ATTR')}
                     </a>
                 </c:forEach>
             </div>
@@ -43,15 +43,15 @@
                         <c:set var="pagePath" value="${sling:adaptTo(resource,'org.apache.sling.cms.PageManager').page.path}" />
                         <form method="get" action="" class="layout-switch is-inline">
                             <div class="select">
-                                <select>
+                                <select aria-label="Select View">
                                     <c:choose>
                                         <c:when test="${slingRequest.requestPathInfo.selectorString == 'table' || (profile.valueMap.defaultLayout == 'table' && slingRequest.requestPathInfo.selectorString != 'grid')}">
-                                            <option value="/cms${fn:substring(pagePath,30,fn:length(pagePath))}.grid.html${sling:encode(slingRequest.requestPathInfo.suffix,'HTML_ATTR')}"><fmt:message key="Grid" /></option>
-                                            <option selected value="/cms${fn:substring(pagePath,30,fn:length(pagePath))}.table.html$${sling:encode(slingRequest.requestPathInfo.suffix,'HTML_ATTR')}"><fmt:message key="Table" /></option>
+                                            <option value="/cms${sling:encode(fn:substring(pagePath,30,fn:length(pagePath)),'HTML_ATTR')}.grid.html${sling:encode(slingRequest.requestPathInfo.suffix,'HTML_ATTR')}"><fmt:message key="Grid" /></option>
+                                            <option selected value="/cms${sling:encode(fn:substring(pagePath,30,fn:length(pagePath)),'HTML_ATTR')}.table.html$${sling:encode(slingRequest.requestPathInfo.suffix,'HTML_ATTR')}"><fmt:message key="Table" /></option>
                                         </c:when>
                                         <c:otherwise>
-                                            <option selected value="/cms${fn:substring(pagePath,30,fn:length(pagePath))}.grid.html${sling:encode(slingRequest.requestPathInfo.suffix,'HTML_ATTR')}"><fmt:message key="Grid" /></option>
-                                            <option value="/cms${fn:substring(pagePath,30,fn:length(pagePath))}.table.html${sling:encode(slingRequest.requestPathInfo.suffix,'HTML_ATTR')}"><fmt:message key="Table" /></option>
+                                            <option selected value="/cms${sling:encode(fn:substring(pagePath,30,fn:length(pagePath)),'HTML_ATTR')}.grid.html${sling:encode(slingRequest.requestPathInfo.suffix,'HTML_ATTR')}"><fmt:message key="Grid" /></option>
+                                            <option value="/cms${sling:encode(fn:substring(pagePath,30,fn:length(pagePath)),'HTML_ATTR')}.table.html${sling:encode(slingRequest.requestPathInfo.suffix,'HTML_ATTR')}"><fmt:message key="Table" /></option>
                                         </c:otherwise>
                                     </c:choose>
                                 </select>
diff --git a/ui/src/main/resources/jcr_root/libs/sling-cms/components/cms/contentbreadcrumb/contentbreadcrumb.jsp b/ui/src/main/resources/jcr_root/libs/sling-cms/components/cms/contentbreadcrumb/contentbreadcrumb.jsp
index ccc45c76..57a33a3d 100644
--- a/ui/src/main/resources/jcr_root/libs/sling-cms/components/cms/contentbreadcrumb/contentbreadcrumb.jsp
+++ b/ui/src/main/resources/jcr_root/libs/sling-cms/components/cms/contentbreadcrumb/contentbreadcrumb.jsp
@@ -22,7 +22,7 @@
     <ul>
         <c:forEach var="parent" items="${breadcrumb.parents}" varStatus="status">
             <li>
-                <a href="${parent.left}">
+                <a href="${sling:encode(parent.left,'HTML_ATTR')}">
                     <sling:encode value="${parent.right}" mode="HTML" />
                 </a>
             </li>
diff --git a/ui/src/main/resources/jcr_root/libs/sling-cms/components/cms/contentgrid/contentgrid.jsp b/ui/src/main/resources/jcr_root/libs/sling-cms/components/cms/contentgrid/contentgrid.jsp
index 4ff0f56c..d223dc22 100644
--- a/ui/src/main/resources/jcr_root/libs/sling-cms/components/cms/contentgrid/contentgrid.jsp
+++ b/ui/src/main/resources/jcr_root/libs/sling-cms/components/cms/contentgrid/contentgrid.jsp
@@ -54,13 +54,13 @@
                             <figure class="image is-5by4">
                                 <c:choose>
                                     <c:when test="${child.resourceType == 'sling:File' || child.resourceType == 'nt:file'}">
-                                        <img src="/cms/file/preview.html${sling:encode(child.path,'HTML_ATTR')}.transform/sling-cms-thumbnail.png" loading="lazy" alt="${child.name}">
+                                        <img src="/cms/file/preview.html${sling:encode(child.path,'HTML_ATTR')}.transform/sling-cms-thumbnail.png" loading="lazy" alt="${sling:encode(child.name, 'HTML_ATTR')}">
                                     </c:when>
                                     <c:when test="${child.resourceType == 'sling:Site'}">
-                                        <img src="/cms/file/preview.html${branding.gridIconsBase}/site.png" loading="lazy" alt="${sling:encode(child.name, 'HTML_ATTR')}">
+                                        <img src="/cms/file/preview.html${sling:encode(branding.gridIconsBase,'HTML_ATTR')}/site.png" loading="lazy" alt="${sling:encode(child.name, 'HTML_ATTR')}">
                                     </c:when>
                                     <c:when test="${child.resourceType == 'sling:OrderedFolder' || child.resourceType == 'sling:Folder' || child.resourceType == 'nt:folder'}">
-                                        <img src="/cms/file/preview.html${branding.gridIconsBase}/folder.png" loading="lazy" alt="${sling:encode(child.name, 'HTML_ATTR')}">
+                                        <img src="/cms/file/preview.html${sling:encode(branding.gridIconsBase,'HTML_ATTR')}/folder.png" loading="lazy" alt="${sling:encode(child.name, 'HTML_ATTR')}">
                                     </c:when>
                                     <c:when test="${child.resourceType == 'sling:Page'}">
                                         <c:set var="templateThumbnail" value="${child.valueMap['jcr:content/sling:template']}/thumbnail"/>
@@ -69,12 +69,12 @@
                                                 <img src="/cms/file/preview.html${templateThumbnail}.transform/sling-cms-thumbnail.png" loading="lazy" alt="${sling:encode(child.name, 'HTML_ATTR')}">
                                             </c:when>
                                             <c:otherwise>
-                                                <img src="/cms/file/preview.html${branding.gridIconsBase}/page.png" loading="lazy" alt="${child.name}">
+                                                <img src="/cms/file/preview.html${sling:encode(branding.gridIconsBase,'HTML_ATTR')}/page.png" loading="lazy" alt="${sling:encode(child.name, 'HTML_ATTR')}">
                                             </c:otherwise>
                                         </c:choose>
                                     </c:when>
                                     <c:otherwise>
-                                        <img src="/cms/file/preview.html${branding.gridIconsBase}/file.png" loading="lazy" alt="${child.name}">
+                                        <img src="/cms/file/preview.html${sling:encode(branding.gridIconsBase,'HTML_ATTR')}/file.png" loading="lazy" alt="${sling:encode(child.name, 'HTML_ATTR')}">
                                     </c:otherwise>
                                 </c:choose>
                             </figure>
diff --git a/ui/src/main/resources/jcr_root/libs/sling-cms/components/cms/contenttable/contenttable.jsp b/ui/src/main/resources/jcr_root/libs/sling-cms/components/cms/contenttable/contenttable.jsp
index 64ee4cff..93fcda20 100644
--- a/ui/src/main/resources/jcr_root/libs/sling-cms/components/cms/contenttable/contenttable.jsp
+++ b/ui/src/main/resources/jcr_root/libs/sling-cms/components/cms/contenttable/contenttable.jsp
@@ -34,7 +34,7 @@
                     #
                 </th>
                 <c:forEach var="column" items="${sling:listChildren(sling:getRelativeResource(resource,'columns'))}">
-                    <th class="${column.name == 'actions' ? 'is-hidden' : '' }" data-attribute="${column.name}" scope="col">
+                    <th class="${column.name == 'actions' ? 'is-hidden' : '' }" data-attribute="${sling:encode(column.name,'HTML_ATTR')}" scope="col">
                         <fmt:message key="${column.valueMap.title}" var="title" />
                         <sling:encode value="${title}" mode="HTML" />
                     </th>
@@ -56,7 +56,7 @@
                             <c:set var="configPath" value="columns/${column.name}"/>
                             <c:set var="colConfig" value="${sling:getRelativeResource(typeConfig,configPath)}" scope="request" />
                             <c:if test="${colConfig != null}">
-                                <sling:include path="${sling:encode(child.path,'HTML_ATTR')}" resourceType="${colConfig.valueMap['sling:resourceType']}" />
+                                <sling:include path="${child.path}" resourceType="${colConfig.valueMap['sling:resourceType']}" />
                             </c:if>
                         </c:forEach>
                     </tr>
diff --git a/ui/src/main/resources/jcr_root/libs/sling-cms/components/cms/getform/getform.jsp b/ui/src/main/resources/jcr_root/libs/sling-cms/components/cms/getform/getform.jsp
index a10817d1..5dff6334 100644
--- a/ui/src/main/resources/jcr_root/libs/sling-cms/components/cms/getform/getform.jsp
+++ b/ui/src/main/resources/jcr_root/libs/sling-cms/components/cms/getform/getform.jsp
@@ -26,7 +26,7 @@
         <c:set var="action" value="${page.path}.html" />
     </c:otherwise>
 </c:choose>
-<form method="get" action="${action}" class="get-form" data-target="${properties.target}" data-load="${properties.load}">
+<form method="get" action="${action}" class="get-form" data-target="${sling:encode(properties.target,'HTML_ATTR')}" data-load="${sling:encode(properties.load,'HTML_ATTR')}">
     <fieldset class="form-wrapper field">
         <input type="hidden" name="_charset_" value="utf-8" />
         <sling:include path="fields" resourceType="sling-cms/components/general/container" />
diff --git a/ui/src/main/resources/jcr_root/libs/sling-cms/components/cms/i18ncontainer/i18ncontainer.jsp b/ui/src/main/resources/jcr_root/libs/sling-cms/components/cms/i18ncontainer/i18ncontainer.jsp
index 120656a2..d4c138dc 100644
--- a/ui/src/main/resources/jcr_root/libs/sling-cms/components/cms/i18ncontainer/i18ncontainer.jsp
+++ b/ui/src/main/resources/jcr_root/libs/sling-cms/components/cms/i18ncontainer/i18ncontainer.jsp
@@ -45,7 +45,7 @@
                             </th>
                             <c:forEach var="language" items="${sling:listChildren(slingRequest.requestPathInfo.suffixResource)}">
                                 <c:if test="${not empty language.valueMap['jcr:language']}">
-                                    <th class="Column-${language.valueMap['jcr:language']}" scope="col">
+                                    <th id="Column-${language.valueMap['jcr:language']}" scope="col">
                                         <sling:adaptTo adaptable="${language}" adaptTo="org.apache.sling.cms.core.models.LocaleResource" var="localeResource" />
                                         <sling:encode value="${localeResource.locale.displayLanguage}" mode="HTML" /> <sling:encode value="${localeResource.locale.displayCountry}" mode="HTML" />
                                         <br/>
@@ -64,19 +64,20 @@
                                 </td>
                                 <c:forEach var="language" items="${sling:listChildren(slingRequest.requestPathInfo.suffixResource)}">
                                     <c:if test="${not empty language.valueMap['jcr:language']}">
-                                        <td>
+                                        <td role="group" aria-labelledby="Column-${language.valueMap['jcr:language']}">
                                             <c:set var="keyfound" value="false" />
                                             <c:forEach var="entry" items="${sling:listChildren(language)}">
                                                 <c:if test="${entry.valueMap['sling:key'] == key}">
                                                     <c:set var="keyfound" value="true" />
-                                                    <input name="${language.name}/${entry.name}/sling:message" class="input" type="text" value="${sling:encode(entry.valueMap['sling:message'],'HTML_ATTR')}" />
-                                                    <input name="${language.name}/${entry.name}/sling:key" type="hidden" value="${key}" />
+                                                    <input name="${sling:encode(language.name,'HTML_ATTR')}/${sling:encode(entry.name,'HTML_ATTR')}/sling:message" class="input" type="text" value="${sling:encode(entry.valueMap['sling:message'],'HTML_ATTR')}" />
+                                                    <input name="${sling:encode(language.name,'HTML_ATTR')}/${sling:encode(entry.name,'HTML_ATTR')}/sling:key" type="hidden" value="${sling:encode(key,'HTML_ATTR')}" />
                                                 </c:if>
                                             </c:forEach>
                                             <c:if test="${keyfound == 'false'}">
-                                                <input name="${language.name}/${key}/sling:message" class="input" type="text" value="" />
-                                                <input name="${language.name}/${key}/sling:key" type="hidden" value="${key}" />
-                                                <input name="${language.name}/${key}/jcr:primaryType" type="hidden" value="sling:MessageEntry" />
+                                            
+                                                <input name="${sling:encode(language.name,'HTML_ATTR')}/${sling:encode(key,'HTML_ATTR')}/sling:message" class="input" type="text" value="" />
+                                                <input name="${sling:encode(language.name,'HTML_ATTR')}/${sling:encode(key,'HTML_ATTR')}/sling:key" type="hidden" value="${sling:encode(key,'HTML_ATTR')}" />
+                                                <input name="${sling:encode(language.name,'HTML_ATTR')}/${sling:encode(key,'HTML_ATTR')}/jcr:primaryType" type="hidden" value="sling:MessageEntry" />
                                             </c:if>
                                         </td>
                                     </c:if>
diff --git a/ui/src/main/resources/jcr_root/libs/sling-cms/components/cms/optimizefile/optimizefile.jsp b/ui/src/main/resources/jcr_root/libs/sling-cms/components/cms/optimizefile/optimizefile.jsp
index 18c9b095..9442dbcf 100644
--- a/ui/src/main/resources/jcr_root/libs/sling-cms/components/cms/optimizefile/optimizefile.jsp
+++ b/ui/src/main/resources/jcr_root/libs/sling-cms/components/cms/optimizefile/optimizefile.jsp
@@ -56,7 +56,7 @@
                         <button type="submit" class="button is-primary">
                             <fmt:message key="Optimize" />
                         </button>
-                        <button type="button" class="button close">Cancel</button>
+                        <button type="button" class="button close"><fmt:message key="Cancel" /></button>
                     </fieldset>
                 </form>
             </c:when>
diff --git a/ui/src/main/resources/jcr_root/libs/sling-cms/components/cms/pageeditbar/pageeditbar.jsp b/ui/src/main/resources/jcr_root/libs/sling-cms/components/cms/pageeditbar/pageeditbar.jsp
index e6f6cfb0..6d34b60d 100644
--- a/ui/src/main/resources/jcr_root/libs/sling-cms/components/cms/pageeditbar/pageeditbar.jsp
+++ b/ui/src/main/resources/jcr_root/libs/sling-cms/components/cms/pageeditbar/pageeditbar.jsp
@@ -23,9 +23,10 @@
 <div class="sling-cms-editor">
     <div class="level has-background-grey">
         <div class="level-left">
-            <a href="/cms/start.html" target="_blank" title="${branding.appName}"
+            <a href="/cms/start.html" target="_blank" title="${sling:encode(branding.appName,'HTML_ATTR')}"
                 class="button"> <img
-                src="${branding.logo}"
+                src="${sling:encode(branding.logo,'HTML_ATTR')}"
+                alt="Sling Logo"
                 class="sling-cms-logo" />
             </a>
         </div>
diff --git a/ui/src/main/resources/jcr_root/libs/sling-cms/components/cms/querydebug/querydebug.jsp b/ui/src/main/resources/jcr_root/libs/sling-cms/components/cms/querydebug/querydebug.jsp
index 4900a086..43b8d1de 100644
--- a/ui/src/main/resources/jcr_root/libs/sling-cms/components/cms/querydebug/querydebug.jsp
+++ b/ui/src/main/resources/jcr_root/libs/sling-cms/components/cms/querydebug/querydebug.jsp
@@ -51,9 +51,9 @@
         </c:if>
     </dl>
     <br/><hr/><br/>
-    <h2><fmt:message key="Popular Queries" /></h2>
+    <h2 id="popular-queries-header"><fmt:message key="Popular Queries" /></h2>
     <div class="table-container">
-        <table class="table">
+        <table class="table popular-queries-table" aria-labelledby="popular-queries-header">
             <tr>
                 <th scope="col">
                     #
@@ -110,64 +110,66 @@
             </c:forEach>
         </table>
     </div>
-    <h2><fmt:message key="Slow Queries" /></h2>
-    <div class="table-container">
-        <table class="table">
-            <tr>
-                <th scope="col">
-                    #
-                </th>
-                <th scope="col">
-                    <fmt:message key="Query Statement" />
-                </th>
-                <th scope="col">
-                    <fmt:message key="Query Language" />
-                </th>
-                <th scope="col">
-                    <fmt:message key="Count" />
-                </th>
-                <th scope="col">
-                    <fmt:message key="Last Thread" />
-                </th>
-                <th scope="col">
-                    <fmt:message key="Duration" />
-                </th>
-                <th scope="col">
-                    <fmt:message key="Max Rows Scanned" />
-                </th>
-                <th scope="col">
-                    <fmt:message key="Rows Scanned / Read" />
-                </th>
-            </tr>
-            <c:forEach var="query" items="${queryDebugger.slowQueries}">
+    <c:if test="${not empty queryDebugger.slowQueries}">
+        <h2 id="slow-queries-header"><fmt:message key="Slow Queries" /></h2>
+        <div class="table-container">
+            <table class="table popular-queries-table" aria-labelledby="slow-queries-header">
                 <tr>
-                    <td>
-                        ${query.position}
-                    </td>
-                    <td>
-                        ${sling:encode(query.statement,'HTML')}
-                    </td>
-                    <td>
-                        ${query.language}
-                    </td>
-                    <td>
-                        ${query.executeCount}
-                    </td>
-                    <td>
-                        ${sling:encode(query.lastThread,'HTML')}
-                    </td>
-                    <td>
-                        ${query.totalTimeMillis}
-                    </td>
-                    <td>
-                        ${query.maxRowsScanned}
-                    </td>
-                    <td>
-                        ${query.rowsScanned} / ${query.rowsRead}
-                    </td>
+                    <th scope="col">
+                        #
+                    </th>
+                    <th scope="col">
+                        <fmt:message key="Query Statement" />
+                    </th>
+                    <th scope="col">
+                        <fmt:message key="Query Language" />
+                    </th>
+                    <th scope="col">
+                        <fmt:message key="Count" />
+                    </th>
+                    <th scope="col">
+                        <fmt:message key="Last Thread" />
+                    </th>
+                    <th scope="col">
+                        <fmt:message key="Duration" />
+                    </th>
+                    <th scope="col">
+                        <fmt:message key="Max Rows Scanned" />
+                    </th>
+                    <th scope="col">
+                        <fmt:message key="Rows Scanned / Read" />
+                    </th>
                 </tr>
-            </c:forEach>
-        </table>
-    </div>
+                <c:forEach var="query" items="${queryDebugger.slowQueries}">
+                    <tr>
+                        <td>
+                            ${query.position}
+                        </td>
+                        <td>
+                            ${sling:encode(query.statement,'HTML')}
+                        </td>
+                        <td>
+                            ${query.language}
+                        </td>
+                        <td>
+                            ${query.executeCount}
+                        </td>
+                        <td>
+                            ${sling:encode(query.lastThread,'HTML')}
+                        </td>
+                        <td>
+                            ${query.totalTimeMillis}
+                        </td>
+                        <td>
+                            ${query.maxRowsScanned}
+                        </td>
+                        <td>
+                            ${query.rowsScanned} / ${query.rowsRead}
+                        </td>
+                    </tr>
+                </c:forEach>
+            </table>
+        </div>
+    </c:if>
     <br/><br/><br/>
 </div>
\ No newline at end of file
diff --git a/ui/src/main/resources/jcr_root/libs/sling-cms/components/cms/references/references.jsp b/ui/src/main/resources/jcr_root/libs/sling-cms/components/cms/references/references.jsp
index f63b73db..f6a18f81 100644
--- a/ui/src/main/resources/jcr_root/libs/sling-cms/components/cms/references/references.jsp
+++ b/ui/src/main/resources/jcr_root/libs/sling-cms/components/cms/references/references.jsp
@@ -37,8 +37,8 @@
                                 <span class="jam jam-document"></span>
                             </span>
                         </td>
-                        <td title="${ref.containingPage.path}">
-                            <a href="/cms/site/content.html${ref.containingPage.parent.path}?resource=${ref.containingPage.path}" target="_blank">
+                        <td title="${sling:encode(ref.containingPage.path,'HTML_ATTR')}">
+                            <a href="/cms/site/content.html${sling:encode(ref.containingPage.parent.path,'HTML_ATTR')}?resource=${sling:encode(ref.containingPage.path,'HTML_ATTR')}" target="_blank">
                                 ${sling:encode(ref.containingPage.title,'HTML')}
                             </a>
                         </td>
@@ -56,7 +56,7 @@
                             </span>
                         </td>
                         <td>
-                            ${ref.resource.path}
+                            ${sling:encode(ref.resource.path,'HTML')}
                         </td>
                         <td>
                         </td>
diff --git a/ui/src/main/resources/jcr_root/libs/sling-cms/components/cms/startcontent/search.jsp b/ui/src/main/resources/jcr_root/libs/sling-cms/components/cms/startcontent/search.jsp
index efd663fd..3da468cb 100644
--- a/ui/src/main/resources/jcr_root/libs/sling-cms/components/cms/startcontent/search.jsp
+++ b/ui/src/main/resources/jcr_root/libs/sling-cms/components/cms/startcontent/search.jsp
@@ -22,7 +22,7 @@
     <c:set var="results" value="${false}" />
     <c:forEach var="item" items="${startContent.relatedContent}">
         <c:set var="results" value="${true}" />
-        <a class="panel-block" title="${sling:encode(item.path,'HTML_ATTR')}" href="/cms/site/content.html${item.parent.path}?resource=${sling:encode(item.path,'HTML_ATTR')}">
+        <a class="panel-block" title="${sling:encode(item.path,'HTML_ATTR')}" href="/cms/site/content.html${sling:encode(item.parent.path,'HTML_ATTR')}?resource=${sling:encode(item.path,'HTML_ATTR')}">
             <span class="panel-icon">
                 <c:choose>
                     <c:when test="${item.resourceType == 'sling:Page'}">
@@ -38,7 +38,7 @@
                     <sling:encode value="${item.valueMap['jcr:content/jcr:title']}" default="${item.name}" mode="HTML" />
                 </c:when>
                 <c:otherwise>
-                    ${item.name}
+                    <sling:encode value="${item.name}" mode="HTML" />
                 </c:otherwise>
             </c:choose>
         </a>
diff --git a/ui/src/main/resources/jcr_root/libs/sling-cms/components/cms/startcontent/startcontent.jsp b/ui/src/main/resources/jcr_root/libs/sling-cms/components/cms/startcontent/startcontent.jsp
index 97343c21..65a71d48 100644
--- a/ui/src/main/resources/jcr_root/libs/sling-cms/components/cms/startcontent/startcontent.jsp
+++ b/ui/src/main/resources/jcr_root/libs/sling-cms/components/cms/startcontent/startcontent.jsp
@@ -27,7 +27,7 @@
                 ${recentContentMessage}
             </p>
             <c:forEach var="item" items="${startContent.recentContent}">
-                <a class="panel-block" title="${sling:encode(item.path,'HTML_ATTR')}" href="/cms/site/content.html${item.parent.path}?resource=${sling:encode(item.path,'HTML_ATTR')}">
+                <a class="panel-block" title="${sling:encode(item.path,'HTML_ATTR')}" href="/cms/site/content.html${sling:encode(item.parent.path,'HTML_ATTR')}?resource=${sling:encode(item.path,'HTML_ATTR')}">
                     <span class="panel-icon">
                         <c:choose>
                             <c:when test="${item.resourceType == 'sling:Page'}">
diff --git a/ui/src/main/resources/jcr_root/libs/sling-cms/components/cms/staticnav/staticnav.jsp b/ui/src/main/resources/jcr_root/libs/sling-cms/components/cms/staticnav/staticnav.jsp
index 77f88d6a..f247e356 100644
--- a/ui/src/main/resources/jcr_root/libs/sling-cms/components/cms/staticnav/staticnav.jsp
+++ b/ui/src/main/resources/jcr_root/libs/sling-cms/components/cms/staticnav/staticnav.jsp
@@ -18,7 +18,7 @@
  */ --%>
  <%@include file="/libs/sling-cms/global.jsp"%>
 <nav class="menu" aria-label="${sling:encode(properties.title,'HTML_ATTR')}">
-    <a class="menu-label toggle-hidden toggle-${fn:replace(properties.title,' ','-')}" data-target="#${fn:replace(properties.title,' ','-')}-nav">
+    <a class="menu-label toggle-hidden toggle-${sling:encode(fn:replace(properties.title,' ','-'),'HTML_ATTR')}" data-target="#${sling:encode(fn:replace(properties.title,' ','-'),'HTML_ATTR')}-nav">
         <fmt:message key="${properties.title}" var="title" />
         <sling:encode value="${title}" mode="HTML" />
     </a>
@@ -34,7 +34,7 @@
         </c:forEach>
     </c:forEach>
     <sling:adaptTo var="currentUser" adaptable="${slingRequest.resourceResolver}" adaptTo="org.apache.sling.cms.AuthorizableWrapper" />
-    <ul id="${fn:replace(properties.title,' ','-')}-nav" class="menu-list ${hidden}">
+    <ul id="${sling:encode(fn:replace(properties.title,' ','-'),'HTML_ATTR')}-nav" class="menu-list ${hidden}">
         <c:forEach var="item" items="${sling:listChildren(sling:getRelativeResource(resource,'links'))}">
             <c:set var="selected" value="" />
             <c:if test="${fn:startsWith(slingRequest.requestURI,item.valueMap.link)}">
@@ -58,7 +58,7 @@
             </c:if>
             <c:if test="${enabled}">
                 <li>
-                    <a href="${item.valueMap.link}" class="${selected} nav-link-${fn:replace(item.valueMap.text,' ','-')}">
+                    <a href="${sling:encode(item.valueMap.link,'HTML_ATTR')}" class="${selected} nav-link-${sling:encode(fn:replace(item.valueMap.text,' ','-'),'HTML_ATTR')}">
                         <fmt:message key="${item.valueMap.text}" var="text" />
                         <sling:encode value="${text}" mode="HTML" />
                     </a>
diff --git a/ui/src/main/resources/jcr_root/libs/sling-cms/components/cms/suffixswitch/suffixswitch.jsp b/ui/src/main/resources/jcr_root/libs/sling-cms/components/cms/suffixswitch/suffixswitch.jsp
index d0977bd2..837c3aa6 100644
--- a/ui/src/main/resources/jcr_root/libs/sling-cms/components/cms/suffixswitch/suffixswitch.jsp
+++ b/ui/src/main/resources/jcr_root/libs/sling-cms/components/cms/suffixswitch/suffixswitch.jsp
@@ -30,7 +30,7 @@
             </label>
             <div class="field has-addons">
                 <div class="control is-expanded">
-                    <input class="input pathfield" type="text" name="suffix" id="suffix" required="required" data-type="${properties.type}" data-base="${properties.base}" autocomplete="off" />
+                    <input class="input pathfield" type="text" name="suffix" id="suffix" required="required" data-type="${sling:encode(properties.type,'HTML_ATTR')}" data-base="${sling:encode(properties.base,'HTML_ATTR')}" autocomplete="off" />
                 </div>
                 <div class="control">
                     <fmt:message key="Search" var="searchMessage" />
diff --git a/ui/src/main/resources/jcr_root/libs/sling-cms/components/cms/tilecard/tilecard.jsp b/ui/src/main/resources/jcr_root/libs/sling-cms/components/cms/tilecard/tilecard.jsp
index a5c464ea..531aaeb7 100644
--- a/ui/src/main/resources/jcr_root/libs/sling-cms/components/cms/tilecard/tilecard.jsp
+++ b/ui/src/main/resources/jcr_root/libs/sling-cms/components/cms/tilecard/tilecard.jsp
@@ -23,7 +23,7 @@
         <div class="card is-linked" title="${sling:encode(properties.title,'HTML_ATTR')}" data-value="${sling:encode(resource.path,'HTML_ATTR')}">
             <div class="card-image">
                 <figure class="image is-5by4">
-                    <img src="/cms/file/preview.html${branding.gridIconsBase}${sling:encode(properties.icon,'HTML_ATTR')}" loading="lazy" alt="${sling:encode(title,'HTML_ATTR')}">
+                    <img src="/cms/file/preview.html${sling:encode(branding.gridIconsBase,'HTML_ATTR')}${sling:encode(properties.icon,'HTML_ATTR')}" loading="lazy" alt="${sling:encode(title,'HTML_ATTR')}">
                 </figure>
             </div>
             <footer class="card-footer">
diff --git a/ui/src/main/resources/jcr_root/libs/sling-cms/components/cms/versionmanager/versionmanager.jsp b/ui/src/main/resources/jcr_root/libs/sling-cms/components/cms/versionmanager/versionmanager.jsp
index c57862b4..51b554f7 100644
--- a/ui/src/main/resources/jcr_root/libs/sling-cms/components/cms/versionmanager/versionmanager.jsp
+++ b/ui/src/main/resources/jcr_root/libs/sling-cms/components/cms/versionmanager/versionmanager.jsp
@@ -67,19 +67,19 @@
                     <c:forEach var="version" items="${sling:adaptTo(slingRequest.requestPathInfo.suffixResource,'org.apache.sling.cms.core.models.VersionInfo').versions}" varStatus="status">
                         <tr>
                             <td>
-                                ${version.name}
+                                ${sling:encode(version.name, 'HTML')}
                             </td>
                             <td>
                                 <fmt:formatDate value="${version.created.time}" type="both"  dateStyle="long" timeStyle="long" />
                             </td>
                             <td>
                                 <c:forEach var="successor" items="${version.successors}">
-                                    ${successor.name}<br/>
+                                    ${sling:encode(successor.name,'HTML')}<br/>
                                 </c:forEach>
                             </td>
                             <td>
                                 <c:forEach var="predecessor" items="${version.predecessors}">
-                                    ${predecessor.name}<br/>
+                                    ${sling:encode(predecessor.name,'HTML')}<br/>
                                 </c:forEach>
                             </td>
                             <td>
diff --git a/ui/src/main/resources/jcr_root/libs/sling-cms/components/editor/fields/auth/members/options.jsp b/ui/src/main/resources/jcr_root/libs/sling-cms/components/editor/fields/auth/members/options.jsp
index 2541bef8..14011f9f 100644
--- a/ui/src/main/resources/jcr_root/libs/sling-cms/components/editor/fields/auth/members/options.jsp
+++ b/ui/src/main/resources/jcr_root/libs/sling-cms/components/editor/fields/auth/members/options.jsp
@@ -17,7 +17,7 @@
  * under the License.
  */ --%>
 <%@include file="/libs/sling-cms/global.jsp"%>
-<datalist id="labelfield-${fn:replace(resource.name,':','-')}">
+<datalist id="labelfield-${sling:encode(fn:replace(resource.name,':','-'),'HTML_ATTR')}">
     <c:set var="query" value="SELECT * FROM [rep:Authorizable] WHERE ISDESCENDANTNODE([/home]) ORDER BY [rep:principalName]" />
     <c:forEach var="auth" items="${sling:findResources(resourceResolver,query,'JCR-SQL2')}">
         <option value="${sling:encode(auth.path,'HTML_ATTR')}">${sling:encode(auth.valueMap['rep:principalName'],'HTML')}</option>
diff --git a/ui/src/main/resources/jcr_root/libs/sling-cms/components/editor/fields/auth/membership/options.jsp b/ui/src/main/resources/jcr_root/libs/sling-cms/components/editor/fields/auth/membership/options.jsp
index 3a709b35..6b5d7843 100644
--- a/ui/src/main/resources/jcr_root/libs/sling-cms/components/editor/fields/auth/membership/options.jsp
+++ b/ui/src/main/resources/jcr_root/libs/sling-cms/components/editor/fields/auth/membership/options.jsp
@@ -17,7 +17,7 @@
  * under the License.
  */ --%>
 <%@include file="/libs/sling-cms/global.jsp"%>
-<datalist id="labelfield-${fn:replace(resource.name,':','-')}">
+<datalist id="labelfield-${sling:encode(fn:replace(resource.name,':','-'),'HTML_ATTR')}">
     <c:set var="query" value="SELECT * FROM [rep:Group] WHERE ISDESCENDANTNODE([/home/groups]) ORDER BY [rep:principalName]" />
     <c:forEach var="group" items="${sling:findResources(resourceResolver,query,'JCR-SQL2')}">
         <option value="${sling:encode(group.path,'HTML_ATTR')}">${sling:encode(group.valueMap['rep:principalName'],'HTML')}</option>
diff --git a/ui/src/main/resources/jcr_root/libs/sling-cms/components/editor/fields/base/base.jsp b/ui/src/main/resources/jcr_root/libs/sling-cms/components/editor/fields/base/base.jsp
index 5fd0c719..a2248964 100644
--- a/ui/src/main/resources/jcr_root/libs/sling-cms/components/editor/fields/base/base.jsp
+++ b/ui/src/main/resources/jcr_root/libs/sling-cms/components/editor/fields/base/base.jsp
@@ -55,7 +55,7 @@
 </c:forEach>
 <div class="field" data-events="${events}" data-path="${sling:encode(resource.path,'HTML_ATTR')}">
     <c:if test="${not empty properties.label}">
-        <label class="label" for="${properties.name}">
+        <label class="label" for="${sling:encode(properties.name,'HTML_ATTR')}">
             <fmt:message key="${properties.label}" var="label" />
             <sling:encode value="${label}" mode="HTML" />
             <c:if test="${properties.required}"><span class="has-text-danger">*</span></c:if>
diff --git a/ui/src/main/resources/jcr_root/libs/sling-cms/components/editor/fields/combobox/options.jsp b/ui/src/main/resources/jcr_root/libs/sling-cms/components/editor/fields/combobox/options.jsp
index 81610ff8..6e73e52a 100644
--- a/ui/src/main/resources/jcr_root/libs/sling-cms/components/editor/fields/combobox/options.jsp
+++ b/ui/src/main/resources/jcr_root/libs/sling-cms/components/editor/fields/combobox/options.jsp
@@ -17,7 +17,7 @@
  * under the License.
  */ --%>
 <%@include file="/libs/sling-cms/global.jsp"%>
-<datalist id="labelfield-${fn:replace(resource.name,':','-')}">
+<datalist id="labelfield-${sling:encode(fn:replace(resource.name,':','-'),'HTML_ATTR')}">
     <c:choose>
         <c:when test="${not empty properties.options}">
             <c:forEach var="option" items="${properties.options}">
diff --git a/ui/src/main/resources/jcr_root/libs/sling-cms/components/editor/fields/combobox/values.jsp b/ui/src/main/resources/jcr_root/libs/sling-cms/components/editor/fields/combobox/values.jsp
index 2f71992f..eb4f3d6d 100644
--- a/ui/src/main/resources/jcr_root/libs/sling-cms/components/editor/fields/combobox/values.jsp
+++ b/ui/src/main/resources/jcr_root/libs/sling-cms/components/editor/fields/combobox/values.jsp
@@ -19,7 +19,7 @@
 <%@include file="/libs/sling-cms/global.jsp"%>
 <c:forEach var="item" items="${value}">
     <a class="tag labelfield__item" title="${item}">
-        <input type="hidden" name="${properties.name}" value="${item}" />
+        <input type="hidden" name="${sling:encode(properties.name,'HTML_ATTR')}" value="${sling:encode(item,'HTML_ATTR')}" />
         <span class="labelfield__title">
             ${sling:encode(item,'HTML')}
         </span>
diff --git a/ui/src/main/resources/jcr_root/libs/sling-cms/components/editor/fields/labelfield/field.jsp b/ui/src/main/resources/jcr_root/libs/sling-cms/components/editor/fields/labelfield/field.jsp
index 3c4ddd1b..40f814cf 100644
--- a/ui/src/main/resources/jcr_root/libs/sling-cms/components/editor/fields/labelfield/field.jsp
+++ b/ui/src/main/resources/jcr_root/libs/sling-cms/components/editor/fields/labelfield/field.jsp
@@ -32,7 +32,7 @@
     </fieldset>
     <div class="labelfield__field field has-addons">
         <div class="control is-expanded">
-             <input class="input" type="text" ${required} ${disabled} id="${sling:encode(properties.name,'HTML_ATTR')}" list="labelfield-${fn:replace(resource.name,':','-')}" autocomplete="off" />
+             <input class="input" type="text" ${required} ${disabled} id="${sling:encode(properties.name,'HTML_ATTR')}" list="labelfield-${sling:encode(fn:replace(resource.name,':','-'),'HTML_ATTR')}" autocomplete="off" />
          </div>
          <div class="control">
              <button class="labelfield__add button">
diff --git a/ui/src/main/resources/jcr_root/libs/sling-cms/components/editor/fields/path/path.jsp b/ui/src/main/resources/jcr_root/libs/sling-cms/components/editor/fields/path/path.jsp
index ffb0f06f..88913db2 100644
--- a/ui/src/main/resources/jcr_root/libs/sling-cms/components/editor/fields/path/path.jsp
+++ b/ui/src/main/resources/jcr_root/libs/sling-cms/components/editor/fields/path/path.jsp
@@ -49,7 +49,7 @@
     </c:otherwise>
 </c:choose>
 <c:if test="${not empty properties.label}">
-    <label class="label" for="${properties.name}">
+    <label class="label" for="${sling:encode(properties.name,'HTML_ATTR')}">
         <fmt:message key="${properties.label}" var="label" />
         <sling:encode value="${label}" mode="HTML" />
         <c:if test="${properties.required}"><span class="has-text-danger">*</span></c:if>
diff --git a/ui/src/main/resources/jcr_root/libs/sling-cms/components/editor/fields/references/references.jsp b/ui/src/main/resources/jcr_root/libs/sling-cms/components/editor/fields/references/references.jsp
index ac54986b..07e308da 100644
--- a/ui/src/main/resources/jcr_root/libs/sling-cms/components/editor/fields/references/references.jsp
+++ b/ui/src/main/resources/jcr_root/libs/sling-cms/components/editor/fields/references/references.jsp
@@ -19,14 +19,14 @@
  <%@include file="/libs/sling-cms/global.jsp"%>
 <c:if test="${slingRequest.requestPathInfo.suffix != null}">
     <sling:getResource path="${slingRequest.requestPathInfo.suffix}" var="editedResource" />
-    <c:set var="editProperties" value="${sling:adaptTo(editedResource,'org.apache.sling.api.resource.ValueMap')}" scope="request"/>
+    <c:set var="editProperties" value="${sling:adaptTo(editedResource,'org.apache.sling.api.x.ValueMap')}" scope="request"/>
 </c:if>
 <sling:adaptTo var="references" adaptable="${slingRequest.requestPathInfo.suffixResource}" adaptTo="org.apache.sling.cms.References" />
 <c:if test="${fn:length(references.references) gt 0}">
     <div class="field ${properties.toggle ? 'is-hidden toggle-value' : ''}" data-toggle-source=":operation" data-toggle-value="move">
         <div class="field">
             <label class="checkbox">
-                <input type="checkbox" name="${properties.name}" value="true" />
+                <input type="checkbox" name="${sling:encode(properties.name,'HTML_ATTR')}" value="true" />
                 <fmt:message key="${properties.label}" var="label" />
                 <sling:encode value="${label}" mode="HTML" />
             </label>
@@ -50,8 +50,8 @@
                                             <span class="jam jam-document"></span>
                                         </span>
                                     </td>
-                                    <td title="${ref.containingPage.path}">
-                                        <a href="/cms/site/content.html${ref.containingPage.parent.path}" target="_blank">
+                                    <td title="${sling:encode(ref.containingPage.path,'HTML_ATTR')}">
+                                        <a href="/cms/site/content.html${sling:encode(ref.containingPage.parent.path,'HTML_ATTR')}" target="_blank">
                                             ${sling:encode(ref.containingPage.title,'HTML')}
                                         </a>
                                     </td>
@@ -69,7 +69,7 @@
                                         </span>
                                     </td>
                                     <td>
-                                        ${ref.resource.path}
+                                        ${sling:encode(ref.resource.path,'HTML')}
                                     </td>
                                     <td>
                                     </td>
diff --git a/ui/src/main/resources/jcr_root/libs/sling-cms/components/editor/fields/repeating/field.jsp b/ui/src/main/resources/jcr_root/libs/sling-cms/components/editor/fields/repeating/field.jsp
index bc0edb26..673fd161 100644
--- a/ui/src/main/resources/jcr_root/libs/sling-cms/components/editor/fields/repeating/field.jsp
+++ b/ui/src/main/resources/jcr_root/libs/sling-cms/components/editor/fields/repeating/field.jsp
@@ -21,7 +21,7 @@
     <fieldset disabled="disabled" class="repeating__template is-hidden">
         <div class="repeating__item field has-addons">
             <div class="control is-expanded">
-                <input type="${properties.type}" value="" class="input" name="${sling:encode(properties.name,'HTML_ATTR')}" ${required} ${disabled} />
+                <input type="${sling:encode(properties.type,'HTML_ATTR')}" value="" class="input" name="${sling:encode(properties.name,'HTML_ATTR')}" ${required} ${disabled} />
             </div>
             <div class="control">
                 <button class="repeating__remove button">
@@ -52,7 +52,8 @@
             </div>
         </c:forEach>
     </div>
-    <button type="button" class="repeating__add button" name="${properties.name}">
+    <fmt:message key="Add" var="addMsg" />
+    <button type="button" class="repeating__add button" aria-label="${addMsg}" name="${sling:encode(properties.name,'HTML_ATTR')}">
         <span class="jam jam-plus"></span>
     </button>
 </div>
\ No newline at end of file
diff --git a/ui/src/main/resources/jcr_root/libs/sling-cms/components/editor/fields/resourceparam/resourceparam.jsp b/ui/src/main/resources/jcr_root/libs/sling-cms/components/editor/fields/resourceparam/resourceparam.jsp
index 340f6808..ff9499ef 100644
--- a/ui/src/main/resources/jcr_root/libs/sling-cms/components/editor/fields/resourceparam/resourceparam.jsp
+++ b/ui/src/main/resources/jcr_root/libs/sling-cms/components/editor/fields/resourceparam/resourceparam.jsp
@@ -17,4 +17,4 @@
  * under the License.
  */ --%>
 <%@include file="/libs/sling-cms/global.jsp"%>
-<input type="hidden" name="${properties.name}" value="${sling:getResource(resourceResolver, param[properties.param]).path}" />
\ No newline at end of file
+<input type="hidden" name="${sling:encode(properties.name,'HTML_ATTR')}" value="${sling:encode(sling:getResource(resourceResolver, param[properties.param]).path,'HTML_ATTR')}" />
\ No newline at end of file
diff --git a/ui/src/main/resources/jcr_root/libs/sling-cms/components/editor/fields/richtext/toolbar/button/button.jsp b/ui/src/main/resources/jcr_root/libs/sling-cms/components/editor/fields/richtext/toolbar/button/button.jsp
index cca710f3..88d6bc70 100644
--- a/ui/src/main/resources/jcr_root/libs/sling-cms/components/editor/fields/richtext/toolbar/button/button.jsp
+++ b/ui/src/main/resources/jcr_root/libs/sling-cms/components/editor/fields/richtext/toolbar/button/button.jsp
@@ -19,10 +19,10 @@
 <%@include file="/libs/sling-cms/global.jsp"%>
 <c:choose>
     <c:when test="${not empty properties.value}">
-        <a class="button is-small" data-wysihtml-command="${properties.command}" data-wysihtml-command-value="${properties.value}">
+        <a class="button is-small" data-wysihtml-command="${sling:encode(properties.command,'HTML_ATTR')}" data-wysihtml-command-value="${sling:encode(properties.value,'HTML_ATTR')}">
             <c:choose>
                 <c:when test="${not empty properties.icon}">
-                    <em class="jam jam-${properties.icon} icon"></em>
+                    <em class="jam jam-${sling:encode(properties.icon,'HTML_ATTR')} icon"></em>
                 </c:when>
                 <c:otherwise>
                     <fmt:message key="${properties.text}" var="text" />
@@ -32,10 +32,10 @@
         </a>
     </c:when>
     <c:otherwise>
-        <a class="button is-small" data-wysihtml-command="${properties.command}">
+        <a class="button is-small" data-wysihtml-command="${sling:encode(properties.command,'HTML_ATTR')}">
             <c:choose>
                 <c:when test="${not empty properties.icon}">
-                    <em class="jam jam-${properties.icon} icon"></em>
+                    <em class="jam jam-${sling:encode(properties.icon,'HTML_ATTR')} icon"></em>
                 </c:when>
                 <c:otherwise>
                     <fmt:message key="${properties.text}" var="text" />
diff --git a/ui/src/main/resources/jcr_root/libs/sling-cms/components/editor/fields/taxonomy/options.jsp b/ui/src/main/resources/jcr_root/libs/sling-cms/components/editor/fields/taxonomy/options.jsp
index ac756b1a..bdaa2cbb 100644
--- a/ui/src/main/resources/jcr_root/libs/sling-cms/components/editor/fields/taxonomy/options.jsp
+++ b/ui/src/main/resources/jcr_root/libs/sling-cms/components/editor/fields/taxonomy/options.jsp
@@ -18,9 +18,9 @@
  */ --%>
 <%@include file="/libs/sling-cms/global.jsp"%>
 <sling:getCAConfigResource resource="${slingRequest.requestPathInfo.suffixResource}" bucket="site" name="settings" var="sitesettings" />
-<datalist id="labelfield-${fn:replace(resource.name,':','-')}">
+<datalist id="labelfield-${sling:encode(fn:replace(resource.name,':','-'),'HTML_ATTR')}">
     <c:set var="query" value="SELECT * FROM [sling:Taxonomy] WHERE ISDESCENDANTNODE([${not empty properties.basePath ? properties.basePath : sitesettings.valueMap.taxonomyroot}])" />
     <c:forEach var="taxonomy" items="${sling:findResources(resourceResolver,query,'JCR-SQL2')}">
-        <option value="${sling:encode(taxonomy.path,'HTML_ATTR')}">${taxonomy.valueMap['jcr:title']}</option>
+        <option value="${sling:encode(taxonomy.path,'HTML_ATTR')}">${sling:encode(taxonomy.valueMap['jcr:title'],'HTML')}</option>
     </c:forEach>
 </datalist>
\ No newline at end of file
diff --git a/ui/src/main/resources/jcr_root/libs/sling-cms/components/editor/fields/text/field.jsp b/ui/src/main/resources/jcr_root/libs/sling-cms/components/editor/fields/text/field.jsp
index df44659f..e888786f 100644
--- a/ui/src/main/resources/jcr_root/libs/sling-cms/components/editor/fields/text/field.jsp
+++ b/ui/src/main/resources/jcr_root/libs/sling-cms/components/editor/fields/text/field.jsp
@@ -17,4 +17,4 @@
  * under the License.
  */ --%>
  <%@include file="/libs/sling-cms/global.jsp"%>
-<input type="${not empty properties.type ? properties.type : 'text'}" class="input" id="${properties.name}" name="${properties.name}" value="${sling:encode(value,'HTML_ATTR')}" ${required} ${disabled} />
\ No newline at end of file
+<input type="${sling:encode(not empty properties.type ? properties.type : 'text','HTML_ATTR')}" class="input" id="${sling:encode(properties.name,'HTML_ATTR')}" name="${sling:encode(properties.name,'HTML_ATTR')}" value="${sling:encode(value,'HTML_ATTR')}" ${required} ${disabled} />
\ No newline at end of file
diff --git a/ui/src/main/resources/jcr_root/libs/sling-cms/components/editor/fields/well/well.jsp b/ui/src/main/resources/jcr_root/libs/sling-cms/components/editor/fields/well/well.jsp
index 6fc55ba1..65c58d7b 100644
--- a/ui/src/main/resources/jcr_root/libs/sling-cms/components/editor/fields/well/well.jsp
+++ b/ui/src/main/resources/jcr_root/libs/sling-cms/components/editor/fields/well/well.jsp
@@ -17,11 +17,11 @@
  * under the License.
  */ --%>
 <%@include file="/libs/sling-cms/global.jsp"%>
-<fmt:message key="${properties.title}" var="title" />
+<fmt:message key="${sling:encode(properties.title,'HTML_ATTR')}" var="title" />
 <div class="card field">
     <c:choose>
         <c:when test="${properties.collapse}">
-            <header class="card-header toggle-hidden" data-target="#${resource.name}">
+            <header class="card-header toggle-hidden" data-target="#${sling:encode(resource.name,'HTML_ATTR')}">
                 <p class="card-header-title">
                     <sling:encode value="${title}" mode="HTML" />
                 </p>
@@ -31,7 +31,7 @@
                     </span>
                 </a>
             </header>
-            <div class="card-content is-hidden" id="${resource.name}">
+            <div class="card-content is-hidden" id="${sling:encode(resource.name,'HTML_ATTR')}">
                 <sling:include path="content" resourceType="sling-cms/components/general/container" />
             </div>
         </c:when>
diff --git a/ui/src/main/resources/jcr_root/libs/sling-cms/components/editor/scripts/componentConfigOptions.jsp b/ui/src/main/resources/jcr_root/libs/sling-cms/components/editor/scripts/componentConfigOptions.jsp
index 63af915e..f38de3f0 100644
--- a/ui/src/main/resources/jcr_root/libs/sling-cms/components/editor/scripts/componentConfigOptions.jsp
+++ b/ui/src/main/resources/jcr_root/libs/sling-cms/components/editor/scripts/componentConfigOptions.jsp
@@ -28,6 +28,6 @@
                 <c:set var="rt" value="${fn:substringAfter(sling:encode(component.path,'HTML_ATTR'),'/libs/')}" />
             </c:otherwise>
         </c:choose>
-        <option value="${rt}" ${rt == editProperties.type ? 'selected' : ''} data-config="${sling:encode(component.path,'HTML_ATTR')}/config.html"><sling:encode value="${component.valueMap['jcr:title']}" mode="HTML" /></option>
+        <option value="${sling:encode(rt,'HTML_ATTR')}" ${rt == editProperties.type ? 'selected' : ''} data-config="${sling:encode(component.path,'HTML_ATTR')}/config.html"><sling:encode value="${component.valueMap['jcr:title']}" mode="HTML" /></option>
     </c:if>
 </c:forEach>
\ No newline at end of file
diff --git a/ui/src/main/resources/jcr_root/libs/sling-cms/components/editor/scripts/configResourceTypeOptions.jsp b/ui/src/main/resources/jcr_root/libs/sling-cms/components/editor/scripts/configResourceTypeOptions.jsp
index ebdbb75a..24495a13 100644
--- a/ui/src/main/resources/jcr_root/libs/sling-cms/components/editor/scripts/configResourceTypeOptions.jsp
+++ b/ui/src/main/resources/jcr_root/libs/sling-cms/components/editor/scripts/configResourceTypeOptions.jsp
@@ -22,10 +22,10 @@
 <c:forEach var="component" items="${sling:findResources(resourceResolver,query,'JCR-SQL2')}">
 	<c:choose>
 		<c:when test="${fn:startsWith(component.path,'/apps/')}">
-			<option value="${fn:substringAfter(component.path,'/apps/')}"><sling:encode value="${component.valueMap['jcr:title']}" mode="HTML" /></option>
+			<option value="${sling:encode(fn:substringAfter(component.path,'/apps/'),'HTML_ATTR')}"><sling:encode value="${component.valueMap['jcr:title']}" mode="HTML" /></option>
 		</c:when>
 		<c:otherwise>
-			<option value="${fn:substringAfter(component.path,'/libs/')}"><sling:encode value="${component.valueMap['jcr:title']}" mode="HTML" /></option>
+			<option value="${sling:encode(fn:substringAfter(component.path,'/libs/'),'HTML_ATTR')}"><sling:encode value="${component.valueMap['jcr:title']}" mode="HTML" /></option>
 		</c:otherwise>
 	</c:choose>
 </c:forEach>
\ No newline at end of file
diff --git a/ui/src/main/resources/jcr_root/libs/sling-cms/components/editor/scripts/localeOptions.jsp b/ui/src/main/resources/jcr_root/libs/sling-cms/components/editor/scripts/localeOptions.jsp
index 8e813cc6..f0ae8ec8 100644
--- a/ui/src/main/resources/jcr_root/libs/sling-cms/components/editor/scripts/localeOptions.jsp
+++ b/ui/src/main/resources/jcr_root/libs/sling-cms/components/editor/scripts/localeOptions.jsp
@@ -20,8 +20,8 @@
 <option value="">Select Locale</option>
 <c:forEach var="locale" items="${sling:adaptTo(slingRequest,'org.apache.sling.cms.core.models.LocaleList').locales}">
     <c:if test="${not empty locale.language}">
-        <option value="${locale}" ${locale == editProperties[properties.name] ? 'selected' : ''}>
-            ${locale.displayLanguage} ${locale.displayCountry} (${locale})
+        <option value="${sling:encode(locale,'HTML_ATTR')}" ${locale == editProperties[properties.name] ? 'selected' : ''}>
+            ${sling:encode(locale.displayLanguage,'HTML')} ${sling:encode(locale.displayCountry,'HTML')} (${sling:encode(locale,'HTML')})
         </option>
     </c:if>
 </c:forEach>
\ No newline at end of file
diff --git a/ui/src/main/resources/jcr_root/libs/sling-cms/components/editor/scripts/pageTemplateOptions.jsp b/ui/src/main/resources/jcr_root/libs/sling-cms/components/editor/scripts/pageTemplateOptions.jsp
index 10aea488..8f312921 100644
--- a/ui/src/main/resources/jcr_root/libs/sling-cms/components/editor/scripts/pageTemplateOptions.jsp
+++ b/ui/src/main/resources/jcr_root/libs/sling-cms/components/editor/scripts/pageTemplateOptions.jsp
@@ -17,10 +17,10 @@
  * under the License.
  */ --%>
  <%@include file="/libs/sling-cms/global.jsp"%>
-<option value="">Select Page Type</option>
+<option value=""><fmt:message key="Select Page Type" /></option>
 <sling:adaptTo var="templateMgr" adaptable="${slingRequest.requestPathInfo.suffixResource}" adaptTo="org.apache.sling.cms.PageTemplateManager" />
 <c:forEach var="template" items="${templateMgr.availableTemplates}">
-    <option value="${template.resource.path}">
+    <option value="${sling:encode(template.resource.path,'HTML_ATTR')}">
         <sling:encode value="${template.title}" mode="HTML" />
     </option>
 </c:forEach>
\ No newline at end of file
diff --git a/ui/src/main/resources/jcr_root/libs/sling-cms/components/editor/scripts/resourceTypeOptions.jsp b/ui/src/main/resources/jcr_root/libs/sling-cms/components/editor/scripts/resourceTypeOptions.jsp
index bf1b7edb..4e355eab 100644
--- a/ui/src/main/resources/jcr_root/libs/sling-cms/components/editor/scripts/resourceTypeOptions.jsp
+++ b/ui/src/main/resources/jcr_root/libs/sling-cms/components/editor/scripts/resourceTypeOptions.jsp
@@ -24,10 +24,10 @@
         <c:forEach var="component" items="${sling:findResources(resourceResolver,query,'JCR-SQL2')}">
             <c:choose>
                 <c:when test="${fn:startsWith(component.path,'/apps/')}">
-                    <option value="${fn:substringAfter(component.path,'/apps/')}"><sling:encode value="${component.valueMap['jcr:title']}" mode="HTML" /></option>
+                    <option value="${sling:encode(fn:substringAfter(component.path,'/apps/'),'HTML_ATTR')}"><sling:encode value="${component.valueMap['jcr:title']}" mode="HTML" /></option>
                 </c:when>
                 <c:otherwise>
-                    <option value="${fn:substringAfter(component.path,'/libs/')}"><sling:encode value="${component.valueMap['jcr:title']}" mode="HTML" /></option>
+                    <option value="${sling:encode(fn:substringAfter(component.path,'/libs/'),'HTML_ATTR')}"><sling:encode value="${component.valueMap['jcr:title']}" mode="HTML" /></option>
                 </c:otherwise>
             </c:choose>
         </c:forEach>
diff --git a/ui/src/main/resources/jcr_root/libs/sling-cms/components/editor/slingform/slingform.jsp b/ui/src/main/resources/jcr_root/libs/sling-cms/components/editor/slingform/slingform.jsp
index 4d9c97e1..7e1619aa 100644
--- a/ui/src/main/resources/jcr_root/libs/sling-cms/components/editor/slingform/slingform.jsp
+++ b/ui/src/main/resources/jcr_root/libs/sling-cms/components/editor/slingform/slingform.jsp
@@ -23,9 +23,9 @@
 </c:if>
 <form method="post"
     action="${sling:encode(slingRequest.requestPathInfo.suffix,'HTML_ATTR')}${sling:encode(properties.actionSuffix,'HTML_ATTR')}"
-    enctype="${encoding}" class="Form-Ajax"
+    enctype="${sling:encode(encoding,'HTML_ATTR')}" class="Form-Ajax"
     data-add-date="${properties.addDate != false}"
-    data-callback="${properties.callback}">
+    data-callback="${sling:encode(properties.callback,'HTML_ATTR')}">
     <div class="form-wrapper pt-4 field">
         <input type="hidden" name="_charset_" value="utf-8" />
         <sling:include path="fields" resourceType="sling-cms/components/general/container" />
diff --git a/ui/src/main/resources/jcr_root/libs/sling-cms/components/general/container/container.jsp b/ui/src/main/resources/jcr_root/libs/sling-cms/components/general/container/container.jsp
index 13e6c59b..c2d08916 100644
--- a/ui/src/main/resources/jcr_root/libs/sling-cms/components/general/container/container.jsp
+++ b/ui/src/main/resources/jcr_root/libs/sling-cms/components/general/container/container.jsp
@@ -39,7 +39,7 @@
         <div class="level has-background-light has-text-black-ter">
             <div class="level-left">
                 <div class="level-item">
-                    <a href="/cms/editor/add.html${sling:encode(resource.path,'HTML_ATTR')}?availableTypes=${availableTypes}" class="button action-button is-small" data-sling-cms-action="add" data-sling-cms-path="${sling:encode(resource.path,'HTML_ATTR')}" data-sling-cms-available-types="${availableTypes}" title="${addComponentsMessage}">
+                    <a href="/cms/editor/add.html${sling:encode(resource.path,'HTML_ATTR')}?availableTypes=${sling:encode(availableTypes,'HTML_ATTR')}" class="button action-button is-small" data-sling-cms-action="add" data-sling-cms-path="${sling:encode(resource.path,'HTML_ATTR')}" data-sling-cms-available-types="${sling:encode(availableTypes,'HTML_ATTR')}" title="${addComponentsMessage}">
                         &#43;
                     </a>
                 </div>
diff --git a/ui/src/main/resources/jcr_root/libs/sling-cms/components/general/textelement/textelement.jsp b/ui/src/main/resources/jcr_root/libs/sling-cms/components/general/textelement/textelement.jsp
index a1be1ca0..f55f9972 100644
--- a/ui/src/main/resources/jcr_root/libs/sling-cms/components/general/textelement/textelement.jsp
+++ b/ui/src/main/resources/jcr_root/libs/sling-cms/components/general/textelement/textelement.jsp
@@ -27,13 +27,13 @@
 </c:choose>
 <c:choose>
     <c:when test="${not empty properties.href}">
-        <${properties.level}>
+        <${sling:encode(properties.level,'HTML')}>
             <a href="${sling:encode(properties.href,'HTML_ATTR')}">
                 <sling:encode value="${text}" mode="HTML" />
             </a>
-        </${properties.level}>
+        </${sling:encode(properties.level,'HTML')}>
     </c:when>
     <c:otherwise>
-        <${properties.level}><sling:encode value="${text}" mode="HTML" /></${properties.level}>
+        <${sling:encode(properties.level,'HTML')}><sling:encode value="${text}" mode="HTML" /></${sling:encode(properties.level,'HTML')}>
     </c:otherwise>
 </c:choose>
diff --git a/ui/src/main/resources/jcr_root/libs/sling-cms/components/insights/insight/insight.jsp b/ui/src/main/resources/jcr_root/libs/sling-cms/components/insights/insight/insight.jsp
index c19ebc03..e7d37845 100644
--- a/ui/src/main/resources/jcr_root/libs/sling-cms/components/insights/insight/insight.jsp
+++ b/ui/src/main/resources/jcr_root/libs/sling-cms/components/insights/insight/insight.jsp
@@ -17,18 +17,18 @@
  * under the License.
  */ --%>
 <%@include file="/libs/sling-cms/global.jsp"%>
-<article class="message ${insight.primaryMessage.styleClass}">
-    <div class="message-header toggle-hidden" data-target="#${insight.provider.id}-body">
+<article class="message ${sling:encode(insight.primaryMessage.styleClass,'HTML_ATTR')}">
+    <div class="message-header toggle-hidden" data-target="#${sling:encode(insight.provider.id,'HTML_ATTR')}-body">
         <p>
             <sling:encode value="${insight.provider.title}" mode="HTML" />
             <c:if test="${insight.scored}">
-                <span class="score" data-score="${insight.score}">
+                <span class="score" data-score="${sling:encode(insight.score,'HTML_ATTR')}">
                     <fmt:formatNumber type="percent" maxFractionDigits="2" value="${insight.score}" />
                 </span>
             </c:if>
         </p>
         <c:if test="${not empty insight.moreDetailsLink}">
-            <a class="button ${insight.primaryMessage.styleClass}" href="${insight.moreDetailsLink}" target="_blank">
+            <a class="button ${sling:encode(insight.primaryMessage.styleClass,'HTML_ATTR')}" href="${sling:encode(insight.moreDetailsLink,'HTML_ATTR')}" target="_blank">
                 <em class="jam jam-info icon"></em>
             </a>
         </c:if>
diff --git a/ui/src/main/resources/jcr_root/libs/sling-cms/components/jobs/jobOptions.jsp b/ui/src/main/resources/jcr_root/libs/sling-cms/components/jobs/jobOptions.jsp
index b57c21ad..e638c820 100644
--- a/ui/src/main/resources/jcr_root/libs/sling-cms/components/jobs/jobOptions.jsp
+++ b/ui/src/main/resources/jcr_root/libs/sling-cms/components/jobs/jobOptions.jsp
@@ -20,7 +20,8 @@
 <option value=""><fmt:message key="Select Job" /></option>
 <sling:adaptTo var="jobManager" adaptable="${slingRequest}" adaptTo="org.apache.sling.cms.CMSJobManager" />
 <c:forEach var="job" items="${jobManager.availableJobs}">
-    <option value="${job.configurationPath}">
-        <fmt:message key="${job.titleKey}" />
+    <option value="${sling:encode(job.configurationPath,'HTML_ATTR')}">
+        <fmt:message key="${job.titleKey}" var="title" />
+        <sling:encode value="${title}" mode="HTML" />
     </option>
 </c:forEach>
\ No newline at end of file
diff --git a/ui/src/main/resources/jcr_root/libs/sling-cms/components/jobs/list/list.jsp b/ui/src/main/resources/jcr_root/libs/sling-cms/components/jobs/list/list.jsp
index 34d53484..1843b3d9 100644
--- a/ui/src/main/resources/jcr_root/libs/sling-cms/components/jobs/list/list.jsp
+++ b/ui/src/main/resources/jcr_root/libs/sling-cms/components/jobs/list/list.jsp
@@ -50,10 +50,10 @@
                         ${count}
                     </td>
                     <td>
-                        <a href="/cms/jobs/view.html/${job.id}">
+                        <a href="/cms/jobs/view.html/${sling:encode(job.id,'HTML_ATTR')}">
                             <fmt:message key="${job.properties._titleKey}" />
                         </a><br/>
-                        <small>${job.topic}</small>
+                        <small>${sling:encode(job.topic,'HTML')}</small>
                     </td>
                     <td>
                         <fmt:formatDate value="${job.created.time}" type="both" dateStyle="long" timeStyle="long" />
@@ -69,7 +69,7 @@
                     </td>
                     <td class="is-sr-only cell-actions">
                         <fmt:message key="Remove Job" var="removeJobMessage" />
-                        <a class="button Fetch-Modal" data-title="${removeJobMessage}" data-path=".Main-Content form" href="/cms/jobs/delete.html/bin/cms/removejob?id=${job.id}" title="${removeJobMessage}">
+                        <a class="button Fetch-Modal" data-title="${removeJobMessage}" data-path=".Main-Content form" href="/cms/jobs/delete.html/bin/cms/removejob?id=${sling:encode(job.id,'HTML_ATTR')}" title="${removeJobMessage}">
                             <span class="jam jam-trash">
                             </span>
                         </a>
diff --git a/ui/src/main/resources/jcr_root/libs/sling-cms/components/jobs/view/view.jsp b/ui/src/main/resources/jcr_root/libs/sling-cms/components/jobs/view/view.jsp
index 8a6c5056..9fe57dac 100644
--- a/ui/src/main/resources/jcr_root/libs/sling-cms/components/jobs/view/view.jsp
+++ b/ui/src/main/resources/jcr_root/libs/sling-cms/components/jobs/view/view.jsp
@@ -28,7 +28,8 @@
         </li>
         <li class="is-active">
             <a href="#">
-                <fmt:message key="${job.properties._titleKey}" />
+                <fmt:message key="${job.properties._titleKey}" var="title" />
+                <sling:encode value="title" mode="HTML" />
             </a>
         </li>
     </ul>
@@ -37,7 +38,7 @@
 <div class="scroll-container">
     <dl>
         <dt><fmt:message key="State" /></dt>
-        <dd>${job.jobState}</dd>
+        <dd>${sling:encode(job.jobState,'HTML')}</dd>
         <c:if test="${not empty job.resultMessage}">
             <dt><fmt:message key="Result Message" /></dt>
             <dd>${sling:encode(job.resultMessage,'HTML')}</dd>
@@ -53,7 +54,7 @@
         <c:if test="${job.progressStepCount > 0}">
             <dt><fmt:message key="Progress" /></dt>
             <dd>
-                ${job.finishedProgressStep} / ${job.progressStepCount}
+                ${sling:encode(job.finishedProgressStep,'HTML')} / ${sling:encode(job.progressStepCount,'HTML')}
             </dd>
         </c:if>
         <c:if test="${job.progressLog != null && fn:length(job.progressLog) > 0}">
diff --git a/ui/src/main/resources/jcr_root/libs/sling-cms/components/pages/base/head.jsp b/ui/src/main/resources/jcr_root/libs/sling-cms/components/pages/base/head.jsp
index bdb3bc61..84f60145 100644
--- a/ui/src/main/resources/jcr_root/libs/sling-cms/components/pages/base/head.jsp
+++ b/ui/src/main/resources/jcr_root/libs/sling-cms/components/pages/base/head.jsp
@@ -21,17 +21,17 @@
     <meta charset="utf-8">
     <meta http-equiv="X-UA-Compatible" content="IE=edge" />
     <meta name="viewport" content="width=device-width, initial-scale=1" />
-    <title><fmt:message key="${properties['jcr:title']}" /> :: ${branding.appName}</title>
-    <link href="${branding.css}" rel="stylesheet" />
-    <link rel="apple-touch-icon" sizes="180x180" href="${branding.appleTouchIcon}" />
-    <link rel="icon" type="image/png" sizes="32x32" href="${branding.favicon32}" />
-    <link rel="icon" type="image/png" sizes="16x16" href="${branding.favicon16}" />
-    <link rel="shortcut icon" href="${branding.favicon}" />
-    <meta name="apple-mobile-web-app-title" content="${branding.appName}" />
-    <meta name="application-name" content="${branding.appName}" />
-    <link rel="mask-icon" href="${branding.appleMaskIcon}" color="${branding.tileColor}" />
-    <meta name="msapplication-TileColor" content="${branding.tileColor}" />
-    <meta name="theme-color" content="${branding.tileColor}" />
-    <meta name="msapplication-config" content="${branding.browserConfig}">
-    <link rel="manifest" href="${branding.webManifest }">
+    <title><fmt:message key="${properties['jcr:title']}" var="title" />${sling:encode(title,'HTML')} :: ${sling:encode(branding.appName,'HTML')}</title>
+    <link href="${sling:encode(branding.css, 'HTML_ATTR')}" rel="stylesheet" />
+    <link rel="apple-touch-icon" sizes="180x180" href="${sling:encode(branding.appleTouchIcon, 'HTML_ATTR')}" />
+    <link rel="icon" type="image/png" sizes="32x32" href="${sling:encode(branding.favicon32, 'HTML_ATTR')}" />
+    <link rel="icon" type="image/png" sizes="16x16" href="${sling:encode(branding.favicon16, 'HTML_ATTR')}" />
+    <link rel="shortcut icon" href="${sling:encode(branding.favicon, 'HTML_ATTR')}" />
+    <meta name="apple-mobile-web-app-title" content="${sling:encode(branding.appName,'HTML_ATTR')}" />
+    <meta name="application-name" content="${sling:encode(branding.appName,'HTML_ATTR')}" />
+    <link rel="mask-icon" href="${sling:encode(branding.appleMaskIcon, 'HTML_ATTR')}" color="${branding.tileColor}" />
+    <meta name="msapplication-TileColor" content="${sling:encode(branding.tileColor, 'HTML_ATTR')}" />
+    <meta name="theme-color" content="${sling:encode(branding.tileColor, 'HTML_ATTR')}" />
+    <meta name="msapplication-config" content="${sling:encode(branding.browserConfig, 'HTML_ATTR')}">
+    <link rel="manifest" href="${sling:encode(branding.webManifest, 'HTML_ATTR')}">
 </head>
\ No newline at end of file
diff --git a/ui/src/main/resources/jcr_root/libs/sling-cms/components/pages/base/nav.jsp b/ui/src/main/resources/jcr_root/libs/sling-cms/components/pages/base/nav.jsp
index a8dc538b..3aa5e870 100644
--- a/ui/src/main/resources/jcr_root/libs/sling-cms/components/pages/base/nav.jsp
+++ b/ui/src/main/resources/jcr_root/libs/sling-cms/components/pages/base/nav.jsp
@@ -19,8 +19,8 @@
 <%@include file="/libs/sling-cms/global.jsp"%>
 <nav class="navbar has-background-light" role="navigation" aria-label="main mavigation">
     <div class="navbar-brand">
-        <a class="navbar-item" href="${branding.logoLink}">
-            <img src="${branding.logo}" width="100" alt="${branding.appName}"/>
+        <a class="navbar-item" href="${sling:encode(branding.logoLink,'HTML_ATTR')}">
+            <img src="${sling:encode(branding.logo,'HTML_ATTR')}" width="100" alt="${sling:encode(branding.appName,'HTML_ATTR')}"/>
         </a>
         <fmt:message key="Home" var="homeMessage" />
         <a href="/cms/start.html" class="navbar-item" title="${homeMessage}">
@@ -60,7 +60,7 @@
                         </em>&nbsp;
                         <fmt:message key="My Transformations" />
                     </a>
-                    <a class="navbar-item" href="${branding.helpLink}" target="_blank" rel="noopener noreferrer">
+                    <a class="navbar-item" href="${sling:encode(branding.helpLink,'HTML_ATTR')}" target="_blank" rel="noopener noreferrer">
                         <em class="jam jam-help">
                             <span class="is-sr-only">Help</span>
                         </em>&nbsp;
diff --git a/ui/src/main/resources/jcr_root/libs/sling-cms/components/pages/error/body.jsp b/ui/src/main/resources/jcr_root/libs/sling-cms/components/pages/error/body.jsp
index 15ff0673..5ad557f9 100644
--- a/ui/src/main/resources/jcr_root/libs/sling-cms/components/pages/error/body.jsp
+++ b/ui/src/main/resources/jcr_root/libs/sling-cms/components/pages/error/body.jsp
@@ -25,7 +25,7 @@
                 <main class="columns is-centered is-vcentered" style="min-height: calc(100vh - 85px)">
                     <div class="column is-two-thirds-tablet is-half-desktop is-one-third-widescreen">
                         <div class="box mt-6">
-                            <img src="${branding.logo}" width="100" alt="${branding.appName}" class="pb-3">
+                            <img src="${sling:encode(branding.logo,'HTML_ATTR')}" width="100" alt="${sling:encode(branding.appName,'HTML_ATTR')}" class="pb-3">
                             <sling:call script="content.jsp" />
                         </div>
                     </div>
diff --git a/ui/src/main/resources/jcr_root/libs/sling-cms/components/pages/error/nav.jsp b/ui/src/main/resources/jcr_root/libs/sling-cms/components/pages/error/nav.jsp
index e590b869..a79e934d 100644
--- a/ui/src/main/resources/jcr_root/libs/sling-cms/components/pages/error/nav.jsp
+++ b/ui/src/main/resources/jcr_root/libs/sling-cms/components/pages/error/nav.jsp
@@ -20,7 +20,7 @@
 <nav class="navbar has-background-light" role="navigation" aria-label="main navigation">
 <div class="navbar-brand">
 <a class="navbar-item" href="http://sling.apache.org" >
-    <img src="${branding.logo}" width="100" alt="${branding.appName}"/>
+    <img src="${sling:encode(branding.logo,'HTML_ATTR')}" width="100" alt="${sling:encode(branding.appName,'HTML_ATTR')}"/>
 </a>
 <a href="/cms/start.html" class="navbar-item" title="CMS Home"><span class="icon"><em class="jam jam-home-f"></em></span></a>
 </div>
diff --git a/ui/src/main/resources/jcr_root/libs/sling-cms/components/publication/agent/agent.jsp b/ui/src/main/resources/jcr_root/libs/sling-cms/components/publication/agent/agent.jsp
index 93a5cc2e..bddf0629 100644
--- a/ui/src/main/resources/jcr_root/libs/sling-cms/components/publication/agent/agent.jsp
+++ b/ui/src/main/resources/jcr_root/libs/sling-cms/components/publication/agent/agent.jsp
@@ -70,7 +70,7 @@
                                 <a class="button" href="/system/console/configMgr/${agentCfg['service.pid']}"><fmt:message key="Edit" /></a>
                             </div>
                             <div class="level-item">
-                                <form method="post" action="/libs/sling/distribution/services/agents/${agent.name}" class="mb-0" target="_blank">
+                                <form method="post" action="/libs/sling/distribution/services/agents/${sling:encode(agent.name,'HTML_ATTR')}" class="mb-0" target="_blank">
                                     <input type="hidden" name="action" value="TEST" />
                                     <button class="button" type="submit"><fmt:message key="Test" /></button>
                                 </form>
@@ -83,7 +83,7 @@
         <div class="column is-6">
             <c:forEach var="url" items="${agentCfg['packageImporter.endpoints']}" varStatus="status">
                 <article class="message is-light">
-                    <sling:getResource var="queue" path="/libs/sling/distribution/services/agents/${agent.name}/queues/endpoint${status.index}" />
+                    <sling:getResource var="queue" path="/libs/sling/distribution/services/agents/${sling:encode(agent.name,'HTML_ATTR')}/queues/endpoint${status.index}" />
                     <div class="message-header">
                         <p><fmt:message key="Queue" /> #${status.index + 1}</p>
                     </div>
@@ -114,7 +114,7 @@
         </div>
         <div class="message-body">
             <figure class="image is-16by9">
-                <iframe class="has-ratio" src="/libs/sling/distribution/services/agents/${agent.name}/log.txt"></iframe>
+                <iframe class="has-ratio" title="Agent Logs" src="/libs/sling/distribution/services/agents/${sling:encode(agent.name,'HTML_ATTR')}/log.txt"></iframe>
             </figure>
         </div>
     </article>
diff --git a/ui/src/main/resources/jcr_root/libs/sling-cms/components/publication/configuration/configuration.jsp b/ui/src/main/resources/jcr_root/libs/sling-cms/components/publication/configuration/configuration.jsp
index 8da679fd..966da44d 100644
--- a/ui/src/main/resources/jcr_root/libs/sling-cms/components/publication/configuration/configuration.jsp
+++ b/ui/src/main/resources/jcr_root/libs/sling-cms/components/publication/configuration/configuration.jsp
@@ -25,7 +25,7 @@
     <dd>
         <c:choose>
             <c:when test="${not empty properties.objectClass}">
-                <a href="/system/console/services?filter=%28%26%28objectClass%3D${properties.objectClass}%29%28name%3D${sling:encode(config[properties.key],'HTML_ATTR')}%29%29">
+                <a href="/system/console/services?filter=%28%26%28objectClass%3D${sling:encode(properties.objectClass,'HTML_ATTR')}%29%28name%3D${sling:encode(config[properties.key],'HTML_ATTR')}%29%29">
                     <sling:encode value="${config[properties.key]}" mode="HTML" />
                 </a>
             </c:when>
diff --git a/ui/src/main/resources/jcr_root/libs/sling-cms/components/publication/exporter/exporter.jsp b/ui/src/main/resources/jcr_root/libs/sling-cms/components/publication/exporter/exporter.jsp
index 4ef55e4e..fb83ef14 100644
--- a/ui/src/main/resources/jcr_root/libs/sling-cms/components/publication/exporter/exporter.jsp
+++ b/ui/src/main/resources/jcr_root/libs/sling-cms/components/publication/exporter/exporter.jsp
@@ -56,7 +56,7 @@
                             <sling:include resource="${configRsrc}" />
                         </c:forEach>
                     </dl>
-                    <a class="button" href="/system/console/configMgr/${exporterCfg['service.pid']}"><fmt:message key="Edit" /></a>
+                    <a class="button" href="/system/console/configMgr/${sling:encode(exporterCfg['service.pid'],'HTML_ATTR')}"><fmt:message key="Edit" /></a>
                 </div>
             </article>
         </div>
diff --git a/ui/src/main/resources/jcr_root/libs/sling-cms/components/publication/home/home.jsp b/ui/src/main/resources/jcr_root/libs/sling-cms/components/publication/home/home.jsp
index 05523084..9d464c50 100644
--- a/ui/src/main/resources/jcr_root/libs/sling-cms/components/publication/home/home.jsp
+++ b/ui/src/main/resources/jcr_root/libs/sling-cms/components/publication/home/home.jsp
@@ -21,6 +21,6 @@
 <br/>
 <dl>
     <dt><fmt:message key="Publication Mode" /></dt>
-    <dd><fmt:message key="${publicationManager.publicationMode}" /></dd>
+    <dd><fmt:message key="${sling:encode(publicationManager.publicationMode,'HTML')}" /></dd>
 </dl>
 <br/>
\ No newline at end of file
diff --git a/ui/src/main/resources/jcr_root/libs/sling-cms/components/publication/importer/importer.jsp b/ui/src/main/resources/jcr_root/libs/sling-cms/components/publication/importer/importer.jsp
index 86ead340..7ec06bb3 100644
--- a/ui/src/main/resources/jcr_root/libs/sling-cms/components/publication/importer/importer.jsp
+++ b/ui/src/main/resources/jcr_root/libs/sling-cms/components/publication/importer/importer.jsp
@@ -56,7 +56,7 @@
                             <sling:include resource="${configRsrc}" />
                         </c:forEach>
                     </dl>
-                    <a class="button" href="/system/console/configMgr/${importerCfg['service.pid']}"><fmt:message key="Edit" /></a>
+                    <a class="button" href="/system/console/configMgr/${sling:encode(importerCfg['service.pid'],'HTML_ATTR')}"><fmt:message key="Edit" /></a>
                 </div>
             </article>
         </div>
diff --git a/ui/src/main/resources/jcr_root/libs/sling/thumbnails/transformation/config/config.jsp b/ui/src/main/resources/jcr_root/libs/sling/thumbnails/transformation/config/config.jsp
index e68c95e7..fbfe0f31 100644
--- a/ui/src/main/resources/jcr_root/libs/sling/thumbnails/transformation/config/config.jsp
+++ b/ui/src/main/resources/jcr_root/libs/sling/thumbnails/transformation/config/config.jsp
@@ -21,7 +21,7 @@
 <div>
     <dl>
         <dt><fmt:message key="Name" /></dt>
-        <dd><sling:encode value="${properties.name}" mode="HTML" />
+        <dd><sling:encode value="${sling:encode(properties.name,'HTML_ATTR')}" mode="HTML" />
     </dl>
 </div>
 <hr/>