From e092c4b91de03f60f2bb69b955c6da0cc0566ba0 Mon Sep 17 00:00:00 2001
From: Brian Canini <canini.16@osu.edu>
Date: Wed, 6 Jan 2021 12:50:19 -0500
Subject: [PATCH] Updating drupal/webform (5.19.0 => 5.22.0)

---
 composer.json                                 |    2 +-
 composer.lock                                 |   20 +-
 vendor/composer/installed.json                |   20 +-
 web/modules/webform/README.md                 |   31 +-
 web/modules/webform/composer.json             |    6 +-
 web/modules/webform/composer.libraries.json   |   82 +-
 .../config/install/webform.settings.yml       |    3 +
 .../install/webform.webform.contact.yml       |    6 +
 .../schema/webform.entity.webform.schema.yml  |   15 +
 .../config/schema/webform.field.schema.yml    |    7 +
 .../schema/webform.plugin.handler.schema.yml  |   10 +
 .../config/schema/webform.settings.schema.yml |    9 +
 .../webform.third_party.antibot.schema.yml    |   14 +
 .../webform/css/webform.admin.toolbar.css     |   15 +
 .../webform/css/webform.element.multiple.css  |    1 +
 .../webform/css/webform.element.options.css   |    6 +-
 web/modules/webform/css/webform.form.css      |   13 +
 .../webform/css/webform.theme.claro.css       |   16 +-
 .../webform/css/webform.theme.seven.css       |    6 +
 .../webform/docs/DEVELOPMENT-CHEATSHEET.md    |    3 +
 web/modules/webform/docs/FEATURES.md          |  112 +-
 web/modules/webform/docs/UPDATE-LIBRARIES.md  |   12 +-
 web/modules/webform/icons/000000/webform.svg  |    6 +
 web/modules/webform/icons/787878/webform.svg  |    6 +
 .../webform/images/addons/ldbase_handlers.png |   66 +
 .../images/addons/webform_nouislider.png      |  260 ++
 web/modules/webform/images/addons/wsla.svg    |   16 +
 .../webform/includes/webform.editor.inc       |   35 +-
 .../webform/includes/webform.install.inc      |   16 +
 .../includes/webform.install.requirements.inc |   42 +-
 .../includes/webform.install.update.inc       |  155 +-
 .../webform/includes/webform.theme.inc        |   14 +-
 .../includes/webform.theme.template.inc       |    1 +
 web/modules/webform/js/webform.contextual.js  |    2 +-
 web/modules/webform/js/webform.dialog.js      |    7 +-
 .../webform/js/webform.element.checkboxes.js  |  145 +-
 .../webform/js/webform.element.codemirror.js  |   14 +-
 .../webform/js/webform.element.date.js        |    4 +-
 .../js/webform.element.details.save.js        |   18 +-
 .../js/webform.element.details.toggle.js      |    5 +-
 .../webform/js/webform.element.help.js        |    2 +-
 .../webform/js/webform.element.inputhide.js   |    2 +-
 .../webform/js/webform.element.likert.js      |    2 +-
 .../js/webform.element.location.places.js     |    4 +-
 .../js/webform.element.managed_file.js        |   10 +-
 .../webform/js/webform.element.message.js     |   36 +-
 .../webform/js/webform.element.radios.js      |   33 -
 .../webform/js/webform.element.signature.js   |   43 +-
 .../webform/js/webform.element.states.js      |    4 +-
 web/modules/webform/js/webform.filter.js      |    3 +-
 web/modules/webform/js/webform.form.js        |   19 -
 .../webform/js/webform.form.submit_once.js    |   10 +-
 .../webform/js/webform.form.unsaved.js        |   29 +-
 web/modules/webform/js/webform.states.js      |  265 +-
 .../WebformAccessBreadcrumbBuilder.php        |    5 +
 .../webform_access/webform_access.info.yml    |    6 +-
 .../WebformAttachmentController.php           |    3 +-
 ...webform.webform.test_attachment_access.yml |    6 +-
 .../webform.webform.test_attachment_email.yml |    5 +
 ...bform.webform.test_attachment_sanitize.yml |    6 +-
 ...webform.webform.test_attachment_states.yml |    6 +-
 .../webform.webform.test_attachment_token.yml |    6 +-
 .../webform.webform.test_attachment_twig.yml  |    6 +-
 .../webform.webform.test_attachment_url.yml   |    6 +-
 .../webform_attachment_test.info.yml          |    6 +-
 .../webform_attachment.info.yml               |    6 +-
 .../webform_bootstrap_test_module.info.yml    |    6 +-
 .../webform_bootstrap_test_theme.info.yml     |    6 +-
 .../webform_bootstrap.info.yml                |    6 +-
 .../webform_bootstrap.module                  |   38 +-
 .../webform_cards/css/webform_cards.css       |    7 +-
 .../modules/webform_cards/js/webform_cards.js |  217 +-
 .../webform_cards/js/webform_cards.test.js    |   25 +
 .../webform_cards/src/Element/WebformCard.php |    6 +-
 .../src/Plugin/WebformElement/WebformCard.php |    5 +
 .../webform_cards/src/WebformCardsManager.php |   11 +-
 .../templates/webform-card.html.twig          |    2 +-
 .../webform.webform.test_cards_access.yml     |    6 +-
 .../webform.webform.test_cards_ajax.yml       |    6 +-
 ...ebform.webform.test_cards_auto_forward.yml |    8 +-
 ...m.webform.test_cards_auto_forward_hide.yml |  249 ++
 .../webform.webform.test_cards_draft.yml      |    6 +-
 .../webform.webform.test_cards_javascript.yml |  234 ++
 .../webform.webform.test_cards_long_100.yml   |    6 +-
 .../webform.webform.test_cards_progress.yml   |    6 +-
 ...orm.webform.test_cards_progress_custom.yml |    6 +-
 ...form.webform.test_cards_progress_links.yml |    6 +-
 .../webform.webform.test_cards_states.yml     |    6 +-
 .../webform.webform.test_cards_titles.yml     |    6 +-
 .../webform.webform.test_cards_toggle.yml     |    6 +-
 ...m.webform.test_cards_validation_errors.yml |    6 +-
 .../webform_cards_test.info.yml               |    6 +-
 .../WebformCardsAjaxJavaScriptTest.php        |   26 +
 .../WebformCardsAutoForwardJavaScriptTest.php |   26 +-
 .../WebformCardsProgressJavaScriptTest.php    |    2 +-
 .../webform_cards/webform_cards.info.yml      |    6 +-
 .../webform_cards/webform_cards.libraries.yml |    8 +
 .../webform_cards/webform_cards.module        |   40 +-
 .../js/webform_clientside_validation.ife.js   |   33 +-
 ...orm.webform.test_clientside_validation.yml |   22 +-
 ...ebform_clientside_validation_test.info.yml |    6 +-
 .../webform_clientside_validation.info.yml    |    8 +-
 ...ebform_clientside_validation.libraries.yml |    2 +-
 .../webform.webform.demo_application.yml      |    6 +-
 ...rm.webform.demo_application_evaluation.yml |   10 +-
 ...bform_demo_application_evaluation.info.yml |    6 +-
 ...ebform.webform.demo_event_registration.yml |    8 +
 .../webform_demo_event_registration.info.yml  |    6 +-
 .../webform.webform.webform_group_contact.yml |    7 +-
 .../webform_demo_group.info.yml               |    6 +-
 .../webform_demo_group.install                |   20 +-
 .../webform.webform.demo_region_contact.yml   |   10 +
 .../webform_demo_region_contact.info.yml      |    6 +-
 .../webform_devel/webform_devel.info.yml      |    6 +-
 .../Controller/WebformEditorialController.php |   26 +
 .../webform_editorial.info.yml                |    6 +-
 .../webform_editorial.links.menu.yml          |   47 -
 .../webform_editorial.links.task.yml          |   36 +
 .../webform_editorial.routing.yml             |    2 +-
 .../webform.webform.test_entity_print.yml     |    6 +-
 ...bform.webform.test_entity_print_custom.yml |   34 +-
 .../webform_entity_print_test.info.yml        |    6 +-
 .../webform_entity_print.info.yml             |    6 +-
 ...m.webform.test_entity_print_attachment.yml |    5 +
 ...form_entity_print_attachment_test.info.yml |    6 +-
 .../webform_entity_print_attachment.info.yml  |    6 +-
 ...form.webform.webform_example_composite.yml |    6 +-
 .../webform_example_composite.info.yml        |    6 +-
 ...rm.webform.webform_example_custom_form.yml |    6 +-
 .../webform_example_custom_form.info.yml      |    6 +-
 ...ebform.webform.webform_example_element.yml |    6 +-
 .../Functional/WebformExampleElementTest.php  |    2 +-
 .../webform_example_element.info.yml          |    6 +-
 ...ebform_example_element_properties.info.yml |    6 +-
 ...ebform.webform.webform_example_handler.yml |    5 +
 .../webform_example_handler.info.yml          |    6 +-
 .../webform.webform.example_remote_post.yml   |    5 +
 .../webform_example_remote_post.info.yml      |    6 +-
 ...ebform.webform_example_variant_ab_test.yml |    6 +
 ...bform.webform_example_variant_segments.yml |    6 +-
 .../webform_example_variant.info.yml          |    6 +-
 ...form.webform.example_computed_elements.yml |    6 +-
 ...webform.example_computed_elements_ajax.yml |   61 +-
 ...webform.webform.example_element_states.yml |    6 +-
 ...webform.webform.example_flexbox_layout.yml |    6 +-
 .../webform.webform.example_input_masks.yml   |    6 +-
 .../webform.webform.example_style_guide.yml   |    7 +
 .../webform.webform.example_wizard.yml        |    6 +-
 .../webform.webform.example_cards.yml         |    6 +-
 .../webform_examples.info.yml                 |    6 +-
 ...webform.example_accessibility_advanced.yml |    6 +-
 ...rm.webform.example_accessibility_basic.yml |    6 +-
 ...bform.example_accessibility_containers.yml |    6 +-
 ...m.webform.example_accessibility_labels.yml |    6 +-
 ...m.webform.example_accessibility_wizard.yml |    6 +-
 .../webform_examples_accessibility.info.yml   |    6 +-
 ...bform.webform.test_element_group_roles.yml |    5 +
 ...form.webform.test_group_element_access.yml |    5 +
 .../webform_group_test.info.yml               |    6 +-
 .../WebformGroupBrowserTestBase.php           |   16 +
 .../webform_group/webform_group.info.yml      |    6 +-
 .../webform.webform.test_element_icheck.yml   |    6 +-
 ...orm.webform.test_element_icheck_styles.yml |    6 +-
 .../webform_icheck_test.info.yml              |    6 +-
 .../Functional/WebformIcheckElementTest.php   |   12 +-
 .../webform_icheck/webform_icheck.info.yml    |    6 +-
 .../WebformImageSelectElementImages.php       |    4 +-
 .../WebformElement/WebformImageSelect.php     |    1 +
 ...form.webform.test_element_image_select.yml |    6 +-
 .../webform.webform.test_element_images.yml   |    5 +
 .../webform_image_select_test.info.yml        |    6 +-
 .../webform_image_select.info.yml             |    6 +-
 .../webform.webform.test_element_buttons.yml  |    5 +
 .../webform_jqueryui_buttons_test.info.yml    |    6 +-
 .../webform_jqueryui_buttons.info.yml         |    6 +-
 ...m.webform.test_element_loc_geocomplete.yml |    5 +
 ...webform_location_geocomplete_test.info.yml |    6 +-
 .../webform_location_geocomplete.info.yml     |    6 +-
 .../src/Access/WebformNodeAccess.php          |   19 +-
 ...m.webform.webform_node_test_multiple_a.yml |    6 +-
 ...m.webform.webform_node_test_multiple_b.yml |    6 +-
 .../webform_node_test_multiple.info.yml       |    6 +-
 ....webform.webform_node_test_translation.yml |    6 +-
 .../webform_node_test_translation.info.yml    |    6 +-
 .../src/Functional/WebformNodeResultsTest.php |    4 +-
 .../webform_node/webform_node.info.yml        |    6 +-
 ...webform.webform.example_options_custom.yml |    6 +-
 .../src/Access/WebformOptionsCustomAccess.php |    2 +-
 .../src/Element/WebformOptionsCustom.php      |   12 +-
 ...ebform.test_element_options_custom_ent.yml |    6 +
 ...ebform_options_custom_entity_test.info.yml |    6 +-
 ...bform.test_element_options_custom_html.yml |    5 +
 ...bform.test_element_options_custom_imap.yml |    5 +
 ...ebform.test_element_options_custom_svg.yml |    5 +
 ...bform.test_element_options_custom_twig.yml |    5 +
 .../webform_options_custom_test.info.yml      |    6 +-
 .../webform_options_custom.info.yml           |    6 +-
 .../OptionsLimitWebformHandler.php            |    3 +-
 ...orm.webform.test_handler_boolean_limit.yml |    7 +
 ...orm.webform.test_handler_options_limit.yml |   12 +
 ...webform.test_handler_options_limit_ent.yml |    5 +
 ...ebform.test_handler_options_limit_user.yml |    5 +
 .../webform_options_limit_test.info.yml       |    6 +-
 .../webform_options_limit.info.yml            |    6 +-
 .../src/WebformScheduledEmailManager.php      |    2 +-
 ...m.webform.test_handler_scheduled_email.yml |   10 +
 .../webform_scheduled_email_test.info.yml     |    6 +-
 ...bform.test_handler_scheduled_translate.yml |    5 +
 ..._scheduled_email_test_translation.info.yml |    6 +-
 .../webform_scheduled_email.info.yml          |    6 +-
 .../webform_scheduled_email.module            |    7 +-
 .../webform_share/webform_share.info.yml      |    6 +-
 .../WebformShortcutsFunctionalTest.php        |    4 +-
 .../webform_shortcuts.info.yml                |    6 +-
 ....webform.test_submission_export_import.yml |    6 +-
 ...orm_submission_export_import_test.info.yml |    6 +-
 .../webform_submission_export_import.info.yml |    6 +-
 .../webform_submission_log.info.yml           |    6 +-
 .../webform_submission_log.module             |    2 +-
 .../webform.webform.template_contact.yml      |    6 +
 ...m.webform.template_employee_evaluation.yml |    6 +-
 .../webform.webform.template_feedback.yml     |    6 +
 .../webform.webform.template_issue.yml        |    6 +-
 ...bform.webform.template_job_application.yml |    5 +
 ...rm.webform.template_job_seeker_profile.yml |    5 +
 ...m.webform.template_medical_appointment.yml |    7 +-
 .../webform.webform.template_registration.yml |    5 +
 ...rm.webform.template_session_evaluation.yml |    5 +
 .../webform.webform.template_subscribe.yml    |    5 +
 .../webform.webform.template_user_profile.yml |    5 +
 .../webform_templates.info.yml                |    6 +-
 .../webform.webform.test_element_toggles.yml  |    5 +
 .../webform_toggles_test.info.yml             |    6 +-
 .../Functional/WebformTogglesElementTest.php  |   10 +-
 .../webform_toggles/webform_toggles.info.yml  |    6 +-
 .../src/Form/WebformUiElementDeleteForm.php   |    3 +-
 .../Form/WebformUiElementDuplicateForm.php    |    3 +-
 .../src/Form/WebformUiElementEditForm.php     |    4 +-
 .../src/Form/WebformUiElementTypeFormBase.php |    4 +-
 .../src/WebformUiEntityElementsForm.php       |   38 +-
 .../src/Functional/WebformUiElementTest.php   |   44 +-
 .../modules/webform_ui/webform_ui.info.yml    |    6 +-
 .../text/example_accessibility_advanced.txt   |   12 +-
 .../text/example_accessibility_basic.txt      |   14 +-
 .../text/example_accessibility_containers.txt |   14 +-
 .../text/example_accessibility_labels.txt     |   14 +-
 .../text/example_accessibility_wizard.txt     |    7 +-
 .../src/Access/WebformSubmissionAccess.php    |   18 +-
 .../Breadcrumb/WebformBreadcrumbBuilder.php   |   29 +-
 .../WebformPluginHandlerController.php        |    4 +-
 .../WebformPluginVariantController.php        |    7 +-
 .../WebformResultsExportController.php        |    5 +-
 .../webform/src/Element/WebformActions.php    |   44 +-
 .../src/Element/WebformCompositeBase.php      |    3 +-
 .../src/Element/WebformElementMultiple.php    |    8 +-
 .../src/Element/WebformElementOptions.php     |    4 +-
 .../src/Element/WebformElementStates.php      |   13 +-
 .../src/Element/WebformEmailConfirm.php       |    4 +-
 .../src/Element/WebformEntityTrait.php        |   14 +-
 .../webform/src/Element/WebformHeight.php     |  254 ++
 .../src/Element/WebformLocationBase.php       |    6 +-
 .../webform/src/Element/WebformMapping.php    |    7 +-
 .../webform/src/Element/WebformMultiple.php   |   12 +-
 .../webform/src/Element/WebformOtherBase.php  |    6 +-
 .../webform/src/Element/WebformRating.php     |    3 +-
 .../webform/src/Element/WebformTime.php       |    2 +-
 web/modules/webform/src/Entity/Webform.php    |   20 +
 .../webform/src/Entity/WebformSubmission.php  |   20 +
 .../WebformEntitySettingsFormForm.php         |   26 +-
 .../WebformEntitySettingsGeneralForm.php      |    9 +-
 .../WebformEntitySettingsSubmissionsForm.php  |   12 +
 .../WebformAdminConfigAdvancedForm.php        |   28 +-
 .../WebformAdminConfigFormsForm.php           |    7 +
 .../src/Form/WebformHandlerFormBase.php       |    8 +
 .../src/Form/WebformVariantFormBase.php       |    2 +
 .../webform/src/Plugin/Block/WebformBlock.php |    3 +-
 .../WebformEntityReferenceEntityFormatter.php |   49 +-
 .../FieldType/WebformEntityReferenceItem.php  |   15 +-
 .../WebformEntityReferenceSelectWidget.php    |   38 +-
 .../WebformEntityReferenceWidgetTrait.php     |   50 +-
 .../src/Plugin/WebformElement/Checkboxes.php  |   11 +-
 .../WebformElement/EntityAutocomplete.php     |   13 +-
 .../src/Plugin/WebformElement/OptionsBase.php |    5 +-
 .../src/Plugin/WebformElement/Radios.php      |   14 -
 .../src/Plugin/WebformElement/Telephone.php   |    3 +-
 .../src/Plugin/WebformElement/TextFormat.php  |    5 +-
 .../src/Plugin/WebformElement/Value.php       |    3 +-
 .../Plugin/WebformElement/WebformActions.php  |   26 +-
 .../WebformElement/WebformCompositeBase.php   |   40 +-
 .../WebformElement/WebformComputedBase.php    |    9 +
 .../WebformEntityReferenceTrait.php           |    3 +-
 .../Plugin/WebformElement/WebformHeight.php   |  184 ++
 .../WebformElement/WebformManagedFileBase.php |    3 +-
 .../WebformElement/WebformSignature.php       |    4 +-
 .../webform/src/Plugin/WebformElementBase.php |   79 +-
 .../WebformElementCompositeInterface.php      |   10 +
 .../src/Plugin/WebformElementInterface.php    |   13 +
 .../TabularBaseWebformExporter.php            |   12 +-
 .../WebformHandler/DebugWebformHandler.php    |  140 +-
 .../WebformHandler/EmailWebformHandler.php    |    2 +-
 .../RemotePostWebformHandler.php              |    1 +
 .../webform/src/Plugin/WebformHandlerBase.php |   52 +-
 .../src/Plugin/WebformHandlerInterface.php    |   31 +
 .../Plugin/WebformHandlerPluginCollection.php |    2 +-
 .../webform/src/Plugin/WebformVariantBase.php |    9 +-
 .../src/Plugin/WebformVariantInterface.php    |   13 +
 .../src/Routing/WebformRouteSubscriber.php    |   21 +-
 .../webform/src/Twig/WebformTwigExtension.php |   19 +
 .../src/Utility/WebformArrayHelper.php        |    2 +-
 .../src/Utility/WebformDialogHelper.php       |   10 +-
 .../src/Utility/WebformElementHelper.php      |   49 +-
 .../src/Utility/WebformOptionsHelper.php      |    2 +-
 .../webform/src/Utility/WebformYaml.php       |    9 +-
 .../webform/src/WebformAddonsManager.php      |   88 +-
 .../src/WebformEntityConditionsManager.php    |  281 ++
 ...ebformEntityConditionsManagerInterface.php |   26 +
 .../webform/src/WebformEntityHandlersForm.php |   10 +-
 ...WebformEntityReferenceManagerInterface.php |    6 +-
 .../webform/src/WebformEntityVariantsForm.php |   10 +-
 .../webform/src/WebformHelpManager.php        |   34 +-
 web/modules/webform/src/WebformInterface.php  |   12 +
 .../webform/src/WebformLibrariesManager.php   |   39 +-
 .../WebformSubmissionConditionsValidator.php  |  168 +-
 .../webform/src/WebformSubmissionExporter.php |   16 +-
 .../webform/src/WebformSubmissionForm.php     |  108 +-
 .../src/WebformSubmissionInterface.php        |    8 +
 .../src/WebformSubmissionListBuilder.php      |    6 +-
 .../webform/src/WebformSubmissionStorage.php  |   16 +-
 .../src/WebformSubmissionStorageInterface.php |    2 +-
 .../src/WebformSubmissionViewBuilder.php      |    7 +-
 .../webform-composite-address.html.twig       |   40 +-
 .../webform-composite-contact.html.twig       |   52 +-
 .../webform-composite-name.html.twig          |   14 +-
 .../templates/webform-confirmation.html.twig  |    2 +-
 .../webform-handler-action-summary.html.twig  |    2 +-
 .../webform-handler-debug-summary.html.twig   |    4 +-
 .../webform-handler-email-summary.html.twig   |    2 +-
 ...form-handler-remote-post-summary.html.twig |    2 +-
 ...webform-handler-settings-summary.html.twig |    2 +-
 .../templates/webform-progress-bar.html.twig  |    2 +-
 .../webform-progress-tracker.html.twig        |    2 +-
 .../install/webform.webform.test_ajax.yml     |    6 +-
 ....webform.test_ajax_confirmation_inline.yml |    6 +-
 ...webform.test_ajax_confirmation_message.yml |    6 +-
 ...m.webform.test_ajax_confirmation_modal.yml |    6 +-
 ...rm.webform.test_ajax_confirmation_page.yml |    6 +-
 ...orm.webform.test_ajax_confirmation_url.yml |    6 +-
 ...webform.test_ajax_confirmation_url_msg.yml |    6 +-
 .../webform.webform.test_composite.yml        |    5 +
 .../webform.webform.test_composite_custom.yml |    5 +
 ...orm.webform.test_composite_custom_file.yml |    7 +-
 .../webform.webform.test_composite_format.yml |    6 +
 ...webform.test_composite_format_multiple.yml |    6 +
 ...bform.webform.test_confirmation_inline.yml |    6 +-
 ...form.webform.test_confirmation_message.yml |    6 +-
 ...ebform.webform.test_confirmation_modal.yml |    6 +-
 ...webform.webform.test_confirmation_none.yml |    6 +-
 ...webform.webform.test_confirmation_page.yml |    6 +-
 ....webform.test_confirmation_page_custom.yml |    6 +-
 .../webform.webform.test_confirmation_url.yml |    6 +-
 ....webform.test_confirmation_url_message.yml |    6 +-
 .../install/webform.webform.test_element.yml  |    8 +-
 .../webform.webform.test_element_access.yml   |   20 +-
 .../webform.webform.test_element_actions.yml  |   27 +-
 ...m.webform.test_element_actions_buttons.yml |    6 +-
 .../webform.webform.test_element_address.yml  |    5 +
 ...form.webform.test_element_allowed_tags.yml |    6 +-
 ...ebform.webform.test_element_attributes.yml |    5 +
 ...form.webform.test_element_autocomplete.yml |    6 +-
 .../webform.webform.test_element_captcha.yml  |    5 +
 .../webform.webform.test_element_checkbox.yml |    5 +
 ...rm.webform.test_element_checkbox_value.yml |    5 +
 ...ebform.webform.test_element_checkboxes.yml |    5 +
 ...bform.test_element_checkboxes_all_none.yml |    6 +
 ...ebform.webform.test_element_codemirror.yml |    5 +
 ...webform.webform.test_element_composite.yml |    5 +
 ...webform.test_element_composite_wrapper.yml |    5 +
 ...orm.webform.test_element_computed_ajax.yml |    5 +
 ...rm.webform.test_element_computed_debug.yml |    6 +-
 ...rm.webform.test_element_computed_token.yml |    5 +
 ...orm.webform.test_element_computed_twig.yml |   16 +-
 ...webform.webform.test_element_container.yml |    6 +-
 .../webform.webform.test_element_counter.yml  |    5 +
 .../webform.webform.test_element_date.yml     |    5 +
 .../webform.webform.test_element_datelist.yml |    5 +
 .../webform.webform.test_element_datetime.yml |    5 +
 ...bform.test_element_description_tooltip.yml |    6 +-
 .../webform.webform.test_element_details.yml  |    6 +-
 .../webform.webform.test_element_disabled.yml |    6 +-
 ...orm.webform.test_element_email_confirm.yml |    5 +
 ...rm.webform.test_element_email_multiple.yml |    5 +
 ...bform.test_element_entity_autocomplete.yml |   41 +-
 ....webform.test_element_entity_reference.yml |    5 +
 ....webform.test_element_excluded_columns.yml |    5 +
 ...webform.test_element_excluded_elements.yml |    5 +
 .../webform.webform.test_element_fieldset.yml |    6 +-
 .../webform.webform.test_element_flexbox.yml  |    6 +-
 ...form.webform.test_element_flexbox_flex.yml |    6 +-
 .../webform.webform.test_element_format.yml   |    6 +
 ...orm.webform.test_element_format_custom.yml |   50 +-
 ...m.webform.test_element_format_multiple.yml |    6 +
 ...form.webform.test_element_format_token.yml |    6 +
 .../webform.webform.test_element_height.yml   |  282 ++
 .../webform.webform.test_element_help.yml     |    6 +-
 ...form.webform.test_element_help_display.yml |    7 +-
 ...m.webform.test_element_horizontal_rule.yml |    5 +
 ...bform.webform.test_element_html_editor.yml |    5 +
 ...bform.webform.test_element_html_escape.yml |    6 +-
 ...bform.webform.test_element_html_markup.yml |    6 +-
 ...ebform.test_element_ignored_properties.yml |    6 +-
 ...ebform.webform.test_element_image_file.yml |    5 +
 ...webform.test_element_image_file_attach.yml |    5 +
 ....webform.test_element_image_resolution.yml |    5 +
 ...ebform.webform.test_element_input_mask.yml |    5 +
 .../webform.webform.test_element_invalid.yml  |    4 +
 .../webform.webform.test_element_likert.yml   |    5 +
 ...ebform.webform.test_element_loc_places.yml |    5 +
 ...form.webform.test_element_managed_file.yml |    6 +-
 ....webform.test_element_managed_file_dis.yml |    6 +-
 ...webform.test_element_managed_file_help.yml |    5 +
 ...ebform.test_element_managed_file_limit.yml |    6 +-
 ...webform.test_element_managed_file_name.yml |    5 +
 ...webform.test_element_managed_file_prev.yml |    6 +-
 .../webform.webform.test_element_mapping.yml  |    5 +
 .../webform.webform.test_element_markup.yml   |    6 +-
 ...ebform.webform.test_element_media_file.yml |    6 +-
 .../webform.webform.test_element_message.yml  |    6 +-
 .../webform.webform.test_element_more.yml     |    6 +-
 .../webform.webform.test_element_multiple.yml |    5 +
 ...orm.webform.test_element_multiple_date.yml |    5 +
 ...webform.test_element_multiple_property.yml |    5 +
 ...orm.webform.test_element_multiple_text.yml |    5 +
 .../webform.webform.test_element_options.yml  |    5 +
 .../webform.webform.test_element_other.yml    |    5 +
 ...bform.webform.test_element_prepopulate.yml |    6 +-
 .../webform.webform.test_element_private.yml  |    6 +-
 .../webform.webform.test_element_radios.yml   |    5 +
 .../webform.webform.test_element_range.yml    |    5 +
 .../webform.webform.test_element_rating.yml   |    5 +
 .../webform.webform.test_element_readonly.yml |    5 +
 .../webform.webform.test_element_same.yml     |    5 +
 .../webform.webform.test_element_scale.yml    |    5 +
 .../webform.webform.test_element_section.yml  |    6 +-
 .../webform.webform.test_element_select.yml   |    5 +
 ...webform.webform.test_element_signature.yml |    5 +
 .../webform.webform.test_element_states.yml   |    5 +
 ....webform.test_element_submission_views.yml |    5 +
 ...ebform.test_element_submission_views_r.yml |    5 +
 ...m.webform.test_element_submitted_value.yml |    5 +
 .../webform.webform.test_element_table.yml    |    5 +
 ...webform.test_element_table_select_sort.yml |    5 +
 ...webform.webform.test_element_telephone.yml |    5 +
 ...rm.webform.test_element_term_reference.yml |    6 +-
 ....webform.test_element_terms_of_service.yml |    6 +-
 ...bform.webform.test_element_text_format.yml |    6 +-
 .../webform.webform.test_element_time.yml     |    5 +
 ...orm.webform.test_element_title_display.yml |    5 +
 ...bform.webform.test_element_users_roles.yml |    5 +
 ...ebform.test_element_validate_minlength.yml |    6 +-
 ...webform.test_element_validate_multiple.yml |    5 +
 ....webform.test_element_validate_pattern.yml |    5 +
 ...webform.test_element_validate_required.yml |    6 +-
 ...m.webform.test_element_validate_unique.yml |    6 +-
 .../webform.webform.test_element_view.yml     |    5 +
 .../webform.webform.test_example_elements.yml |    6 +-
 ...ebform.test_example_elements_composite.yml |    6 +-
 ...webform.test_exporter_entity_reference.yml |    6 +-
 .../webform.webform.test_exporter_options.yml |    6 +-
 ...ebform.webform.test_form_access_denied.yml |    6 +-
 .../install/webform.webform.test_form_api.yml |    6 +-
 .../webform.webform.test_form_archived.yml    |    6 +-
 .../webform.webform.test_form_assets.yml      |   10 +-
 .../webform.webform.test_form_autofill.yml    |    6 +-
 .../webform.webform.test_form_autofocus.yml   |    6 +-
 .../webform.webform.test_form_closed.yml      |    6 +-
 ...webform.webform.test_form_confidential.yml |    6 +-
 ...bform.webform.test_form_details_toggle.yml |    6 +-
 ...webform.test_form_disable_autocomplete.yml |    6 +-
 ...webform.webform.test_form_disable_back.yml |    6 +-
 ...ebform.test_form_disable_inline_errors.yml |    6 +-
 ...form.webform.test_form_draft_anonymous.yml |    6 +-
 ....webform.test_form_draft_authenticated.yml |    6 +-
 ...bform.webform.test_form_draft_multiple.yml |    8 +-
 ...ebform.webform.test_form_inline_errors.yml |    6 +-
 .../webform.webform.test_form_limit.yml       |    6 +-
 ...m.webform.test_form_limit_total_unique.yml |    6 +-
 ...rm.webform.test_form_limit_user_unique.yml |    6 +-
 .../webform.webform.test_form_limit_wait.yml  |   10 +-
 .../webform.webform.test_form_long_100.yml    |    6 +-
 .../webform.webform.test_form_long_200.yml    |    6 +-
 .../webform.webform.test_form_long_300.yml    |    6 +-
 .../webform.webform.test_form_novalidate.yml  |    6 +-
 .../webform.webform.test_form_opening.yml     |    6 +-
 .../webform.webform.test_form_prepopulate.yml |    6 +-
 .../webform.webform.test_form_preview.yml     |    8 +-
 .../webform.webform.test_form_properties.yml  |    6 +-
 .../webform.webform.test_form_remote_addr.yml |    6 +-
 .../webform.webform.test_form_required.yml    |    6 +-
 .../webform.webform.test_form_reset.yml       |    6 +-
 ...orm.webform.test_form_results_disabled.yml |    6 +-
 .../webform.webform.test_form_submit_back.yml |    6 +-
 .../webform.webform.test_form_submit_once.yml |    6 +-
 .../webform.webform.test_form_submit_text.yml |    6 +-
 .../webform.webform.test_form_template.yml    |    6 +-
 .../webform.webform.test_form_unsaved.yml     |    6 +-
 ...bform.webform.test_form_unsaved_wizard.yml |    6 +-
 .../webform.webform.test_form_validate.yml    |    6 +-
 ...ebform.webform.test_form_wizard_access.yml |    6 +-
 ...form.webform.test_form_wizard_advanced.yml |    6 +-
 ...webform.webform.test_form_wizard_basic.yml |    6 +-
 ...m.webform.test_form_wizard_conditional.yml |    6 +-
 ...ebform.webform.test_form_wizard_custom.yml |    6 +-
 ...webform.webform.test_form_wizard_links.yml |    6 +-
 ...form.webform.test_form_wizard_long_100.yml |    6 +-
 ...form.webform.test_form_wizard_long_200.yml |    6 +-
 ...form.webform.test_form_wizard_long_300.yml |    6 +-
 ...form.webform.test_form_wizard_validate.yml |    5 +
 ...webform.test_form_wizard_validate_comp.yml |    5 +
 .../webform.webform.test_handler_action.yml   |    9 +
 .../webform.webform.test_handler_email.yml    |    5 +
 ...rm.webform.test_handler_email_advanced.yml |    5 +
 ...orm.webform.test_handler_email_mapping.yml |    9 +
 ...bform.webform.test_handler_email_roles.yml |    5 +
 ...form.webform.test_handler_email_states.yml |   11 +
 ...ebform.webform.test_handler_email_twig.yml |    5 +
 .../webform.webform.test_handler_settings.yml |    7 +
 ...ebform.webform.test_libraries_optional.yml |    6 +-
 .../webform.webform.test_rendering.yml        |    6 +
 .../install/webform.webform.test_states.yml   | 2732 -----------------
 ...bform.webform.test_states_autocomplete.yml |    6 +-
 ...rm.webform.test_states_client_disabled.yml | 1207 ++++++++
 ...m.webform.test_states_client_invisible.yml | 1020 ++++++
 ...rm.webform.test_states_client_required.yml |  338 ++
 ...orm.webform.test_states_client_visible.yml | 1248 ++++++++
 .../webform.webform.test_states_crosspage.yml |    6 +-
 .../webform.webform.test_states_disabled.yml  |    5 +
 ...bform.webform.test_states_server_clear.yml |    5 +
 ...ebform.webform.test_states_server_comp.yml |    6 +-
 ....webform.test_states_server_containers.yml |    6 +-
 ...form.webform.test_states_server_custom.yml |   50 +-
 ...form.webform.test_states_server_hidden.yml |    5 +
 ...form.webform.test_states_server_likert.yml |    6 +-
 ...rm.webform.test_states_server_multiple.yml |    6 +-
 ...form.webform.test_states_server_nested.yml |    6 +-
 ...orm.webform.test_states_server_preview.yml |    6 +-
 ...rm.webform.test_states_server_required.yml |    8 +-
 ...ebform.webform.test_states_server_save.yml |    5 +
 ...form.webform.test_states_server_wizard.yml |   18 +
 .../webform.webform.test_states_to_text.yml   |  251 ++
 .../webform.webform.test_states_triggers.yml  |    6 +-
 .../webform.webform.test_submission_label.yml |    6 +-
 .../webform.webform.test_submission_log.yml   |    6 +-
 .../webform.webform.test_submission_views.yml |    6 +-
 .../install/webform.webform.test_token.yml    |    5 +
 ...rm.webform.test_token_submission_value.yml |   34 +-
 ...webform.webform.test_token_view_update.yml |    5 +
 .../install/webform.webform.test_variant.yml  |  211 ++
 .../webform.webform.test_variant_multiple.yml |    5 +
 .../webform.webform.test_variant_override.yml |    5 +
 ...webform.webform.test_variant_randomize.yml |    5 +
 ...tates.inc => webform_test.test_states.inc} |   91 +-
 ...bform_test.test_states_client_disabled.inc |   37 +
 ...form_test.test_states_client_invisible.inc |   32 +
 ...ebform_test.test_states_client_visible.inc |   37 +
 .../webform_test/webform_test.info.yml        |    6 +-
 .../modules/webform_test/webform_test.module  |   30 +-
 .../src/Plugin/Block/WebformTestAjaxBlock.php |   86 +-
 .../webform_test_ajax.info.yml                |    6 +-
 .../webform_test_alter_hooks.info.yml         |    6 +-
 .../webform_test_block_context.info.yml       |    6 +-
 .../webform_test_block_custom.info.yml        |    6 +-
 ...bform_test_block_submission_limit.info.yml |    6 +-
 .../webform_test_config_performance.info.yml  |    6 +-
 ....webform.test_element_comp_file_plugin.yml |    5 +
 ....webform.test_element_composite_plugin.yml |    5 +
 .../webform.webform.test_element_plugin.yml   |    8 +-
 .../WebformTestOffCanvasWidthElement.php      |   26 +
 .../webform_test_element.info.yml             |    6 +-
 .../webform_test_element_input_masks.info.yml |    6 +-
 ....view.webform_test_entity_reference_vs.yml |    4 +-
 ...bform.test_element_entity_reference_vs.yml |    5 +
 ...bform_test_entity_reference_views.info.yml |    6 +-
 .../webform_test_exporter.info.yml            |    6 +-
 ...ebform.webform.test_handler_conditions.yml |    6 +
 .../webform.webform.test_handler_test.yml     |    6 +
 .../TestWebformOffCanvasWidthHandler.php      |   27 +
 ...orm-handler-test-offcanvas-width.html.twig |   17 +
 .../webform_test_handler.info.yml             |    6 +-
 .../webform_test_handler.module               |    3 +
 ...webform_test_handler_invoke_alter.info.yml |    6 +-
 ...ebform.webform.test_handler_remote_get.yml |    5 +
 ...bform.webform.test_handler_remote_post.yml |    5 +
 ....webform.test_handler_remote_post_cast.yml |    5 +
 ....webform.test_handler_remote_post_file.yml |    5 +
 ...ebform.webform.test_handler_remote_put.yml |    5 +
 .../webform_test_handler_remote_post.info.yml |    6 +-
 .../webform_test_markup.info.yml              |    6 +-
 .../webform_test_message_custom.info.yml      |    6 +-
 .../install/webform.webform.test_options.yml  |    6 +-
 .../webform_test_options.info.yml             |    6 +-
 .../webform_test_paragraphs.info.yml          |    6 +-
 .../webform_test_rest.info.yml                |    6 +-
 .../webform_test_states.info.yml              |   12 +
 .../webform_test_states.module                |   33 +
 .../webform.webform.test_submissions.yml      |    6 +-
 .../webform_test_submissions.info.yml         |    6 +-
 ...bform_test_third_party_settings.schema.yml |    6 +
 ...webform_test_third_party_settings.info.yml |    6 +-
 ...form_test_third_party_settings.webform.inc |   43 +-
 .../webform.webform.test_translation.yml      |    5 +
 .../webform_test_translation.info.yml         |    6 +-
 ...webform_test_translation_lingotek.info.yml |    6 +-
 .../webform_test_validate.info.yml            |    6 +-
 .../TestWebformOffCanvasWidthVariant.php      |   27 +
 ...orm-variant-test-offcanvas-width.html.twig |   17 +
 .../webform-variant-test-summary.html.twig    |   14 +-
 .../webform_test_variant.info.yml             |    6 +-
 .../webform_test_variant.module               |    3 +
 .../webform_test_views.info.yml               |    6 +-
 .../webform_test_wizard_custom.info.yml       |    6 +-
 .../Composite/WebformCompositeFormatTest.php  |   20 +-
 .../Composite/WebformCompositeTest.php        |    4 +-
 .../Element/WebformElementAccessTest.php      |   23 +
 .../Element/WebformElementActionsTest.php     |   28 +-
 .../Element/WebformElementAddressTest.php     |    2 +-
 .../Element/WebformElementCheckboxesTest.php  |    2 +-
 .../Element/WebformElementCodeMirrorTest.php  |   12 +-
 .../Element/WebformElementCompositeTest.php   |    4 +-
 .../Element/WebformElementComputedTest.php    |    2 +-
 .../Element/WebformElementCounterTest.php     |    4 +-
 .../Element/WebformElementDetailsTest.php     |    4 +-
 .../WebformElementEmailConfirmTest.php        |    8 +-
 .../WebformElementEntityAutocompleteTest.php  |   43 +-
 .../Element/WebformElementFieldsetTest.php    |    2 +-
 .../WebformElementFormatCustomTest.php        |    2 +-
 .../Element/WebformElementFormatTest.php      |   19 +-
 .../Element/WebformElementHeightTest.php      |   82 +
 .../Element/WebformElementHelpTest.php        |   30 +-
 .../Element/WebformElementHtmlEditorTest.php  |   24 +-
 .../Element/WebformElementLikertTest.php      |   10 +-
 .../WebformElementManagedFilePreviewTest.php  |    8 +-
 .../WebformElementManagedFilePrivateTest.php  |    4 +-
 .../Element/WebformElementManagedFileTest.php |    4 +-
 .../Element/WebformElementMappingTest.php     |    2 +-
 .../Element/WebformElementMarkupTest.php      |    2 +-
 .../Element/WebformElementMessageTest.php     |    4 +-
 .../Element/WebformElementMultipleTest.php    |   10 +-
 .../Element/WebformElementOtherTest.php       |    6 +-
 .../WebformElementPluginDefinitionsTest.php   |   20 +
 .../WebformElementPluginPropertiesTest.php    |  287 ++
 .../Element/WebformElementPrepopulateTest.php |    2 +-
 .../Element/WebformElementRadiosTest.php      |   10 +-
 .../Element/WebformElementRangeTest.php       |    4 +-
 .../Element/WebformElementReadonlyTest.php    |    6 +-
 .../Element/WebformElementSectionTest.php     |    2 +-
 .../Element/WebformElementStatesTest.php      |    4 +-
 .../Element/WebformElementTableTest.php       |   14 +-
 .../WebformElementTermReferenceTest.php       |    4 +-
 .../WebformElementTermsOfServiceTest.php      |    2 +-
 .../Element/WebformElementTextFormatTest.php  |    2 +-
 .../WebformElementValidatePatternTest.php     |   16 +-
 .../WebformElementValidateRequiredTest.php    |    2 +-
 .../Element/WebformElementViewTest.php        |    2 -
 .../src/Functional/Field/WebformFieldTest.php |   88 +
 .../Handler/WebformHandlerRemotePostTest.php  |    9 +-
 .../Handler/WebformHandlerSettingsTest.php    |    8 +-
 .../Functional/Handler/WebformHandlerTest.php |   17 +
 .../WebformSettingsAccessDeniedTest.php       |    4 +-
 .../Settings/WebformSettingsAdminTest.php     |   23 +-
 .../Settings/WebformSettingsBehaviorsTest.php |    8 +-
 .../WebformSettingsConfirmationTest.php       |   14 +-
 .../Settings/WebformSettingsDraftTest.php     |   42 +-
 .../Settings/WebformSettingsPreviewTest.php   |   16 +-
 .../Settings/WebformSettingsSerialTest.php    |   16 +-
 .../States/WebformStatesHiddenTest.php        |   14 +-
 .../States/WebformStatesManagerTest.php       |   42 +
 .../States/WebformStatesServerTest.php        |   25 +
 .../States/WebformStatesWizardTest.php        |   85 +-
 .../Token/WebformTokenSubmissionValueTest.php |    4 +-
 .../Variant/WebformVariantRandomizeTest.php   |   54 -
 .../Functional/Variant/WebformVariantTest.php |   52 +
 .../src/Functional/WebformBrowserTestBase.php |    5 +-
 .../Functional/WebformBrowserTestBaseTest.php |    6 +-
 .../Functional/WebformEmailProviderTest.php   |    2 +-
 .../WebformEntityTranslationTest.php          |    2 +-
 .../tests/src/Functional/WebformHelpTest.php  |    4 +-
 .../src/Functional/WebformLibrariesTest.php   |    2 +-
 .../src/Functional/WebformRenderingTest.php   |    2 +-
 .../Functional/WebformSubmissionViewsTest.php |    7 +
 .../WebformThirdPartySettingsTest.php         |   17 +
 .../Wizard/WebformWizardAdvancedTest.php      |    2 +-
 ...WebformElementCheckboxesJavaScriptTest.php |   13 -
 .../WebformStatesCustomJavaScriptTest.php     |   38 +
 .../WebformStatesRequiredJavaScriptTest.php   |  160 +
 .../WebformVariantRandomizeJavaScriptTest.php |   75 +
 .../WebformWebDriverTestBase.php              |    2 +
 .../WebformBreadcrumbBuilderTest.php          |   12 +-
 .../WebformSubmissionViewAccessTrait.php      |    2 +-
 .../src/Traits/WebformWebDriverTestTrait.php  |   28 +
 .../Access/WebformSubmissionAccessTest.php    |   16 +-
 .../Unit/Utility/WebformOptionsHelperTest.php |    1 +
 .../src/Unit/Utility/WebformYamlTest.php      |   60 +-
 .../src/Unit/WebformMessageManagerTest.php    |    2 +-
 .../webform_test_bartik.info.yml              |    6 +-
 .../third_party_settings/webform.antibot.inc  |    4 -
 .../third_party_settings/webform.captcha.inc  |    7 +-
 .../third_party_settings/webform.honeypot.inc |    4 -
 web/modules/webform/webform.api.php           |    6 +-
 web/modules/webform/webform.info.yml          |    6 +-
 web/modules/webform/webform.libraries.yml     |   34 +-
 web/modules/webform/webform.links.menu.yml    |    1 +
 web/modules/webform/webform.links.task.yml    |    6 -
 web/modules/webform/webform.module            |  125 +-
 web/modules/webform/webform.routing.yml       |    2 +-
 web/modules/webform/webform.services.yml      |    8 +-
 web/modules/webform/webform.tokens.inc        |    2 +-
 716 files changed, 13116 insertions(+), 4778 deletions(-)
 create mode 100644 web/modules/webform/config/schema/webform.third_party.antibot.schema.yml
 create mode 100644 web/modules/webform/css/webform.admin.toolbar.css
 create mode 100644 web/modules/webform/icons/000000/webform.svg
 create mode 100644 web/modules/webform/icons/787878/webform.svg
 create mode 100644 web/modules/webform/images/addons/ldbase_handlers.png
 create mode 100644 web/modules/webform/images/addons/webform_nouislider.png
 create mode 100644 web/modules/webform/images/addons/wsla.svg
 delete mode 100644 web/modules/webform/js/webform.element.radios.js
 create mode 100644 web/modules/webform/modules/webform_cards/js/webform_cards.test.js
 create mode 100644 web/modules/webform/modules/webform_cards/tests/modules/webform_cards_test/config/install/webform.webform.test_cards_auto_forward_hide.yml
 create mode 100644 web/modules/webform/modules/webform_cards/tests/modules/webform_cards_test/config/install/webform.webform.test_cards_javascript.yml
 delete mode 100644 web/modules/webform/modules/webform_editorial/webform_editorial.links.menu.yml
 create mode 100644 web/modules/webform/src/Element/WebformHeight.php
 create mode 100644 web/modules/webform/src/Plugin/WebformElement/WebformHeight.php
 create mode 100644 web/modules/webform/src/Plugin/WebformElementCompositeInterface.php
 create mode 100644 web/modules/webform/src/WebformEntityConditionsManager.php
 create mode 100644 web/modules/webform/src/WebformEntityConditionsManagerInterface.php
 create mode 100644 web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_height.yml
 delete mode 100644 web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_states.yml
 create mode 100644 web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_states_client_disabled.yml
 create mode 100644 web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_states_client_invisible.yml
 create mode 100644 web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_states_client_required.yml
 create mode 100644 web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_states_client_visible.yml
 create mode 100644 web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_states_to_text.yml
 create mode 100644 web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_variant.yml
 rename web/modules/webform/tests/modules/webform_test/includes/{webform_test.test_form_states.inc => webform_test.test_states.inc} (63%)
 create mode 100644 web/modules/webform/tests/modules/webform_test/includes/webform_test.test_states_client_disabled.inc
 create mode 100644 web/modules/webform/tests/modules/webform_test/includes/webform_test.test_states_client_invisible.inc
 create mode 100644 web/modules/webform/tests/modules/webform_test/includes/webform_test.test_states_client_visible.inc
 create mode 100644 web/modules/webform/tests/modules/webform_test_element/src/Plugin/WebformElement/WebformTestOffCanvasWidthElement.php
 create mode 100644 web/modules/webform/tests/modules/webform_test_handler/src/Plugin/WebformHandler/TestWebformOffCanvasWidthHandler.php
 create mode 100644 web/modules/webform/tests/modules/webform_test_handler/templates/webform-handler-test-offcanvas-width.html.twig
 create mode 100644 web/modules/webform/tests/modules/webform_test_states/webform_test_states.info.yml
 create mode 100644 web/modules/webform/tests/modules/webform_test_states/webform_test_states.module
 create mode 100644 web/modules/webform/tests/modules/webform_test_variant/src/Plugin/WebformVariant/TestWebformOffCanvasWidthVariant.php
 create mode 100644 web/modules/webform/tests/modules/webform_test_variant/templates/webform-variant-test-offcanvas-width.html.twig
 create mode 100644 web/modules/webform/tests/src/Functional/Element/WebformElementHeightTest.php
 create mode 100644 web/modules/webform/tests/src/Functional/Field/WebformFieldTest.php
 create mode 100644 web/modules/webform/tests/src/Functional/States/WebformStatesManagerTest.php
 delete mode 100644 web/modules/webform/tests/src/Functional/Variant/WebformVariantRandomizeTest.php
 create mode 100644 web/modules/webform/tests/src/Functional/Variant/WebformVariantTest.php
 create mode 100644 web/modules/webform/tests/src/FunctionalJavascript/States/WebformStatesRequiredJavaScriptTest.php
 create mode 100644 web/modules/webform/tests/src/FunctionalJavascript/Variant/WebformVariantRandomizeJavaScriptTest.php
 create mode 100644 web/modules/webform/tests/src/Traits/WebformWebDriverTestTrait.php

diff --git a/composer.json b/composer.json
index d3d27bf7c7..ba0a421ac6 100644
--- a/composer.json
+++ b/composer.json
@@ -184,7 +184,7 @@
         "drupal/views_fieldsets": "3.3",
         "drupal/views_infinite_scroll": "1.7",
         "drupal/views_slideshow": "4.4",
-        "drupal/webform": "5.19",
+        "drupal/webform": "5.22",
         "drupal/webform_views": "5.0-alpha2",
         "drush-ops/behat-drush-endpoint": "0.0.5",
         "drush/drush": "9.7.2",
diff --git a/composer.lock b/composer.lock
index 9f00741774..e8737d4217 100644
--- a/composer.lock
+++ b/composer.lock
@@ -4,7 +4,7 @@
         "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
         "This file is @generated automatically"
     ],
-    "content-hash": "aa72e1bd58199425620bca45a714ecc4",
+    "content-hash": "cc2d25c444bb240901cdfc8717674c23",
     "packages": [
         {
             "name": "alchemy/zippy",
@@ -8565,17 +8565,17 @@
         },
         {
             "name": "drupal/webform",
-            "version": "5.19.0",
+            "version": "5.22.0",
             "source": {
                 "type": "git",
                 "url": "https://git.drupalcode.org/project/webform.git",
-                "reference": "8.x-5.19"
+                "reference": "8.x-5.22"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://ftp.drupal.org/files/projects/webform-8.x-5.19.zip",
-                "reference": "8.x-5.19",
-                "shasum": "90a2084c2647bca791cc8b18a7e2a3b49f3da7ea"
+                "url": "https://ftp.drupal.org/files/projects/webform-8.x-5.22.zip",
+                "reference": "8.x-5.22",
+                "shasum": "807308bb8c57c3c66c7a839effc558ab2a76c1f5"
             },
             "require": {
                 "drupal/core": "^8.8"
@@ -8588,9 +8588,10 @@
                 "drupal/clientside_validation": "~3.0",
                 "drupal/clientside_validation_jquery": "*",
                 "drupal/devel": "~3.0",
+                "drupal/entity": "~1.0",
                 "drupal/entity_print": "~2.0",
                 "drupal/gnode": "*",
-                "drupal/group": "~1.0",
+                "drupal/group": "1.0",
                 "drupal/lingotek": "~3.0",
                 "drupal/mailsystem": "~4.0",
                 "drupal/paragraphs": "~1.0",
@@ -8599,6 +8600,7 @@
                 "drupal/styleguide": "~1.0",
                 "drupal/telephone_validation": "~2.0",
                 "drupal/token": "~1.0",
+                "drupal/variationcache": "~1.0",
                 "drupal/webform_access": "*",
                 "drupal/webform_attachment": "*",
                 "drupal/webform_clientside_validation": "*",
@@ -8614,8 +8616,8 @@
             "type": "drupal-module",
             "extra": {
                 "drupal": {
-                    "version": "8.x-5.19",
-                    "datestamp": "1593681136",
+                    "version": "8.x-5.22",
+                    "datestamp": "1601919522",
                     "security-coverage": {
                         "status": "covered",
                         "message": "Covered by Drupal's security advisory policy"
diff --git a/vendor/composer/installed.json b/vendor/composer/installed.json
index 107764d9cb..15df9ebe02 100644
--- a/vendor/composer/installed.json
+++ b/vendor/composer/installed.json
@@ -8832,18 +8832,18 @@
     },
     {
         "name": "drupal/webform",
-        "version": "5.19.0",
-        "version_normalized": "5.19.0.0",
+        "version": "5.22.0",
+        "version_normalized": "5.22.0.0",
         "source": {
             "type": "git",
             "url": "https://git.drupalcode.org/project/webform.git",
-            "reference": "8.x-5.19"
+            "reference": "8.x-5.22"
         },
         "dist": {
             "type": "zip",
-            "url": "https://ftp.drupal.org/files/projects/webform-8.x-5.19.zip",
-            "reference": "8.x-5.19",
-            "shasum": "90a2084c2647bca791cc8b18a7e2a3b49f3da7ea"
+            "url": "https://ftp.drupal.org/files/projects/webform-8.x-5.22.zip",
+            "reference": "8.x-5.22",
+            "shasum": "807308bb8c57c3c66c7a839effc558ab2a76c1f5"
         },
         "require": {
             "drupal/core": "^8.8"
@@ -8856,9 +8856,10 @@
             "drupal/clientside_validation": "~3.0",
             "drupal/clientside_validation_jquery": "*",
             "drupal/devel": "~3.0",
+            "drupal/entity": "~1.0",
             "drupal/entity_print": "~2.0",
             "drupal/gnode": "*",
-            "drupal/group": "~1.0",
+            "drupal/group": "1.0",
             "drupal/lingotek": "~3.0",
             "drupal/mailsystem": "~4.0",
             "drupal/paragraphs": "~1.0",
@@ -8867,6 +8868,7 @@
             "drupal/styleguide": "~1.0",
             "drupal/telephone_validation": "~2.0",
             "drupal/token": "~1.0",
+            "drupal/variationcache": "~1.0",
             "drupal/webform_access": "*",
             "drupal/webform_attachment": "*",
             "drupal/webform_clientside_validation": "*",
@@ -8882,8 +8884,8 @@
         "type": "drupal-module",
         "extra": {
             "drupal": {
-                "version": "8.x-5.19",
-                "datestamp": "1593681136",
+                "version": "8.x-5.22",
+                "datestamp": "1601919522",
                 "security-coverage": {
                     "status": "covered",
                     "message": "Covered by Drupal's security advisory policy"
diff --git a/web/modules/webform/README.md b/web/modules/webform/README.md
index 25ef5e7171..9711d893f9 100644
--- a/web/modules/webform/README.md
+++ b/web/modules/webform/README.md
@@ -7,7 +7,6 @@ CONTENTS OF THIS FILE
  * Configuration
  * Upgrading
 
-
 INTRODUCTION
 ------------
 
@@ -24,20 +23,20 @@ The Webform module is a form builder and submission manager for Drupal 8.
 
  * Goals:
 
-  - A comprehensive form and survey building solution for Drupal 8. 
+  - A comprehensive form and survey building solution for Drupal 8.
   - A stable, maintainable, and tested API for building forms and handling submission.
   - A pluggable/extensible API for custom form elements and submission handling.
-  
+
  * Demo:
   - Video review of the Webform module:
     http://youtu.be/sQGsfQ_LZJ4
   - Online evaluate by simplytest.me:
     https://simplytest.me/project/webform/8.x-5.x
-   
+
  * Project status:
    [Webform Project Board] https://contribkanban.com/board/webform/8.x-5.x
-  
- * Comparsion with other modules:
+
+ * Comparision with other modules:
    https://www.drupal.org/node/2083353
 
 
@@ -49,7 +48,7 @@ The installation of this module is like other Drupal modules.
  1. Copy/upload the webform module to the modules directory of your Drupal
    installation.
 
- 2. Enable the 'Webform' module and desired sub-modules in 'Extend'. 
+ 2. Enable the 'Webform' module and desired sub-modules in 'Extend'.
    (/admin/modules)
 
  3. Set up user permissions. (/admin/people/permissions#module-webform)
@@ -66,10 +65,10 @@ CONFIGURATION
 
  * Build a new webform (/admin/structure/webform)
    or duplicate an existing template (/admin/structure/webform/templates).
-   
+
  * Publish your webform as a:
 
-   - **Page** by linking to the published webform. (/webform/contact)  
+   - **Page** by linking to the published webform. (/webform/contact)
 
    - **Node** by creating a new node that references the webform. (/node/add/webform)
 
@@ -79,12 +78,12 @@ CONFIGURATION
 UPGRADING
 ---------
 
- * All existing configuration and submission data was maintained and updated 
-   through the beta and rc release cycles. 
-   **APIs have changed** during these release cycles. 
+ * All existing configuration and submission data was maintained and updated
+   through the beta and rc release cycles.
+   **APIs have changed** during these release cycles.
 
- * Simply put, if you installed and used the Webform module out of the box AS-IS, 
-   and now you want to upgrade to a full release, then 
-   you _should_ be okay. If you extended webforms with plugins, altered 
-   hooks, and overrode templates, you will need to read each release's 
+ * Simply put, if you installed and used the Webform module out of the box AS-IS,
+   and now you want to upgrade to a full release, then
+   you _should_ be okay. If you extended webforms with plugins, altered
+   hooks, and overrode templates, you will need to read each release's
    notes and assume that _things have changed_.
diff --git a/web/modules/webform/composer.json b/web/modules/webform/composer.json
index 4182ce3c85..fd588c04a9 100644
--- a/web/modules/webform/composer.json
+++ b/web/modules/webform/composer.json
@@ -45,8 +45,9 @@
     "drupal/chosen": "~2.0",
     "drupal/clientside_validation": "~3.0",
     "drupal/devel": "~3.0",
+    "drupal/entity": "~1.0",
     "drupal/entity_print": "~2.0",
-    "drupal/group": "~1.0",
+    "drupal/group": "1.0",
     "drupal/lingotek": "~3.0",
     "drupal/mailsystem": "~4.0",
     "drupal/paragraphs": "~1.0",
@@ -54,6 +55,7 @@
     "drupal/smtp": "~1.0",
     "drupal/styleguide": "~1.0",
     "drupal/telephone_validation": "~2.0",
-    "drupal/token": "~1.0"
+    "drupal/token": "~1.0",
+    "drupal/variationcache": "~1.0"
   }
 }
diff --git a/web/modules/webform/composer.libraries.json b/web/modules/webform/composer.libraries.json
index 0f2d2d2e01..e7fb406dc4 100644
--- a/web/modules/webform/composer.libraries.json
+++ b/web/modules/webform/composer.libraries.json
@@ -28,18 +28,43 @@
         "docs": "https://www.drupal.org/docs/8/modules/webform",
         "forum": "https://drupal.stackexchange.com/questions/tagged/webform"
     },
+    "require": {
+        "algolia/places": "*",
+        "choices/choices": "*",
+        "ckeditor/autogrow": "*",
+        "ckeditor/codemirror": "*",
+        "ckeditor/fakeobjects": "*",
+        "ckeditor/image": "*",
+        "ckeditor/link": "*",
+        "codemirror/codemirror": "*",
+        "jquery/chosen": "*",
+        "jquery/geocomplete": "*",
+        "jquery/hotkeys": "*",
+        "jquery/icheck": "*",
+        "jquery/image-picker": "*",
+        "jquery/inputmask": "*",
+        "jquery/intl-tel-input": "*",
+        "jquery/rateit": "*",
+        "jquery/select2": "*",
+        "jquery/textcounter": "*",
+        "jquery/timepicker": "*",
+        "jquery/toggles": "*",
+        "progress-tracker/progress-tracker": "*",
+        "signature_pad/signature_pad": "*",
+        "svg-pan-zoom/svg-pan-zoom": "*"
+    },
     "repositories": {
         "algolia.places": {
             "type": "package",
             "package": {
                 "name": "algolia/places",
-                "version": "1.18.2",
+                "version": "1.19.0",
                 "type": "drupal-library",
                 "extra": {
                     "installer-name": "algolia.places"
                 },
                 "dist": {
-                    "url": "https://registry.npmjs.org/places.js/-/places.js-1.18.2.tgz",
+                    "url": "https://registry.npmjs.org/places.js/-/places.js-1.19.0.tgz",
                     "type": "tar"
                 },
                 "require": {
@@ -69,13 +94,13 @@
             "type": "package",
             "package": {
                 "name": "ckeditor/autogrow",
-                "version": "4.14.0",
+                "version": "4.14.1",
                 "type": "drupal-library",
                 "extra": {
                     "installer-name": "ckeditor.autogrow"
                 },
                 "dist": {
-                    "url": "https://download.ckeditor.com/autogrow/releases/autogrow_4.14.0.zip",
+                    "url": "https://download.ckeditor.com/autogrow/releases/autogrow_4.14.1.zip",
                     "type": "zip"
                 },
                 "require": {
@@ -105,13 +130,13 @@
             "type": "package",
             "package": {
                 "name": "ckeditor/fakeobjects",
-                "version": "4.14.0",
+                "version": "4.14.1",
                 "type": "drupal-library",
                 "extra": {
                     "installer-name": "ckeditor.fakeobjects"
                 },
                 "dist": {
-                    "url": "https://download.ckeditor.com/fakeobjects/releases/fakeobjects_4.14.0.zip",
+                    "url": "https://download.ckeditor.com/fakeobjects/releases/fakeobjects_4.14.1.zip",
                     "type": "zip"
                 },
                 "require": {
@@ -123,13 +148,13 @@
             "type": "package",
             "package": {
                 "name": "ckeditor/image",
-                "version": "4.14.0",
+                "version": "4.14.1",
                 "type": "drupal-library",
                 "extra": {
                     "installer-name": "ckeditor.image"
                 },
                 "dist": {
-                    "url": "https://download.ckeditor.com/image/releases/image_4.14.0.zip",
+                    "url": "https://download.ckeditor.com/image/releases/image_4.14.1.zip",
                     "type": "zip"
                 },
                 "require": {
@@ -141,13 +166,13 @@
             "type": "package",
             "package": {
                 "name": "ckeditor/link",
-                "version": "4.14.0",
+                "version": "4.14.1",
                 "type": "drupal-library",
                 "extra": {
                     "installer-name": "ckeditor.link"
                 },
                 "dist": {
-                    "url": "https://download.ckeditor.com/link/releases/link_4.14.0.zip",
+                    "url": "https://download.ckeditor.com/link/releases/link_4.14.1.zip",
                     "type": "zip"
                 },
                 "require": {
@@ -159,13 +184,13 @@
             "type": "package",
             "package": {
                 "name": "codemirror/codemirror",
-                "version": "5.53.2",
+                "version": "5.57.0",
                 "type": "drupal-library",
                 "extra": {
                     "installer-name": "codemirror"
                 },
                 "dist": {
-                    "url": "https://github.com/components/codemirror/archive/5.53.2.zip",
+                    "url": "https://github.com/components/codemirror/archive/5.57.0.zip",
                     "type": "zip"
                 },
                 "require": {
@@ -267,13 +292,13 @@
             "type": "package",
             "package": {
                 "name": "jquery/inputmask",
-                "version": "5.0.3",
+                "version": "5.0.5",
                 "type": "drupal-library",
                 "extra": {
                     "installer-name": "jquery.inputmask"
                 },
                 "dist": {
-                    "url": "https://github.com/RobinHerbots/jquery.inputmask/archive/5.0.3.zip",
+                    "url": "https://github.com/RobinHerbots/jquery.inputmask/archive/5.0.5.zip",
                     "type": "zip"
                 },
                 "require": {
@@ -357,13 +382,13 @@
             "type": "package",
             "package": {
                 "name": "jquery/timepicker",
-                "version": "1.13.10",
+                "version": "1.13.14",
                 "type": "drupal-library",
                 "extra": {
                     "installer-name": "jquery.timepicker"
                 },
                 "dist": {
-                    "url": "https://github.com/jonthornton/jquery-timepicker/archive/1.13.10.zip",
+                    "url": "https://github.com/jonthornton/jquery-timepicker/archive/1.13.14.zip",
                     "type": "zip"
                 },
                 "require": {
@@ -443,30 +468,5 @@
                 }
             }
         }
-    },
-    "require": {
-        "algolia/places": "*",
-        "choices/choices": "*",
-        "ckeditor/autogrow": "*",
-        "ckeditor/codemirror": "*",
-        "ckeditor/fakeobjects": "*",
-        "ckeditor/image": "*",
-        "ckeditor/link": "*",
-        "codemirror/codemirror": "*",
-        "jquery/chosen": "*",
-        "jquery/geocomplete": "*",
-        "jquery/hotkeys": "*",
-        "jquery/icheck": "*",
-        "jquery/image-picker": "*",
-        "jquery/inputmask": "*",
-        "jquery/intl-tel-input": "*",
-        "jquery/rateit": "*",
-        "jquery/select2": "*",
-        "jquery/textcounter": "*",
-        "jquery/timepicker": "*",
-        "jquery/toggles": "*",
-        "progress-tracker/progress-tracker": "*",
-        "signature_pad/signature_pad": "*",
-        "svg-pan-zoom/svg-pan-zoom": "*"
     }
 }
diff --git a/web/modules/webform/config/install/webform.settings.yml b/web/modules/webform/config/install/webform.settings.yml
index 3099bf59a4..69846a3e4f 100644
--- a/web/modules/webform/config/install/webform.settings.yml
+++ b/web/modules/webform/config/install/webform.settings.yml
@@ -10,6 +10,7 @@ settings:
   default_form_exception_message: 'Unable to display this webform. Please contact the site administrator.'
   default_submit_button_label: Submit
   default_reset_button_label: Reset
+  default_delete_button_label: Delete
   default_form_submit_once: false
   default_form_confidential_message: 'This form is confidential. You must <a href="[site:login-url]/logout?destination=[current-page:url:relative]">Log out</a> to submit it.'
   default_form_access_denied_message: 'Please login to access this form.'
@@ -311,6 +312,7 @@ ui:
   offcanvas_disabled: false
   promotions_disabled: false
   description_help: true
+  toolbar_item: false
 libraries:
   excluded_libraries:
     - choices
@@ -318,6 +320,7 @@ libraries:
 requirements:
   cdn: true
   bootstrap: true
+  clientside_validation: true
   spam: true
 langcode: en
 third_party_settings:
diff --git a/web/modules/webform/config/install/webform.webform.contact.yml b/web/modules/webform/config/install/webform.webform.contact.yml
index 1937fa7376..7f1fb2dc20 100644
--- a/web/modules/webform/config/install/webform.webform.contact.yml
+++ b/web/modules/webform/config/install/webform.webform.contact.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -112,6 +113,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -167,6 +170,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
@@ -218,6 +222,7 @@ handlers:
   email_confirmation:
     id: email
     label: 'Email confirmation'
+    notes: ''
     handler_id: email_confirmation
     status: true
     conditions: {  }
@@ -254,6 +259,7 @@ handlers:
   email_notification:
     id: email
     label: 'Email notification'
+    notes: ''
     handler_id: email_notification
     status: true
     conditions: {  }
diff --git a/web/modules/webform/config/schema/webform.entity.webform.schema.yml b/web/modules/webform/config/schema/webform.entity.webform.schema.yml
index 8636b747a4..20d3cc2bf3 100644
--- a/web/modules/webform/config/schema/webform.entity.webform.schema.yml
+++ b/web/modules/webform/config/schema/webform.entity.webform.schema.yml
@@ -162,6 +162,9 @@
         form_file_limit:
           type: string
           label: 'Form file upload limit'
+        form_elements_attributes:
+          type: ignore
+          label: 'Form elements attributes'
         share:
           type: boolean
           label: 'Enable form sharing'
@@ -320,6 +323,12 @@
         wizard_auto_forward:
           type: boolean
           label: 'Auto-forward to next page when the page is completed'
+        wizard_auto_forward_hide_next_button:
+          type: boolean
+          label: 'Hide the next button when auto-forwarding'
+        wizard_keyboard:
+          type: boolean
+          label: 'Navigate between cards when the left or right arrow is pressed'
         wizard_track:
           type: text
           label: 'Track wizard progress in the URL'
@@ -476,6 +485,9 @@
         token_update:
           type: boolean
           label: 'Allow updating a submission using token'
+        serial_disabled:
+          type: boolean
+          label: 'Next submission number disabled'
     access:
       type: sequence
       label: 'Access Rules'
@@ -516,6 +528,9 @@
           label:
             type: label
             label: Label
+          notes:
+            type: text
+            label: Notes
           status:
             type: boolean
             label: Status
diff --git a/web/modules/webform/config/schema/webform.field.schema.yml b/web/modules/webform/config/schema/webform.field.schema.yml
index e9084eb624..76c365b611 100644
--- a/web/modules/webform/config/schema/webform.field.schema.yml
+++ b/web/modules/webform/config/schema/webform.field.schema.yml
@@ -68,6 +68,13 @@ field.widget.settings.webform_entity_reference_select:
     default_data:
       type: boolean
       label: 'Default submission data'
+    webforms:
+      type: sequence
+      label: 'Webforms'
+      sequence:
+        type: string
+        label: 'Webform'
+
 field.formatter.settings.webform_entity_reference_entity_view:
   type: mapping
   label: 'Display the referenced webform with default submission data.'
diff --git a/web/modules/webform/config/schema/webform.plugin.handler.schema.yml b/web/modules/webform/config/schema/webform.plugin.handler.schema.yml
index 8d9dd4448a..2802f735b8 100644
--- a/web/modules/webform/config/schema/webform.plugin.handler.schema.yml
+++ b/web/modules/webform/config/schema/webform.plugin.handler.schema.yml
@@ -32,6 +32,16 @@ webform.handler.action:
     debug:
       type: boolean
       label: 'Enable debugging'
+webform.handler.debug:
+  type: mapping
+  label: Debug
+  mapping:
+    format:
+      label: 'Data format'
+      type: string
+    submission:
+      type: boolean
+      label: 'Include submission data'
 webform.handler.log:
   type: mapping
   label: Log
diff --git a/web/modules/webform/config/schema/webform.settings.schema.yml b/web/modules/webform/config/schema/webform.settings.schema.yml
index 75fd5aa691..65e1cb78da 100644
--- a/web/modules/webform/config/schema/webform.settings.schema.yml
+++ b/web/modules/webform/config/schema/webform.settings.schema.yml
@@ -30,6 +30,9 @@ webform.settings:
         default_reset_button_label:
           type: label
           label: 'Default reset button label'
+        default_delete_button_label:
+          type: label
+          label: 'Default delete button label'
         default_form_submit_once:
           type: boolean
           label: 'Prevent duplicate submissions'
@@ -568,6 +571,9 @@ webform.settings:
         description_help:
           type: boolean
           label: 'Display element description as help text (tooltip)'
+        toolbar_item:
+          type: boolean
+          label: 'Display webforms as a top-level item in toolbar'
     libraries:
       type: mapping
       label: 'Library settings'
@@ -585,6 +591,9 @@ webform.settings:
         cdn:
           type: boolean
           label: 'Check if CDN is being used for external libraries'
+        clientside_validation:
+          type: boolean
+          label: 'Check if Webform Clientside Validation module is installed when using the Clientside Validation module'
         bootstrap:
           type: boolean
           label: 'Check if Webform Bootstrap Integration module is installed when using the Bootstrap theme'
diff --git a/web/modules/webform/config/schema/webform.third_party.antibot.schema.yml b/web/modules/webform/config/schema/webform.third_party.antibot.schema.yml
new file mode 100644
index 0000000000..27841b2a9f
--- /dev/null
+++ b/web/modules/webform/config/schema/webform.third_party.antibot.schema.yml
@@ -0,0 +1,14 @@
+webform.admin_settings.third_party.antibot:
+  type: mapping
+  label: 'Webform test third party settings'
+  mapping:
+    antibot:
+      type: boolean
+      label: 'Protect all webforms with Antibot'
+webform.settings.third_party.antibot:
+  type: mapping
+  label: 'Webform test third party settings'
+  mapping:
+    antibot:
+      type: boolean
+      label: 'Protect all webforms with Antibot'
diff --git a/web/modules/webform/css/webform.admin.toolbar.css b/web/modules/webform/css/webform.admin.toolbar.css
new file mode 100644
index 0000000000..ca2a65d2ef
--- /dev/null
+++ b/web/modules/webform/css/webform.admin.toolbar.css
@@ -0,0 +1,15 @@
+/**
+ * @file
+ * Styling for the admin toolbar.
+ */
+
+/**
+ * Toolbar tab icon.
+ */
+.toolbar-bar .toolbar-icon-entity-webform-collection:before {
+  background-image: url(../icons/787878/webform.svg);
+}
+.toolbar-bar .toolbar-icon-entity-webform-collection:active:before,
+.toolbar-bar .toolbar-icon-entity-webform-collection.is-active:before {
+  background-image: url(../icons/000000/webform.svg);
+}
diff --git a/web/modules/webform/css/webform.element.multiple.css b/web/modules/webform/css/webform.element.multiple.css
index a2932c315c..e1869e7542 100644
--- a/web/modules/webform/css/webform.element.multiple.css
+++ b/web/modules/webform/css/webform.element.multiple.css
@@ -21,6 +21,7 @@
 }
 
 .webform-multiple-table td .description,
+.webform-multiple-table td .messages,
 .webform-multiple-table td .form-item--error-message {
   white-space: normal;
 }
diff --git a/web/modules/webform/css/webform.element.options.css b/web/modules/webform/css/webform.element.options.css
index da0f535174..745c2b77bb 100644
--- a/web/modules/webform/css/webform.element.options.css
+++ b/web/modules/webform/css/webform.element.options.css
@@ -15,7 +15,8 @@
  */
 @media (min-width: 400px) {
   .webform-options-display-two-columns {
-    display: inline-block;
+    display: block;
+    max-width: 900px;
     margin-top: 0.4em;
     -moz-column-count: 2;
     -webkit-column-count: 2;
@@ -23,7 +24,8 @@
   }
 
   .webform-options-display-three-columns {
-    display: inline-block;
+    display: block;
+    max-width: 900px;
     margin-top: 0.4em;
     -moz-column-count: 3;
     -webkit-column-count: 3;
diff --git a/web/modules/webform/css/webform.form.css b/web/modules/webform/css/webform.form.css
index 201bf548f5..fe4c1621f7 100644
--- a/web/modules/webform/css/webform.form.css
+++ b/web/modules/webform/css/webform.form.css
@@ -31,6 +31,19 @@ html.js .js-webform-visually-hidden[style*="display: none"] {
   display: none;
 }
 
+/**
+ * Form inline. (This is not included in all themes)
+ */
+.form--inline .form-item {
+  float: left; /* LTR */
+  margin-right: 0.5em; /* LTR */
+}
+[dir="rtl"] .form--inline .form-item {
+  float: right;
+  margin-right: 0;
+  margin-left: 0.5em;
+}
+
 /**
  * Container inline
  */
diff --git a/web/modules/webform/css/webform.theme.claro.css b/web/modules/webform/css/webform.theme.claro.css
index 69f562c7ad..9605fad438 100644
--- a/web/modules/webform/css/webform.theme.claro.css
+++ b/web/modules/webform/css/webform.theme.claro.css
@@ -314,18 +314,26 @@ div.webform-form-filter input.webform-form-filter-text {
 /**
  * jQuery UI tabs.
  */
-.webform-tabs.ui-tabs .ui-tabs-nav li {
-  padding: 0 5px;
-}
-
 .webform-tabs.ui-tabs .ui-tabs-panel {
   padding: 0;
 }
 
+.webform-tabs.ui-tabs .ui-tabs-nav {
+  padding: 5px 10px 4px 0px;
+}
+
+.webform-tabs.ui-tabs .ui-tabs-nav li {
+  padding: 0 5px;
+}
+
 .webform-tabs .ui-tabs-tab.ui-tab a {
   border-radius: 0;
 }
 
+.webform-tabs.ui-tabs .ui-tabs-nav .ui-tabs-anchor {
+  padding: .5em .75em;
+}
+
 .webform-tabs .ui-tabs-active.ui-state-active a {
   border-bottom: 3px solid #003cc5;
 }
diff --git a/web/modules/webform/css/webform.theme.seven.css b/web/modules/webform/css/webform.theme.seven.css
index 12952d79c0..a5c2c08d0f 100644
--- a/web/modules/webform/css/webform.theme.seven.css
+++ b/web/modules/webform/css/webform.theme.seven.css
@@ -20,6 +20,12 @@ tr.even .form-item:last-of-type {
   margin-bottom: 0;
 }
 
+tr.odd .form--inline > .form-item,
+tr.even .form--inline > .form-item {
+  margin-top: 0;
+  margin-bottom: 0;
+}
+
 /* Add margin around HR tags */
 table hr {
   margin: 0.5em 0;
diff --git a/web/modules/webform/docs/DEVELOPMENT-CHEATSHEET.md b/web/modules/webform/docs/DEVELOPMENT-CHEATSHEET.md
index 7a1b09a6e5..ee9ee67546 100644
--- a/web/modules/webform/docs/DEVELOPMENT-CHEATSHEET.md
+++ b/web/modules/webform/docs/DEVELOPMENT-CHEATSHEET.md
@@ -15,6 +15,9 @@ git diff 8.x-5.x > [project_name]-[issue-description]-[issue-number]-00.patch
 # Apply remote patch
 curl https://www.drupal.org/files/issues/[project_name]-[issue-description]-[issue-number]-00.patch | git apply -
 
+# Apply remote patch with 3 way merge
+curl https://www.drupal.org/files/issues/[project_name]-[issue-description]-[issue-number]-00.patch | git apply -3
+
 # Force apply patch
 patch -p1 < 3037968-2.patch
 
diff --git a/web/modules/webform/docs/FEATURES.md b/web/modules/webform/docs/FEATURES.md
index 400b78c1ee..6d4834d190 100644
--- a/web/modules/webform/docs/FEATURES.md
+++ b/web/modules/webform/docs/FEATURES.md
@@ -17,18 +17,18 @@ Whether you need a multi-page form containing a multi-column input layout with
 conditional logic or a simple contact form that pushes data to a SalesForce/CRM,
  it is all possible using the Webform module for Drupal 8.
 
-Drupal and the Webform module strives to be fully accessible to all users and 
+Drupal and the Webform module strives to be fully accessible to all users and
 site builders. Assistive technologies, including screen readers and
 keyboard access, are fully supported.
 
-Besides being a feature rich form builder, the Webform module is part of the 
+Besides being a feature rich form builder, the Webform module is part of the
 Drupal project's ecosystem and community.
 
 <blockquote>
-The <a href="https://www.drupal.org/about">Drupal project</a> is open source software. 
-Anyone can download, use, work on, and share it with others. 
-It's built on principles like collaboration, globalism, and innovation. 
-It's distributed under the terms of the <a href="https://www.gnu.org/copyleft/gpl.html">GNU General Public License</a> (GPL). 
+The <a href="https://www.drupal.org/about">Drupal project</a> is open source software.
+Anyone can download, use, work on, and share it with others.
+It's built on principles like collaboration, globalism, and innovation.
+It's distributed under the terms of the <a href="https://www.gnu.org/copyleft/gpl.html">GNU General Public License</a> (GPL).
 There are <a href="https://www.drupal.org/about/licensing">no licensing fees</a>, ever. Drupal (and Webform) will always be free.
 </blockquote>
 
@@ -89,9 +89,9 @@ Form manager features include:
   </tr>
 </table>
 
-The Webform module provides an intuitive form builder based upon Drupal 8's 
-best practices for user interface design and user experience. 
-The form builder allows non-technical users to easily build 
+The Webform module provides an intuitive form builder based upon Drupal 8's
+best practices for user interface design and user experience.
+The form builder allows non-technical users to easily build
 and maintain webforms.
 
 Form builder features include:
@@ -124,7 +124,7 @@ Form behaviors, features, submission handling, messaging, and confirmations are
 
 ### General settings
 
-Allow a webform's administrative information, paths, behaviors, and third-party settings to be customized. 
+Allow a webform's administrative information, paths, behaviors, and third-party settings to be customized.
 
 General settings include:
 
@@ -136,7 +136,7 @@ General settings include:
 ### Form settings
 
 Allow a form's status, attributes, behaviors, labels, messages, wizard settings,
-and preview to be customized. 
+and preview to be customized.
 
 Form settings include:
 
@@ -146,12 +146,12 @@ Form settings include:
 - Submission preview
 - Input prepopulation using query string parameters.
 
-<table class="views-view-grid" width="100%">  
+<table class="views-view-grid" width="100%">
   <tr>
     <td width="50%"><div class="note">
     <a href="https://www.drupal.org/files/webform-8.x.5.x-features--settings-submissions.png">
-    <img src="https://www.drupal.org/files/webform-8.x.5.x-features--settings-submissions.png" alt="Configuration settings: Submisssions" /><br/>
-    <strong>Submisssions</strong>
+    <img src="https://www.drupal.org/files/webform-8.x.5.x-features--settings-submissions.png" alt="Configuration settings: Submissions" /><br/>
+    <strong>Submissions</strong>
     </a>
     </div></td>
     <td width="50%"><div class="note">
@@ -165,8 +165,8 @@ Form settings include:
 
 ### Submissions settings
 
-Allows a submission's labels, behaviors, limits, and draft settings to be 
-customized. 
+Allows a submission's labels, behaviors, limits, and draft settings to be
+customized.
 
 Submission settings include:
 
@@ -177,7 +177,7 @@ Submission settings include:
 
 ### Confirmation settings
 
-Allows the form's confirmation type, message, and URL to be customized. 
+Allows the form's confirmation type, message, and URL to be customized.
 
 Confirmation types include:
 
@@ -186,7 +186,7 @@ Confirmation types include:
 - Displaying of a custom status message
 - Opening a modal dialog
 
-<table class="views-view-grid" width="100%">  
+<table class="views-view-grid" width="100%">
   <tr>
     <td width="50%"><div class="note">
     <a href="https://www.drupal.org/files/webform-8.x.5.x-features--settings-handlers.png">
@@ -206,9 +206,9 @@ Confirmation types include:
 
 ### Emails / Handlers
 
-Allows additional actions and behaviors to be processed when a webform or 
-submission is created, updated, or deleted. Handlers are used to route 
-submitted data to external applications and send notifications & confirmations. 
+Allows additional actions and behaviors to be processed when a webform or
+submission is created, updated, or deleted. Handlers are used to route
+submitted data to external applications and send notifications & confirmations.
 
 Email support features include:
 
@@ -222,7 +222,7 @@ Remote post features include:
 - Posting selected elements to a remote server
 - Adding custom parameters to remote post requests
 
-<table class="views-view-grid" width="100%">  
+<table class="views-view-grid" width="100%">
   <tr>
     <td width="50%"><div class="note">
     <a href="https://www.drupal.org/files/webform-8.x.5.x-features--settings-assets.png">
@@ -242,14 +242,14 @@ Remote post features include:
 ### CSS/JS assets
 
 The CSS/JS assets page allows site builders to attach custom CSS and JavaScript
-to a webform.  Custom CSS can be used to make simple layout or design tweaks 
-to a form. Custom JavaScript allows additional conditional logic and 
+to a webform.  Custom CSS can be used to make simple layout or design tweaks
+to a form. Custom JavaScript allows additional conditional logic and
 behaviors to be added to a form.
 
 ### Access settings
 
-Allows an administrator to determine who can administer a webform and/or create, 
-update, delete, and purge webform submissions. 
+Allows an administrator to determine who can administer a webform and/or create,
+update, delete, and purge webform submissions.
 
 ## Elements
 
@@ -268,9 +268,9 @@ update, delete, and purge webform submissions.
     </a>
     </div></td>
   </tr>
-</table>  
+</table>
 
-The Webform module is built directly on top of Drupal 8's Form API. 
+The Webform module is built directly on top of Drupal 8's Form API.
 Every form element available in Drupal 8 is supported by the Webform module.
 
 Form elements include:
@@ -285,7 +285,7 @@ Form elements include:
 
 ### Element settings
 
-All of Drupal 8's default form element properties and behaviors are supported. 
+All of Drupal 8's default form element properties and behaviors are supported.
 There are also several custom webform element properties and settings available
 to enhance a form element's behavior.
 
@@ -302,7 +302,7 @@ Standard and custom properties allow for:
 - Private elements, visible only to administrators
 - Unique values per element
 
-<table class="views-view-grid" width="100%">  
+<table class="views-view-grid" width="100%">
   <tr>
     <td width="50%"><div class="note">
     <a href="https://www.drupal.org/files/webform-8.x.5.x-features--elements-conditional.png">
@@ -321,7 +321,7 @@ Standard and custom properties allow for:
 
 ### States/Conditional logic
 
-Drupal's State API can be used by developers to provide conditional logic 
+Drupal's State API can be used by developers to provide conditional logic
 to hide and show form elements.
 
 Drupal's State API supports:
@@ -333,11 +333,11 @@ Drupal's State API supports:
 
 ### Viewing source
 
-At the heart of a Webform module's form elements is a Drupal 
-[render array](https://www.drupal.org/docs/8/api/render-api/render-arrays), 
-which can be edited and managed by developers. The Drupal render array 
+At the heart of a Webform module's form elements is a Drupal
+[render array](https://www.drupal.org/docs/8/api/render-api/render-arrays),
+which can be edited and managed by developers. The Drupal render array
 gives developers complete control over a webform's elements, layout,
-and look-and-feel by allowing developers to make bulk updates 
+and look-and-feel by allowing developers to make bulk updates
 to a webform's label, descriptions, and behaviors.
 
 ## Forms
@@ -361,15 +361,15 @@ to a webform's label, descriptions, and behaviors.
 
 ### Accessibility
 
-The outputted forms and even the Webform module's administrative interface 
+The outputted forms and even the Webform module's administrative interface
 (i.e. form builder) are accessible using keyboard navigation and screen readers.
 The Webform module complies with [WCAG 2.0](http://www.w3.org/TR/WCAG20/#contents)
 and [ATAG 2.0](http://www.w3.org/TR/ATAG20/#contents) guidelines.
 
 ### Multistep form
 
-Forms can be broken up into multiple pages using a progress bar. 
-Authenticated users can save drafts and/or have their changes automatically 
+Forms can be broken up into multiple pages using a progress bar.
+Authenticated users can save drafts and/or have their changes automatically
 saved as they progress through a long form.
 
 Multistep form features include:
@@ -397,9 +397,9 @@ Multistep form features include:
   </tr>
 </table>
 
-Webforms can be attached to nodes or displayed as blocks. 
+Webforms can be attached to nodes or displayed as blocks.
 Webforms can also have dedicated SEO-friendly URLs.
-Form elements are render arrays that can easily be altered using 
+Form elements are render arrays that can easily be altered using
 custom hooks and/or plugins.
 
 ## Results management
@@ -421,7 +421,7 @@ custom hooks and/or plugins.
   </tr>
 </table>
 
-Form submissions can optionally be stored in the database, reviewed, 
+Form submissions can optionally be stored in the database, reviewed,
 and downloaded. Submissions can also be flagged with administrative notes.
 
 Results management features include:
@@ -431,7 +431,7 @@ Results management features include:
 - Customizable reports
 - Downloading results as a CSV to Google Sheets or MS Excel
 - Saving of download preferences per form
-- [Drupal Views](https://www.drupal.org/docs/8/core/modules/views) integration 
+- [Drupal Views](https://www.drupal.org/docs/8/core/modules/views) integration
 for advanced reporting.
 
 ## Access controls
@@ -453,10 +453,10 @@ for advanced reporting.
   </tr>
 </table>
 
-The Webform module provides full access controls and permissions for managing 
-who can create forms, post submissions, and access a webform's results. 
-Access controls can be applied to roles and/or specific users. 
-The Webform access submodule allows you to even setup reusable permission 
+The Webform module provides full access controls and permissions for managing
+who can create forms, post submissions, and access a webform's results.
+Access controls can be applied to roles and/or specific users.
+The Webform access submodule allows you to even setup reusable permission
 groups which can be applied to multiple instances of the same webform.
 
 Access controls allow users to:
@@ -489,8 +489,8 @@ Access controls allow users to:
   </tr>
 </table>
 
-The Webform module provides a few starter templates and multiple example 
-forms which webform administrators can update or use to create new 
+The Webform module provides a few starter templates and multiple example
+forms which webform administrators can update or use to create new
 reusable templates for their organization.
 
 Starter templates include:
@@ -527,22 +527,22 @@ Starter templates include:
 
 
 Administrators can define reusable global options for select menus, checkboxes,
-and radio buttons. The Webform module includes default options for states, 
+and radio buttons. The Webform module includes default options for states,
 countries, demographics, likert answers, and more.
 
 Reusable options include:
 
 - **Geographic**: Languages, country, and states
 - **Date and time**: Days, months, and time zones
-- **Demographic**: Education, employment status, ethnicity, Industry, 
+- **Demographic**: Education, employment status, ethnicity, Industry,
 languages, marital status, relationship, size, and job titles
-- **Likert**: Agreement, comparison, importance, quality, satisfaction, 
+- **Likert**: Agreement, comparison, importance, quality, satisfaction,
 ten scale, and would you
 
 
 ## Internationalization
 
-Forms and configuration can be translated into multiple languages using 
+Forms and configuration can be translated into multiple languages using
 Drupal's [configuration translation system](https://www.drupal.org/docs/8/core/modules/config-translation.
 
 ## Add-ons
@@ -565,14 +565,14 @@ Drupal's [configuration translation system](https://www.drupal.org/docs/8/core/m
 </table>
 
 There are [dozens of add-ons available](https://www.drupal.org/node/2837065)
-that extend and/or provide additional functionality to the Webform module 
-and Drupal's Form API. 
+that extend and/or provide additional functionality to the Webform module
+and Drupal's Form API.
 
 Add-ons include:
 
 - Analysis for creating graphs and charts
 - CRM integration including SalesForce, HubSpot, MyEmma, SugarCRM, more…
-- SPAM protection 
+- SPAM protection
 - Advanced workflows
 - Data encryption
 - GDPR compliance
@@ -596,7 +596,7 @@ Add-ons include:
   </tr>
 </table>
 
-Examples and tools are provided to help developers get started customizing 
+Examples and tools are provided to help developers get started customizing
 existing features and adding new features to the Webform module.
 
 Development tools include:
diff --git a/web/modules/webform/docs/UPDATE-LIBRARIES.md b/web/modules/webform/docs/UPDATE-LIBRARIES.md
index 9ebf5cda5c..fd05755f08 100644
--- a/web/modules/webform/docs/UPDATE-LIBRARIES.md
+++ b/web/modules/webform/docs/UPDATE-LIBRARIES.md
@@ -21,7 +21,7 @@ Steps for updating libraries
 
 - Enable all external libraries (admin/structure/webform/config/libraries)
 
-- Manually check for new releases. Only update to stable releases. 
+- Manually check for new releases. Only update to stable releases.
 
 - Add list of updated external libraries to issue on Drupal.org
 
@@ -62,8 +62,13 @@ Enable and download all libraries
 
 Update libraries.zip
 
-    # Remove libraries.zip.
-    rm -Rf /var/www/sites/d8_webform/web/modules/sandbox/webform_libraries/libraries.zip
+    # Checkout branch
+    cd /var/www/sites/d8_webform/web/modules/sandbox/webform_libraries/
+    git checkout 8.x-5.x
+
+    # Remove libraries.zip
+    cd /var/www/sites/d8_webform/web/modules/sandbox/webform_libraries/
+    rm -Rf libraries.zip
 
     # Create libraries.zip
     cd /var/www/sites/d8_webform/web/
@@ -74,6 +79,7 @@ Commit changes
 
     # Commit changes.
     cd /var/www/sites/d8_webform/web/modules/sandbox/webform_libraries/
+    git checkout 8.x-5.x
     git commit -am"Update webform_libraries"
     git push
 
diff --git a/web/modules/webform/icons/000000/webform.svg b/web/modules/webform/icons/000000/webform.svg
new file mode 100644
index 0000000000..befa84691a
--- /dev/null
+++ b/web/modules/webform/icons/000000/webform.svg
@@ -0,0 +1,6 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16">
+    <rect fill="#000000" height="1.75" width="12" y="2" x="2"/>
+    <rect fill="#000000" height="1.75" width="12" y="4.5" x="2"/>
+    <rect fill="#000000" height="4.25" width="12" y="7" x="2"/>
+    <rect fill="#000000" height="1.75" width="6" y="12" x="2"/>
+</svg>
diff --git a/web/modules/webform/icons/787878/webform.svg b/web/modules/webform/icons/787878/webform.svg
new file mode 100644
index 0000000000..3d0ee0ca2a
--- /dev/null
+++ b/web/modules/webform/icons/787878/webform.svg
@@ -0,0 +1,6 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16">
+    <rect fill="#787878" height="1.75" width="12" y="2" x="2"/>
+    <rect fill="#787878" height="1.75" width="12" y="4.5" x="2"/>
+    <rect fill="#787878" height="4.25" width="12" y="7" x="2"/>
+    <rect fill="#787878" height="1.75" width="6" y="12" x="2"/>
+</svg>
diff --git a/web/modules/webform/images/addons/ldbase_handlers.png b/web/modules/webform/images/addons/ldbase_handlers.png
new file mode 100644
index 0000000000..accbbcfb76
--- /dev/null
+++ b/web/modules/webform/images/addons/ldbase_handlers.png
@@ -0,0 +1,66 @@
+�PNG
+
+���
IHDR������������X����L_IDATx���mgY'��k��vo_9�pH AB !Re4�G�r�2��
+"\�QǑ ��u,#���e�Ȍ@/�BM�i'�����*��=���}���j�;�k'��os���[����SR0�_8|�[��n-�/���Mh�[�J�M7u�w�a�P?��О��"���+���f`�ѳ`��
?�)��z����k`�m���^J����u<��{�񺛟;�u��ݷ��}WX,B�@Z+
h�6Gc��L��%��;��@�@���~|��v���KE�]�^���/�k��ߴ��ǖ�,�d���zg�9mА:��'�&j҅�Y3u*́u续��Ǘ����y��n���� o �B�$	��k;`fL�S8V��5]��J���#G�� A���I~�.k+�Nv�܍�(�� �F�;�I���`[��GKi�2Mt�:.��k94��<�c=�^#ܡ=�߃��'I�tI�I
+��ߚ&\��wӮ֮e������>����~�+�S�j�?.A��5�q�m5����|Fp�0� �6@J	V��"�Y��}���)ӀA��O������4�Ƙ�7�t1F.
v#�Ad"C�?$�U���ʧC�-t
��I��̣;%��{*��ur���/�@�̥k����ku��:��g�y���x�v��AB�o� W)@a��f쁿��$��^���@����Ҹ�*y%X�i�"4
2�8��No�=�΍�K����~�2�`�v�޷E����Z�@�ؖ�H5�t��4��ڰ���g�>�ʘ�l�_��o۪�l�b�"f6
��2�ϬM1@����b�'m�&�-2E���a����߅�V!hv��G���۩�!���Zƶ�0�@�(��*��Zk��4������}�і��ts��#������?�Wo���ݞF���/B:��t�������D��{4��S�PX.C���uF��ײi��)� ]H��P?�
+��B'�-94�{���2IDD�tv���R����$�z[�KRB��:i�¾
+�G�>]��2F��#Өy���j��j��`��t�m2��!���J��(��uZ�x�tr�<�F���Es	�O�M�������}bTj+�h�j��ƾ{�4��D�sqM��g�|pA�����L|̠ݽ���\���~����_n��/?���u�O����;��b��R�Wc�:m2�HץN!p�j'W�����dJY�>�b��
�vjm��52��F��u
r�E�`�/�E�Y4�,�d��8#QyҾ[����'BB"�W����kQs4έ�=�^�����&-�Q�T-�@�itZ�F��W@S߅k�ѳ�L�A��K�k$Dz�j@&G�����WkӼ#�9s�u���w�6���W�ΰ|Ea_劊�[�k�H�_�O����lh��a�AVO����$�	u��Z��)�)dI2);��&|8�6A�z����l���|9���8�$�H��/�(%i]�$H@�|�43j�~�GZ"�4Bs����3P۠��qE��5:4��+����u��ϔ��>{���&������A�CL��?�~�����\VOiO�R�5���t�߽�{��_k\�v�b�~��U��Ei�o�����|���T,��e��>�v�Bd
+Hh�Z��$D�1&	�ip�5wǭ�(�������S�х��'������ w���o��=��O|z�l}�o�,.afm���w��pcHE��gֱ͋77{��	����rR��2��������jK�L�`w5J�n����_8x��_�x�s޺�/M$�^����;�.�����~������q�0H��
+
$<�x��rW�ƍ�[�	�.�~�kB{�M��ƃ�y�V� A�=
�� ^�����\�1�g'���2	����Y��?�7,�r�0H��	)!��h��~H�x�<�i!_��F��0��������߻d�@c��Ҧ\Bbݯ��
.A[�F=��=#��>N�1 �.��~痟y�3�a���:���S-��_b�b:kMr��:�J�3�_,��5��\�%7��j���H�R�ʥ�ۺ�@g�5�x��̥�OJ��\1��8�������\�1m���FmJPX,Q<���9�Ǣ��~��`dL�@�64���d޷�BP��?�tJ���.�� ��a���XX*Q̌�k�J���YoA���CCB�����������y���"9������e��"#�,[��z�<E�&�\���P\*Q�l
+�r�8]�@:oBg�
0ln�/{��&�A�~��Bd�<lR�A�(DP� a8�r=�s��
�<x��<]�������g�u�A�0q�ND[�Ai_��c���"����܁�چ�|v�R�T��6�D��?VJ)
+�s���M�1@�B�n��M�Ȁ�U��phQۑ�+���P�;#����ҟ�ū��k?P[zç�߷�����)e�!ر��/п^�&N(��;�k|0�#�5J��4�3�j�$7��K m,|���˞��7����l"l4�����#
�C#����A).�)���h�"� ��	��Q>�@�s2��7܏�W/Q����"0�<���"`!����^lɁ*���7��I�����9Pڣu�>�7��#K���dք8
+
+샦
+���#�d��
+��Φ�܃�.���2
+��W�\Ξ���|�m��?�u�b��R4M����z>3H�J�tf�N��5I�������V������Fў����u謶FD2	������硽�4Y��Q���Ch�4�df�+4���.��m���bv�~/��ؠ�#�7>���yf#�ߏ��N��ډh]��E�6�b�چR���"/�V����ؑ74M�r�4�������l��X����|��vz=W?��F�|e��ـX�/�2�kwI��9�
�}�h#�f3L�P��hfL����:Etk�7z��������8��F�A�k�GP(�Q�L�$���^kð�'3�bBh��0���yE�Uk���#^e��I�,,���Gn��1�_<ZH���Z��<�C�k���oc��:	��bq�i���5�ڰ7|�����.?�����X����
�8i(������8�'�QAd��\��v��H�p�5�&�9%���łԻ�87�\�����/�%��9%�Țw�bxc�~[-�����5��x�	jc*E��S���n�K���66�Fۿ�z��C?w�m��d�D_�6b!CdE��u���k$Jd.�8~Qp��zP;yj��?���,,�� *�Z�)jP����M�Y;�3�\��WcCpv��AfcT�!�b���뺮�v�5����^}��������k��o�F2.�PК#�����".���v�v�-�At�(�����<jl�G�Zג8/H�����*�@i�Ȍ����2���&�QјG;����$�Ux �5^Z#��hڲHi�v��t4n"w���vPT�J4�Djwʻ_}�G
+n+8�o�u-�]5@O����o��x^�;G9�rd$,�E����~�x�ȉ�c^�@(F,��t�������G�4=J��j9!��������p2�A��{�hA�`�x'j���'�a~Jp�xk��%����qW{��s+�C:�5�{d��R���Ú�������m�
+Q�Υ:"�dMӮ�S�!��k$Hd�
+����+RJ:#yf��1��(�,��)���'_�;��;�'#�}�h䞠y��	���u�ԢB�_<���c�䅗�����h�q��I���������tœ����1pgqg�����/�U��XZ|��ݓ�zT$����NZ1��&A*��
�^�s57xRM��ț�Q��A�|o�W�go�+�wr�o������rM��g	M,G�.�Q�h=Ege�����W����C��Pq��|C~����9���葕�0GO鑍�U�L./�<��0
�6�<� �퐍Og���|�k4/[����_�k���{�zj�=ZE�I���
+M�LԽӘw�*����Q�gB�ZhQ��4M<��Çn�lS���ao����K!���L����-]��$���vo�����դ��$i�7���ݤ��
+=˚'�8~����o_��c�}����K��
΄���ȱR����Ć�_?��5si�N#吔P\i�-Q�Ų{�.5<Wɇj#����Ӗ�=P��l''�y<W�C��-	-�,a�-k#��r��}��U��Z����<�������ۥ� �N�w��J:3�0�Ȅ����W�B�e44�����g��	{�y�^Y6d��PI��\�:�T��� 
+5v2�^�����\#&/k8�MĤiZh�${��;��������
��Ļ�`�N	ѩ�c��٢���d�A��,y{�Z1�om5�����U���F�s��A�P�W�j(%0^(��u�مUH�FJ �^�C��\���
��5寕˨��;�� 1�;�w�=:kM���U��+�A�u�X�W&���v�����#+V[����@�A�t`���^mn8T�-�bLP�V/M�Z��r����ѝt�ǂ&�{C�p�t�Z,�7���~h���jn��T�N�H�<l�ib�^E9GNf�Ђƙ�)�|N�l
RGSP�_%M�f���=f>C��
`��6��=,^�4�h�qQY=�8�]Z?�Bc�[(�fPT5M�#o:䭋�u�x�9hJQ�		<�izOw���G^��p�򿵾~�W������L#g��ii���6a}II1"H'��2i�=�I�S���2nM�
+�b�md��ߥ�U�|暵ӫ/~aq����Nѯ�S��܅ņ�=��A~�H^��-��<]�:u���T�������5,xh�^kBw����ﬨ�Tyo��ۼ�.-J�MijoL���6��E�8G(�Fc�K�k���[�|���:i���j��W<�R�_q��Kg׵N�G1
+�ƅ:id�¢� y�TDbk������)
+N�pB���nj :���j��#�җN
�S�u:��c+ 4n��	&J,Tw������jU�"|�G1g��Tӌ�ڗ��A�������X{|E��$�rב�V���3��›�q��Q��Z�����:!�w
+w��a�\����������c�®w-�4D�C*</�#Z.~g;HoTM 8=��/9j�N
����L1��,pE��Jlz������^�no[��DžW�����N���m���n�m����/�r�h�.�=(��V�RAc�㨃���/�S��b�'’8�.��:�i;R��N� 	E+��4��I��e�A�c�o%H�2��~�%�`����g�H����;��i�H4H�݉t#��4�� �qpK!�U��WM-I���������T��#�|�����	�$����
+���N�_�T�Mwj�0H�]�{N���;�  ��Z�$�`W���j���*5��l>�V�G�w���^8�ܺj��\�Y�.�
`
+X�%X\��@����d�ޑ�x��j ��i����<Bj���4d+9�摎��Cn�z'0�Kp2�lYy���{��w��T>b/���R��JII��>��PoKyr���ځ�o�'c�r4�5�"�������C����5{ݔa�YNޭ�U$�c��C�F'<��P~l�J��>q��a
��<�d:hpl��)��20Ȁ��Y>�H
GF�D�R��v(S�A�����
��0����1��D�Ɵ��xt����"6yu3�UJ�<W��D��,�x_*c���ݾ/� a�U(M�u�����Qز����o���_�?�Z9�Pɖ�$���XW��/�U�s5�7�i��P$�Z#{0��z$�3e�ϕ�Sx<%
+��RIK�3e8��y�G�ȥ)C8Z�k�_� *ϵ=W-RLH��"M�ՅR��:�ͱ��ODd�y:C�����L���"%k.,�ɏ	ă��y�S������ڙur��$ @�����W�Å'�;ad���r
~+Ur
+��_���h������T�@��_?�F!#i]#��������O�JKM��Ʀ�‚*̂�[ooXJ�l����*.����'VT��Іک���u��b`l�fp���ߚmd�$@{�I��'�0�����_*��Q�C�9���@��F�eT<ik����]��OϘv��=���4�d�#/�Gv�Vwd.���U
+d��8�d����-��tp��gԹ��$ԥ�R:�.���!]ȒPEX���� � Cd
+�Qn^/E��)�Ð_(@������G��2�x�ģ	�6�����5�h��`:�����G������ҩ���o�i|t�ɋq�(�Qk�Z]
+��3��N�V@k��%ÙP{z��A2U娻���%;U�&����j'0"�W\�ڡ.۔\�ݧ11��	�p$�ݘw���+�����t6\�8Ы�霢1��!K��[�fm����!�L�JrD!^}���N����2�,�"�M6d�/W�\%**��$�d�mWz�y�r\�o���I$�5T��Fc�kԴ"k1*ma�=Z@�qĢH�u�3�����Q�`��J*��$27yP&� x��s�e��
+�V{N��mE�P)��PUY��tj�3@��}Ui7Z�DR$�{�uJ�GY��[/���'d�<�CgqR�z����yx�m���Ry�:W��zI-���0b'������x#��_�ew�2	��~��'H��l�^��������y�b��;`��
M�q��X9�++��Ѩof���}B7�Q���ƻv�v/« �*&3lFx�עuU!Uo;t�~#��C��Y8čY����䊮qA��8��^���dqGG:� �y�x��/�k�Ź���f�T%���
+�`G��ݼU�D�)=�Tt��D\��5&�Ts"[�g�3էhg�h�ʉèD\�]����ɎB��N+�l:Tu��i��5k.&w�l%<G�8�����6j)m�-❆�Ik�|&��z�)���hL���*{b�����%|b1H�ݧ��U�UN�L���P��̰=�*(ߍ��{9��1�xQ��8Tzb�d�h6���1S��+<�[��"]�d�\�ᨦ�䀉c4�꼔]���6s�B��8�O��-'ȫw��qڭ�Gܙ��|�T���T*E�x#l|�Yk��ѽ��YT��JʾN�����%�A�7{6v	�]͇|U9>�H]Ϥ���;�R�qlr����G.�[{�I��U|�'g�j��WoDzr�fHO�2�����Ty����ξTV�����ꚡC�R���6�мP�K��pQϔ��d�����L,��������ec�1����E;1�& �P"!D��W�N�)_/Wp��J�L��2S�cvE-ܩ���t�J�������s�pسS�fo	�|x���z�y�7���L'�86������T�	�"A���	i�J��<Q���#�xϴ��b�|�@~-.<|F�l�
�~j�\�+�i!h�t��J���~��35�����ȘP=��jz'暠�o��y�F�?���F{�s�F.C�@��%-�	����g�G&����b�����+,���^�3����� -�P �`��F�>7�<�C����K�N��G�..�i|��`�V��i�~fݷ�k9�[X,Aq��=TY��~dF�s�
����%*89.Sb[�H;P-�lRf��~��{�.y�sL
+(RG\��N���u�2i�th�zD�c���o�T��8rI"��>�!��7/j�<e}�����C}w�h9��m�^�;j%�U�PH�ohz�RY
ˡ�W��Ԣ�<>kIeg�T(���<Ƶ��A��4OJ
;���ЉAۦF�9�ac��z�H�ut�|��۶��"���MU�^(/2�ח�P�W����lQct�6-�uS��:�;7B��\�܇��~z��*�+>�8����萮;Z��L�KP�u��'W���oS�l�Q��-dd��NK/�{�)ह�alr�uڬC9�/�����]*����� pq���q7��<V�ΐ�q\)��~o�$%�����C�0[ ��`i�xp�˄A����A��%8ߙ�2a���\:b�W���%@�����I�+�**�c�8�:S�:eH$���f9! �N�VB���
��I$���9F^�u���ә
�	R�&�N$��#�)���K��5��m��A�8^����۹��~��|���ܼ�C(9��u/N���I�q��ݷ�CY�8�T���H7Od
+*�l�Qj�@1J�D��!AhB4�)S��¡��je�x��Ҟ$��Ҕ�"�L���H�!e҉�ʀ�i�����b�W�L1H�HU���X�uu���4s����r��o��N�����S����X���\���B��Er�ĉ��������x�{�Е�{�&�~j�?^F����ґ��r\�j��Z��o'~��W���F�m��ȟ���"ߵl9����ޏ��8�R���RL�1!S����p/�c���K�{����� ��u���qЫGA�@��F�$_3k��56���lIM2N�|M������r��H�Qb:d��.���#Z+0�)�]H�24a�I�Q��TIR
+v�,�7�Ie�@�ЂJ7���!Q��(�W��g�A�"&yǭ��e�b��(����*��-
Z=h���q�@PR�\�@��^oC��E�}�]�q�����1�Қ���<k�}f�APҌҢh�|����[�npH��N5ߩu(�ʋu��R�BI�ō����F��5:�o�[(nr���kur�CARX,�[��}FI	۲h샀	�j{��![���j�����ű4vG@��p�h?�z�nj��^,,�?
+X�!�o����`�)$@���������B�� A�%P��9����9k�-���!m.{���	묵T�v��8	^��i"��~"B���y�N�"^��{D�|�Z�3K��ȷK�m��JJߏ��R�@���Ƞ3��T͐�N��/�e4_,��Щ��y�/�hL�-�N19��<ɍ~��yז�c����x��O� ��)j@��ӫS12h��W�d���)y��<�)��+�|pa�A�.��X����v�J���<�Y1�s7[̪�֍N`�"e�G�p��^@���\ݟ�@m�^oQ$�x�q�P�6N�a��G�4W���e�A�ov��f���|��7^uU�H6�:)�+]�̈́m☸v(�`��o���$(��Ѽ�	�I>��8�/�ׄc~���m��1�
+J;ݼ�D��*Ga�2a��2�(�0��+N"�;̨�H�x:��an�h������d�WxRU����gT�q8�Jq�;�9&a-��m��R�/T.|9P{�,� ^�!�<�Ws��[��x�@},�%��<-��Ԍ�P�NX�I�X�K9,3�V��?+Ej�O������rD�?�2�x��Q��}Cw?����b'NBM�*�#p\|�
Le�"L$���M	6M��ř�p)��Uy����ϑ�}{�z8�]wݕ�X�.����׸='x�aT���KF�R�\�']���#��?ua��b�ʄ�
���=n�7ڽJ�(�Ix̐	q��ԍ��V�<�Ȉە+�f�B��H��ci/Z2oH�R7iz�T��3�K/w3]Ce
tߜ
+c�k ����v<꙱dû61�O�u�L����R��N�v�ͩ����J��)]����=h�Ϛ�_�PY`�����p6R��f1J���ΘE<)�B7��d�
F��@t*[��
���p�蔾]~�#�
+��U�N�%R��R<E���ߕ�<�m���y�>J֨��qA��38�@���g�3�ԛ���*�����:��{�T�O�>��L����v�p�H~H�\��#C����L���h^h^+�y�g��@>@�<�&����Y3��ɷ�?�`��1Qh�^���ꎕ�X.�d�����,ⴓ�feȠ����ETx�9iZ�7��~?gr(_q�nV?(%p����fB�������R�}����z�L(��P<p��:�N6`8ؘOi���K0����)��7�g>�������fH��:�CK�&r&���%A���vJ�����������}0������ڼѕ��e⼔0�W��e2F����IW���Ӱ��LU@s@@@�)i#�mH^Y���2�d�YЌ@H.]��
+�sA����=��/k��m�� f�TLѿ8��wz1Cۓa\k�3�Hj;2����yk������T+����k�@�6�`���˴A\�3˶ �Z���L3��f�)	�P"iM��{C��!��j���v�/�t��`�^|�(uh�$7�Y����#A�41����O��t�,`���@�_Մ�ڮ݅��R�/<�}*��`+����sѤ#�X�,��?H��!���9��!i>3���� �&��*�O' ���~[���~}5v�X�.dT��FWU_e��=�V���3��}	�G~�H�YoE�z���
77ќ�dA�_�
U�Ɵ7���)[�Ӏvj����n��ao@>MhL�K��-�45��M����S5�w�If�5��?f>M�A�ĉ�q-��m��r@-D�k����ld�~��#!"=䗊�e�^k�z{��ݕyyw띙M�a�O4�F-���?s*�u��'�k0-����v{�;����Y��r���� ѵW�)�]oH
˔��E�r�d�5�!`�@)9�[d���G��ǁĀ�!�P���l�ₒ�/���,"��ؐ	����T�uJ/��F"4%��\����͗~�G���~ۿ�1O�	�s4�y-,���c�~d|�7��0
lc{�ILyշ(���tk�\w|v!��S�;��_����aJ�\L;���F�lz�u;�'q��q��2�8;�4��g�A���z{��=��$��n 5.9��z	@���%�
����+�;:���ȗ)E���CWk$1��Mvm�"i���C�mC���3i�R���<�c��2��I�M)�%k��ٍt�He2���f��7h�QZW!8�"<�[����=��TX(P��l1Jnk:�QI�6�y��V���̏�E&���'|&�q��4�P���x
�	����ՙr�<�����F���+`y�K8��8z�F���X9�T��I�p��+,�����q�jƧ\�qt-�}_霭�ό�\M~�tl?��{��z�Ά�X�E )�X��E�����hB���ר8���	J*�B~�j�	����e�8���1g�`����!����“�Q��k�׈J�*��H<Z�C��SֵF��^�S�|X̙*����g���\i]�O(�W!͒ڋ_�����s���v�{,^���,Z�
"�q�������5��h��|hA���^� �hx�)�p�$•,(�^�����-j���E��.�P;�6ha�s��4oȑu�I��X9������*\a�z�ݑ7�iYB��U����P�
p�>Q������q~).�Z$^�i�9֚�]ooh
+���Ň�]��>�������L1��ش����Z��@�
Z;x޾8�h��IAf�N���z���N��0�+)��A�^Z���2*�����wb�~z]da�dMW��Q�Q �]%\��{bD�'buг����,''�dC��
<���FƯo���)�)dF>](Q-���%$o��^�J�431$
+�v��������Ϭ�"�T�JGz�&=vҰ���c$h�iF���H��ّ���B\���ESqr}��N\�]�}������b���kcere,WO�cc�١��!�nq�z�ѕ�j�Տ�phf.�&�lC���p�尝�΄��Jr'�zj��p�����g,�v�/ݑ�2)�@u3.�Yki��<q�X<GAl�8Ϳ��G���q�o�M�P��,XC�X���{�����l��a�A����=q+��6 qmg�P���[�s�O�M΁��ln0h�g���bl��򯅞���5<I5��V�	���������w]r���A*�e0R���a��{�s�L$�傁y���?���μ����Jp9��&��F���w<��[?�0H���CJx���]�����}� a�{�3"~
+t��_x����ْ���A�5� �~��cV����=���e	�$�Kp$�W5�?r�3�j���B���L�v%,V����M�ө���-��'�V��GW~[^��oh��F���|���6z��YR��q�F�+�G���L�҂�?TD���6R܍Ti��N���&������ة�v�
�Ms�-��X�0�
+t��V���\I4�����G��ya���>�H����?�X��sߖ�]o^C#��t!C~J����_�P�ri.qD�T^�B(7��y����iEyjR�Z�%�$�~����&��k���+W��Z]�~�7��ž���e��I�
�ѭ?�
+>���R��g�{q<�Scz�L�7�D6M)^ہ�+]g�y�2���%M�5O���,�s���r�,f9�J܌§Wk�Ӥ�1�aPγl�@�������$���2e�W>`�ĸ���^il�;^�_:��2����}�p�����������ݡ�J���޼W.+�Y��{QQ����ʺ]%��j^���`d
ru.��Ѐt9v`8���N�o���Tɱ��b��|�Bg�78"�s�!G��(�4
�r�`_��eb�Aw@K� %il{�@��A�lmJ�!#s�Y����rH� ���VI �������߯\ʁ=[��dl�N����!�~��
+��s#8��W@7T�T~�D}��Y1"�վ
+�h*(
��4��*�Rbi�J��k$qN�|���rx��
+O��2T/����ꎖ����V$�} ��z��/8�{.4ϵf��`�A�����!,=%��"4
J�q?�~���,C�P���μl(4e�謷�<¸wg��׶I��u8�^x,�
+���2h`�D��΀��{�b����.��=�+��{���^m����ɇZ�J^�6 ����&�d���|��>��3��$����L�4J�֪��>�����gKy�������H�][e{D�S=����?W�������ؒ�pϢP�q���a�q�=T[&�v�3 �Np�ߺC���\�rs���L1H���Fs(D"f��`T�~Nj����"O��S��xo)OfN��3>�Jd�L)K�D����H�!�l��( �q�y������#�Y�A��i$~����pa
+�i��@PZ��Ӟ�A��q��Q��V��j?�iUQa���u
+)�4oq<���g ]HC��̠������!����-�Mse:V�ku�X5�CZ�I�|�	u������a8��>�\}�\��v��"��O�9*\��E	[��︈Es�ȩ`��\5ϑ���lH��`Y�L���߅:��YSI�np��hSh����@�A��R�1�X��{�[�1�ߨ�2�<i�U�i�R�N5����m��sl�9��	�5�Qa�8�������ݖ Ҥ��+��B����}���O�	�MϦ�~S�IP�����3sh%��1S��x��g;����63�S� (]E9�,�i����JA�u��s�^|���F꣥����n)hG�L���HaƎ��q��:�6.�Utc�.�c9��7����)3�{h�+��9�Wn�p��~����mǦgU�t�J|R���ȥiPi7&�W� x�%G��s�h\xi����-���5�d
M�7�$dZk`�Ieg��>o�P�4��� �j��Z��γL�P	8ױ,��!��mI	k�pN��k[���ײַ>5hw�>�\_;�o�~e]�RL3�p��Ԣ�W^����6�إ����;6Ł����w_X�IE�r�s
+���M���T5CTO�[H��R%|�zy(U��MLv?)Y^���
+��HKYRʚ�2�,ϼa�*冿Ư�9����(�o��B~c+�P�GH��M!���k-�v��`EQ�����:�Z����7�m6�ja�AZ��?)�Z?(:4��	���0��xq]R�ˠ�2.8F�z�����u�`HÁ�^,�X����0�䠗���wS.�Ep�:XP���}Ҁ~'��vDaGH�W٥��>W���`�����oC�=	��܅��wBw_ni���>xƯ?r�V��m��L�~�;(&]h8]РV�q/^�IY�ts���c������?�~�'��z3+e�V#-����
]�6H�	]fO4�)��vg`
�;N"�	\fH�$A� 	� a�	B�0H�!H$A�$� AI� 	�$H��A$A� 	��ϛw������W�{3A�'~��V`��3Q��=���]&�`l�xH�{�$A�$� AI� 	�$H��A$A� 	� a�	B�0H�!H$A�$� AI� 	�$H��A$A� 	� a�	B�0H�!��rH�2�P�z#y��\ʹ�EW�������@p{�Y��9p̫�"9y���
;W#��z��>x�?-��&>��.��۝g:����u��n�s̷�A��5��\�x>��}�P��s���:����sɡ{�O�N	���_ß+`�	.;6Q�
�8�p�o��md�2��{��9��'s�)*����M���}���x���f?�8���#��T��@���6"
=���)�8�w/�~�����_s#��%��Q��,4	l�u�7��xb��%��!~��rr��6��>#3|������+��23���2�ܟ�(�
����01di;,&��,�>�m?�}�j���1�_�t�_�z#$��������,��oa�">w�&6����̵A����������* c,1S������%�O����a�+� ���8���bV������
+���qmG��_�p#��`VA������1�u^��ׯ��6�dH\��_��GX%[[Dd�Lh}1X[�=K̭l������𤐄��j�?ݢ~�l~���w44� ����[9A�x��YZ��7�߰
��m����S.��)6����m��'�5s�ȸ^�a^wnu�]6�~���� ��o���>���9H�o|d��|��I����p]��m�x~��U��7y�����i����g�:6�A��
�of�1ñm�.��77�����:/�f]��x&��,���wv�.��������1̱�Y���#������u���?��ֈ���fԐ+l���\ޥ+��[��b,�u���=^P��3pM���ml:G��1�s�-�4�y�۟���'y��m����A�a'�.��?��sy7�
+��-�j6��H�f�"�&�a�>�=�U�;��Y�������16
��gWx���1A�y��Q#jl���x.
+�����G���_p۟
���뙓1�����8����w�|�GY�|!�	��`���u�8�D�L�qvƦ� N��ټ��x�{��AZ���"m5���?<Pq�D�cl�F�$.K\d��eb<<v��]Hp��!D$o�^�����<�A�<���i3�`�����.��v�4�a�E/^�r���!���)��-�x����+��s�	��G��fF��}�>�g��%Ȱ��h���xK0�
�D�G1����ϼSs�@����)�N4M��L��FL|��7��>ϔ���عl��z���� l��?�[��u�ʲF�P���X�� ��_a[�R'F���"4�˃xs�A|*/���u����,Q浅)�$�:����o
+y�Żr���~`
��xoƸ,�y�Xy^������Y�\*���U6���w���L��A��'�qN��	����L�|����lL2�GyM4�>���o��zl�=g��[�X��Lq/���g�KK؜~�ר�B���aB�ܿ؈� -^�����C�]3����o;��+ť��q�j6���p&�:ǟ�<�1�D�*,��O�:e3x}�\��Ҝ���7y�q�x�,�b��o�ך~���˜�am����lW������z&ޠ>ty�l�����߻�}٬ Y����y
{t����#dc���(�Ϥ��q޶�jW�/�����q���[��������������p0l^�0�v#��Na>ngy�j+ ؁��Z�~7oFz��D����>�=���3�´�^9�1n�"������@/���u�p�M�Őkpm��-z���?��J�����HȷG�x^ɇw{"�6����o}_7Ƕ]*4^#�"D��|沕�?�^�4od�!�W��]��U>�ܪ]��@��"K��Ӹx �x�5��k|��4I��`W�\s�����w"�P���nj����y��l_y��lfew(
+Q��cU�!���Q��|Μ�u?/Ɵ����8�`׋�-
+Ҋ�"�	�����Ж�ZA;}W2-
ƿ���ad��l�vs�;�l����Oc�}k���:˾a׆̝`O��q�ж��Ƀ-hSr�6�#�׊a�d�"���x���s4c���C�eV��b�{*/>�Gx5�5v_y>k�0,��߰��;0~����`+��W"��f�v0���\
+��7l���<L�z��@b{�{GY#�(oW��qC�������`ƾ�?����z��b�9Ǧؼ3�,E��������0�y]����3��^�:��A1��9E��	��~^��&��k�Y �˵�d���{[����e�x��z_gs�1�0�KL���;����}��a���X�i��b�wm4�t(e_�ےq}��`�����yWi���W�Gj�&w�4&�e6��/f�f'ˏ�yV�$���q�TL�@�K��W$�VNmR�{j��������w,r�Ǧ��,����]�o�D��`�#޷���	^�e.ѷ,�1!/`��{���K1˂z7m�GA�	�� N��6q�Sd3�3-y��k�s�w�>��1��G�0�T�.?��F?ǮB���(k�[�
������\��+2od���X�Ɓ�)���˧����3��a6��`3�:�PH��[Y�q�y֌?�HzYc�0���d7f����3����XZ�a)���9�K�b>�ނ���`����
+ohl��I��k9,�3��$C6�vC>恟K�^a�l�ÊA�����]�0���3�;����S�CfE����)ޡy)��?���Y��"�F�.��|#d\�Z%�������5�\.2�`�����53\�R�8'ݵM9i�6������s�=��f�9���I_��*~����Y+�g�	{�A��b��ݕ'���I�~��g���W y7�s���j}*{��̒�0kS�I^������1kڠm�n���P�hk-�Q�,%����?b��\�#���|�D�b~�m�v�G�/����k�W䚈���A��+A.�8�����]P�d'a�Y��l�������^�s4?me>-�9��ܱW$,i�˓�w����4L�?�g�a����r�{#�r�8�G�݈ �,���!v�{�A�"2���o���n#A��H9�%=�F49=�'B�1y+�/�B�S�ie��0�Em;���q^q�];�l�+y�*��g���ou|�^�gS	���9~���!��ea���dg��@�0/(�p(b��!%ǃ��ـ�Y.�A�1�@��O۹���
����Dv��K����#�@���~X��o�lÉ��ǜ��Ћq���O�Wp3��ncL���xo�ȯf��[���Ȓ%LH^������>6����9>��.W�T��uC�T��|X����lG̍W#�9���c'������[D`���-"����ԣo����9'{o�"�}5�
6�a�E��������%�����`rF˰q8��V
+�����;ϳ��,ŔfJ^��~M��!�Dӓ�w.,��"�q��|����c0��R�@��{��ϭ�k@~-���!�"Ɓ�Mc���9��~Hq|�d��!��Ŧ�Y�|k���r����o#�j��Wtm��^!�,�\4L���ؐ��m�,�zv��`Z����w��ƾZaZ�Ʊ"QcXbO�y��<-�Mܟ�͜ :�p���L�����b��7���8�T� �$F9�/1S^�=��g��&Ka�!��^M�ߎ(���RU�D\����#���n�8l j<�d���D)>鏪���5I,l�A$��8��e��d�px+2c�{^S�I|O��r̝�c1L5��'�%�9�6���]��?fsͯ�N�>�9�]9Nl��_�3���G������*^46���͂q��&���J�}��>����ͳY�~7�]k,��ro@��Ʋ]��]�z�cW��|*���W����X�S���́��)vq�*����<!�x0?V���}���f��È�3A�2�K.��pm�8����#L�?ƋP/O���;:^��C��~��D1�w�1k����}i���}�P��a�����g�y�w����-\(2ȹ�[�m����f��0Ըs�Y}/���8��1C�p	�8�'$O����>ń�e_�q4��x}�y]�#!��_\�:Wq���Ͱf���lf�7�4x��3>�?q�u�����&Β�&�?��������L�eK�LS7Ĵ.\^��Ĭ��4�]ܠW��v�w�9~jQ�����辷p~;3�2;C���ޘ}��+��mS_�>]6+/%5ҳ�zh�@����v�f�A��87���f��|�{��Og	e6\�gȋ�[Ǥ�ɑwa����i>߹�M�i�s���
�>NV\gޟ6����n��A�����n����☁Kي,�>��4��ᬟ3�[�~.bL�<c��������ۂ>�<S�[�3�Ca���S>S��.�L�{l���R�?+�x��y��ڛ���]9O?�#�y|������q�ˆ��'f��=x�og�7��lN��k��T���<�<1G��e�q7g��s��߄��_A��w���T�
��w�^�{�6���şK��u����4��Y;ٱ��[�U�[�N�Ʋ'z۵u&�/s[��Z��
��9����,���M̌7�F��o���Ō���ϲ+ɩM�kV�x��lR_�'�&�%@\f.��.�_���z�����Sq�'1*R�;w+w��|�䩷3��l����3�����[���̈́�i-/"���|�ce��
+;v^�y�J��AV72�ͩ#(����	j'sy�ı��ӡ��=ؼ�y���X������dq+�qn܌����IEND�B`�
\ No newline at end of file
diff --git a/web/modules/webform/images/addons/webform_nouislider.png b/web/modules/webform/images/addons/webform_nouislider.png
new file mode 100644
index 0000000000..37f9d4bed5
--- /dev/null
+++ b/web/modules/webform/images/addons/webform_nouislider.png
@@ -0,0 +1,260 @@
+�PNG
+
+���
IHDR��������������HiCCPICC Profile��H��WXS��[RIh�H	��"H�B�  U��@B�1!��Q�����UE��Z��E�����u�`C�M
+�����������g��O�ܛ�t�yRi�@�$O����"=(��> ��ǗKٱ�Q�J�����@���.J������	�r>�H,��9?�����|�,��7�[O͓*�x�
d0A��J����J���*��8�; �x<Y&��MP���gB�[�Jb	�:d��"�������NVbhҿ���g��'��9�յ��"�Ksx���v�o��Q�ǰ��&�E�)k�}��=9R�iwIңc և��X������j{Ԕ/���&Į^H$Ħ�Ir��4��qb�B�q7A�P(��pV�&���������Tq��'ىl
�-������P�����拓�!ֆ�)ώ�T�`6�"Nt��L���b_�$<X͏M̐��i�e���z��"17Z�+�D	��|�*#���vb?�P>6���0$T];vY(I�ԋ�K��4���9�{�*�	W� 6���k|�<� ��x�4/6A�'�����/�Q�B�(�H�A�v5v�'�L��B���{$�f$�
+�_	�|�/X5+�P�e@�����l��#<�8D���PyI�%�'P#�):��r�gj�4E?/K�ߒJ!FÈ��	���Q�����g�͞��FxD�Nh'ܞ$.��P��0B�����k�� ���C~ȍ3q������x ���M�����G
�u]cGq���A� �Ï��N�,ʞ~�!u��}�����]����%�ۇ���c�CX#`aG�&�"vX�V��*���'�����TvR�Z����Y=�',P~g�t�L�)�c��_��J�C���\�\P���?So����y����>��)}}}����{��9�Ԯo:�:��G�8;����u��B�T��(c`����
x?B�(@
+��,��Y��`.(e`X
*��l��^����4��.���.\=���@/� $��0c��E�7�	@B�($IAҐLD�(��<�Y�T"��Z�7� r9��!���H'���b(
5@�P;tꍲ�H4��f�S�B�]�V�5�N�=�^@��������,1��`1X*��ɰYX)V��`�X3���b�X�'������'�||
+>_�W����$~�w�_	t�)���K��2	S	%�r�V��)�6u��D&ў���bq:q1qq7������C"��I�$R�G�#��֒v�����:H�Zd�9��J�������#�+�g�^�.Ŗ�K��(�(K)[(͔K�J/U�jO��&P��s��z�)�=�---+-�1Zb�9ZZ{��j=��Hӧ9�8��4m	m��6�
�N���S�y�%�Z�	��m��Pm��@{�v�v���:[��D�B�r�}:�t�t)�v�]��,�*݃�7u{�z��b�r����;��\��o��/�/�߬B�1cX38>cc��Àh`o�5�2(3�e�j�m�o8�0ɰ����a;c�1���R�^�
�Af�؃��
�te�{��FAFB�R��F׍>��C����7�7�M�LƘL5Yorʤk��`��������c��:�ƙN7�lzѴ���,�Lj���Y�9�<�<�|���N�E���b��Q�?Y�,6+�U�:��4���TXn�l�쵲�J�*��muߚj�m�a�ʺź���f���:�;�[o[���3�������5�=�7�������s�;:Lq�q��Ht�v�v\�x�	u�p9U9]rF�=����ۆ����rӅ��v�w�sy8�94jh��ơ/��K�|ؙa_]=\s\����?|�����_�9��ݪܮ�����g�7���<B8b��[��<Z<�xzy�<�=;�l�Ҽ��nzx�z/�>�C�	���s�磯�o��^߿�\���v�=i?R8r����V�<�M�������큖�����GA�A���A�؎�,�N��`�`Y����_�Lα,$<�4�5T?41�2�A�UXfX]Xw�G���c��Ȉ�7�f\>���=�k��Q'#i�񑕑����dQͣ�ѣF�}/�6Z�b�1+c����N��}qL옪1O��͈;ψ��#�]Bp�҄����Ė$���I�I�C�W$��6v��)&)┦TRjR��Ԟq��V���1�d��	�
+&��h21g��I:�x���Ғ�v�}���jx=�����n>����B$X%��W�e�g��x�韹2�S(*u�9�J񫬈�
Y�c��e��$���%����K�%''�O.��&u��Hۧ�NY=�[)�*G��Myp�~Q᠘�x��_��aj��}z���Ӝ�-���0�����t����3��x8�=s�,dV����ֳ�gw�	��}.un��?�\�V���<��جxN������J�Kd%7�-ذ_(^غ�}��E_K���\���>/�/>���_*~�[���u����ˈ�$�n,\�}�ފ��W�^ٰ���t��ՓV�+Q�a
u�bM{ETE�Z����~�U^�
+��]mZ����:��+���o0�P���F��[��75��Քo&n���tKҖ3�z�Z��dk��/�$�ڷ�m?Y�U[��t��:�NQ׹s��˻Bv5ջ�o���]��Q����n��۲�{_�~���J��i
ݍ����������4�5�}���Y�:lxx���#}G����:�y�qˤ��'ƞ�vr���S��Ξ;}���ѳ�g��=w�����.z\<���Z=[.y]j��s��mdۑ+�W�_
�z��څ����n$޸us���[�[�o��~u'�N��9��J���/`���_������~�a�Ë���}�����������,��>w{~�3������x!}��U��_�/^��;���c�;^�^��^���Ͷ�#޶���<x����}���?z<�)�ӳީ�I�+�8~i���^_n_��'㩶hF����}B
+���p�0N}�S	�>���OX}T�'���ܮs���9�>+��	A�uw�g����h��C������R3�_d}}�����l�������R)Dx6��DW,��?ȿŀ���J����	pHYs��%��%IR$����iTXtXML:com.adobe.xmp�����<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="XMP Core 5.4.0">
+   <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
+      <rdf:Description rdf:about=""
+            xmlns:exif="http://ns.adobe.com/exif/1.0/">
+         <exif:PixelXDimension>938</exif:PixelXDimension>
+         <exif:PixelYDimension>414</exif:PixelYDimension>
+      </rdf:Description>
+   </rdf:RDF>
+</x:xmpmeta>
+�_�(���iDOT��������������(�����������:��ض��@�IDATx�x�އqwB	������~)�B�R���JK{���m��
+�Rám�bE�@	!�xB�]v�Ii ������ϓ'�#g�y�gv�s�����_$@$@$@$@$@$@$�U�D��      ���E��H�H�H�H�H�H@U(��
+3C$@$@$@$@$@$@Qe      P�����̐�	��	��	��	��	��	PTYH�H�H�H�H�H�TE����p03$@$@$@$@$@$@U�      U���*�	��	��	��	��	��	��E�u�H�H�H�H�H�H@U(��
+3C$@$@$@$@$@$@Qe      P�����̐�	��	��	��	��	��	PTYH�H�H�H�H�H�TE����p03$@$@$@$@$@$@U�      U���*�	��	��	��	��	��	��E�u�H�H�H�H�H�H@U(��
+3C$@$@$@$@$@$@Qe      P�����̐�	��	��	��	��	��	PTYH�H�H�H�H�H�TE����p03$@$@$@$@$@$@U�      U���*�	��	��	��	��	��	��E�u�H�H�H�H�H�H@U(��
+3C$@$@$@$@$@$@Qe      P�����̐�	��	��	��	��	��	PTYH�H�H�H�H�H�TE����p03$@$@$@$@$@$@U�      U���*�	��	��	��	��	��	��E�u�H�H�H�H�H�H@U(��
+3C$@$@$@$@$@$@Qe      P�����̐�	��	��	��	��	��	PTYH�H�H�H�H�H�TE����p03$@$@$@$@$@$@U�      U���*�	��	��	��	��	��	��E�u�H�H�H�H�H�H@U(��
+3C$@$@$@$@$@$@Qe      P�����̐�	��	��	��	��	��	PTYH�H�H�H�H�H�TE����p03$@$@$@$@$@$@U�      U���*�	��	��	��	��	��	��E�u�H�H�H�H�H�H@U(��
+3C$@$@$@$@$@$@Qe      P�����̐�	��	��	��	��	��	PTYH�H�H�H�H�H�TE����p03$@$@$@�	8�8���چFTW7�B�~-ߓ�:x�9���͵���iD�:��\��I���t��y  07v�/g;�8�`�0_�s�]S	���6ט[yYS$��֛(v6�����A�s�Acq��Y"4�b��gP�����ܐ�	��	�@�#`���#=���o�q���:u�+?މ%.�'P���#&��@?g�9�#��}�a������`�a�T�q?��	�K���/1nO$@$@$`k+�X[����Gb\�;�������6��6�|�t'�u�W��H��ꩥ��|p���D9�����p�꾖B�?9��+Ef����	���J@$@$�3gD�Z��R��b�����,�=0���…���%z�nmWӢ�F�ES�Y��(k���[8#��N…���.���`�?[K��.�i����'F�[	-md������;Ҋ�`��6��k�����m�����RT;��e$`��Aظ	��	�9/L�>N�t������e
kA����PVU���V�"���Ӫ�l�H<0c��\mٲ������#|��/�Z����iFqE=*j���ȮhB� ���ͨ�i@nj.�Wh��Y�����0=T`$��z�y!���8w��kH9�)�B�۔~N�F�_犧�,[oH46��R�qI-��k�s��3�`��5$n���)$��<�����/[Ĵc�(���3	L��j0:�H�C��B��$��H��i���Y�Fk�_�BwE���R�jФ��L�4�W
��p;.�㫾�'O�a��4��gں�g�>��u�'�y: ��^�6�ӁC��t٠���
�
�Ad�Q^!�(,���y�jV�9��;&`��|�� ��z�J�R��Z��)�1s��x�®��jQ[U��'s��@v��ᄗ8D�N�}��a�@��n,緇���/u�)�Rez���E��E�
l0nF��o��z��2�Vӂ��,|�!��
LD��Y`��	x3�£u�Q�?�G���e�A�pߕ0��ڠ��m�E���O\rk�C%u�.�v����5B05���ū�7%�-@k�\k+vYb�Na��:TԵ�Q��Jߴd��v�H����?��ZD��#��Ya�jؗ���;���I�(0��LY+�����ι�1��A�o:���3*nH=���D��I��	8��Sq_�.��*zS1�,=���z�e�M3�h���ymH=����B��7�=�]��UE��#���=Y�Q��³��m���+'�b��
D]��v��e�����`Ov5Jk�p���m�Q��
��7�Y֣�ATm=e���^�˪�ɽǰt_.�D'�z"��G��9�rݲ�+՞"��$�3��Ψ�!	�"g�z��+�>z.�0��e��즎D��K�(¦g"��K9���SZT-1p��;�.^��g��[kO����C,�����0sT"�$,tG�gu#N%�b�0hO���h��(=��;D�ї��]a���k��|onLlj^<@�θ�lHQC����QPT���%�PTœ6gQm}fk޻>>�����	x��l=UU񲲲��iCqW�?��eS�,��b|�;T�BaTa%��4Q�Ơ�����>p쌿�e����ŭȥ��"����n�p%	���EU�Qa�H@2U�(�UTI�����ђ�&�F�'ۍ���Uk7a�bo̿*3=M��oE}�7����O�@V*������[Tmѯ_�|�@�I~C�
x3��ہW����(�Rez$ ;���y�0&��x��*���xv������ob�]�q��������ax|�/<e��L�4u8��V�(F\���c֢j���o2����&��<�}}[J8y���Ck�UY�2Q���EUN�L��N��*>�)��#F��%����{���C���OZ����9q��)
�$�ƶO�*�6�9�I���i��j���G�Y��nV������ഒ��e)�
+���0(�	tO���=�%'@Q@sUaʝ�gbI��x<���\��?<���u�X�ml�د?^��;	�3�$Z�����#c�����5��z��ۚz��������iOG|�8�zCQUU8�Ѕ�EUJ܆L��EU|��OT-C��MC1�M<�R�dž�v��<�4ڹ"r`�r} �zSW�n�P��疝@���t�*���±�Ɓ-�0��D�uU%>���U���rcV�)�fN�w����8�����EU|��OT�����"��)hQx2	/��@��{���#Ǝ�ggH0ǥA9P�N-8��x=�
+r(k���=f����ON�VuZ�wO���ҶE�/
��4�
+	(H��� l��'@Q���D�%r������(]�^[��'�$!A�FUa�~QXtU��yA�����]���l=�*�AS��K����Z���N�/Ӑ��:e�����j��^L��ڋ�Ϣ�U�Q6?Qu�����l��t�*O�;���~�`���x떾V�P�T]˪��o���7_�*��Ӧc�t'y�uH][pw��r:,�G�(�"rwP��EUy�<"	(H��*�������Xu�mx�����#V�}��108O���J6��X
+��A̦�x.^�N�g�a��~�,��@���8w/IAF�E|+���	(K���,o�&@Q��D�}����SYQ�����I[Tm0xH�=�
+
`,�>)�B��w}<�dH}w��2�����1_NU�E�)X�I*�.��%bPT���$`U�`�AI@)U��OT]"�c�l/e��Vd����믭��=���G�S�K�����8���UT��N����lwM^2|v�]�1��-EU�L��$@QU�6�E����Gn~��4|,��񁒍���Sx�ӓH�l0%�����Qٖa�J��������!�&��*�����ۙ�ݔ\�U�i�����K�t�N��ڻ��қ$��I���&]	PTu%��v�'����a�0�P�b�tj�r0o���ܮA��m�P���P�U�ze���d���q�\Ҿ�]��\E�=r4���?<���	1;���]E��6WD��j6�D�$@Q5&}�d'@Q���Dθ��x X������=�����t�����y}h���o-J����lt���K�UTa퉇�����#�<AM)������)��y�v)E�lC˂�/���Ɩ%#��EU|50CQ���9�Mr��������ⱧN|4 tX1>
+o��əe5�r�N|U�\��VT���c���[�m��Tp�|�����(�iS9E�T"�|��9�s(��̑�EU|T�ST������G`�춧����ÔJ��j��_̿-ӕ|�V|%R4���\,��(�6(wX�U�',/�����Ԁ�_��Y�(S.t��H��k��lPT�&�,	tF��������ֈ�l<Mt��~@�ں)�$���4�Hѕ�
+�WO�;�
+�k�U�5-���CAe�Z4hhj��EKkk8�Z�^�������gimG;x8Z��{�ڱ��)�$
�:fӜE�r��qx>�IָU&%��[3S�#tn���~��5	���EUA`H@>U�l�UT2�³�����gc)��p�O�Atcjk ]��`�8��U�SР03�2��WQ���gp�Q��,�3��=��b��oD�q������]=6-߁�dKqc@���ƼE�����F�*��U��l}Vg�\�t�<K��ʚ@&G��jr!c�I@U}hu���jk�݂��]Q�ԭ��������b�Pkx"��!�����#��?�Ei�X�/���8]��~�a�\1��.��p��Ŭ�@���jלs
+���$v�%C�2wQm�b�����h�� h��f�|�P>�jh
�a?����		���EU]�`nH@bU�@�\T-m����)n
��mD��1x]�~*��
+���Y����6?�T=45��qk"��T�*�{�<2a;����n���p��������;��#u��	�Q��-�����%��jj�csފ���>t
W�܎��;��R�4��I���'��PT{"��z3�6��xx�0��c��e��Ԕ�DZ4�Rvb������H�O����'[��[F-��a�.��f�/ƅ�b���n�37�aՆX|���(J�W��_e��	��s��2_k���E%h*/��m�X�X+M��.������*������\ȘaЇ�EUZ�o�KD���.^���� }G�6��T�/�qY�J��^������F?ar�^ͅixa�	�)�}�
+�>N�kB�����I�-_d����ʽ�M��J��G8WBC����wd,M=�ƤໄR���@٧����;EUu!a�H�'՞q=	�4�����"Qm��lo��{Fy���5�k;{i�Z454 3=_o�Bry���k퍻o���*3�ekY���6��2	q�u(���J/sp���ax����i�����c[�a��m��~K�\���1Cp�079�#<w^1�ZaT�z��f��� �L8W:ߔK�"@Q��,�%�PTeC˄I@
(����D�0++KXZ�c�� L
q�U����5��(�����|$U6�Y��E��E��C=�)�
+����a˚��d-�eH��$-,`�����
#<��^�Z���e��.˝��s�E�<��b+a�![GDFcB���犓e*�s�����q�Jx�Y#�r>S|ב�E�#~&����>D� 	�!@QC�쾽WTų�(������^�$J��d��p��3�hI�,��2��pǘ0\!<S���ݘ��Ǘ�⤜7��K���-�݀�*����'�		�H���#(nF�I��*>nU�E���Ϟ�@��贻�_�K��'�T�젧�+B�Bq�4w��8~H*E�N��~#���L���(�er$ ?����y0"��x�U�Ť`�����K��*&�m�M�]��6����v�Y���
+-�
�1Rkjkf(��B·�$@QUg\�+��E�8\E�O��*>�U�Ť��ko��'�(1j3bv�;�
+P,&˽p_�j/����jjc~I�UV0kU�ᥨ�g(&̿*��IC�}+���bC���s�6�6��ZUՆ�#��PT�"��$`(���HQ�PL
+n���ɸ�CL:�[_���OU:n������C�7j%@QUkd�/��E�K4\A�@��*>�U�Ť������Ĥ���x�����Z����9�s(�F�(�j��E]��v��+H�PT�G��*�����Г�1W���*s3��Dl���0���ȸ��(�J��H@4�jO��n[KX֭����jѤ�B#L���,L�]\����z*����y:���6V��&\�%<��}����a��U����*����U-�SӰ��dlg�_�FQ�Y�����a��pme)�~[�BD��n���5�/�A�>#]STu!��6v����u�5Wk�zؼmu�k�*ᚫ�m����O�
+�l=u�-�SP��M��Ԅ��Z
+��zQT/ k�aa��v����-�=���>��s��MRۥ��܄��jd��dAJꄀ���dj1r5�6�[��{a��=�\laom7wtA����-������i�P[���dV�ti=j����F�T��HF9�ol��(��GQ�PL
+J�*�T��w���Z1���RT{g�u.��+��������oW	rE���Y��&�p@�V�ʲ*��!���M���5����Y��������Z ��B�kbOG+AN��'��}��a!lz��^sV�!�������]]]#�+k�k�
+4�"7ח�Fp������$���Y�;8
+7��yi�Ƹ��Z�g� 6���TӤ�d�X�>)u����胿��E�0�u�y�f�`���HJ��o�M�l��*װ��!�a^��qB� �r��QXR�t�D�ܘ�|$s�;�
+*I�V�I}��b�������߹d@N���n0֠P���'�h���T����P:�b����&x����n�J(�ǖ&�e�����0�ޜ�Ϩ6���f��׻J���z�Ƒ����K������Fd�gbC��Wxz�A��m}�p�0w��r���x9@�T�^ZTWT�ԙJdW"�x�th桨����	�F�#"��.kB�ld�]Ѣ��5יR�~���_��\^I��FĨP��w���ҧ[6Z[0둞������ u	郿Ex��p=�����e�)��F�qʫ�YZ���"J>��R��[����4o^�/���\̨*1O~��4�+��1e�@\?���pҩ���y�D�+X'��e��C؞U����1���,ag+��x`��\�pO[�Nx=]V���[X�?bOc�:4�4C�yd/��� �_TmF�yA�_X�Sh�9�{�8�\�Sv�¨�7)1�/��i��T��^�����G�8���N*�T�ɣ�}U.L�I[���nCF���>��w[=ɑ0&-Mg{F%'��˽��o���/��.�9�2��F�����D�G�mm���+���Ծn��b�ujᚫ�V��**���4�O�E���j�����ۇb����% ��S�x��4��V,ao��Qa��A>�p����.l�
+-j+�������sp�J�n�p�H�DU+L�5�ƻIswFS��>݉�
+���9VB�i_�4p�<2��Ɛ�s���F��������B�p7�T�;�77���#��������az�=��6վ�M
8�p�Ɩ ��i�x���*���E�q�h���o�<����x�d�������	3c����Π�����MET}'���y�RT+N��_g����	ws°���'��
+�����ҀԄT�<Z�A���v��G�������f� ��ڀǧ�	s�5WB\*�=s��*�&��N�L[���;b��l��3��4���4w~� _�k��/n�9�c]��Ώ��RM#N%�b����3~�-�����}K�z�k?\>8wN���J��i0����|lڗ��'����;H�B祶�>����#�1�Wm�n=C8�N�����"�_�һ�����j�����D���`��S1߷�CH��*�}���f��+-4��*��ɉ��#F
�ø!��b�+\T|��-:Z�Z�B�F
+U��Z  �c�|p��`7�������s�9��BOģ*k�1��Z8�!:<@x�/&���c[8���R��7><�=z�b�
+M)/;��r��	�F��m��1�YՆza̵M�I�ź���-���5�O�n�9�?�6��=�~�Af\�/_Av>�HƊ�z>��EQ����E�7͟�”��mB��xm%*Uu.�����RT�36Q�B�!��iL0&�8�Mn��V�T*�v^~�=)W�D_'��(z����=IX~R=�\�U�@�:���fr�("=/���O1Xr�H�q�U�27�(ߔ�a
+[�9����Q�3�^���=GB�-��{G>=T�<=�˥ό)Z	]M�|p��Cq�����_�fd'�`��yHF>+����w�E�3*�-�����­ŋ�f^���]aa��}�)���G�:���:����R����)���0�~���xv�;\M�U|THAe�j�$\w����E��9�E�ӱ�����_Ȁ�v��QD���Aaxqv?u�>F][+<��\xnۀgj�@T��YxmU�d�
�h����={��2��R���'���bϫ�i^:Y"4�C�
����aa��o�ď[R��D�]V)�]�I��U�Y]��xQ�BG��;�@�޿���LJ�"���T�8��,��vE�EjU/W�Z�f�)F�ԓ�Im�Q�t� aք)����`�S�5��ٟ�o�d#ވ�\���J�UK7�	�S��O��ԧ~ً�G+�o@|�CT�Vմ�{����w66j �of(�;�T�Mk}}A6�ؚ����DL�`�2[",��M��>�����i��bw6ve�qn0���OQ�P
+Q�K��T�Ɉ��6a��#��h���j��(�="�q�����0�����s�'�z,7�D�������q�ypuD\�V07+vg`KJ�Q�SLT�S�Ďr��{"]�a�T������'�?�f"���%�X�2
š���� (�8���CSS������ta���m�ᬭm0x\$^��?3�Iw\�����$ax����w����(��RT�0�DT���'"1^�.m-~�"�j|9�M�WL�D�KQ	P�]u�je	�@<>w��IPy����H��QE�
+>�����`�mc
��q�+EE�F�F�D5/����aP�e�Y����J
�6QTI�e�uf�M�q]N��2|��8�%W€Vt]� �6�N��ע��v�^���c��Xv��c���GNQ�PQ��‚�Fc~��I4��q�A,N2�!�Ą��})�!�{��D��A��-O���f�;M��軃�D�᡾�}�pLq�ͷ����K�ʐ[Z+؁2/�DUS�����i�8���+�q�L��7
�HT����9JC1Vn:���5_β8�����P��M r�JL�MH�����a�/1i�/EUJ�oCQ�O�k%U�bP�H|4��8w��*�q�a|t���U�)�]��}�jD���"������;�{�.��(�j���#��t��'�.�~ѧ����'������^TP�.� ��Q,��Έ�#EU<c�)���Չ�\ؤ�#]�l���W�-�h��%�Fۦ'����_�U���pST�0�FT����P��Ɍ�}[j�c[>�-F>�Y��$E�"$z/P��Z9bҌxz���.w����j�13��p�zuCj'կ:'��%[re�N��v@c!��o,~-7e	E�WS�X�w��L���v��Ƽ�Ѹɏ��:�K�>x/�����7�x)EU<P���R�*|��(��o�&�f��ǻ{
+p�Z�eb�+�/EU<k����FO�¢����E<n�RPPT]]�1n�(<;��8�M�(Y�-�g��$l��\�,Ջ��^�$y�!|_�S"���z!W��ř�	x~}6r��{�`\w�(�ɾB=D�'��­0`J���ڑ���)��3;��d�*$0y����|�FzW����v	S�RV�B@Qm#a�����;&��W.�:��%��B���ㆡGca��}hQ�v����M9B7�Z�Iu�?E���b|��!���IQm��d�jk��8|W�:#����^>4�`'F*���
+����K�;T!s�(������U1�U�!C���P��`����|�3�&��P���b�+�/EU<l������w�<7�.��U;o/L��I5fS
+v��D���(l�%���X����
+S����g���\M�]Yoj��H��[8�n�jV�F��]�nI]�����6��d���z!tC>QT
�ֶ���
+\1�UɥYK��S���,�5i��V�^���*>�FU+[�FF��k����J<I#� ��ں�K#��X^s�鲔d�}�i��U���W4js�����Y�FS�EU
+�*I��P,^ޝ�E'�A��|Ŀ.���J8�R6Z�r������Z�\STœ���a(��
+�†��W�	A��LI�ocq�\������=���$GQ���:��:���J|��R�UTm=#���.�m���/��s/���|���yc�j+#-��b����겖��s�3�-4UX��^��W��%�����P6�\O�RO��5iH��1��jp`��HQ=�€7Ҋ��̿2���K����`��b��}��PT
89:좴�Z��ū��T��GqdUk���Wg��K\{��u���Q��`)�lס�
+ժ��>�Ǯ������Z|"	ץ#YW��#s��*3��xq���8�u�L�.�U�ᤨ�a(��
+�q0��O1�i���R�8��MG���k�$!S6%O��*���j��{��-�*x�[<:u� ��Z"0b(�q}�2d��]��e�:MB�
+ǻwĨ^;�����_[s�&�OEU|uWY
+UX��a|�V'�QV.���qx1�Ne�?�����u(�nD��-ܝ��l
�>�S����:�_%���*��RT�0�CT���ۮ�{���_Q���\���VԄZ鮅ĄB�})���*'��{��>Ε����)�!��Ax�H��T�E��Ծ�!3/�JE�D`z}�jS)�.;�u%Z�P�(���I-M�(.�BRjv�W�Rky� A�6v�vD��;��uG_W�[Y�f䵪��X�].�:)�$�,�14��>�T�c��	9�y�p��i�
g�բ�E��3��uG��l��{�;clT_\��^��]y�a�r�I��YCQ=s�ߨ_T����s����
���K�>��������8q(_'�!/����~\����tDuV\�JASJT#�ih���`�Nw.L&�~�h4hl֠��	��
(��Cne������o'[8�[����k49�^iJ-�V�a�h<���@��TW��Tv)��U!��M��H��匰��z9���V�k-�X�7� v�a,=^�t	F�3Qբ�����8���T	��v�lck�>Aޘ8��=�s�����"����S�t�g����I]���j��b��Tl-hF��%�$|Av_w�N�aie�>��!��|]1��ָ/����5)ؒ!qmi��.X��(Lwh[`���&���ة3�r$'k�Xi�zM�lei++;�3y#*���m���$t����.���$��)��a�_T��/^�p=n�i-,�-�p�{VR�DV�6cޟ������{�58���ɅؕV
YG?w0�1Q��7�]� =.�����r�����U+���~M�V�3�Z4�գ���9%�����o�;Z���ilF]�2Kk8�^{	�᭿��6.�dJ�9R�/;#�|�TTm5i
+ϥ�����ZTWT	bS�ci�=�%�f!���=����`eaK�w���7D�ap��{��~^u���"���!l��eG���TW�S��ؼ�$v���j��s�s�F�޳��l\q��0��D?7m;���Ś8|�!��[�Um3�2�#����q(_
+���2&��ֺ��V-N�؍��T�����Z��gOâH{�flUnVH����=�HЯ�6��vD_�>��h?�٧��듈��� EU�Z���& ��e��e��x�q�-�ĉ��jk�l<�����������"�D6�ľ�f�B��mMm����!\-��衑�$��E�#g�ǻS]/�%f)�i(/���2�W��$K�g��k"�13J!#}/H(�����c��S5(����)%�;y1%=K��u����xbX��\�o�ϯ��EIR<�_����7�y�jE��1�Na��\�;�}�[��u�Ĕ���Q�pm�q�C��"T�[&��^+�����d{R2K�.�yw>.v����b�Z[�O��Mi5���� �~K8��a~m=�M�WIU8�/��}�\1�����+}���uذ6+�*$ڛ�*�0SQ�p�#�M��o��*�Bߕ�@O,�s������P�T��IX~��5�(i�p�)~2gQ��?^j4��,���S0>|*Í�o��uc5v�JĦ�
+˕�ѹ# 0X��[&���Κ��o+�;�D���f��kƸ�p-��?����uJA�
m�m1��"�����|#�0c��u��䄸y?�(����`{.��*�l�N[oW�pŔ�Cpc�-,�
+��w��*<*)ǽ�^'���rl�v�R*�'S�ضSOh/��{���u8��|1x�mo45������tn!<�;j����aK�|�A讐S��2�����æ�â	��w+l)H�}�R�.�OQ_M(�b�+��9�E�A����}����.��j���Ît�!�x;�S%�T	b���U}�]����*�-q�-���@�sϢ]�y�h���x
+Kw��������UxF�ҫF���N�=�%��:�G�[��Dۂ�c'��oyȮmR�{���Q����@+|�Yw� �/�UU��j���^�S��&H;�Bx>���a���&4 I4&�E_B�HT�p��i|�'{K�����v��B���y�q��-tZ���
O��/�_er��%��I�\�)���?��6anB�O�nr��YS���q.������:l�������KBQ휋>K)���긭���zDDN��ߧz���d�5�������5{rqF�T��*�����-��Z���p<='��Қ�Eev&����o�kd���2����N	E���fB
+Qu��Cw��\�k�/ú�'��H	
+E��2=���A��`�6sf�(ث��
+�V���i�Z5��mB��x��k����=�K���CT*�e�I��R���J`��}�p�Loߩ��ͤ\Ty�8�X��).|l�0�Q���
+����µ��U����D��›ю�>��x2�o*@��[TU��EUCeD�5��?3/M�}�(1<�۷����%��ըi4����cȵ��*��l��(�2g^�oK� '1�|����i�;���ᖿ
���+-�V;
+���c�b��Y�^d٪$�L�@�׍b�*����Q��W�:[t8O���<۲�!�M8����5�b��h_�Նb|��8�M����α�qB�02��
��d��7dC�K�%��Q����B����lH>�G����&"����!�~�Nx�,�P��TSV�ڏe"��-:EU|���a������/���m5�Ws�,���U"]��(� AQOY.Qu6��	���
�8��(��#�"]�.�A���G`N�� Ċ��|j*nT����fK5��<[Jj�g�
+mj3�^�?3�j�i������s�/�-8�=��-D�y�&�άEUS[��V�cMV�q%���غ`�u��P��6��WKv�KѷU1�h<7Z�.��5ظ��8]�%nOw�\������5�2�����魻p��j��)�����j �?wSVT[i�1��ƫ�<���*Q�� ;%K肗�'KQd��.rٶ���F����5F_3{r���4 v�Q|�G1�H1�B��
�h�j�a����>�=��R�_6�''jQ���V6�
�3sb�����O����Bo6*��E�$!On�A��+�Ek��Z_�U�c��)u
���/����Mصq/�8&n�6<��X\�`�˜����bY����$i��{�(��)@��8��9x��x�j�ݽ���������U��ʋjknm5>�O� E.p��a��z�H���?�!�I�O��͍���*��,����3B� _�8��Q,�S��,� ��n�q�d<�T�4H;�~)@�*�\l1b�H�1�[�ވ��xtI
��kLQՖfa�$����;
��a3U
�oߋ��V��G���:/�+1ܸ�)�X�]R�/�F���%^�|I��:��I��l1�\�w��&J��C�z���>َO��R�k(�=3�i�jO��[oQm͑
�x�kFa��r�9u�B̺��2l�5�Nס�F
�(/,
E�B�|�^T0z�H�}���c,��&��5�����Զ`����ݴ�]���4�xf�qUIw߶P]����=8�(1������~L׿��h�������H%�OS�.�3^�I�{(V�8k�w�y��f��~��.W��Z����xsn?_p&���,�����l�i�_���+��{9�7V(;¯��݆���� PW��Ծx��-�Ǐ��ch�ٌ��
�WOT[�fwgGL�1��t��R_c=R1t
r�.HJ���yUCcz~?�E���?9��
��.�_��g%�;�N�wjU/\1}4����a�:�]y�eT+2�nA�l+[����[C���jI�i���~*�{�㈪��G��Og�b���BIQ팊�ˬ������>��~m�� ��fq�����I
+������)H20���v�̛��pEL��ij78~�?���)�7D���,[v��Kd������n\Q�+�V�:<�"���h�H���~�a>�_w�bcB!N��}ʆ���ήmO�E�>l(�������m������j�/���ڟ�\T-�ñ�ށ���Eal��T�"�荛����?L�6/	7�����F��B��4�����Yd܅�)��Ꟃ�+fΌ�]��Ӑ�g�9�X�۷�+z<���K�D�ī?�܉���_�}�-1dT^���2-�����j��(E�}�{OQ5��ٽT!�����g����[W����O~���
+����þ�@�(����yS�0��RU����1��U0��λ�ZT��7b$�{�y���+��`E����.�������&��	��������CTӅQ��ٕ�������'�������?k�����O���z�a���I����+򵉦�4�k�	�T���_`-���3�p�"��M8��^����я)��O��ST
�vv/5�jk�,���↙3���.��0�nߖba��I؜o�;���:iE�����۱EoU'<��u��U�𑫿J�fQ����Ɲ��4�;�9K���ݻ��6�!x���N�:�mD�o��쁚�3���E��+�؋�?ъ�-��?�IDAT�I)Է��j��X������yAS�M_���
���	�?�E�H�e;�?hpӡ��tƵ7���\�6�'ඕYvϡ���U1�&�me���FXT���
+��k;�������r�I�<]�#5�RT�UJQ
��׮�0�����g���
9��A��,�.Ax��(�V�H[�ᅬ���8�hw����R|-�Iޞݸ}GUw��h�ҢZ��6�A�)�m��Z�(�=3�g�P�~[����)Gxf���X�-�z��"xV��W��ׅ�5�a���X�����t�����s~�|�O��%��g�(�a�`'��8���VQ=[���ⲑ!�j�/BMy*��J���1|q���	LQ����ds)EuȬX2^��̨����o�pC��-R���b��axyV�<d+�����)���T�2A��7Z����@�|�\�����⬬�6����8Sh�9_�yGQ5��$�Xc��X4T���b�੟�P�g��Gc��~P�ڭ9�(n�*W�϶td��7��$��+d�\w��>��y��*>"U1�-�m%�ǠP����vWn*���K����n8���jQ���EU|�U[\5�R<�Ls*��S�hU
+b�.>�UG�p�4<�D�wvl�ò��(_e�O��
>>7��{��\|��Ql�cpHEE�2�mL����t��DQ���|&L���e>ۄ�e9�G��OT-=p�p�`{��6#y�!<�{���e�i�0�)1��l9�W��&�Z5)����v���Ca��տ
+�bg/̽|f��)4��P��E�rb��1�1�Y
+vP��v��I%��a���pD*Ҡڌm+�⟙F�s�ڳ[�VT]pϣSq���^�RЖa���!����m[g�q�4��/��&�X�uk���S��k%E�%#s��#�e0�EՈ1�?	��r�}�߂�x< <;R�OYm���#ј%�G����X��ź!�S��u>�x�<'������wn5d^`����ST�04)Q�����<��cj�le�f&�o��j*���O,W��
+E��H�P*Qu>���^G7lcMI6>X� �e��UT��Z�=���
���D��p��jWg{9�[&�Ar�FlĶ�;��dݻ�+)�yq��?�8�fg\ջ��j��L���{�~׾��1ܳ&[�� ��L�Z+��:�}���&�;מ����X3W��҅�����
?�0�"E�}�{OQ5��ٽLQTϗ��F��ĨP�
+��ܗF�+���"|�2zn��*>fR��K�xl��%�M������?��s�Ԏ!Q���4������"i�.<z�ƀk��0���c�Nj���M�,����[�j�
+EU[��?���P�ӌ���K�������峼d�3�"��^���z��B?��&��?��?=�dU��X:7a
+\��'����\PT�Wa����-����
C�1��A��g:S�h�N��u)�Y(o�����쾒���;.�t^���
+��]{p�N}G��ʠT)����,�Vb4�l�4���	fP�z�I��V���Ġ���^�����jlQm:��߉�aC�-��8;ST���ϣ�DG���d���b��xf��dB����x��ld1�=�O�6�y�~�����g�8���&Eՠ�^�E�z~0Q���v6�dz3�1���$.��b��98&�3iU=O�N6�DT{q�\&��T���Ç�j;)�
+�RT-1���!J�K#�D=�/#TJ������K��_v�Q=�LT��o���^PT娙V�8k�w������s�
y�O�rw����Q����ePQ�Ǭ���sQN
+�T�
+���tS��
+�n�o*���.�7��r=�?[�(���}�,���C���$�me�v��Ԩ`���>6m�U��	�6��	��v�����$���K�!J [z
+�	���7�/�")�RTp˽3p_���a3:����T�ۡ�>�D�./��t�l�qa����32�_�`�󠿨
+C��1�S�_>�p7V��A��.;�^�ţ5�i�^|pB�[hU񡧨�ah��z������'�E�2=-
EC>}��]������{I"�>��p��OX����Dܲ<�2�/y�*U��~x�!���W�5��Ȏݏ�~*ӹZ1Q���sCEU�
+���T}���Ϳ����exo��λo:�/@�;|�%X���֙��^1
��9���I
+�"�v`Q"E�#�?ST�06_Qm���{D���z�U����C��21����7M��ST���Ŧ����`|�@tq�kPx,�m��v��gJ*U��#�tv)1p���z��Z�'�`��B�z{O1Q-��sK)��TP�j{�����k�;�2�����;���|��V�������X|o��:s2ޟ���-8�~^:NQ��&v�,E�8=�2Q��0���o<re\� � y=�︁��7�{	u�H�*��j�w8�.������B-~Z�$��<'*U��h|�7?(q����r��(I��]_�B�οJ��&/
/.?��lQ� b}����^Qu�]�N�򏤄�|�m<~6UQ�1�L��!�Ob7mó��Fή���9��ST
�vv�^#�A�prǤ���=�F���y��TZ��t.p(�bΒ���UkDN���y��DS��s�M���V�*U���Xu�ؠ*���6-ʲ��/����R�ڒ��WW��`J��-5�j���jջ����%���t,ݘ�m�ɘ�{��ic���ސ��4���jEU��&�m��<00r��
+%&�h;n���
����w���~RT�%��JѢj�[o�‚p�ŧ�o�s;u���7R��z����Wz(�+Kf�f��E)G��3:OHQ��p0%y�ꔪzE��>6�* ���3�w�-�)ݔ=\AT'��S��G��?�8�i+�f��y������A�[E�����-�B��Е�0�E����'���S���K��*�,9��hQ���}w��-J� �T�7�;LQ�,�������^��e��Nš+��a���rY���=z�/��P(�]����*���}U+��^x���Z�Q������{����2`޾��v���(�RP4,
��a���՛E�,�`��A�i��
+ZW���{��]/�t�>EU7N�m%^T}�нc0�_�/Z�T �jE���RT;�bb˴8�}'ܫ��UyBLQ���N��VTm����1C����H���@'�Jn��w�h���QT��Ǣ�^�C�OտxY�`����{F��ڸ�ř�<�!g�e�[ST�ţ�JѢj�'�k�t:��������X�jg�ՠ)S��%
+�
+t�O.놀����t��GQ���UU���ZQu�>2�Ŗ���
����Up�m�^{|�)�����x쐾��8����@QÐ�ڎ��#�<|�̽C)�ͭv����:�}��Sڎ+�LQ5�]۞R��3��U�m)���&�~x�;���Y�1i>�:����d��=��	4c��mx=��ڑ�ҟ)�Jow<Պ� _����2+�[3U������e
+�J�u9��T�U�U��*�!E�=Kk����}�#0í�:�>j���8��P�Γ���5�jO�z^/��>���R���<��^��ŁչE������F�?�ř��	4��v���c�j�D
]KQ5����VT���c#1Y�V„����XS6�C����G#1^��-�܆'��eEQ�1>RT
�vn��9��p³w�����\�xs�J6�E����A
+Q}A�qz��7N��daѧ	إ�O�Ad$�Iu-�V�<w:�j���5�d����j���н�	EU�J@Q���N��VT�|��c������p���x�r#����A���;w��>ST�G��*�!E�kz��x�H�p�z����5��W���Xwy��vGG�u&%�B��B�*��v[�[T-1v�t�)���N2�E�h�J��/�Q��F�QT;���#EU"��$�ZQ���cOL�l.�rb�a��e�u?3$��svz�'��iB8=�0
+d	�-;��%�U�U1q��vC��~�!X8 ��~��C>45ؼ���$M�M�j�|4)Q�Q](<�ʮ��ZgQ"�������}��LrQw���
�Vu��E�(�!�dEU��%�ZQ�r���ŝk���z/AT���k3| ��Z�	�>�yT���QTu���&�.ќ]aa�A����%PvH-�~�{?(ͷ/E��8�Z
+Q}��1�R���ਿ]GTQ�;}���D_����5�޻wn�a"�v�RT����-EUB��&�^Qu�ݏM����H����S�U)���K�%���^2�N��_������Y��X�$��M3�h��Q�K9���˅"��-���c�0G�,U*�0u͍�'���V:l,�&��bޯ���/EU|\�է�k���<���[Q�?�f�A��o��0W]H��7��ˇ��%��^HQ�OU�H�E���²�	�\n�@��"��eS��D~dZpx�v<�fQm.ŧ�ݏUf�����9���/U���Fʀ5������c����\�s����$�(;���7U�ѝ�Q
+Q}��1���\��i*���<���CT��Nš+����,�\�)��3X�!�O�7 E�S��RTE#4<5��OÝJ��U�a�#��TE��iX<N�{�ػn;&6�Y�LI[�e���\��YHy7���c���l�Gg���Ju�n��S��]a��k�_$���W���d(��J!���;s����Z���;�(�����vF�d�i3�b��\���*@Q�'�Uy�ꔪzE���;�)���K��zS�k/��QJ��R�_W���zL>}�*(�����w�k3kQ��\��\�?j�c1w�B�l��N�ӊn���/Q��VQ��_��'9�;�RT��Ѣj�{D�>�?��M)�}o?�ԉ/�b)�nz�#z�^�)��)m#RO�Al��׋b���@��zd��b��
+�;�EU�8�O��ڞ����,�7�>�W������=Xe��j�I7_�7+�W���7IJ�=k�n�c2�D,���ǻ𕙉���aXrS_��難9~s�A�qX{�*��c�B�M���J��h-_~�r;gQT����?^j4��|�/ZT����������ξ-���P��گBQu9���ڶ�V@	V��a�o���*��/K����$(�򄙢*W�RU��:���c�h��w�j�⣝XY�2Umd�'O͎���Lsq>�t?��{A�9�&ᑁ�_�����?����u�u������@��I8��7)s!AQU ���E�1���"L�{K�-��+��_��~�\\.��^�D�%�EU8�g�8����Ox�Eʼnx,X��
+}j��U(�n���b�?�dg�E��=x`��ZeϘ���*O()��p�)U������w����N%�Q����1��Cg�k?h8>�9��{*�0�,�����7M�c�L�؀����{�����tz��1kn�Wdꐪc�p�F��^2���=p˝q�����D�TZT��X�Ǻ�B�2
��%���2P�Dl�BQu2�(ܘR�:�̾��m���VPA��/U�x�5EUWR2l�^Q
+�9��?:�d(��IjQx�^Z�.<;aZ/��c�n�/�xB�����C	���A���>��pV`
+-r�%्��1�Pv�[���W{�������g�:�*��?�l�M�B =!�&E�4Q��Ύ������zw�a;D�
+��	�����CH!���f��7	�4��7�^�����23o��}o�����3)��{��!�p�����Ka4� �p�����\�{���,�}���	�*\G���Ae����w�GR��y���!��$0�n
+�t;��j}�1�r@ �:h�FY��LZ'��֐1���D��ol�B��5�x����[ף�a�o����5)'�r��Jp��<g*[�7��������]�nU4V�P��D}f
+V� U���~�!jJ,���B��\��}��)C۰!�[(���h{���<
+;����%�R��_���v�M��(F�p���z�L<��>Q��;��,A:�Z1"��*;�D�\5*��D��:=�!�i��h+��7������	�,�ƒa�$Zߙ����f���o"qP>[�	��7�8������ln�2�}���Ac†4�:������\l�5�:�F)��?�zx�Y�Q�‘�x���DC ���#D�)��PJ}Vٱ$�qH�o���iY'��q���0�_v��	�}z3�[K�GDr���#f�����F�r��;b��h�@��)��'���GL���?�X�y�ux{2v�舏�?�{lB؟�%z/C��t<�TO' �Fo��⣵~���0Y��p���t�h
+DUw�`;��3������U"7)	nջEQ�B0BTm<�im�9�a�Ҝܽ�2��o>�%p��!f�L�'a���˒�'�f����Ph�!Uv�!UvpըTNU�Ǩ��r��0�JT���Ο)mˡ�t�Jd��0�{�l�J�Խ�<��o>�u-O�=�(:��g��=��Q�
+�Wē@T*�S�hÑ_�����Q���b?�sӓ0�����<�����B�Q0%N	�7�����+�U��-���$l�:"����s��D=i�9�����R�����|0��_W�pD�-�*;�jT*׉�țD��R���3X�q�Qm5���DVXu���*�����l��*][A���x&а����^������]�֘�����ի�0���5VZ���m:�V�d��^��s��>�q����;����4C����*`3	�-��?A
\ɑt�z����w-}�r���������1���ux�_�������Jc���*;"�*;�jT*׉*\���=!K��7�oO�Z�t�D4p"K7l!�w�R!~
+�e�џ��.�:����Gb0��z��*�&�}	Md�F���w�T�F�*���!k����r�-�Q�1z驹���+�G���-[�U��qصԅ�>�ݰuV�m����3����.G��::����]Cԝ�[r=��w�kQ�X�BAj�ʎD�\5*��D�l�2�xn4�E����p2�F�[�
��T;*�jBՀ�l;�}u:�OUk"Yo|��1�ˏ�o��^%�ö�N�[�~	-�����Q��l�5��l���"T\C�������������Ga�N�8��w�&ա��3�j4��?��$J22�Jb5j�FҰw9KT%X�v6�k��O|t-z�++IN>] ��E ���Q��'��뤩�j����]�����#��.)����t"������e⤞^��d��n*��P�����|������G�w$��ԙ�e-�_uu���g��r4�W{�sDUs���$��L���3�)�Y���;�M��-a�UwW,��G|(}���5�ᾝ%(j�
��!�r���":~���	*FU�#{Q�	�%�Y���
)@n?[ ���G ���Q�| ��c#�m�7<X��WCց�w�ۥJ��3D"��x��&g:�T����,l�[���"���n:덯�EQ��w^����_����B|�����f�PcҊϾJ�μ6z��DTmm�a'��cRn=�m���SV�Ƌ�4�+�ػ#�J���Q�V��{�F[8o��X���D���b�:��%�CK�'�Ge�E�'�‡�3�u����=�~�_�t@ �,�I�| ��a�=���M��FVU�'>����e1^��7�Y�9�f�;���x�PF�mz���{G!��G�����b<�qRx�TM\��ϻ�b����jly#�4�È���ŽuA�Qv #��O�!�F��Kc��f�����Xd����x�t���Yt�j;�x�>��_�3��Z�����FW8��\��Պ�?����۸�=��������4&���"�)�X��-WO���D@���	� ��:04.󂨒��Qo��q�"ʐp0�>UDZ���3����6t�*Q+`G
��_
+��g@ܱ~iV�5^�x{a6�)F6Ǘ�8z�ۣ������l��x��d��VÆ��b����G�Uw�B[]v��7�d��=����a"Sx�����\`AA
kSOa�/ud�c��h�/	Q�.�?��	7��|�?O�d
+e�e��y�:�+&�.U�P��q�}�+�-{P�!q_
+^�hm=��˯@Tّ�@T��U�R�BT�G�a�mcA����|S��r�t�b�{���{�Ea�أ<��Ұ�TrZ��<a:v�h�S<�_r��ߙ5��(Y5vu���c��/-%�
�����ìz0��ٻࡏ�Q�`��0�_��.䧜Ç�-��oA)llhD�������[��Ҥ�܃���)f^JZDu����A�xhQ%���e�L<�A�Ok*��3_!�k�x8NT��B��� ��3��n�_{��k�)Y����	T5u�7�iX ��|u�O#U�1c,?�����X�n*��Y�J�G˜J�_�q��4�Ś�&�^/�~�
+)�I«n�c��z�����ȴ�dz�#�8�g�����
�2�Q��oյ?yvl?�ϫ�]�s0,���F��\0�LG�;\��.�43����mp�hl�cf�1�JU�������yf6��CT;������2�%Q<�c��bw
+A��iU�A.���+�Q�%��U[aβIxf,������_�;�O/�r�e����92C||n��A�O���İ�m��G<�
+D�! u)�?D����F���4�(eHڟ��Ӛ
�>D>7-���B���eR���]��0��7�����R[o���P����[��#��-	��q�L���g��+WZ/d��o.Ӌ��S��@T�l��n2���Ө�~Uh��š�K��D�)��ju�����Gc�lw8]���AM>�0����U�N����j���)Q��^|<S�y��[W�W�2;�M(Ar��^����f�n�­~,�FuT��R���ڇ�`�����Z�x�Zj�c�Y����jd$����x4�VD��uE����6`�.ա^>��	DUw����'�
+���h4&Sݱ�?�=�Y͆Y�jb��$��3������������PB#��sE�t^�4�ܞ�v]���-ś��V�}����Tm�Lage��3#�H�5�Y�]3R�?���0c��Y}������x�G/YK=~;��/�O}U�p�#XYc܄Hl�l���X<��c��$�:3t��
+���x~g>�hZ��JTEv�iA4���Y�듴���%�}��b�������5k�c��ƙtK�Q�rwƼ��x�M�G�Kނ�b{N;��8�7���l�`�8���{,C������P��(��h0w,U�Ժ$^U2{�7��Q�,Bр�����&��U�
f�
+��Iv�>�R�'?�Gz
�
+�ѡxiE�J�ȫ�ق#'�p��%M�fp����o{̙�ɎZ���n
3���]�8YKs��]7�U����Ѻ���ۚq��E$T����9�G7FV��ń�!X3ZB�_U��N�SI
�
��U��
�x��Y�dvo���D����5_����[��ݎZ|z��{���������3b�p0�/�D�'��;['�ITv�2H�J��g�_��q�2\�zW�c��p��јf����cU����ET��E�@TفY ���Q��"��E"w?��r,��h�<������|�H��?��+���(��׽1׺>%u!�H^;Z
v�Xb�_��_C3ի͖�6#�|�/őr�|� �>������.�ꂱ��P�?.u!;1(�?�|��DU����� Fҧ]ڞv�p���ʄINYt0��зB�����0o�c��S���t��/gۘ� �FT�K�؛gqV �}k�s��>�}�"�_W!��'/��r.a�y��[�]W�P'&�0���F���I��*`b�'��\��{���P���ン�eջ���m1~���q�[�
�	�#c�1<a�����Kf
+D�A0�-�oDU=�r�Tl�jEy�_��eyE��P1�Ww��q��/4�g�c�à=��b�.}k9^� �Z�˦yjsDD�����1x-��v\�܈̂
+�JfݫJH;:S�	�&"���1m��{�"��
+bn��k(����w�!�P�ּ&�b���Ƕ�v���+䝨�kA���O)Cn��.%ډ.�F���`"2������0=��61�>�ɰCx�X5���E��*��'����bT6[T���k�8|��lyt��1���e���d~,hC�\��D�1y猈�h@ ��ɞ�t=��$� ���4/�1��Բ�\�Sg����zT�HHMuD0�!�XPW��@��9$t���l�4L�iТ�Q�,-�
+DU��N�?�
+8z�c��1X6����X^g~�)�UHQR˔��|�,���&ؑdž�S��g'�1q��Ğq�����1�F�^�P��hkn������H��`�R�K��
+F0Q����gb|�J����pC�œ�`E�)G[Hڡ����x#�U��X�L>U<�.
+�Y��V�Յ��fd�W"�R��zwE��&R�P��dbE���9'�Vi"���3&��!�I	�@�B�:*��ۧq��ݿ�UBk
+O��C��fJ<'�����x��A	/
�Z}_$��P*Gk�9���sxX���7��C�p6�+�7Q%�Jܰq]����$�%m�|�TҎN�R\���g�j3cX�;bь@L �S�P"��c�Qނ2z��
+^Q��6�\�*#0�V�*`������
Π���$�FU5���GYsR�U�\s����X���3�]0ʚ�[�
��H~��OFc&P������	��:���:��iU�O1R�����/|��CYS��񘨊=C��}^wG�PA��	�������dޯ'���z�3\S��(��4�0兙X�y9�m�U�_Ȅ�t�m�!o(�J���p���m�jnD2��j�5��0�x���a��%l
�ac��B��0|�ڃ���Pv�bq
2K�P�!Cuc;Rsj��s_�_[_�:Z��RGG{��kk��&M�x�gq�r�.��j)|
�DUC��H�O�J����������_��R������%�8ZԌ�&���/r#2���5�Ǻ"�ٚW�C��)̸@x�������C���\<p�H�2�f�l�K�*������:��2�Z�Uk��c����!�9SL[
>�2�.�2�7t+D��{�7�m5��w�f�bMh�����.�*i��-�g2ֺp��g�+��"C}�͝J�����x.ȉG�ګAdb	q�737����\�a����,1o�le���`�wv���
�DN]]
+to9�m�u�
+�IWcLdea&���1Y�CdF\���̞1q϶������a�l9��O�{)�T=��:���w] ���Wn�U�j�K��A��Ob� U�$&1s���䪫�7�z��'Vw��]�[�8�N��#?U�<+��"zFF��^�4�!Y���:OMr26��!��~{#�S����g�G�������_�J�:�G���}��7{��PT8��a<�������D���;C����h8��)�J���o���	��W��Q5".�*�\�?)@N��,��@T�R�A3DuPhؿ�g�
+3K����[$���s��Ec!��,ƥ������	����-�&�?"}�2R���[v�"���E���K�*¸E3�5�\�w4sO2YA&��
+E��螚�~C�*�[T��G^�����!����=���;,�*i
+�|��l�bu}��3f`��^	b����(M1��JS +!�'6h�>�D=������jL�]�5QU�df��k&�>C���&1�l�����-O��~���R�����3mr	iuB@ٌ/??�����YO>U{�{`V9�2�fTUx��b*�]��S�wv��z����׉x)��r��BT���ݼ����X�L���_i��F������1�n!L*k�3������n}׻:Q�s�QeK�K�=Q%-�!�D+��`�Z#��
+��rϤ���^A��
+��x�V�n�uQ�]?9N�����3�<P���:���㛜a%�������H�
+؝ 1�C\��f`Yek���y�jd��_zU���'*/-����{�ER��*y���VD`�� 4�%�…_��LZZ(|w���d�I)Um�b8�p �Ĭ��`lZ=
+��3��S���1<�ފ�~���6����xc��0[������*䴰��]��Q�s²qx$XX����KS�5������]� �uG©��S�<#�cy}��"�jy�w�8l�jOV�
+�#�QU���/�O��i���q�X)P�\�7?9�_X)��B�z��D�1(�/hxUu��>>
+��s�1���s&��<�\�y�-����7�����)d��S�9����9�C��i�xFTMɖ4��w������I�Y�����!���
+��<�6����C�8��������#�DD�X�<��1&(�~-X"��j�����A���1���H�1
�g��"�6���#T�����F���n��,���Y�#�o(d�ex�s8P�r�9T%�gd�
�Ga��Z4�:�\"���%B��u��r>Uc[�8;
+�&X	�j
բ��/��S'HB��¶xLW�:�z8
��5��8�Ñ�=2�s��Q���䂆J��d,Us@Dd�X�oa�N3
�^���g�x3���Q�Lڦ����1�~xU50昱0���� z"�.���Ǐ��"�תk�MwDb����&:�Py>�9P��DA��򉨚�b�q�*l����
+����8���o�ڸN���f*`�eٹx�P��u�����Ô��Q����C��`�}��O��JT	f����F[B�e��N(�s2O�Z
6W�DUYh�F ��c�X��GT��H0}��+�UNm�ʘ�t/HUW��{s�{ˁ?t�╜Fv�xrm��ߩg���]��ә�g�e\h�Z�zՇ7D��S#��
.��U}�p`Z���OEH3���F�a�WX�ңj��7� ��-�-(a"��0&�j-r���}+"q���
�Ri{�m�������~ؼ"����Vp�o-��v]ĉ2�ܛ�ʎ^	D�\5*uxUu��1mA��*��WU�����&��p���(����X�.�e��~�R�>��w�U�"+>��B�D�!�V�����Y�f��T*4�ec�d�;{c���t�����q�d4������|�N�E���DU
���Э�dk���W]@��vW��o^\�(�g���F*=��G����@Tّ�@T��U�R�/QU7��f�c�dWx��E�J���Îcq���i��+�.ŚPK�������&b�9\���P���u��Z���G�+(��$GNz>���� !v�l�Ʌ)J��|[\F��itkU5־~�˼�X�6�?��Đ�(Uu=$>~xx�(����{7$2��B!���j@��h���#��7QUCd�с�XC6�<"é�p�`v4��c��4V`k�uMp06/r��ƙF^���l�u�G�3��_�*�И�|��� ��~t6a�w�q����פ��	u�-<�f`��Py������WFQU���j�1�b�|���i�(�(U�S-��B����d[aˡ~r�D����~�	�U칛�~�3rA ����[!ß��q���	�Y]Jf�<v�MP:�R���Og�Y���p����b�y�%��)��n���q*!���p�|0���>o���$f�
+����~����U)� �.ö}9H"��ZjI��W���g`��!�
+9v��;9�`d��DTՒ�47EȄ�0�6�co��ӱ�j��\Fc�B_��
+�Sc��R�/���[����C������x�fD�%�
n��e�<0j8��P�Q�[�/��py'kk!��=]�:�`��@��v��H�Su���yWr1��3����
Q���fvX:=7E�"`8�#��<СBڊ��"��8��=��
�����m��S�V�~~��mjO]GQ��l��	�ꉾ��4�;�E���@D�j�`��[��~2�
+#vɱ\�sJ��|j�!�����e2��j	��GQ�N��E>|�-|�ma#�(�6D�ąZ42�(�*��c��pB0�z���0*4W�a;���rJ6ZV��D���bww�	��m�\�m>�,*9
+ɚ���� ����$b�\��!�K���C�8S��5#���_6#x{9#f�/V�s��[U�p>�����r�aP���0Gl�3&��E��9�0t�8�{���lA=J)��	D�G����*�xjU�H$�j�D��r kW�c��	�݁U�V>��o�������J������st���1e��W�5ر/i�-���2z
+�c�����5|"�ⱉ�p�F/����%�P֌�=�p�W����E��^%�e���w���o���#��v���^�vX�h,����n�jgC�,@Z�)f̋�#��v���
+���xly"���	%ꊋ�=�YMm(k`+�����@T�F�;Q�==�T�����>��f�ƻK ���3��|�{NW��]9ϗ���E�_Ħ��U��p6�p3n�]���ő��i~:���4���)�Q��b��,1uJ��qF���ey�JщKŕ���8P���K�,�Re�Jn,�[@�����͵ʩS���J���&9��t��#c���i���mKN�U�hjDbj>J�G��ݱ����"p�H"�j��o�Hא`���87���z��
+��m�.����R$]�AJ�l�?�����@T��U�R]���o�ƲeS�Yܳ�����5z�DF�E%�q>��
v���	�jQuv����EuHϯDz�c�I�\3�Wd�8"���6\�� տ�M��H�؄��
+�|�	L��\86D���v��pO���ϊ�z�\K���zd�_¾<Y���P��1d�%�Ζ���R���a����<�@T�(���~�↩�v���e�/� ��	)�8�����ă��p�ˎ��p��#�k�d�q�7�:c\�=|�x�e4�=��Y[+���Wӄ��%Hmc�d����~�
��2QFM���f�Hr�Ո��*)<�-�^Z����53����P�&=
w�X����`�
}������xaA�ܸ`Q)PUZ���(l��R!Y��ր������!�֖�¬Qvpfy"F�*w�����/$����g��*�����MS��ek��:����KTa0���������8��}�(em8M��%�4��I���-���7��,���3Gc)qe������X%�J�P�\��K�b��qϲQv�,V�,�Q�	��Y����aޘK��*0�����^āKR�5�#�x ��;�ΕѸ3�I=��(Z���w2q��e������Y��f7,"|V"�.�"Λ���W��K�hjmE�5��t��}����0��P�ME9��y!�P�Aj���ԉ���L�İ��c5S)�!�Ds���S�~�bock��,M�+�r4�w����=f?d��lo����<1��^6���`�j����w���S�q����tv��U����P,��bj��HXx�����J��"Ve8T���S)��wu���	)���[n��]�n�1�6���1P
+#�"gmm���%GC���;�\f�/�����Q~�d+SX��7(S� '��@_g�K�}v��r�&C=G�L+���
+�a!x|�|�Ϩn���&�D���H(����S��&.�Dgl�7Ȍi`��S�oLC��������bc��x`n�"]-�`aB�6,�g����ddYF#N�_$�eh�u��Y���*���.�ILa��ĕ���J�[�-2�g�S[sX�%す��@�
��mʆ�z��c��A�D'qߕJ�(&�}�5(mS�����6��Sr]U:11���ب��,���Ș����eD��T��#���������.��@�IDAT��$E�ǿ�p�{9�.qG�
+J̠�b��O��F�O�O�>#>ETTr�s�p�%.��q{�{{�{��u=5�=;��3�=3��������U�W�类u����)t$�r555R[3J&7˛�.�'7Ȥ�:i���Ɔz���ѵ��N�45�IM����H{�N�ݱC�wu˖m=��{�tum���m�����G�H���ݱS��"@�����s���'��I�2�I�nl�LlҺD}�Zv������+[;���nik�U6�m��g:z���:6\U�ר��������{��9���{o��F��4Z������#[ۻ���[�vn�����ҥ���wH��jd��5�V�P޸��m��2�N�Ԏ�n���,���٥�v����ikk��_X)z�U�T�,,e�1j���guu�����]���q�e����Z��qu�dT���k�P�^i��+ۻ�w�e���m]]�~��힥r�K�ҽ�mt�!G���ߪ�+G��4s�LU�8��mxC�hm�k�����J�E?#���Z_�=�&k��C�]���:ަ��
����'Wɽk�i�K-����߹��jã(T���+�ൣU�L�"G�:F
�H��@A��r�q�t�⳷�M���KҢ�լt#N�N��o��5��5x��5R_� Б��o��e}���4�N5�=��uj�׮
�U�Nmض�쐞�^���C��ꥫ���L�/.3�J����Q��4}x2v�v��pϩq� :�5��l�}��s�>�҇ ����9�{��l׿�����K[[���_��T�z�3US�(���,�#�X+�*H`���m�KrǓ��}����(}P4c�.r�t�h�U�꿯z�Ƕ#�w���&�=�*��$���u�Q�8v�L�0E����D-�m���j�����=vbT�d������6uKG������S�(T+�vY6     (C�eXi�2	��	��	��	��	��	T2
+�J�]��H�H�H�H�H�ʐ��jV�L$@$@$@$@$@�L�B��k�e#     �2$@�Z���,��	��	��	��	��	�@%�P���e�H�H�H�H�H�H�	P��a�1�$@$@$@$@$@$P�(T+�vY6     (C�eXi�2	��	��	��	��	��	T2
+�J�]��H�H�H�H�H�ʐ��jV�L$@$@$@$@$@�L�B��k�e#     �2$@�Z���,��	��	��	�O`|c��p�.2N��_�$��h����%H
��MMU�hF(TG?/N$@$@$P
+:�52e\Ct��~w�����h� ��5j�4��&�c�N���M�7������4�.+K�;v���Yq�Y�#˟W'  (���򺬳���e��k�̊�	������=���MjT��rk6w�;.�%���K������'_�2���[�+�_._�DAyd���P-=c^�H�H�F��F@�/�̙,��5�d�yv�K�����iv�&��e�*bD�N;���Y̯{t�|�f�
�Fp�jds���4�G��؃�?y�L��+)�ݻC횤]ŕ���?t��1kbb^���ٿ�;q#������3�I�H�
+$p�>��W.����)Z�߱c������m��KZ���~�"7�1&�M[��	혁3����纲g�ў��-T�r�2��5#7���/�����` j�E��]^�u�4��W>����rnnWm�+�}�"f�嬖p1��y�('�K�Ȇ*TK��mʇO�;���XF,�Bu����$@$@����'��p�˵�M߼^ڶu��]��-�._xˁ2�i��x��7��͝>.m\}�I�8:��~�������Otg�pg�ޓo�{s$�X}h���-����+[�K�=([:92<h��x`��ff̚�$��j�&���G��&W��
+U����~�M's���	cF˧ް�{���R��Bz�jz�9! ���3'����Xlᛧ�&�ض��* %:������Ad��n�ί�G�o*{d.�*M�4����h�~���e�v��`�I_��ȡd�N=���'��]��g~�f�(�K/�����yS�b����{�O�:}%�B�aH��jj��! �8v��r����w�>�g�A�I�$�1�Q*���N���^=[/����]~��ĉQh��j�[E��^*��s��ڋ��P��C�˫��i�"�kW<,7?�:�f�8|��:Y<BB�A����Ǝ���֬#c������
+���u�d���<�)u�K׷�~t�m�O����É�Bu8i�Z����$@$@)!�w�>q�Qn~p�S���(�
+�|�n�c��J�m{��q�M9�?�VW�<כ��x�S�{^���@q�I��%��Gu�wz0�ۣ��'�Xg�>���#vo��O��.yB��%���L��p�i�U��d���=5�פPn�	��	�@QT�.�1A^w�\9x�4jt���55n�Sնtv�ʍ[�;�x\Vmj��H|�a߹��8?Сb�GVe������^�P͜�S,�ԙ0���{l�2g����ʬIc��s/�G~��i�_~��r̾�bJ8�ww>/?�)y$���f�q�͖]u�:†w@�	�"L����]Ϭ������_���$s����޿L�i��<O��k����n���X�
+1�a����tY\g�������ԪV7:�#��)�u�0�=��E���v����nOё{�~l��}�����3x���ݧ�����LG�����s{�z��䗻P�2��ï����6�k����ϋ����^'���O���Z���~�Ľ����c�t�
[:�'�h&D:�������X0��%�{���q�~R�L��&o���yY��g���S�M�͗yzΙz��|������r�ë4��3c����/�P��P�����Ø����jK����O�1}������*@�#�C��R�?�̕�P��eyH�H�J*Tщ��}���9�8.tf�}d�|�o��]�Q�xzl�W����D]>�_zX����!�Ͽ���	�q�W��w'�1R�ON�;Z_�Ã�O��AH�3��v��x?��ٱ#�~���k�z����'*rr�_���Q�(Ϝ�$��2#\�%)=��~�rj��+>��!�t��q]NAy�NΚ�j��7�����Η�{~|7�3��O^l	p����C��,&�0��w#�c���A���N��؁�:�j��(��޸�m�r_���m��P���D��q׫+��{��o?Խ{�o�X��_ޥ�5�����Ӟ�x�xxu�����C�����].�^E��.�م�>���"��C�B>�ŽֿT�E�Je��8�:����`�u���� ��^���K��<#��j1귔�/�|�G�Z)5�r��	�@�(T��S���@���}ҍ�u�r��hٟ�O��h":��:I3ut(��_%�`�)�Â+o8t����͉E?=�X�����71�������ī[:�����)8��Z*?��iw��~愼+��t.���U��;%gg�/��ou����<+������P]�C���3~�@��+��ᄢ��ܧ|��t"v����������蜃	`VĻ�k�C����C���=�B*$�{8�O�����r^�/�\�����$T�R؃\�P�_?OX�	2�������/nv1�SM�Ŕ�U�x�W*�/S%mS�VRm�,$@$PE
+���N��1�������u5X|ba�v�Ӳ:�Qy�n�^��YG����U�N�_�S[����4�ѽ�ig	�Ќ�����蠶芩+�#}�o_�ߐ��O;ň%�ܛ��X�C8X��~N�G<*����nںM0�S�1���۬��C�C�S�?������E�èW\(�t4:��FN�ܞ2�1�]tT}�ПP������Q�\e��C+#0�t�|�����[�͚�+�P�*T?�����b��sk�ȇr�m�P������7���b'�E��F5�p���x����a����i��������ϟ����~�u�դ��9c�w�	�?�V���H��*�a����_1�Ŷ��i(Bu��~-_�-��Xu�n��B����a��s��5Ŭ�Rٿx*i�B��j�e! �*"P�P�E�aC'
+�)A�#^�,���&����c�H��"s���#r�c/�ML�F?��O����)�vL����F��?����P��4W���|�xG�wm����:�vLQ-ԡ���k��T�ܴU>���i�v>�\����{yg�	Uۆ?m|��Q��r�{����hz$���‹�}�;teZ�M.>�ٟP��`��S��,���:�������C��7\���;��a��.�;kz*�W��	2?��8Nj:���_ݝ�ޮ�/�?�zЮS�w�%���
+�H��6W�����N��;���=�E}PQa�~���}eq�b��gDtR��aӏt��]��s�>t9V��~�.J��;���&L������|��x���*�}��oў��K��R1큕1�?��t΁���e�0b�������+	;ݷ^O<`y��w������j)���/�i9�Q��c�1�$@$@R�P���H>����C������N�*�����D߬��ё�`�b,�q��D��k��(w�hr������]�E]�>E����';l���.����T��b�D�"�_�ww�����($<Ў.Ι$d�.��mO�I�,�E�H�?z�Yb:���tXX�)��e��#K��`߁��6�?�mi��|�3��U,Lt�~/���*F��!
fE�aQ���;)K|>��F�n1�wx��)8��L�b1��u�4s8���?(w�Hj.�û��{ӿ�;lP��i�e`��j|$�q�U��?�AJ�Âw?��Q}ޅ7�Z���%T�e���\�q��Xk�3	��	����*��-�����NL�[��M:U@^~�k"�X�+�C���;1kD"�Z�߀���2�й��
�9���
68/��~_���S��a��|]D	�8���s��F1��#?��v����*�񯟴�QRG
u������y�wK�~��'�Gx��f�N�^p�+�-� TD�A`f@!>
�~��K�~BW���^�e�q�5C&�����������O�����"6I�Z"��|���g��&T��c����7>������巴?��{{�a��c?���.�_,{�/S#-To��k��r!��Qx��𧌛P-u����嫯r�O�Z.5�|��	��	dȈ*P�;�X�S�s9tZ�iy�*��8����W�9#:�R�L�t�$_���ܒ(Š�?�e�p:L�����L�'� <.�G(�i�}��K���bߛ�u}��F	�����)�����a�
B5��5��a��
+]E��BӜ���me�:����̪��϶T�P�{��zm���~�U,܄)��V�������������ԩ��.�i���M>�����[��5JfB�_);�Y����2�@'��S�5L?~�δ(��=($_#)T1�ai�^�3]0�7����{ʙGe�����Rۿ|�.����RS�'	��	T8,\�����Qy��P�����Έ/@E�$T���)���iިu�Q�:t��=�������b����m��H��T|��#��\���|���}LG��8o~b�$M-�w԰8
>R,W����_���,��{J����?ό�U�P�����>e����~��*�K|�?�4�	�o�����$��M:/���-��1��ƶmY�(鸁�Y>z�@���[���H
+�7�{����������$3@�9�o]�X������S�>�j�� �O$@@��D�(�����׺k�+Z!B�x0��:���̞ޝ��$�$Tq������΍�~�����bs6c��K�?�Ia�K�k�x��>�b�
+S+�O��7j�t�B��5|��w)�+�P�oZw<��講���ZB�&N�O	��A�Iz���a�Ӹ!�o�Zy��~.�P��n��sǫ�݉�y�-���F���ybc�E���"�p�'�g���:�H
+U|3�8]���'����ͼ�M_~]��B��ZT-��$�o��_B6�2�B�,���& ��"�2����t��3a��=�0�
��GR1��F]���:r���NK�|t�1eSfm�1�P�g���WF�C���3�*�����g4�v���6��>��w��O����ซ��̳�[���)��7;��o�~�;j���އ�ˎQk�晃��;��&T�w���We�;ˆ�麠��Jq?������S������P�����VX���*V�GY�����9�ߡSS�zzu5��o*��`b�?7�B5>�����
�B��u_<9J
+���۟/y����E*���j�W �O$@�@ >�
+�,������ay��s�����Ad|uM�W�>}�4.P��Q�\BI��g�4`sX�\�ЉŔAsߺ�Q���U���b���S��^qrLC��/����ce֤�7���Cr��G�C�/Gڢ�!J�Q+�P�'}�-�B��N�G�rx�]��9�P��)�ܥLS��i⋂!?�k��䆧���~�K���\��*��_����/z�Y� �P}��V7��G�-n��bڃ�yw֧���6�B5>��]7������"[�x�3|̕�~Km�,���S��{
2�$@$P�B���ݟwT0.?��,��&��O�b'�>U`���џP�w�!�!���H��H.2>�w���'_�2�]O��E:*��~�|1������S�Z
S�r}�%�50R�F���J�Q+�P�H9��7Z�Q��|��X5��R|*�p��e��@!B��DWr�
+��0����e+��l���ͤ)������q�s�D���Q��-�o�{�`5�\��:���pQ0KcS���Na_!������Z���2�B+(c%esx�u��Yt��^x�r�>�3�
+a^��-����O�Z�5����	�@��k^)��[�;��b�U�>a.>=-�i��~?�)��{��	U\S��o�b:从�]�p�<˖N#{N~y˳Ѷ���Ͼ��Y|�;����.��ޭ�v����GuZ��z���5s��6���Lj7��W��W�Z1�*�z�����B�[�}L�'j|���? w?�.���~�q�Y��\+@G	�)P�P�w'�)i<�@9��}?[�%Tq�?駧��k�S��z�~b�} ��x�B���Z��iL�bj?����
+�v�N;:��K?����_y�I��P�"Q7��i|WȂJ�
+�)�3�Z��-����T�a
+�r�=�H�*�@\�b����v�Lr񑎤��X��ܣ�7�N�m���i�O֧z�X��'T߭��=���
+�c����aC$����դ�$;񩧸~!�m������׸{���VcFG=��i<8��U�,��&�XG��Xߕ��V,��<c����������^&:������������U�m���<����9vw/�o���� �N>�P���$M��.���V��g�w1�*F���WE��5�n��׾$�Ux��|Ak���P�� ��7e/��
��p�|�$ʢ�����}�rŶ��5�By��݇���f�|���=�>��?��'���A�	�R�o��_���M�Z�5�|��	�@�U
#q�ٝ�N��^��9���#1�}��Q>u�~2�/��������ӫZ�R�(����g�[;�&]4���Hzv�K}�(�5_8)kUT;>�+ޝMr���a�N�{U�����6����H\d!�������=��=���u�5�g޴����yq�~�)�w=�N�s7��)�In�1��?���g\��E�tjt0=B��is}���_�3�I��\��M�%�cN9|A��41zkg��D���+=V���v;|<tX��ϪM�.zM[����W���y�%����sc���{A~w�7Eq޴�rVb�ol�����O|j���G]�af|\;�tTy»�=ǿ�����)�(/��\0}�`�3�
��ۋ�y��G�-s���N�)�u��F�|�2����?+��7�bfO�lu��0�s6����O� �h}�'��S���(����3�x��M�wl�sI��P��ǽ����+���{��W$۽���d��b��m]+��	}����Z����M�g�$�~�|} ���@�'�-�ǖ��t5��C����I��})�_R*)�B��j�e! �2%PW3J��R��-+
+�h�Ł��e��4Df:*ҠStڅ7Ik{��|t���k���f%��e��O��sT��C"t������}�AD��!g�_�|��>�If+�x������Ŕ�?�s�����Bè���H���y��\��� ݙ���ŕ�9Q0�8T������]}�*�P��'7>-ԅ��,�����T�x�\ۘ1��n!�S�u�ǿ��>��እCYN��'�,>f\v��}F���˟��R9J=�^�2�T�\�h�O[}l�>�e��߶�W��OO�����B���8jT?ɡ�D9��/7�Uj�����s����ic���#�g���,t��w/�����+x7����$�~��!�/�����ۿb�3��PM{
1$@$P%�N�1��pi!
+~�>��O���#�d��g��Z4#�h��Ϧ�ڶ����j\�`�ٹ��c��b�W�[[;�U�:����n�������Ө�������N�Ũ�u�����JZP�wuD�o�šn���
+:6_"���z��~���N�������8�_}��h3�I5�#�6"X�1����b<�)��Z�,�
c;���������{��&��U�㟷JJ��򉕭�oS��A�l��v���帗�%�|��cp������QF;g.�.�s����Kr%t<>������r�${�}���=1Tw�C+�B}7���~�/|�b��&xq�5O�̑�t��Վ[�\�X���/1�I�Za���	�@9�� �����k��ʇN1:�:�V��=Kr�0�����t��X`+}�����w
+sM�=G;F�JXu�m�4���犕�[�Z-���Qs_5:z��#��
+@LwKz��·�����C�YGcs9p������EL���.�_H�S�瞩�bڝ��^�A�$����0�|�c��J�BS�1��b��/�w�nF���Q�����nm҂Y�u,�4�N.�|/���L9���r��K��"�y�����I:ʆ��g}���3>r����#v����c.��Y���5E��֥Nu:g��H��{J�|�hw|��h� �.S1x�~?9��a����:E�7���,�d#����4���[�W~���6FY\�Q~�y)�;�I�($���[%-�=�}��)id�>��������k�Ũ���@�齨�����s}��yW�wR[����&�~Ka�����S�Vr��l$@$P��?U�I��*0g������x?p����(��J*�B99p��M�F��>�<x/rÖmI���_�D�ouq���b�Ӑ��o7u��_��x���W�O��;]EF;W�b`��K�/Ϙf��������L}_
����dɺ6����(W�K��˃)��('��S�QK�K��x�Ҳ]��9
e�������b��7o�.�4ƭ|�L�}���>�8[!�r�{���a���L�i��;��76AWX�C�:�ӹ!���T����C�Zn5����	��	��	��@�B�$�ISI�r����8V#OZd*��g�H��	P��y2�$@$@$@�!@�Z��rLu���a���_��6��	����j���$@$@$@�A�B�<�Թ�;��tқ����k�8�:<?	����s���ȼ1N"$@$@$@$PevՅ� J��w�n�9�S����6��E`�E|�vr�l�{�?���nf,���������9|�j��Ɨ
f�RH�B5���,��	��	��	|^h�.�R����6}���KW��r��r�.2V������%H�>n!�3
	���P���"  ���䂾�h��խ���ԉ���n���`��U����r]���w�[�9ob& (*
+բ���H�H�H�ʍ�YG�.��@�jj�fS�?u�9�/��L����;�}�S~��c�� ��>����M�饭��/3B�F�B��j��%     ���PMy1{$@$@$@$@$@$Pm(T���Y^     H9
+ՔW�G$@$@$@$@$@�F�B��j��%     ���PMy1{$@$@$@$@$@$Pm(T���Y^     H9
+ՔW�G$@$@$@$@$@�F�B��j��%     ���PMy1{$@$@$@$@$@$Pm(T���Y^     H9
+ՔW�G$@$@$@$@$@�F�B��j��%     ���PMy1{$@$@$@$@$@$Pm(T���Y^     H9
+ՔW�G$@$@$@$@$@�F�B��j��%     ���PMy1{$@$@$@$@$@$Pm(T���Y^     H9
+ՔW�G$@$@$@$@$@�F�B��j��%     ���PMy1{$@$@$@$@$@$Pm(T���Y^     H9
+ՔW�G$@$@$@$@$@�F�B��j��%     ���PMy1{$@$@$@$@$@$Pm(T���Y^     H9
+ՔW�G$@$@$@$@$@�F�B��j��%     ���PMy1{$@$@$@$@$@$Pm(T���Y^     H9
+ՔW�G$@$@$@$@$@�F�B��j��%     ���PMy1{$@$@$@$@$@$Pm(T���Y^     H9
+ՔW�G$@$@$@$@$@�F�B��j��%     ���PMy1{$@$@$@$@$@$Pm(T���Y^     H9
+ՔW�G$@$@$@$@$@�F�B��j��%     ���PMy1{$@$@$@$@$@$Pm(T���Y^     H9
+ՔW�G$@$@$@$@$@�F�B��j��%     ���PMy1{$@$@$@$@$@$Pm(T���Y^     H9
+ՔW�G�O`����ܨQ2j�3P�+����e�# ��"�/Q�\6l�W&���H��(T�D�MUO�B��o HO�Q���j� ���P-[��ʄ@(L�=
�"ˤ<�����ޕ	�?��f�	���p�)��i%�d@w���h��#_5�	����P>ּ	���vu��I��	
+4�u��)+E������Ee���)XcT�I$0"r�,�=\+c��E��&�
+~)X}�@��P�޺gɫ��z}'��X�1X¶�Ba�kw<�pl�,����0ȴF .��n82�k��	�@��}�rd�B��k8n�\|
+m2���GB�
+��
+��<fL>GvJn��	T
+�J�Q���%t}�&1��/G�:Av��(M�5=�w�Nٸ�G_�.7?�*-=�Or�(V�����H���E*lЄ�Z9n��r�.c�y|����V�����]�;dYK�ܷl�ܵtK�MF�(VG��xq1�#��&��&��@�H��1ur���9c���f�34��[��-~d�<��]�{35�,2$@M [�B����$g2]fN]�%O*�v��O�=���
��ޓ��b57H�*P�VE5��$�-R�-�w�|�:��oj�q��˘1M:��b6zJ��.G��'4��<�ۻ���M:�uʚ���w���4߸����X��3	���H5�3C��G^5KfMl���&g�FG��JWiv���Sڶ����.yt�V��k�l2�N�jw�}���Q�,eU�@�ı0p�����ʬ�cdʔ)RWW�O�����I�ۗ��Tq��_������7�6o�,r۳�r�S-n�;>T��?%�I�H`�2"�湎o�����"��5YvyǎUe�Q�M�6Ɇ�:���6��/lQ��h���Q�	�$P�(T+��Yª&�,R�U�<�YGS���iSdLӘ�/�8�/B���L��}#��BԮ��Y>���imm�U-��˻��rUu.�'�Ȫ��O$P$�H�Ç�3Ə�5K�N#S�L������,�T햹$�g�G�7��_ۏ��_���m�n�&7�
+���(��U�'�$P�(T+�vY��'���dP���������<Ff�h����詽�ѱ����dY?~�����oq�c�����
6H�v�.��Eyn}g�)�:D�����	����ˡM�3�A>{�\iԩ�3f��.��m��ͷ4��������]���G������^Y�v�{�[ׯp6�P��dl��	�@��P��eyH "����x��T����PŢ���j��\~tj�'K�����%�K��A�vuu�ŷ�(�B�j���TO�zA����	���	�M�%�-�3�A�[<�=8�9s���Gfks�~,�7�a��~,.�G�!TתP]��K�q�J7�68.V9ا�0	T&
+�ʬW������P���Ҥ%�tp��s"�:zt�X���`��-����~�p����_׏�0|#-FTׯ_���:���v�P�R��$@C#�	U�.#8WGT?�x��'����5��Ö��8�7��ok��~���[y��鉄��\�B�b�Ev8�F�Z5�} �J"@�ZI�ɲ�@D h��&\���IG8I���`��\~t	
X?n$����mqI>⬬��*����@�OpV��K$@� ��T�dg��g����P����������4~�H����׶�$��r\��H���1C�QU�.�$Py(T+�NY"Ph�3���ΐ�C����Ǐ�L��|8�����n��߶ͷ��=\�uv����-���ۄ�%:���
��_Ň.%\t���	��	�@F���[��9�F�gOFTM��JQ�*��&T_ԩ�߼~�Q
찣�Ĝ�v�@�:�{�Ǒ@y�P-�zb.C�Nm����SVe��z\D���xttLpYz,����xG�����]Z�c��G�(���¾oa+˺u���������K��/��ʬ��	�!ߦ���v!T�}�Af��>X\Zq�e���[��-�;��۾}{V�PNK��2ge|6zu�����)�M�]�.�lU��/I�%@�:Xr<n�	�q�9r��a�n%\�v+���U4����ag��3
�_�xض�[e2�����e����3L$@�%�dkp.<4�U��a���ƾ�8���m÷�/T��]�\����3���si���ᖴg��#�,�Y8��V�vT��=��eoҤI���$uuu}�����e
=rǯm�饗ܓk,ځ���8��q~ض���/>)m1�r�яGض-����m�6�Ӌ�eeg���Qzݍ�eꂉec���a�r�# ���f���0[X����;��s:�:k�,g�|[�g��m���}K��
G��m�Z~<¶ma��3��5k\��qx�����3R�M�W��Ө;;;e���.KO��ݹ>
�cH� �ab��$`#��5}��H��Q�[+~�ma������ښ%T�Θ�����x�iq�r"_�c�hB��աP��O��s �����'��ё�	�@~�1���`E�W�P=sN�Pu�B{S-v��S�Lqv��#���ͮ�i��.h��L7n��|����('��T[U�W��z�13]�gϞ�4[cm~b�Yd�����8a�aT���Ž�c#��oL����#��,��+��m�ttt���S�>\�	i7����<��#��~�_��x����6�	���jG�Hu�TOt3�B�'�0	�@^js��&V�P����ܰS�g�I>�|W�]�=ܰ~�����)S�F���閖M����Q&N����}����$q��iӦ��T+K�o�پ�u�uۘ�G���[0R
��[���j�1ʬ��eVaՖ]M���a��� �Q�7X���h��*�|B�8�oW�o[|>��Bտ����l~<l�(�	�?�Sw�	��z����ѹ-@�H��Ȟ�龡p��A[����
+������_�-�m��χ=,�P��e���l~<l�&TmU�ͷ2�o�ߗ�q�P���㏣�}Y1&�(T�Y/�UH���gK�z�hj�>խ���H-��@�F�~k�p�5X&T����ygHo���8��J%T�+��8c`>ҠL�����Ī�����j�v��H��0�j�4#T1��A��P���P��̓��3{l���~<��Blb��*�`6�[��c��U�^�ڭ���}|�g��G�������u�1����n����s�=$��)�f#��wO��>A�`��n�5Xɩk��
+�á�0�*VT4�j��u��1�/��@])�*�b�����|ۇr�P����BSr"UQb��B�a�	���	��2���_�@�E��l�Y�Pm�3����P5�k��|d�������]L�=:�w〧�&]{ v���|ʉ���lp^�K�.����l�-[&�t�9YA<$�z������ ��2�X�p�M�ƪz�V�x����[�Q���}����\9�4��[|�Qmow�B�喝�lrS���j���L~��m�����F�}��U{�7�e��p
�# �Bd���@��)iT�F47$ո-6[���bi��Yl��uk�;�S�N�h'j6m� ���~�祥��N�l�������j|D��yضws�PŨ�ҥK]�W,g[����C�B5=u����BuѢEѴ�X2n&���va��Cc�I��;�������q��NOR�]7�/�P�s�ˊx���x�Ȼ	տ�;����bJ��oE՛� L�{�B5��_ ��|����SۃwSaM��o�n7�n�3bS����m��a�w�Ϗ���K�xW#��v
���
��|?ƶ/T����ʏ_~;�@�j�T��h��,Y��0
+�j�ʯ���WgU�ck�mDu��v��S�
+�C,����Ƕ��*�������-{�߶�-TqM+�]߶�|���7��Wo1�z�8�pu���/)T�4} �||�a�U=���A��0S�O�����[>l�m��a�-TqM��v}�N�gq���T��ʆ?��r�oס�L����?���PEJ�gɼ�����#`
9Z���U8
+UPA4HpI�@��u��/���O
+�P�u�������	����}GU� N9�7��G$0P֦�*[>�0�
+�Z�6g�N�=}n�wTa��׎��;���-��<�m�řM��K�"mR�Z^���f	�?/�T*�j5��Qf
+�򨧪�e��j�BupUo�m�K��sP
+�je�o���o��Q_��
+�Q�BJ&Tѝ��_���F�(�'�G��4�!�X��=�	U��1c�Ѕ�`�2la)�*��ܾ�m���"T�r�a�Zg�_
+�l&�J?
+���Q���5�����qD�a(��:�8�S�$p�ꕫuD�B��{�	I�
+#��4MڟP�ŔNOX�v��p�x���
��R��Z��G=�B�Qu�����W$�
+P�VA%�S�&VS���� �Cض��BcU�;���1��߶�|~ZGT)T�����	���k��'��R�f rDu0wY�c���wT}���3����b
+.��E��)��k���v
+Ղ��Id�;�mk�(T&�6��B��m� �"���B5h��4�.�6|
+�"�t	������.�
+�h�q�#^̀��7%���IDAT��*a�]ĩ��g@>$s���5Ti���L��7X6%�����������~��ܶ��m���*>K��Cw��NTY�6㞄��
��K$@��vaQ��s���A�j��v9�P�Y<�-�~�t��֟���p�k��F�m[2;Ǝ
+Ցc�+�Xc�4��1Do�A2��m��w��X�������5�~�����m�����ߴ	U��4��j��I�
+%`m�rж��O�U�g��iN��;�fs�m��.��պ�:�wT�i���br��X�6|��	��)T�gĽ�#@���:��YcnkA�����S�ma�G!l��)T3O��ٱ����ǘ�H�0ֶQ�6��FT)T��
+M��?K��ES
+�iG~�'c:&�����O�s
+����0a�t�6)�!V9��=�Buն�/�9�7�]��$@����?�Z�
_��
+����_�6���U8Dٶ���K�m?�j���3�(TSX)՚%ט�5����w8�:����)Fض)T3��`Q�P��ƃH��!`m���FT)T����m�/T��U<��s����A$I (TSP	�B@�5����������8aۦP�P�ţH�K��D@о�7�U��fls|�/�*�$���w_:���~%���G�B�x,y�!p���
���PT�8�|�*w��Z��Sw��( ��	��M�P��h�풅ͧP��~�^����R��&�.��E���K�5������j^l�	� �����Q�P�:�O$P9О�Q�R�w���R��w^uh(T�ƏG��k�����
+���P-�C�wTw�( ��	�=��P-�.sD5�_��K�Zl�<�p�PʼFA\c�?�ݟ�P���O�����w]9��Ou2�H��	�=��P�P
��P���P���."ט�|��?��L�ZX��#����x	�@�О�Q�f�9��/���P-6Q�o8P�e^� �1�k��y���%&�P-�CD��x�0�H���M�P-�.S����N�$T�y��$@���j��LYc��~��_�����h�"�%ꃽ���pU\Bo���m�t����)Sd�~��\k������Y�x��(T�} �R0+9Be�]�=\�n�����ԩ�"���Ҳi�465�ĉ���Bfw��g6�,l>��O�xa����%K�H�*�O]�B����]�g"���P-
+F���17���'̖���e޼y���8���*�s�A2g�?�����--Xew�̜9S�h��Cz���}샳�`�����V�$�x�G�׭['۶m|�feg���b��{O�w���T�F��P�����T$@�K��6�
����o�wTk4fFC��>w��dzg�v���F��,��f��>��v���p8�j�=F�|��p\����d=�6V���׎�6l;;;e�ʕ�~k�|����v�ay)T˰�*5�֘�
s���"��u�L�<Y�O�>��RY�+�u��:��|Bi�΀u��~sIq�/�/�P��j׳8ߏ����S�5�$@� `m�P�*��e67��y�}~\�0la����[�����0�)T}j���
���U�z�M.��=tu^ç��W���L$0D�C�ËG�s_��:�A>q�Lw��6�$����GJ�m>D*�6m
+��&���B;DHWhǨXB��\=����~<�m�لꕫ��^m�9��͓[$@�'`mD@���#�����$���5�*rP
+�[X,�jvy�;����0�M���T�iӦ	FT�gm���װ�����M���+V�p�߶V�m�P�Fĭ�PMa�Ts�\��?�W�#��QU4Z�f͢X-���I�m��	U��N��.�++�ja����CY��*��b�o�ty�Y'��: (���gfCl�/�U~�HB�0{l�����$��K�Z9}�.7��5k��;v����hj��휆���'��#����M�tTb�ïl�=g��St����KCCC���%-�h��	4���o��-���al���ˍ|Y�q0�PN
+U��#(k�#T�'���[�����N�3��X���&[�jqj<������ͭI���k]�����N��~t�4T��W���,$P$�E����k���wU���+�/ޅ*�Lh�б���|a}L��1c�#�:B��m������q#�ˇ|�6�xضQ�h�!�\q�X�H���&(O�
1���ǰ�X���l�����O#m6��`y�m��mc���ǰ�~�,��[�]�~2���^*FRu��w�y�n&�XA�#��N&`5>������a���n�e��z���0��ߘ[�2*T��:�#�w���4��e��o�I>�,��P��1L$P*�;f+���@�*�h�2?��\��t�޶2��k�I>�,�B5Nnp�;�iK{�<�q�ܿ�=�Nj(LM�����c̣JO�B��y��U�8���o��ƻ=�Ҹ}a|t�n�Wx.{��Q�A�	����8F�S�{k��a�d��>#�(:�Z''��~�is��A�,��~iP6�z`���ԩ����./s�����C��H�
+!��
�vJ7`�k��f�N�1�A��9�#��N��e�ڶ�o�^���s]t�5���"��X?�r�r��Q)�Ļ?�q�n[{?�9�>;>���
����C�B5=u��x�1�e�qh�#_�h�]����.-�C��9,��}��+�Ax���4�~��{��w��S2B
�u���ٶ��-���ޏ��	����x�m���l&T/��E}����b�:8>�)�ґ�	�@!��n ��1�A8h���Pd��9�s���o��Κ��k[�m��+����7{?���m[>�lBu}[���+U���K�9[�?��p���.�~����q�����a_�ae�4��1�ñ�O�!��RG�B5uU�k�њ[�k����Kڏ��s^Т*�G��E,��="5xz��#v��S������;���_gh�:@�W�:>H�6|��x���Q��S�zu?:F`��&��o�ݹ�CG$@�6��e�l3�*,L�����&����*��l�o���V�]�P]�v����%?�c�{pث��	0G-��&�|�TGY&qmP�s��1��3W���a��'8G�_H'
+�t�s���q0tö���H���ߏ�?���i�m���:D�y�C0�|�N7�z��>B��;B~����O��^�oq(�gB�һW��
�N��CdH���[l�
+�%(���eKkv6��e��<{R�|����__��j��&TתP��m���8��X
H�3���T�oR�\��ؾ�C�eL�����Ȁ�sdb"�t�PMW}071���hݰm�Ƕ���X@��}�b;c9(�M+'�m���y��Tt�ޣBu�i:�WGT��$�/L����%�~,�5�A_x��x���H���_�^:���H�B��O��5�h��yA��O$@�����]F��˰��`�E��GT�66�U�zg6�����ޏ��5h�6~Q��}?���<�Q]��K~|�
+U'R�u��N���2X�U�]�S�LD&��/{�(��η�J�tI�B�"���
+e��+�n��.��E��8����
+����1p"-�u��q�S�!��'3�O�1c�$v��Ύ���H�Ύ���Fض�G��侥�Eִ��X++[1�7M�>��.�b�C$@�	�v6>��&���<a����Y2k��6m����Gv��-|�	O�
u�� fd��Z.�m�m�|���씵�7��k���_�l2��d�U8x�3a��W�?�2��0��Y�m������'�4�PMc�0O}XC�v�~\N�g'��XD�Ye�
ۆ_����T��s��qr�>SeƤ12u�T�)2$��N|���������]?�o#�������.�,i�[�i����h�I�����7�l�0} �|�� [����FSպ�>Ol��c��,G�>�=<�]��,�ZI68)�?f��~����8���W6n�(�t��On���E�c��^L6������]&d1��'�1�Ѷ?
+G/���DH�B�+���d��+c��>).�!T2 4Kh����c���rqxr�ߕw�Dx�A�nTu\S�L�0A���t_���ux��7�x�O<�g�1��e���~��u����h�榕ٓ{�D;�k��1L: (������a6�d ���3tT��:�ڬ���=�]�_��������l�*��ݤ�]���T����.yjM��ލ��}������;�;�C�������_�d	Q>�N/XYLX��&@�Z��[����y^�2��T��5Ҟ��0M�mT<��N��Z9y�i�Ϭ�2�]��r�ڻ���7�3�:�Kj��	Yg�5�a��נV.��H`0`L��GVم]�3%��*>Q3Z��©����e����\����V;����c�u�Ko��Э�Ǝ����V��C���5m־�cEi%@��֚a�
+"`b�O�;����m��"ń*p@[ቻ?�#��玗�t*�ɍ�XW��V��8�:��ѭ�C�Z�9��+�{PnZ��L/3�j��k�]��jo��#$@p6�4���z����C��.���_,��g�t�&��3�Ռ������Vv�`W�w�7o�GVm��oq+�bv쵛�B������U�P�X�9��$�@�	P������B��!I�"M�#��+�};E��A�b5`�8���
;P�D���3e�,���n'~�^D1��p����X�3Q'a���{��?}��`��H���&i������q��LxI�S��# �Ap�ij'q��jb5�˘��S�t��]��vY���"�+3�Q��v9����M�K��x������'�˽	vٽ���FBՕQ���:t�a�P��P-�:d	H����DBS�6u����������Ǵa<�ǹ?6J`�@�u \��?�E2}.�){xi�ؠ�a�����.����Y�)�3��k�V��T<	�@p6���P���9{;���������]F���.k��e�;��R������(�(���椨����e�Ժ�v�����C{�h���z����A.^�0:��_ ��"@�ZQ���@�JHׁ19����S��Ύ��B���S|��;NӇ�Α;���E<�����qݗpJT3b4�}&��v����Q0�7����~�7zj�{��.� X��N6��g���N��|���
+����m#��.��ypZX0g�!�k�kP��A�
����T=����ls�vyT8�%x���)��8��8Еqn��] a�»���	T
+�J�M��"A��7���ma[\����QT=>���N���qa(v>�����]�%�(��i	�&X���i��Q��O�����8��Z} ���!�
�m�q������t�ׅ1<@��K���c`� Lq�9nå�O��ȝ�X�bl;[�a�g[�مm�}ض��a+��|ۦO$PY(T+�>Y��Y�߇��àd#�.���s���&Tq:<��Y��p[�����.����:ra.�d:4�S}����q�#�?n��ǹ������bC]��% �A��jhœ=��EvV#��`�%��gf� Υ���5\�m!�?���Frm�P��v9���S\'�6R>,tv8����>+΀��^�E%��@��H�*���j��,�E�Y�jH�:7��s�UtB!��@�j�� >�i�x�	z����G۞"��i�����"?��_'D5�u�ܶ�~��D�>~��_D�ɲ��CG$@�$�	U�Am%̥=8����2���-�o#�Q�;'�yp�����e����b��&��W7�1����4��
D���C�:�	נ�-ֳ�,��~�_���0	�@%�P��ZdH ��&�:8��ؓ��k�ɉ:Jz�#Ӊ
+.�s�%�?�3�����O���Y���\G�uz���ҐD�m'N�:Ia�	��	�@�����Y��}�x�H�<3��Y.����e3�&d�?�v6R�|W2�
�}���v~?�a ��"@�ZY��Ґ@�����9���k�Y�&^��t�\7!H��qۏ�CfÝ9��x��?��ha�e	��'�_#�6�$�Az�$ew����������>���	����y�+‹b5P�-]���M�"�(���1�&#SH�;���(G����e���Kx���
��/f�I�N[�45�.
+���SVKH�H�RP�VJM�$���Zw�[�%�K�p������Gɶ�'�ΊB���[� ���,����v�4+��"�9�}�CÍ���K2�H�G���I����~ Pq��"e�!���vN��sN<D�r��a���^���X3�	l2"1g�岘 ]@&H�_ ��%@�Z�u˒��G��|F�[�nhP�����P���kGf:
�Y,�m
����	��f�@�|{i]���Ëo�0�0�� �N�
+{c����`��"����Re�>������-J튖����i=�Jd�Y\�t�}w���I�*���jW.�F��&?��7	tp�����>���Aĥ��6��ʕ*S��[�}^:o?��6EG$@% �����o�a��m{�N���"�ٹ3!je�����2R�%����	T*
+�J�Y��	
��Ի�Ѝ��48Q&]��H���̇#�^�"(�˻WKg�����	�@�	d�Ugkq��F��m��3�˜��+y����Z�?��Z�q����)\ֽb�邴Qi�#��	T
+�j�e���
~ߎ�'R��龬ñ�^��O�a�pY��l�/�E�5q���t�M$@%'�-Vq��F�6�eA�q���Sh�]r��`��yT �4��=N��i0L�E�B��ꛥ%�������[ T�[��ΐ��v�w�Ee�e���ә�%�&	��	��@���V9�~EO��&�EFQᬅ	��_���o�����	T

+ժ�j�r;;���Z')����	B~]�(P�\u�	T/��ՀT�MF�(P����	���*� ��P�"��;(՛�(
˔��2s$@$'�
?�G[�I�e;Z��#��Re�'	;
+�aG��@�	P�����? �*#@�Ze���	���*�      �T�PMUu03$@$@$@$@$@$@��H�H�H�H�H�H�RE�B5U��̐�	��	��	��	��	��	P��      H
+�TU3C$@$@$@$@$@$@��{�H�H�H�H�H�H U(TSU�	��	��	��	��	��	���*�      �T�PMUu03$@$@$@$@$@$@��H�H�H�H�H�H�RE�B5U��̐�	��	��	��	��	��	P��      H
+�TU3C$@$@$@$@$@$@��{�H�H�H�H�H�H U(TSU�	��	��	��	��	��	���*�      �T�PMUu03$@$@$@$@$@$@��H�H�H�H�H�H�RE�B5U��̐�	��	��	��	��	��	P��      H
+�TU3C$@$@$@$@$@$@��{�H�H�H�H�H�H U(TSU�	��	��	��	��	��	���*�      �T�PMUu03$@$@$@$@$@$@��H�H�H�H�H�H�RE�B5U��̐�	��	��	��	��	��	P��      H
+�TU3C$@$@$@$@$@$@��{�H�H�H�H�H�H U�~,٩,������IEND�B`�
\ No newline at end of file
diff --git a/web/modules/webform/images/addons/wsla.svg b/web/modules/webform/images/addons/wsla.svg
new file mode 100644
index 0000000000..e82db677c6
--- /dev/null
+++ b/web/modules/webform/images/addons/wsla.svg
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg width="256px" height="180px" viewBox="0 0 256 180" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" preserveAspectRatio="xMidYMid">
+	<g>
+		<path d="M106.553203,159.610976 C114.801129,168.204994 126.284107,173.534815 138.983873,173.534815 C155.865892,173.534815 170.594851,164.121105 178.438396,150.146262 C185.254593,153.191874 192.799405,154.885905 200.737669,154.885905 C231.186506,154.885905 255.871995,129.985475 255.871995,99.2706935 C255.871995,68.5522694 231.186506,43.651839 200.737669,43.651839 C197.021731,43.651839 193.389583,44.0234329 189.877657,44.7338328 C182.970383,32.4129469 169.807947,24.0885163 154.700107,24.0885163 C148.375726,24.0885163 142.393793,25.5493901 137.067615,28.1469039 C130.065621,11.6765534 113.751923,0.127999726 94.7387049,0.127999726 C74.9385822,0.127999726 58.0638501,12.6565411 51.5864595,30.2271008 C48.7557888,29.6259931 45.8231119,29.3126885 42.8139304,29.3126885 C19.23958,29.3126885 0.127998772,48.6209959 0.127998772,72.4430755 C0.127998772,88.4070383 8.71473094,102.34545 21.4727861,109.802829 C18.8461277,115.846693 17.3852539,122.517167 17.3852539,129.53009 C17.3852539,156.926028 39.6262381,179.134225 67.0586069,179.134225 C83.1646497,179.134225 97.4782987,171.476477 106.553203,159.610976" fill="#00A1E0" transform="translate(127.999997, 89.631112) scale(1, -1) translate(-127.999997, -89.631112) "></path>
+		<path d="M37.1700744,75.3309413 C37.009779,74.9119875 37.2283636,74.8245536 37.2793667,74.7516921 C37.7602528,74.4019567 38.2484251,74.1505844 38.7402405,73.8700675 C41.3486835,72.4856983 43.8114035,72.0813168 46.3870588,72.0813168 C51.6330895,72.0813168 54.8900002,74.8719136 54.8900002,79.3638274 L54.8900002,79.4512613 C54.8900002,83.6043689 51.2141357,85.1126027 47.7641419,86.2018827 L47.3160434,86.3476058 C44.7148866,87.1927996 42.4707512,87.921415 42.4707512,89.6336611 L42.4707512,89.724738 C42.4707512,91.1892549 43.7822589,92.2676057 45.8150958,92.2676057 C48.0738034,92.2676057 50.755108,91.5171318 52.4819264,90.5626457 C52.4819264,90.5626457 52.9883141,90.2347688 53.174111,90.7265842 C53.2761172,90.9888857 54.1504556,93.3423133 54.2415326,93.5973287 C54.3398956,93.8742026 54.1650279,94.0782149 53.9865172,94.1875072 C52.0156126,95.3860795 49.2905911,96.2057718 46.4708496,96.2057718 L45.9462465,96.2021287 C41.1446712,96.2021287 37.7930405,93.3022395 37.7930405,89.1454888 L37.7930405,89.058055 C37.7930405,84.6754335 41.4907635,83.2546335 44.9553296,82.2637166 L45.5127204,82.092492 C48.0373727,81.3165166 50.2122895,80.6498336 50.2122895,78.872012 L50.2122895,78.7845782 C50.2122895,77.1597659 48.7987757,75.9502644 46.5182096,75.9502644 C45.6329419,75.9502644 42.8095574,75.9684798 39.760302,77.8956674 C39.3923513,78.110609 39.1774097,78.2672613 38.8932497,78.4384859 C38.7438836,78.5332059 38.3686467,78.6971444 38.2047082,78.2016859 L37.1700744,75.3309413 L37.1700744,75.3309413 Z" fill="#FFFFFF" transform="translate(46.001138, 84.143544) scale(1, -1) translate(-46.001138, -84.143544) "></path>
+		<path d="M113.969779,75.3309413 C113.809484,74.9119875 114.028068,74.8245536 114.079072,74.7516921 C114.559958,74.4019567 115.04813,74.1505844 115.539945,73.8700675 C118.148388,72.4856983 120.611108,72.0813168 123.186764,72.0813168 C128.432794,72.0813168 131.689705,74.8719136 131.689705,79.3638274 L131.689705,79.4512613 C131.689705,83.6043689 128.013841,85.1126027 124.563847,86.2018827 L124.115748,86.3476058 C121.514591,87.1927996 119.270456,87.921415 119.270456,89.6336611 L119.270456,89.724738 C119.270456,91.1892549 120.581964,92.2676057 122.614801,92.2676057 C124.873508,92.2676057 127.554813,91.5171318 129.281631,90.5626457 C129.281631,90.5626457 129.788019,90.2347688 129.973816,90.7265842 C130.075822,90.9888857 130.95016,93.3423133 131.041237,93.5973287 C131.1396,93.8742026 130.964733,94.0782149 130.786222,94.1875072 C128.815317,95.3860795 126.090296,96.2057718 123.270554,96.2057718 L122.745951,96.2021287 C117.944376,96.2021287 114.592745,93.3022395 114.592745,89.1454888 L114.592745,89.058055 C114.592745,84.6754335 118.290468,83.2546335 121.755034,82.2637166 L122.312425,82.092492 C124.837077,81.3165166 127.015637,80.6498336 127.015637,78.872012 L127.015637,78.7845782 C127.015637,77.1597659 125.598481,75.9502644 123.317914,75.9502644 C122.432647,75.9502644 119.609262,75.9684798 116.560007,77.8956674 C116.192056,78.110609 115.973471,78.2599751 115.696598,78.4384859 C115.601878,78.5004182 115.157422,78.6716428 115.004413,78.2016859 L113.969779,75.3309413 L113.969779,75.3309413 Z" fill="#FFFFFF" transform="translate(122.800843, 84.143544) scale(1, -1) translate(-122.800843, -84.143544) "></path>
+		<path d="M166.398769,84.1136744 C166.398769,81.5744499 165.925169,79.5744007 164.992541,78.1608868 C164.070843,76.7619453 162.675544,76.08069 160.730141,76.08069 C158.781095,76.08069 157.393083,76.7583022 156.485956,78.1608868 C155.567901,79.5707576 155.101587,81.5744499 155.101587,84.1136744 C155.101587,86.6492559 155.567901,88.6456621 156.485956,90.0446036 C157.393083,91.4289728 158.781095,92.102942 160.730141,92.102942 C162.675544,92.102942 164.070843,91.4289728 164.996184,90.0446036 C165.925169,88.6456621 166.398769,86.6492559 166.398769,84.1136744 M170.777747,88.8205297 C170.347864,90.2741174 169.677538,91.5564805 168.784984,92.623902 C167.89243,93.6949666 166.763076,94.5547327 165.422424,95.181342 C164.085415,95.8043081 162.504319,96.1212558 160.730141,96.1212558 C158.95232,96.1212558 157.371224,95.8043081 156.034215,95.181342 C154.693563,94.5547327 153.564209,93.6949666 152.668012,92.623902 C151.779101,91.5528374 151.108775,90.2704743 150.675249,88.8205297 C150.249009,87.3742282 150.034067,85.7931329 150.034067,84.1136744 C150.034067,82.434216 150.249009,80.8494776 150.675249,79.4068191 C151.108775,77.9568745 151.775458,76.6745115 152.671655,75.6034469 C153.564209,74.5323823 154.697206,73.6762592 156.034215,73.0678654 C157.374867,72.4594715 158.95232,72.14981 160.730141,72.14981 C162.504319,72.14981 164.081772,72.4594715 165.422424,73.0678654 C166.759433,73.6762592 167.89243,74.5323823 168.784984,75.6034469 C169.677538,76.6708684 170.347864,77.9532315 170.777747,79.4068191 C171.20763,80.8531206 171.422572,82.4378591 171.422572,84.1136744 C171.422572,85.7894898 171.20763,87.3742282 170.777747,88.8205297" fill="#FFFFFF" transform="translate(160.728320, 84.135533) scale(1, -1) translate(-160.728320, -84.135533) "></path>
+		<path d="M206.737482,76.7251427 C206.591759,77.1513827 206.180091,76.9910873 206.180091,76.9910873 C205.542553,76.7470012 204.864941,76.5211304 204.143612,76.408195 C203.411353,76.2952596 202.606233,76.2369704 201.742824,76.2369704 C199.622553,76.2369704 197.939452,76.8672227 196.733593,78.113155 C195.524092,79.3590873 194.846479,81.3737088 194.853766,84.0987303 C194.861052,86.5796656 195.458516,88.444921 196.533224,89.8657209 C197.600645,91.2792348 199.225458,92.0042071 201.393088,92.0042071 C203.200055,92.0042071 204.577138,91.7965517 206.019796,91.3411671 C206.019796,91.3411671 206.365888,91.1918009 206.529827,91.6435424 C206.91235,92.7073209 207.19651,93.468724 207.604535,94.6381516 C207.721113,94.9696716 207.436953,95.1117516 207.334947,95.1518255 C206.766627,95.3740532 205.425975,95.7347178 204.413199,95.887727 C203.465999,96.0334501 202.358504,96.1099547 201.127144,96.1099547 C199.28739,96.1099547 197.648005,95.7966501 196.245421,95.1700409 C194.846479,94.5470747 193.658836,93.6873086 192.718922,92.616244 C191.779009,91.5451794 191.064966,90.2628163 190.587723,88.8128717 C190.114123,87.3665702 189.873679,85.7781887 189.873679,84.0987303 C189.873679,80.4665826 190.853667,77.5302627 192.788141,75.3808473 C194.726258,73.2241458 197.637076,72.1275797 201.433162,72.1275797 C203.677298,72.1275797 205.979722,72.5829643 207.633679,73.2350751 C207.633679,73.2350751 207.950627,73.3880843 207.81219,73.756035 L206.737482,76.7251427 L206.737482,76.7251427 Z" fill="#FFFFFF" transform="translate(198.860433, 84.118767) scale(1, -1) translate(-198.860433, -84.118767) "></path>
+		<path d="M214.399204,86.5520198 C214.606859,87.9618906 214.996668,89.1349613 215.597776,90.0493736 C216.504902,91.4373859 217.889271,92.198789 219.834675,92.198789 C221.780078,92.198789 223.066084,91.4337428 223.987782,90.0493736 C224.599819,89.1349613 224.865764,87.9108875 224.971413,86.5520198 L214.399204,86.5520198 L214.399204,86.5520198 Z M229.142736,89.6522783 C228.771142,91.0548629 227.849444,92.4720198 227.244693,93.1204874 C226.290207,94.1478351 225.357579,94.8655213 224.432238,95.2662597 C223.222736,95.7835766 221.772791,96.1260258 220.18441,96.1260258 C218.333727,96.1260258 216.654268,95.8163643 215.291758,95.1751828 C213.925604,94.5340013 212.778035,93.6596628 211.878195,92.5703828 C210.978355,91.4847459 210.300742,90.1914536 209.870859,88.7232937 C209.437333,87.2624198 209.218749,85.6703952 209.218749,83.9909368 C209.218749,82.2823338 209.444619,80.6903092 209.892718,79.25858 C210.344459,77.8159215 211.065789,76.5444877 212.042133,75.4916385 C213.014835,74.4315031 214.268053,73.6008816 215.769001,73.0216324 C217.259019,72.4460262 219.069628,72.1472939 221.149825,72.150937 C225.430441,72.1655093 227.685505,73.1199955 228.61449,73.6336693 C228.778428,73.7247462 228.935081,73.8850416 228.738354,74.3440693 L227.769296,77.0581615 C227.623573,77.4625431 227.211905,77.3131769 227.211905,77.3131769 C226.15177,76.9197246 224.643536,76.2129677 221.127967,76.2202539 C218.829185,76.2238969 217.124225,76.9015092 216.056804,77.9616446 C214.960238,79.0472815 214.424705,80.6429492 214.329985,82.8943707 L229.153665,82.8797984 C229.153665,82.8797984 229.543474,82.8870845 229.583548,83.2659645 C229.598121,83.4262599 230.093579,86.3115768 229.142736,89.6522783 L229.142736,89.6522783 Z" fill="#FFFFFF" transform="translate(219.472103, 84.138465) scale(1, -1) translate(-219.472103, -84.138465) "></path>
+		<path d="M95.6829901,86.5520198 C95.8942885,87.9618906 96.2804547,89.1349613 96.8815624,90.0493736 C97.7886885,91.4373859 99.1730577,92.198789 101.118461,92.198789 C103.063864,92.198789 104.34987,91.4337428 105.275211,90.0493736 C105.883605,89.1349613 106.14955,87.9108875 106.255199,86.5520198 L95.6829901,86.5520198 L95.6829901,86.5520198 Z M110.422879,89.6522783 C110.051285,91.0548629 109.13323,92.4720198 108.528479,93.1204874 C107.573993,94.1478351 106.641365,94.8655213 105.716024,95.2662597 C104.506522,95.7835766 103.056578,96.1260258 101.468196,96.1260258 C99.6211562,96.1260258 97.9380547,95.8163643 96.5755439,95.1751828 C95.2093901,94.5340013 94.0618209,93.6596628 93.1619809,92.5703828 C92.2621409,91.4847459 91.5845286,90.1914536 91.1546455,88.7232937 C90.7247625,87.2624198 90.5025348,85.6703952 90.5025348,83.9909368 C90.5025348,82.2823338 90.7284055,80.6903092 91.176504,79.25858 C91.6282455,77.8159215 92.3495747,76.5444877 93.3259193,75.4916385 C94.2986209,74.4315031 95.5518393,73.6008816 97.052787,73.0216324 C98.5428054,72.4460262 100.353415,72.1472939 102.433612,72.150937 C106.714227,72.1655093 108.969291,73.1199955 109.898276,73.6336693 C110.062214,73.7247462 110.218867,73.8850416 110.022141,74.3440693 L109.056725,77.0581615 C108.907359,77.4625431 108.495691,77.3131769 108.495691,77.3131769 C107.435556,76.9197246 105.930965,76.2129677 102.40811,76.2202539 C100.112972,76.2238969 98.4080116,76.9015092 97.3405901,77.9616446 C96.2440239,79.0472815 95.7084916,80.6429492 95.6137716,82.8943707 L110.437451,82.8797984 C110.437451,82.8797984 110.827261,82.8870845 110.867334,83.2659645 C110.881907,83.4262599 111.377365,86.3115768 110.422879,89.6522783 L110.422879,89.6522783 Z" fill="#FFFFFF" transform="translate(100.755643, 84.138465) scale(1, -1) translate(-100.755643, -84.138465) "></path>
+		<path d="M63.6417638,76.8187739 C63.0625146,77.2814447 62.9823669,77.3980231 62.7856408,77.6967554 C62.4941946,78.15214 62.3448285,78.8006077 62.3448285,79.6239431 C62.3448285,80.9281646 62.7747115,81.8644354 63.6672654,82.4946877 C63.6563361,82.4910446 64.9423423,83.6058261 67.9660961,83.5657523 C70.0900099,83.5366076 71.9880529,83.223303 71.9880529,83.223303 L71.9880529,76.4836108 L71.991696,76.4836108 C71.991696,76.4836108 70.1082253,76.0792293 67.9879545,75.9517216 C64.9714869,75.7695678 63.6308346,76.822417 63.6417638,76.8187739 M69.5399053,87.2343307 C68.9387976,87.2780476 68.1591792,87.3035491 67.2265515,87.3035491 C65.9551176,87.3035491 64.7274007,87.1432537 63.5761885,86.8335922 C62.41769,86.5239307 61.37577,86.0394014 60.4795731,85.3982199 C59.5797331,84.7533953 58.8547608,83.9300599 58.3301578,82.9537153 C57.8055547,81.9773707 57.5396101,80.8261584 57.5396101,79.5365092 C57.5396101,78.2250016 57.7654809,77.0847185 58.2172224,76.1520908 C58.6689639,75.2158201 59.3210747,74.4362016 60.1516962,73.8350939 C60.9750316,73.2339863 61.99145,72.793174 63.1718069,72.5272294 C64.3339484,72.2612847 65.6527423,72.1264909 67.0954007,72.1264909 C68.6145638,72.1264909 70.1300837,72.2503555 71.5982437,72.5017278 C73.0518314,72.749457 74.836939,73.1101217 75.3323975,73.223057 C75.8242129,73.3396355 76.3706744,73.4890016 76.3706744,73.4890016 C76.7386252,73.5800786 76.7094806,73.9735309 76.7094806,73.9735309 L76.7021944,87.5294199 C76.7021944,90.5021706 75.9080036,92.7062321 74.3451237,94.0723859 C72.7895298,95.4348967 70.4980345,96.1234382 67.536213,96.1234382 C66.4250746,96.1234382 64.6363238,95.970429 63.5652592,95.7554874 C63.5652592,95.7554874 60.3265639,95.1288782 58.9931978,94.0869582 C58.9931978,94.0869582 58.7017516,93.9048044 58.862047,93.4967798 L59.9112531,90.6770383 C60.0424039,90.3127306 60.3957824,90.4365952 60.3957824,90.4365952 C60.3957824,90.4365952 60.5087177,90.4803121 60.6398685,90.5568168 C63.4923977,92.1087675 67.0990438,92.0614075 67.0990438,92.0614075 C68.7019976,92.0614075 69.9333576,91.7408167 70.7639791,91.1032783 C71.5727422,90.4839552 71.9844099,89.5476845 71.9844099,87.5731368 L71.9844099,86.9465276 C70.709333,87.1286814 69.5399053,87.2343307 69.5399053,87.2343307" fill="#FFFFFF" transform="translate(67.124818, 84.124965) scale(1, -1) translate(-67.124818, -84.124965) "></path>
+		<path d="M189.099133,94.6589745 C189.212069,94.9941376 188.975269,95.1544329 188.876906,95.1908637 C188.625533,95.2892268 187.365029,95.5551714 186.392327,95.6171037 C184.530715,95.7300391 183.496081,95.4167345 182.57074,95.0014237 C181.652684,94.586113 180.632623,93.9157868 180.064303,93.1543837 L180.064303,94.9577068 C180.064303,95.2090791 179.885792,95.4094483 179.638063,95.4094483 L175.838334,95.4094483 C175.590604,95.4094483 175.412094,95.2090791 175.412094,94.9577068 L175.412094,72.8478733 C175.412094,72.6001441 175.616106,72.3961318 175.863835,72.3961318 L179.758284,72.3961318 C180.006014,72.3961318 180.206383,72.6001441 180.206383,72.8478733 L180.206383,83.8936824 C180.206383,85.3764146 180.370321,86.8555038 180.698198,87.7844884 C181.018789,88.7025438 181.455958,89.4384453 181.995134,89.9666915 C182.537952,90.4912946 183.153632,90.8592453 183.827601,91.0669007 C184.516143,91.2781992 185.277546,91.3474176 185.816721,91.3474176 C186.592697,91.3474176 187.445177,91.1470484 187.445177,91.1470484 C187.729337,91.1142607 187.889632,91.2891284 187.984352,91.5477868 C188.239367,92.2253991 188.960697,94.254593 189.099133,94.6589745" fill="#FFFFFF" transform="translate(182.270544, 84.018248) scale(1, -1) translate(-182.270544, -84.018248) "></path>
+		<path d="M152.543767,105.761574 C152.070167,105.907297 151.640284,106.00566 151.07925,106.111309 C150.51093,106.213316 149.833318,106.264319 149.064629,106.264319 C146.383324,106.264319 144.270339,105.506559 142.787607,104.012897 C141.312161,102.526522 140.310315,100.264171 139.80757,97.2877773 L139.625416,96.2859312 L136.259213,96.2859312 C136.259213,96.2859312 135.851189,96.3005035 135.763755,95.8560481 L135.21365,92.770362 C135.173577,92.4789159 135.301084,92.2931189 135.694537,92.2931189 L138.969663,92.2931189 L135.647177,73.7425715 C135.388518,72.24891 135.089786,71.0211931 134.758266,70.0885655 C134.434032,69.1705101 134.117084,68.4819686 133.723632,67.9792239 C133.344752,67.4983378 132.98773,67.1413163 132.368407,66.9336609 C131.858377,66.7624363 131.268198,66.6822886 130.623374,66.6822886 C130.266352,66.6822886 129.789109,66.7405778 129.43573,66.8134393 C129.085995,66.8826578 128.900198,66.9591624 128.634254,67.0720978 C128.634254,67.0720978 128.251731,67.2178209 128.098721,66.8352978 C127.9785,66.5183501 127.104161,64.1175625 126.998512,63.8224732 C126.896506,63.527384 127.042229,63.2978702 127.228026,63.2286517 C127.665195,63.0756425 127.989429,62.9736363 128.583251,62.8315563 C129.406586,62.6384733 130.102414,62.627544 130.754524,62.627544 C132.117035,62.627544 133.362967,62.8206271 134.393958,63.1922209 C135.428592,63.5674579 136.332075,64.2195686 137.133552,65.1011932 C137.996961,66.0556794 138.53978,67.0538824 139.057096,68.4200362 C139.57077,69.7679747 140.011583,71.44379 140.361318,73.3964792 L143.702019,92.2931189 L148.583742,92.2931189 C148.583742,92.2931189 148.99541,92.2785466 149.079201,92.7266451 L149.632949,95.8086881 C149.669379,96.1037773 149.545515,96.2859312 149.148419,96.2859312 L144.408776,96.2859312 C144.434278,96.3915804 144.649219,98.0601096 145.192038,99.6302757 C145.425195,100.296959 145.862364,100.839777 146.230315,101.211371 C146.594623,101.575679 147.013576,101.834337 147.472604,101.983703 C147.942561,102.136713 148.478093,102.209574 149.064629,102.209574 C149.509084,102.209574 149.949896,102.158571 150.281416,102.089353 C150.740444,101.99099 150.918955,101.939986 151.039176,101.903556 C151.523706,101.757833 151.589281,101.899913 151.684001,102.13307 L152.816998,105.244257 C152.933576,105.57942 152.645773,105.7215 152.543767,105.761574" fill="#FFFFFF" transform="translate(139.904621, 84.445931) scale(1, -1) translate(-139.904621, -84.445931) "></path>
+		<path d="M86.3217408,63.553237 C86.3217408,63.3055078 86.14323,63.1051385 85.8955008,63.1051385 L81.9646209,63.1051385 C81.7168916,63.1051385 81.542024,63.3055078 81.542024,63.553237 L81.542024,95.1897165 C81.542024,95.4374457 81.7168916,95.6378149 81.9646209,95.6378149 L85.8955008,95.6378149 C86.14323,95.6378149 86.3217408,95.4374457 86.3217408,95.1897165 L86.3217408,63.553237 L86.3217408,63.553237 Z" fill="#FFFFFF" transform="translate(83.931882, 79.371477) scale(1, -1) translate(-83.931882, -79.371477) "></path>
+	</g>
+</svg>
\ No newline at end of file
diff --git a/web/modules/webform/includes/webform.editor.inc b/web/modules/webform/includes/webform.editor.inc
index df54800c09..4af0de3f32 100644
--- a/web/modules/webform/includes/webform.editor.inc
+++ b/web/modules/webform/includes/webform.editor.inc
@@ -123,7 +123,7 @@ function _webform_get_config_entity_file_uuids(ConfigEntityInterface $entity) {
 /******************************************************************************/
 
 /**
- * Finds all files referenced (data-entity-uuid) in an associatve array.
+ * Finds all files referenced (data-entity-uuid) in an associative array.
  *
  * @param array $data
  *   An associative array.
@@ -228,11 +228,10 @@ function _webform_delete_file_usage(array $uuids, $type, $id, $count) {
 /******************************************************************************/
 
 /**
- * Parse an HTML snippet for any linked file with data-entity-uuid attributes.
+ * Parse text for any linked files with data-entity-uuid attributes.
  *
  * @param string $text
- *   The partial (X)HTML snippet to load. Invalid markup will be corrected on
- *   import.
+ *   The text to parse.
  *
  * @return array
  *   An array of all found UUIDs.
@@ -244,27 +243,15 @@ function _webform_parse_file_uuids($text) {
     return [];
   }
 
+  $dom = Html::load($text);
+  $xpath = new \DOMXPath($dom);
+
   $uuids = [];
-  // Get all images using a regex.
-  if (preg_match_all('/<img[^>]+>/', $text, $matches)) {
-    foreach ($matches[0] as $img) {
-      // Cleanup quotes escaped via YAML.
-      // Please note, calling stripslashes() twice because elements are
-      // double escaped.
-      $img = stripslashes(stripslashes($img));
-
-      // Create a DomElement so that we can parse the image's attributes.
-      $dom_node = Html::load($img)->getElementsByTagName('img')->item(0);
-
-      // Get the entity type and uuid.
-      $type = $dom_node->getAttribute('data-entity-type');
-      $uuid = $dom_node->getAttribute('data-entity-uuid');
-
-      // Check the image is a file entity with a uuid.
-      if ($type === 'file' && $uuid) {
-        $uuids[] = $uuid;
-      }
-    }
+
+  // Find all <img> and <a> tags which reference uploaded files.
+  $nodes = $xpath->query('//*[@data-entity-type="file" and @data-entity-uuid]');
+  foreach ($nodes as $node) {
+    $uuids[] = $node->getAttribute('data-entity-uuid');
   }
 
   // Use array_unique() to collect one uuid per uploaded file.
diff --git a/web/modules/webform/includes/webform.install.inc b/web/modules/webform/includes/webform.install.inc
index 4a93e2690e..c40f8ea053 100644
--- a/web/modules/webform/includes/webform.install.inc
+++ b/web/modules/webform/includes/webform.install.inc
@@ -23,6 +23,10 @@
  * @see drush_webform_repair()
  */
 function _webform_update_admin_settings($reset = FALSE) {
+  // Make sure to purge the config cache before updating any config.
+  // This ensure that any config schema changes are loaded.
+  \Drupal::service('cache.config')->deleteAll();
+
   $admin_config = \Drupal::configFactory()->getEditable('webform.settings');
 
   $current_settings = $admin_config->getRawData();
@@ -96,9 +100,11 @@ function _webform_update_webform_settings() {
  */
 function _webform_update_webform_setting(array $data) {
   $default_properties = [
+    'uuid' => NULL,
     'langcode' => 'en',
     'status' => WebformInterface::STATUS_OPEN,
     'dependencies' => [],
+    'third_party_settings' => [],
     'open' => NULL,
     'close' => NULL,
     'weight' => 0,
@@ -126,6 +132,10 @@ function _webform_update_webform_setting(array $data) {
   foreach ($data as $name => $value) {
     $properties[$name] = $value;
   }
+  // Empty settings.
+  if (empty($properties['third_party_settings'])) {
+    unset($properties['third_party_settings']);
+  }
   // Set properties.
   $data = $properties;
 
@@ -167,6 +177,12 @@ function _webform_update_webform_setting_settings(array $settings) {
     }
     unset($settings['page_admin_theme']);
   }
+
+  // Issue #3151506: Remove .webform-elements wrapper around elements.
+  if (isset($settings['form_elements_attributes'])) {
+    unset($settings['form_elements_attributes']);
+  }
+
   return $settings;
 }
 
diff --git a/web/modules/webform/includes/webform.install.requirements.inc b/web/modules/webform/includes/webform.install.requirements.inc
index d0470954d0..ac9b2d706e 100644
--- a/web/modules/webform/includes/webform.install.requirements.inc
+++ b/web/modules/webform/includes/webform.install.requirements.inc
@@ -48,7 +48,7 @@ function webform_requirements($phase) {
   // Check HTML email handling.
   /****************************************************************************/
 
-  /** @var \Drupal\webform\WebformEProviderInterface $email_provider */
+  /** @var \Drupal\webform\WebformEmailProviderInterface $email_provider */
   $email_provider = \Drupal::service('webform.email_provider');
   $mail_module_name = $email_provider->getModuleName();
   $mail_plugin_id = $email_provider->getMailPluginId();
@@ -57,13 +57,17 @@ function webform_requirements($phase) {
     $t_args = [
       '@module' => $mail_module_name,
       '@plugin_id' => $mail_plugin_id,
-      '@plugin_label' => $mail_plugin_definition['label'],
-      '@plugin_description' => $mail_plugin_definition['description'],
     ];
+    if ($mail_plugin_definition) {
+      $t_args += [
+        '@plugin_label' => $mail_plugin_definition['label'],
+        '@plugin_description' => $mail_plugin_definition['description'],
+      ];
+    }
     $requirements['webform_email'] = [
       'title' => t('Webform: HTML email support'),
-      'value' => ($mail_module_name) ? t('Provided by the @module module.', $t_args) : t('Provided by @plugin_id mail plugin.', $t_args),
-      'description' => new FormattableMarkup('@plugin_label: @plugin_description', $t_args),
+      'value' => ($mail_module_name) ? t('Provided by the @module module.', $t_args) : t('Provided by the @plugin_id mail plugin.', $t_args),
+      'description' => $mail_plugin_definition ? new FormattableMarkup('@plugin_label: @plugin_description', $t_args) : '',
       'severity' => REQUIREMENT_OK,
     ];
   }
@@ -108,14 +112,14 @@ function webform_requirements($phase) {
   /****************************************************************************/
 
   if (\Drupal::config('webform.settings')->get('requirements.bootstrap')) {
-    $spam_protection = FALSE;
+    $bootstrap_enabled = FALSE;
     $themes = \Drupal::service('theme_handler')->listInfo();
     foreach ($themes as $theme) {
       if ((isset($theme->base_themes) && isset($theme->base_themes['bootstrap'])) || $theme === 'bootstrap') {
-        $spam_protection = TRUE;
+        $bootstrap_enabled = TRUE;
       }
     }
-    if ($spam_protection) {
+    if ($bootstrap_enabled) {
       if (\Drupal::moduleHandler()->moduleExists('webform_bootstrap')) {
         $requirements['webform_bootstrap'] = [
           'title' => t('Webform: Bootstrap integration'),
@@ -133,6 +137,28 @@ function webform_requirements($phase) {
     }
   }
 
+  /****************************************************************************/
+  // Check Clientside validation module.
+  /****************************************************************************/
+
+  if (\Drupal::config('webform.settings')->get('requirements.clientside_validation')
+    && \Drupal::moduleHandler()->moduleExists('clientside_validation')) {
+    if (\Drupal::moduleHandler()->moduleExists('webform_clientside_validation')) {
+      $requirements['webform_clientside_validation'] = [
+        'title' => t('Webform: Clientside validation'),
+        'value' => t('Webform Clientside Validation module installed.'),
+      ];
+    }
+    else {
+      $requirements['webform_clientside_validation'] = [
+        'title' => t('Webform: Clientside validation'),
+        'value' => t('Webform Clientside Validation module not installed.'),
+        'description' => t('The Webform Clientside Validation module helps support Webform Clientside Validation integration. <a href=":href">Disable Webform Clientside Validation warning</a>', [':href' => Url::fromRoute('webform.config.advanced')->toString()]),
+        'severity' => REQUIREMENT_WARNING,
+      ];
+    }
+  }
+
   /****************************************************************************/
   // Check SPAM protection.
   /****************************************************************************/
diff --git a/web/modules/webform/includes/webform.install.update.inc b/web/modules/webform/includes/webform.install.update.inc
index 13ede9a6b7..3af2053617 100644
--- a/web/modules/webform/includes/webform.install.update.inc
+++ b/web/modules/webform/includes/webform.install.update.inc
@@ -36,6 +36,11 @@ function webform_update_dependencies() {
   // @see https://www.drupal.org/project/webform/issues/2958102
   $dependencies['webform'][8099]['system'] = 8501;
 
+  // Ensure that system_update_8805() runs before the webform update, so that
+  // the 'path_alias' module is enabled and configured correctly.
+  // @see https://www.drupal.org/project/webform/issues/3166248
+  $dependencies['webform']['8158']['system'] = 8805;
+
   return $dependencies;
 }
 
@@ -911,7 +916,7 @@ function webform_update_8044() {
 }
 
 /**
- * Issue #2878307: webform example module disable causes a customised webform deleted.
+ * Issue #2878307: webform example module disable causes a customized webform deleted.
  */
 function webform_update_8045() {
   // Remove sub module dependencies copied to new forms.
@@ -3521,7 +3526,7 @@ function webform_update_8187() {
 }
 
 /**
- * Issue #3097101: Remote Post cast boolean and numer values.
+ * Issue #3097101: Remote Post cast boolean and number values.
  */
 function webform_update_8188() {
   _webform_update_webform_handler_settings();
@@ -3759,3 +3764,149 @@ function webform_update_8196() {
 function webform_update_8197() {
   _webform_update_admin_settings();
 }
+
+/**
+ * Issue #3156982: Fix empty '#option_all_value' and '#option_all_text'.
+ */
+function webform_update_8198() {
+  $options_properties = [
+    '#options_all_value',
+    '#options_all_text',
+    '#options_none_value',
+    '#options_none_text',
+  ];
+
+  $config_factory = \Drupal::configFactory();
+  foreach ($config_factory->listAll('webform.webform.') as $webform_config_name) {
+    $webform_config = $config_factory->getEditable($webform_config_name);
+    $elements = $webform_config->get('elements');
+
+    // Try to decode elements.
+    try {
+      $elements = WebformYaml::decode($elements);
+    }
+    catch (\Exception $exception) {
+      continue;
+    }
+
+    // Make sure elements is an array.
+    if (!is_array($elements)) {
+      continue;
+    }
+
+    $has_options_property = FALSE;
+    $flattened_elements =& WebformFormHelper::flattenElements($elements);
+    foreach ($flattened_elements as &$element) {
+      foreach ($options_properties as $options_property) {
+        if (isset($element[$options_property]) && $element[$options_property] === '') {
+          unset($element[$options_property]);
+          $has_options_property = TRUE;
+        }
+      }
+    }
+    if ($has_options_property) {
+      $webform_config->set('elements', WebformYaml::encode($elements));
+      $webform_config->save(TRUE);
+    }
+  }
+}
+
+/**
+ * Issue #3157587: Hide the next button when auto-forwarding cards.
+ */
+function webform_update_8199() {
+  _webform_update_webform_settings();
+}
+
+/**
+ * Issue #3161787: Image select element is included empty filter properties.
+ */
+function webform_update_8200() {
+  _webform_update_elements_clear_properties([
+    '#filter__placeholder' => '',
+    '#filter__singlular' => '',
+    '#filter__plural' => '',
+    '#filter__no_results' => '',
+  ]);
+}
+
+/**
+ * Issue #3165395: Improve delete button handling.
+ */
+function webform_update_8201() {
+  _webform_update_admin_settings();
+}
+
+/**
+ * Issue #3152884: Clientside validation with AJAX.
+ */
+function webform_update_8202() {
+  _webform_update_admin_settings();
+}
+
+/**
+ * Issue #3166341: Add keyboard navigation support to Webform cards.
+ */
+function webform_update_8203() {
+  _webform_update_webform_settings();
+}
+
+/**
+ * Issue #3166236: Make "next_serial" optional.
+ */
+function webform_update_8204() {
+  _webform_update_admin_settings();
+}
+
+/**
+ * Issue #3168333: Allow site builders to customize debug handler data and format.
+ */
+function webform_update_8205() {
+  _webform_update_webform_handler_settings();
+}
+
+/**
+ * Issue #3166827: Make the "Webforms" menu item a top-level toolbar item.
+ */
+function webform_update_8206() {
+  _webform_update_admin_settings();
+}
+
+/**
+ * Issue #3171834: Allow .webform-elements to support custom attributes.
+ */
+function webform_update_8207() {
+  _webform_update_webform_settings();
+}
+
+/**
+ * Issue #3151506: Remove .webform-elements wrapper around elements.
+ */
+function webform_update_8208() {
+  _webform_update_webform_settings();
+}
+
+/**
+ * Issue #3174132: Add (admin) notes to handlers.
+ */
+function webform_update_8209() {
+  $config_factory = \Drupal::configFactory();
+  foreach ($config_factory->listAll('webform.webform.') as $webform_config_name) {
+    $webform_config = $config_factory->getEditable($webform_config_name);
+
+    $data = $webform_config->getRawData();
+    $save = FALSE;
+    foreach ($data['handlers'] as &$handler) {
+      if (!isset($handler['notes'])) {
+        WebformArrayHelper::insertAfter($handler, 'label', 'notes', '');
+        $save = TRUE;
+      }
+    }
+
+    if ($save) {
+      $webform_config->setData($data);
+      $webform_config->save();
+    }
+  }
+}
+
diff --git a/web/modules/webform/includes/webform.theme.inc b/web/modules/webform/includes/webform.theme.inc
index 49d83a9785..2b3b67b231 100644
--- a/web/modules/webform/includes/webform.theme.inc
+++ b/web/modules/webform/includes/webform.theme.inc
@@ -5,6 +5,7 @@
  * Theme hooks, preprocessor, and suggestions.
  */
 
+use Drupal\Core\Render\Element;
 use Drupal\file\Entity\File;
 use Drupal\Component\Utility\Html;
 use Drupal\Component\Utility\NestedArray;
@@ -497,6 +498,14 @@ function webform_preprocess_form_element(&$variables) {
   // Setup description, help, and more.
   _webform_preprocess_element($variables, ['label', '#title']);
 
+  // Make sure the #description_display is always applied to account for
+  // #more which is placed in the #description.
+  // @see template_preprocess_form_element()
+  if (isset($variables['description'])) {
+    $element = &$variables['element'];
+    $variables['description_display'] = $element['#description_display'];
+  }
+
   // Add missing classes to the Claro theme's form elements.
   // @see core/modules/system/templates/form-element.html.twig
   // @see claro/templates/form-element.html.twig
@@ -515,6 +524,9 @@ function webform_preprocess_form_element(&$variables) {
 
     // Add system .description class.
     if (isset($variables['description'])) {
+      if (empty($variables['description']['attributes'])) {
+        $variables['description']['attributes'] = new Attribute();
+      }
       $variables['description']['attributes']->addClass('description');
     }
   }
@@ -565,7 +577,7 @@ function webform_preprocess_file_managed_file(&$variables) {
   }
 
   // Don't alter hidden file upload input.
-  if (isset($element['upload']['#access']) && $element['upload']['#access'] === FALSE) {
+  if (!Element::isVisibleElement($element['upload'])) {
     return;
   }
 
diff --git a/web/modules/webform/includes/webform.theme.template.inc b/web/modules/webform/includes/webform.theme.template.inc
index 2190037c9f..f3c0e17170 100644
--- a/web/modules/webform/includes/webform.theme.template.inc
+++ b/web/modules/webform/includes/webform.theme.template.inc
@@ -853,6 +853,7 @@ function template_preprocess_webform_composite_telephone(array &$variables) {
 function template_preprocess_webform_element_help(array &$variables) {
   $attributes = (isset($variables['attributes'])) ? $variables['attributes'] : [];
   $attributes['class'][] = 'webform-element-help';
+  $attributes['class'][] = 'js-webform-element-help';
   $attributes['role'] = 'tooltip';
   $attributes['tabindex'] = '0';
 
diff --git a/web/modules/webform/js/webform.contextual.js b/web/modules/webform/js/webform.contextual.js
index 596c4cd243..aacfe44c89 100644
--- a/web/modules/webform/js/webform.contextual.js
+++ b/web/modules/webform/js/webform.contextual.js
@@ -16,7 +16,7 @@
       this.href = this.href.split('?')[0];
 
       // Add ?_webform_test={webform} to the current page's URL.
-      if (/webform\/([^/]+)\/test/.test(this.href)) {
+      if (/webform\/([^/]+)\/test$/.test(this.href)) {
         this.href = window.location.pathname + '?_webform_test=' + RegExp.$1;
       }
     });
diff --git a/web/modules/webform/js/webform.dialog.js b/web/modules/webform/js/webform.dialog.js
index ddee9db0f0..c888e7a106 100644
--- a/web/modules/webform/js/webform.dialog.js
+++ b/web/modules/webform/js/webform.dialog.js
@@ -13,7 +13,7 @@
   Drupal.webform.dialog.options = Drupal.webform.dialog.options || {};
 
   /**
-   * Programatically open a webform (or page) in a dialog.
+   * Programmatically open a webform (or page) in a dialog.
    *
    * @param {string} url
    *   Webform URL.
@@ -84,6 +84,11 @@
         element_settings.dialogType = $a.data('dialog-type') || 'modal';
         element_settings.dialog = options;
         element_settings.element = this;
+        element_settings.error = function error(xmlhttp, uri) {
+          if (xmlhttp.status === 403) {
+            window.location.replace(href.split('?')[0]);
+          }
+        };
         Drupal.ajax(element_settings);
       });
     }
diff --git a/web/modules/webform/js/webform.element.checkboxes.js b/web/modules/webform/js/webform.element.checkboxes.js
index 761ff3d5d3..d5a82520da 100644
--- a/web/modules/webform/js/webform.element.checkboxes.js
+++ b/web/modules/webform/js/webform.element.checkboxes.js
@@ -26,108 +26,87 @@
 
           // Get all checkboxes.
           var $checkboxes = $element.find('input[type="checkbox"]');
+
           // Get all options/checkboxes.
           var $options = $checkboxes
             .not('[value="' + options_all_value + '"]')
             .not('[value="' + options_none_value + '"]');
 
-          // All of the above.
-          if (options_all_value) {
-            var $options_all = $element
-              .find(':checkbox[value="' + options_all_value + '"]');
-            $options_all.on('click', function () {
-              var checked = this.checked;
-              $checkboxes.each(function () {
-                if (this.value === options_none_value) {
-                  this.checked = false;
-                }
-                else {
-                  this.checked = checked;
-                }
-              });
-            });
+          // Get options all and none checkboxes.
+          var $options_all = $element
+            .find(':checkbox[value="' + options_all_value + '"]');
+          var $options_none = $element
+            .find(':checkbox[value="' + options_none_value + '"]');
 
-            $options.on('click', toggleCheckAllEventHandler);
+          // All of the above.
+          if ($options_all.length) {
+            $options_all.on('click', toggleCheckAllEventHandler);
             toggleCheckAllEventHandler();
-
-            /**
-             * Toggle check all checkbox checked state.
-             */
-            function toggleCheckAllEventHandler() {
-              var checked = true;
-              $options.each(function () {
-                if (!this.checked) {
-                  checked = false;
-                }
-              });
-              $options_all[0].checked = checked;
-            }
           }
 
           // None of the above.
-          if (options_none_value) {
-            var $options_none = $element.find(':checkbox[value="' + options_none_value + '"]');
+          if ($options_none.length) {
             $options_none.on('click', toggleCheckNoneEventHandler);
             toggleCheckNoneEventHandler();
+          }
 
-            /**
-             * Toggle check none checkbox checked state.
-             */
-            function toggleCheckNoneEventHandler() {
-              var checked = $options_none[0].checked;
-              $checkboxes.each(function () {
-                if (this.value !== options_none_value) {
-                  if (checked && this.checked) {
-                    this.checked = false;
-                    $(this).change();
-                  }
-                  this.disabled = checked;
-                }
-              });
+          $options.on('click', toggleCheckboxesEventHandler);
+          toggleCheckboxesEventHandler();
+
+          /**
+           * Toggle check all checkbox checked state.
+           */
+          function toggleCheckAllEventHandler() {
+            if ($options_all.prop('checked')) {
+              // Uncheck options none.
+              if ($options_none.is(':checked')) {
+                $options_none
+                  .prop('checked', false)
+                  .trigger('change', ['webform.states']);
+              }
+              // Check check all unchecked options.
+              $options.not(':checked')
+                .prop('checked', true)
+                .trigger('change', ['webform.states']);
+            }
+            else {
+              // Check uncheck all checked options.
+              $options.filter(':checked')
+                .prop('checked', false)
+                .trigger('change', ['webform.states']);
             }
-
           }
-        });
-    }
-  };
 
-  /**
-   * Adds HTML5 validation to required checkboxes.
-   *
-   * @type {Drupal~behavior}
-   *
-   * @see https://www.drupal.org/project/webform/issues/3068998
-   */
-  Drupal.behaviors.webformCheckboxesRadiosRequired = {
-    attach: function (context) {
-      $('.js-webform-type-checkboxes.required, .js-webform-type-webform-radios-other.checkboxes', context)
-        .once('webform-checkboxes-required')
-        .each(function () {
-          var $element = $(this);
-          var $firstCheckbox = $element
-            .find('input[type="checkbox"]')
-            .first();
-
-          // Copy clientside_validation.module's message to the checkboxes.
-          if ($element.attr('data-msg-required')) {
-            $firstCheckbox.attr('data-msg-required', $element.attr('data-msg-required'));
+          /**
+           * Toggle check none checkbox checked state.
+           */
+          function toggleCheckNoneEventHandler() {
+            if ($options_none.prop('checked')) {
+              $checkboxes
+                .not('[value="' + options_none_value + '"]')
+                .filter(':checked')
+                .prop('checked', false)
+                .trigger('change', ['webform.states']);
+            }
           }
 
-          $element.find('input[type="checkbox"]').on('click', required);
-          required();
-
-          function required() {
-            var isChecked = $element.find('input[type="checkbox"]:checked');
-            if (isChecked.length) {
-              $firstCheckbox
-                .removeAttr('required')
-                .removeAttr('aria-required');
+          /**
+           * Toggle check all checkbox checked state.
+           */
+          function toggleCheckboxesEventHandler() {
+            var isAllChecked = ($options.filter(':checked').length === $options.length);
+            if ($options_all.length
+              && $options_all.prop('checked') !== isAllChecked) {
+              $options_all
+                .prop('checked', isAllChecked)
+                .trigger('change', ['webform.states']);
             }
-            else {
-              $firstCheckbox.attr({
-                'required': 'required',
-                'aria-required': 'true'
-              });
+            var isOneChecked = $options.is(':checked');
+            if ($options_none.length
+              && isOneChecked) {
+              $options_none
+                .prop('checked', false)
+                .trigger('change', ['webform.states']);
             }
           }
         });
diff --git a/web/modules/webform/js/webform.element.codemirror.js b/web/modules/webform/js/webform.element.codemirror.js
index b149a1feb9..95b98b0337 100644
--- a/web/modules/webform/js/webform.element.codemirror.js
+++ b/web/modules/webform/js/webform.element.codemirror.js
@@ -28,19 +28,19 @@
         var $input = $(this);
 
         // Open all closed details, so that editor height is correctly calculated.
-        var $details = $(this).parents('details:not([open])');
+        var $details = $input.parents('details:not([open])');
         $details.attr('open', 'open');
 
         // #59 HTML5 required attribute breaks hack for webform submission.
         // https://github.com/marijnh/CodeMirror-old/issues/59
-        $(this).removeAttr('required');
+        $input.removeAttr('required');
 
         var options = $.extend({
-          mode: $(this).attr('data-webform-codemirror-mode'),
+          mode: $input.attr('data-webform-codemirror-mode'),
           lineNumbers: true,
-          lineWrapping: ($(this).attr('wrap') === 'off') ? false : true,
+          lineWrapping: ($input.attr('wrap') !== 'off'),
           viewportMargin: Infinity,
-          readOnly: ($(this).prop('readonly') || $(this).prop('disabled')) ? true : false,
+          readOnly: !!($input.prop('readonly') || $input.prop('disabled')),
           extraKeys: {
             // Setting for using spaces instead of tabs - https://github.com/codemirror/CodeMirror/issues/988
             Tab: function (cm) {
@@ -109,7 +109,7 @@
           editor.setOption('readOnly', $input.is(':disabled'));
         });
 
-        // Delay refreshing CodeMirror for 10 millisecond while the dialog is
+        // Delay refreshing CodeMirror for 500 millisecond while the dialog is
         // still being rendered.
         // @see http://stackoverflow.com/questions/8349571/codemirror-editor-is-not-loading-content-until-clicked
         setTimeout(function () {
@@ -129,7 +129,7 @@
           // Hide tab panel and close details.
           $tabPanel.hide();
           $details.removeAttr('open');
-        }, 10);
+        }, 500);
       });
 
       // Webform CodeMirror syntax coloring.
diff --git a/web/modules/webform/js/webform.element.date.js b/web/modules/webform/js/webform.element.date.js
index 257698d9a8..e9c9c81612 100644
--- a/web/modules/webform/js/webform.element.date.js
+++ b/web/modules/webform/js/webform.element.date.js
@@ -99,9 +99,7 @@
         }
 
         // Disable autocomplete.
-        // @see https://gist.github.com/niksumeiko/360164708c3b326bd1c8
-        var isChrome = (/chrom(e|ium)/.test(window.navigator.userAgent.toLowerCase()));
-        $input.attr('autocomplete', (isChrome) ? 'chrome-off-' + Math.floor(Math.random() * 100000000) : 'off');
+        $input.attr('autocomplete', 'off');
 
         $input.datepicker(options);
       });
diff --git a/web/modules/webform/js/webform.element.details.save.js b/web/modules/webform/js/webform.element.details.save.js
index 3fb4a91d6b..6983b33da4 100644
--- a/web/modules/webform/js/webform.element.details.save.js
+++ b/web/modules/webform/js/webform.element.details.save.js
@@ -7,6 +7,20 @@
 
   'use strict';
 
+  // Determine if local storage exists and is enabled.
+  // This approach is copied from Modernizr.
+  // @see https://github.com/Modernizr/Modernizr/blob/c56fb8b09515f629806ca44742932902ac145302/modernizr.js#L696-731
+  var hasLocalStorage = (function () {
+    try {
+      localStorage.setItem('webform', 'webform');
+      localStorage.removeItem('webform');
+      return true;
+    }
+    catch (e) {
+      return false;
+    }
+  }());
+
   /**
    * Attach handler to save details open/close state.
    *
@@ -14,7 +28,7 @@
    */
   Drupal.behaviors.webformDetailsSave = {
     attach: function (context) {
-      if (!window.localStorage) {
+      if (!hasLocalStorage) {
         return;
       }
 
@@ -72,7 +86,7 @@
    *   The name used to store the state of details element.
    */
   Drupal.webformDetailsSaveGetName = function ($details) {
-    if (!window.localStorage) {
+    if (!hasLocalStorage) {
       return '';
     }
 
diff --git a/web/modules/webform/js/webform.element.details.toggle.js b/web/modules/webform/js/webform.element.details.toggle.js
index cca3c52399..44b8599019 100644
--- a/web/modules/webform/js/webform.element.details.toggle.js
+++ b/web/modules/webform/js/webform.element.details.toggle.js
@@ -23,7 +23,7 @@
         var $tabs = $form.find('.webform-tabs');
 
         // Get only the main details elements and ignore all nested details.
-        var selector = ($tabs.length) ? '.webform-tab' : '.js-webform-details-toggle';
+        var selector = ($tabs.length) ? '.webform-tab' : '.js-webform-details-toggle, .webform-elements';
         var $details = $form.find('details').filter(function () {
           var $parents = $(this).parentsUntil(selector);
           return ($parents.find('details').length === 0);
@@ -57,6 +57,9 @@
             // @see webform.element.details.save.js
             if (Drupal.webformDetailsSaveGetName) {
               $form.find('details').each(function () {
+                // Note: Drupal.webformDetailsSaveGetName checks if localStorage
+                // exists and is enabled.
+                // @see webform.element.details.save.js
                 var name = Drupal.webformDetailsSaveGetName($(this));
                 if (name) {
                   localStorage.setItem(name, open);
diff --git a/web/modules/webform/js/webform.element.help.js b/web/modules/webform/js/webform.element.help.js
index c3347aef74..71bbb7b4fb 100644
--- a/web/modules/webform/js/webform.element.help.js
+++ b/web/modules/webform/js/webform.element.help.js
@@ -35,7 +35,7 @@
    */
   Drupal.behaviors.webformElementHelpIcon = {
     attach: function (context) {
-      $(context).find('.webform-element-help').once('webform-element-help').each(function () {
+      $(context).find('.js-webform-element-help').once('webform-element-help').each(function () {
         var $link = $(this);
 
         var options = $.extend({
diff --git a/web/modules/webform/js/webform.element.inputhide.js b/web/modules/webform/js/webform.element.inputhide.js
index 0a7acfd360..d06698939c 100644
--- a/web/modules/webform/js/webform.element.inputhide.js
+++ b/web/modules/webform/js/webform.element.inputhide.js
@@ -38,7 +38,7 @@
           $(this)
             .on('blur', function () {
               this.type = 'password';
-              $(this).attr('autocomplete', (isChrome) ? 'chrome-off-' + Math.floor(Math.random() * 100000000) : 'off');
+              $(this).attr('autocomplete', 'off');
             })
             .on('focus', function () {
               this.type = type;
diff --git a/web/modules/webform/js/webform.element.likert.js b/web/modules/webform/js/webform.element.likert.js
index ebf81b7d01..9449de17f3 100644
--- a/web/modules/webform/js/webform.element.likert.js
+++ b/web/modules/webform/js/webform.element.likert.js
@@ -8,7 +8,7 @@
   'use strict';
 
   $(document).on('state:required', function (e) {
-    if (e.trigger) {
+    if (e.trigger && e.target && e.target.id) {
       var $element = $('#' + e.target.id);
       // Add/remove required from the question labels.
       if ($element.hasClass('webform-likert-table')) {
diff --git a/web/modules/webform/js/webform.element.location.places.js b/web/modules/webform/js/webform.element.location.places.js
index f213d6ca95..6a2bcbd642 100644
--- a/web/modules/webform/js/webform.element.location.places.js
+++ b/web/modules/webform/js/webform.element.location.places.js
@@ -64,9 +64,7 @@
         var placesAutocomplete = window.places(options);
 
         // Disable autocomplete.
-        // @see https://gist.github.com/niksumeiko/360164708c3b326bd1c8
-        var isChrome = (/chrom(e|ium)/.test(window.navigator.userAgent.toLowerCase()));
-        $input.attr('autocomplete', (isChrome) ? 'chrome-off-' + Math.floor(Math.random() * 100000000) : 'off');
+        $input.attr('autocomplete', 'off');
 
         // Sync values on change and clear events.
         placesAutocomplete.on('change', function (e) {
diff --git a/web/modules/webform/js/webform.element.managed_file.js b/web/modules/webform/js/webform.element.managed_file.js
index 14e9809b29..b005a7d1ef 100644
--- a/web/modules/webform/js/webform.element.managed_file.js
+++ b/web/modules/webform/js/webform.element.managed_file.js
@@ -103,7 +103,15 @@
     var message = Drupal.t('File upload in progress. Uploaded file may be lost.') +
       '\n' +
       Drupal.t('Do you want to continue?');
-    return !window.confirm(message);
+    var result = !window.confirm(message);
+
+    // If submit once behavior is available, make sure to clear it if the form
+    // can be submitted.
+    if (result && Drupal.behaviors.webformSubmitOnce) {
+      setTimeout(function () {Drupal.behaviors.webformSubmitOnce.clear();});
+    }
+
+    return result;
   }
 
 })(jQuery, Drupal);
diff --git a/web/modules/webform/js/webform.element.message.js b/web/modules/webform/js/webform.element.message.js
index 6c216d7a74..8daac8be51 100644
--- a/web/modules/webform/js/webform.element.message.js
+++ b/web/modules/webform/js/webform.element.message.js
@@ -7,6 +7,34 @@
 
   'use strict';
 
+  // Determine if local storage exists and is enabled.
+  // This approach is copied from Modernizr.
+  // @see https://github.com/Modernizr/Modernizr/blob/c56fb8b09515f629806ca44742932902ac145302/modernizr.js#L696-731
+  var hasLocalStorage = (function () {
+    try {
+      localStorage.setItem('webform', 'webform');
+      localStorage.removeItem('webform');
+      return true;
+    }
+    catch (e) {
+      return false;
+    }
+  }());
+
+  // Determine if session storage exists and is enabled.
+  // This approach is copied from Modernizr.
+  // @see https://github.com/Modernizr/Modernizr/blob/c56fb8b09515f629806ca44742932902ac145302/modernizr.js#L696-731
+  var hasSessionStorage = (function () {
+    try {
+      sessionStorage.setItem('webform', 'webform');
+      sessionStorage.removeItem('webform');
+      return true;
+    }
+    catch (e) {
+      return false;
+    }
+  }());
+
   /**
    * Behavior for handler message close.
    *
@@ -53,13 +81,13 @@
 
     switch (storage) {
       case 'local':
-        if (window.localStorage) {
+        if (hasLocalStorage) {
           return localStorage.getItem('Drupal.webform.message.' + id) || false;
         }
         return false;
 
       case 'session':
-        if (window.sessionStorage) {
+        if (hasSessionStorage) {
           return sessionStorage.getItem('Drupal.webform.message.' + id) || false;
         }
         return false;
@@ -76,13 +104,13 @@
 
     switch (storage) {
       case 'local':
-        if (window.localStorage) {
+        if (hasLocalStorage) {
           localStorage.setItem('Drupal.webform.message.' + id, true);
         }
         break;
 
       case 'session':
-        if (window.sessionStorage) {
+        if (hasSessionStorage) {
           sessionStorage.setItem('Drupal.webform.message.' + id, true);
         }
         break;
diff --git a/web/modules/webform/js/webform.element.radios.js b/web/modules/webform/js/webform.element.radios.js
deleted file mode 100644
index 92087b048e..0000000000
--- a/web/modules/webform/js/webform.element.radios.js
+++ /dev/null
@@ -1,33 +0,0 @@
-/**
- * @file
- * JavaScript behaviors for radio buttons.
- */
-
-(function ($, Drupal) {
-
-  'use strict';
-
-  /**
-   * Adds HTML5 validation to required radios buttons.
-   *
-   * @type {Drupal~behavior}
-   *
-   * @see Issue #2856795: If radio buttons are required but not filled form is nevertheless submitted.
-   */
-  Drupal.behaviors.webformRadiosRequired = {
-    attach: function (context) {
-      $('.js-webform-type-radios, .js-webform-type-webform-radios-other', context).each(function () {
-        var $element = $(this);
-        var $radios = $element.find('input[type="radio"]');
-        if ($element.hasClass('required')) {
-          $radios.attr({'required': 'required', 'aria-required': 'true'});
-        }
-        // Copy clientside_validation.module's message to the radio buttons.
-        if ($element.attr('data-msg-required')) {
-          $radios.attr({'data-msg-required': $element.attr('data-msg-required')});
-        }
-      });
-    }
-  };
-
-})(jQuery, Drupal);
diff --git a/web/modules/webform/js/webform.element.signature.js b/web/modules/webform/js/webform.element.signature.js
index 253718a2fa..4401e41a1b 100644
--- a/web/modules/webform/js/webform.element.signature.js
+++ b/web/modules/webform/js/webform.element.signature.js
@@ -3,7 +3,7 @@
  * JavaScript behaviors for signature pad integration.
  */
 
-(function ($, Drupal) {
+(function ($, Drupal, debounce) {
 
   'use strict';
 
@@ -31,24 +31,17 @@
         var $button = $wrapper.find(':button, :submit');
         var canvas = $canvas[0];
 
-        var calculateDimensions = function () {
+        var refresh = function () {
+          // Set dimensions.
           $canvas.attr('width', $wrapper.width());
           $canvas.attr('height', $wrapper.width() / 3);
-        };
-
-        // Set height.
-        $canvas.attr('width', $wrapper.width());
-        $canvas.attr('height', $wrapper.width() / 3);
-        $(window).resize(function () {
-          calculateDimensions();
-
-          // Resizing clears the canvas so we need to reset the signature pad.
+          // Set signature.
           signaturePad.clear();
           var value = $input.val();
           if (value) {
             signaturePad.fromDataURL(value);
           }
-        });
+        };
 
         // Initialize signature canvas.
         var options = $.extend({
@@ -58,17 +51,15 @@
         }, Drupal.webform.signaturePad.options);
         var signaturePad = new SignaturePad(canvas, options);
 
-        // Set value.
-        if (value) {
-          signaturePad.fromDataURL(value);
-        }
-
         // Disable the signature pad when input is disabled or readonly.
         if ($input.is(':disabled') || $input.is('[readonly]')) {
           signaturePad.off();
           $button.hide();
         }
 
+        // Set resize handler.
+        $(window).resize(debounce(refresh, 10));
+
         // Set reset handler.
         $button.on('click', function () {
           signaturePad.clear();
@@ -83,12 +74,7 @@
         // @see webform.states.js
         // @see triggerEventHandlers()
         $input.on('change', function () {
-          if (!$input.val()) {
-            signaturePad.clear();
-          }
-          setTimeout(function () {
-            calculateDimensions();
-          }, 1);
+          setTimeout(refresh, 1);
         });
 
         // Turn signature pad off/on when the input
@@ -105,15 +91,10 @@
           }
         });
 
-        // If the signature pad is not visible (i.e. in a modal dialog),
-        // recalculate the dimensions, after everything has rendered.
-        if (!$input.is(':visible')) {
-          setTimeout(function () {
-            calculateDimensions();
-          }, 1);
-        }
+        // Make sure that the signature pad is initialized.
+        setTimeout(refresh, 1);
       });
     }
   };
 
-})(jQuery, Drupal);
+})(jQuery, Drupal, Drupal.debounce);
diff --git a/web/modules/webform/js/webform.element.states.js b/web/modules/webform/js/webform.element.states.js
index 856d805cf6..26325fe0c7 100644
--- a/web/modules/webform/js/webform.element.states.js
+++ b/web/modules/webform/js/webform.element.states.js
@@ -7,8 +7,6 @@
 
   'use strict';
 
-  var isChrome = (/chrom(e|ium)/.test(window.navigator.userAgent.toLowerCase()));
-
   /**
    * Element #states builder.
    *
@@ -48,7 +46,7 @@
               .removeClass('form-autocomplete');
           }
           // Always disable browser auto completion.
-          $value.attr('autocomplete', (isChrome ? 'chrome-off-' + Math.floor(Math.random() * 100000000) : 'off'));
+          $value.attr('autocomplete', 'off');
         }).change();
       });
 
diff --git a/web/modules/webform/js/webform.filter.js b/web/modules/webform/js/webform.filter.js
index 66f2d8020a..b5b64b7591 100644
--- a/web/modules/webform/js/webform.filter.js
+++ b/web/modules/webform/js/webform.filter.js
@@ -50,10 +50,9 @@
         };
 
         if ($table.length) {
-          var isChrome = (/chrom(e|ium)/.test(window.navigator.userAgent.toLowerCase()));
           $filterRows = $table.find(sourceSelector);
           $input
-            .attr('autocomplete', (isChrome) ? 'chrome-off-' + Math.floor(Math.random() * 100000000) : 'off')
+            .attr('autocomplete', 'off')
             .on('keyup', debounce(filterElementList, 200))
             .keyup();
 
diff --git a/web/modules/webform/js/webform.form.js b/web/modules/webform/js/webform.form.js
index 6af1f863d8..d4f136e18c 100644
--- a/web/modules/webform/js/webform.form.js
+++ b/web/modules/webform/js/webform.form.js
@@ -7,8 +7,6 @@
 
   'use strict';
 
-  var isChrome = (/chrom(e|ium)/.test(window.navigator.userAgent.toLowerCase()));
-
   /**
    * Remove single submit event listener.
    *
@@ -31,23 +29,6 @@
     }
   };
 
-  /**
-   * Autocomplete.
-   *
-   * @type {Drupal~behavior}
-   *
-   * @prop {Drupal~behaviorAttach} attach
-   *   Attaches the behavior for the webform autofocusing.
-   */
-  Drupal.behaviors.webformAutocomplete = {
-    attach: function (context) {
-      if (isChrome) {
-        $(context).find('.webform-submission-form input[autocomplete="off"]')
-          .attr('autocomplete', 'chrome-off-' + Math.floor(Math.random() * 100000000));
-      }
-    }
-  };
-
   /**
    * Prevent webform autosubmit on wizard pages.
    *
diff --git a/web/modules/webform/js/webform.form.submit_once.js b/web/modules/webform/js/webform.form.submit_once.js
index 6c2f440718..ce535d4112 100644
--- a/web/modules/webform/js/webform.form.submit_once.js
+++ b/web/modules/webform/js/webform.form.submit_once.js
@@ -16,6 +16,12 @@
    *   Attaches the behavior for preventing duplicate webform submissions.
    */
   Drupal.behaviors.webformSubmitOnce = {
+    clear: function () {
+      var $form = $('.js-webform-submit-once');
+      $form.removeData('webform-submitted');
+      $form.find('.js-webform-wizard-pages-links :submit, .form-actions :submit').removeClass('is-disabled');
+      $form.find('.form-actions .ajax-progress.ajax-progress-throbber').remove();
+    },
     attach: function (context) {
       $('.js-webform-submit-once', context).once('webform-submit-once').each(function () {
         var $form = $(this);
@@ -53,9 +59,7 @@
           $form.find('.js-webform-wizard-pages-links :submit, .form-actions :submit').addClass('is-disabled');
 
           // Set the throbber progress indicator.
-          // @see Drupal.Ajax.prototype.setProgressIndicatorThrobber
-          var $progress = $('<div class="ajax-progress ajax-progress-throbber"><div class="throbber">&nbsp;</div></div>');
-          $clickedButton.after($progress);
+          $clickedButton.after(Drupal.theme.ajaxProgressThrobber());
         });
       });
     }
diff --git a/web/modules/webform/js/webform.form.unsaved.js b/web/modules/webform/js/webform.form.unsaved.js
index 0b1fd17886..3b1c46aa02 100644
--- a/web/modules/webform/js/webform.form.unsaved.js
+++ b/web/modules/webform/js/webform.form.unsaved.js
@@ -23,6 +23,14 @@
       // @see Drupal.AjaxCommands.prototype.webformRefresh
       unsaved = false;
     },
+    get: function () {
+      // Get the current unsaved flag state.
+      return unsaved;
+    },
+    set: function (value) {
+      // Set the current unsaved flag state.
+      unsaved = value;
+    },
     attach: function (context) {
       // Look for the 'data-webform-unsaved' attribute which indicates that
       // a multi-step webform has unsaved data.
@@ -41,17 +49,20 @@
         });
       }
 
-      $('.js-webform-unsaved button, .js-webform-unsaved input[type="submit"]', context).once('webform-unsaved').on('click', function (event) {
-        // For reset button we must confirm unsaved changes before the
-        // before unload event handler.
-        if ($(this).hasClass('webform-button--reset') && unsaved) {
-          if (!window.confirm(Drupal.t('Changes you made may not be saved.') + '\n\n' + Drupal.t('Press OK to leave this page or Cancel to stay.'))) {
-            return false;
+      $('.js-webform-unsaved button, .js-webform-unsaved input[type="submit"]', context)
+        .once('webform-unsaved')
+        .not('[data-webform-unsaved-ignore]')
+        .on('click', function (event) {
+          // For reset button we must confirm unsaved changes before the
+          // before unload event handler.
+          if ($(this).hasClass('webform-button--reset') && unsaved) {
+            if (!window.confirm(Drupal.t('Changes you made may not be saved.') + '\n\n' + Drupal.t('Press OK to leave this page or Cancel to stay.'))) {
+              return false;
+            }
           }
-        }
 
-        unsaved = false;
-      });
+          unsaved = false;
+        });
 
       // Add submit handler to form.beforeSend.
       // Update Drupal.Ajax.prototype.beforeSend only once.
diff --git a/web/modules/webform/js/webform.states.js b/web/modules/webform/js/webform.states.js
index 3d84806d09..7fcd8c7060 100644
--- a/web/modules/webform/js/webform.states.js
+++ b/web/modules/webform/js/webform.states.js
@@ -14,6 +14,10 @@
   Drupal.webform.states.slideUp = Drupal.webform.states.slideUp || {};
   Drupal.webform.states.slideUp.duration = 'fast';
 
+  /* ************************************************************************ */
+  // jQuery functions.
+  /* ************************************************************************ */
+
   /**
    * Check if an element has a specified data attribute.
    *
@@ -34,9 +38,23 @@
    *   TRUE if element is within the webform.
    */
   $.fn.isWebform = function () {
-    return $(this).closest('form[id^="webform"]').length ? true : false;
+    return $(this).closest('form[id^="webform"], form[data-is-webform]').length ? true : false;
+  };
+
+  /**
+   * Check if element is to be treated as a webform element.
+   *
+   * @return {boolean}
+   *   TRUE if element is to be treated as a webform element.
+   */
+  $.fn.isWebformElement = function () {
+    return ($(this).isWebform() || $(this).closest('[data-is-webform-element]').length) ? true : false;
   };
 
+  /* ************************************************************************ */
+  // Trigger.
+  /* ************************************************************************ */
+
   // The change event is triggered by cut-n-paste and select menus.
   // Issue #2445271: #states element empty check not triggered on mouse
   // based paste.
@@ -45,6 +63,11 @@
     return this.val() === '';
   };
 
+  /* ************************************************************************ */
+  // Dependents.
+  /* ************************************************************************ */
+
+
   // Apply solution included in #1962800 patch.
   // Issue #1962800: Form #states not working with literal integers as
   // values in IE11.
@@ -93,96 +116,98 @@
     else if ('less' in reference) {
       return (value !== '' && parseFloat(reference['less']) > parseFloat(value));
     }
+    else if ('less_equal' in reference) {
+      return (value !== '' && parseFloat(reference['less_equal']) >= parseFloat(value));
+    }
     else if ('greater' in reference) {
       return (value !== '' && parseFloat(reference['greater']) < parseFloat(value));
     }
-    else if ('between' in reference) {
+    else if ('greater_equal' in reference) {
+      return (value !== '' && parseFloat(reference['greater_equal']) <= parseFloat(value));
+    }
+    else if ('between' in reference || '!between' in reference) {
       if (value === '') {
         return false;
       }
-      else {
-        var between = reference['between'];
-        var betweenParts = between.split(':');
-        var greater = betweenParts[0];
-        var less = (typeof betweenParts[1] !== 'undefined') ? betweenParts[1] : null;
-        var isGreaterThan = (greater === null || greater === '' || parseFloat(value) >= parseFloat(greater));
-        var isLessThan = (less === null || less === '' || parseFloat(value) <= parseFloat(less));
-        return (isGreaterThan && isLessThan);
-      }
+
+      var between = reference['between'] || reference['!between'];
+      var betweenParts = between.split(':');
+      var greater = betweenParts[0];
+      var less = (typeof betweenParts[1] !== 'undefined') ? betweenParts[1] : null;
+      var isGreaterThan = (greater === null || greater === '' || parseFloat(value) >= parseFloat(greater));
+      var isLessThan = (less === null || less === '' || parseFloat(value) <= parseFloat(less));
+      var result = (isGreaterThan && isLessThan);
+      return (reference['!between']) ? !result : result;
     }
     else {
       return reference.indexOf(value) !== false;
     }
   };
 
+  /* ************************************************************************ */
+  // States events.
+  /* ************************************************************************ */
+
   var $document = $(document);
 
   $document.on('state:required', function (e) {
-    if (e.trigger && $(e.target).isWebform()) {
+    if (e.trigger && $(e.target).isWebformElement()) {
       var $target = $(e.target);
       // Fix #required file upload.
       // @see Issue #2860529: Conditional required File upload field don't work.
-      if (e.value) {
-        $target.find('input[type="file"]').attr({'required': 'required', 'aria-required': 'true'});
-      }
-      else {
-        $target.find('input[type="file"]').removeAttr('required aria-required');
-      }
-
-      // Fix required label for checkboxes and radios.
-      // @see Issue #2938414: Checkboxes don't support #states required
-      // @see Issue #2731991: Setting required on radios marks all options required.
-      // @see Issue #2856315: Conditional Logic - Requiring Radios in a Fieldset.
-      // Fix #required for fieldsets.
-      // @see Issue #2977569: Hidden fieldsets that become visible with conditional logic cannot be made required.
-      if ($target.is('.js-webform-type-radios, .js-webform-type-checkboxes, fieldset')) {
-        if (e.value) {
-          $target.find('legend span.fieldset-legend:not(.visually-hidden)').addClass('js-form-required form-required');
-        }
-        else {
-          $target.find('legend span.fieldset-legend:not(.visually-hidden)').removeClass('js-form-required form-required');
-        }
-      }
+      toggleRequired($target.find('input[type="file"]'), e.value);
 
       // Fix #required for radios.
       // @see Issue #2856795: If radio buttons are required but not filled form is nevertheless submitted.
-      if ($target.is('.js-webform-type-radios, .js-form-type-webform-radios-other')) {
-        if (e.value) {
-          $target.find('input[type="radio"]').attr({'required': 'required', 'aria-required': 'true'});
-        }
-        else {
-          $target.find('input[type="radio"]').removeAttr('required aria-required');
-        }
+      if ($target.is('.js-form-type-radios, .js-form-type-webform-radios-other, .js-webform-type-radios, .js-webform-type-webform-radios-other')) {
+        toggleRequired($target.find('input[type="radio"]'), e.value);
       }
 
       // Fix #required for checkboxes.
       // @see Issue #2938414: Checkboxes don't support #states required.
       // @see checkboxRequiredhandler
-      if ($target.is('.js-webform-type-checkboxes, .js-form-type-webform-checkboxes-other')) {
+      if ($target.is('.js-form-type-checkboxes, .js-form-type-webform-checkboxes-other, .js-webform-type-checkboxes, .js-webform-type-webform-checkboxes-other')) {
         var $checkboxes = $target.find('input[type="checkbox"]');
         if (e.value) {
-          // Bind the event handler and add custom HTML5 required validation
-          // to all checkboxes.
-          $checkboxes.bind('click', checkboxRequiredhandler);
-          if (!$checkboxes.is(':checked')) {
-            $checkboxes.attr({'required': 'required', 'aria-required': 'true'});
-          }
+          // Add event handler.
+          $checkboxes.on('click', statesCheckboxesRequiredEventHandler);
+          // Initialize and add required attribute.
+          checkboxesRequired($target);
         }
         else {
-          // Remove custom HTML5 required validation from all checkboxes
-          // and unbind the event handler.
-          $checkboxes
-            .removeAttr('required aria-required')
-            .unbind('click', checkboxRequiredhandler);
+          // Remove event handler.
+          $checkboxes.off('click', statesCheckboxesRequiredEventHandler);
+          // Remove required attribute.
+          toggleRequired($checkboxes, false);
         }
       }
 
+      // Fix required label for elements without the for attribute.
+      // @see Issue #3145300: Conditional Visible Select Other not working.
+      if ($target.is('.js-form-type-webform-select-other, .js-webform-type-webform-select-other')) {
+        var $select = $target.find('select');
+        toggleRequired($select, e.value);
+        copyRequireMessage($target, $select);
+      }
+      if ($target.find('> label:not([for])').length) {
+        $target.find('> label').toggleClass('js-form-required form-required', e.value);
+      }
+
+      // Fix required label for checkboxes and radios.
+      // @see Issue #2938414: Checkboxes don't support #states required
+      // @see Issue #2731991: Setting required on radios marks all options required.
+      // @see Issue #2856315: Conditional Logic - Requiring Radios in a Fieldset.
+      // Fix #required for fieldsets.
+      // @see Issue #2977569: Hidden fieldsets that become visible with conditional logic cannot be made required.
+      if ($target.is('.js-webform-type-radios, .js-webform-type-checkboxes, fieldset')) {
+        $target.find('legend span.fieldset-legend:not(.visually-hidden)').toggleClass('js-form-required form-required', e.value);
+      }
+
       // Issue #2986017: Fieldsets shouldn't have required attribute.
       if ($target.is('fieldset')) {
         $target.removeAttr('required aria-required');
       }
     }
-
   });
 
   $document.on('state:checked', function (e) {
@@ -192,7 +217,7 @@
   });
 
   $document.on('state:readonly', function (e) {
-    if (e.trigger && $(e.target).isWebform()) {
+    if (e.trigger && $(e.target).isWebformElement()) {
       $(e.target).prop('readonly', e.value).closest('.js-form-item, .js-form-wrapper').toggleClass('webform-readonly', e.value).find('input, textarea').prop('readonly', e.value);
 
       // Trigger webform:readonly.
@@ -202,7 +227,7 @@
   });
 
   $document.on('state:visible state:visible-slide', function (e) {
-    if (e.trigger && $(e.target).isWebform()) {
+    if (e.trigger && $(e.target).isWebformElement()) {
       if (e.value) {
         $(':input', e.target).addBack().each(function () {
           restoreValueAndRequired(this);
@@ -220,8 +245,8 @@
     }
   });
 
-  $document.bind('state:visible-slide', function (e) {
-    if (e.trigger && $(e.target).isWebform()) {
+  $document.on('state:visible-slide', function (e) {
+    if (e.trigger && $(e.target).isWebformElement()) {
       var effect = e.value ? 'slideDown' : 'slideUp';
       var duration = Drupal.webform.states[effect].duration;
       $(e.target).closest('.js-form-item, .js-form-submit, .js-form-wrapper')[effect](duration);
@@ -230,7 +255,7 @@
   Drupal.states.State.aliases['invisible-slide'] = '!visible-slide';
 
   $document.on('state:disabled', function (e) {
-    if (e.trigger && $(e.target).isWebform()) {
+    if (e.trigger && $(e.target).isWebformElement()) {
       // Make sure disabled property is set before triggering webform:disabled.
       // Copied from: core/misc/states.js
       $(e.target)
@@ -257,19 +282,89 @@
     }
   });
 
+  /* ************************************************************************ */
+  // Behaviors.
+  /* ************************************************************************ */
+
   /**
-   * Trigger custom HTML5 multiple checkboxes validation.
+   * Adds HTML5 validation to required checkboxes.
    *
-   * @see https://stackoverflow.com/a/37825072/145846
+   * @type {Drupal~behavior}
+   *
+   * @see https://www.drupal.org/project/webform/issues/3068998
    */
-  function checkboxRequiredhandler() {
-    var $checkboxes = $(this).closest('.js-webform-type-checkboxes, .js-form-type-webform-checkboxes-other').find('input[type="checkbox"]');
-    if ($checkboxes.is(':checked')) {
-      $checkboxes.removeAttr('required aria-required');
+  Drupal.behaviors.webformCheckboxesRequired = {
+    attach: function (context) {
+      $('.js-form-type-checkboxes.required, .js-form-type-webform-checkboxes-other.required, .js-webform-type-checkboxes.required, .js-webform-type-webform-checkboxes-other.required, .js-webform-type-webform-radios-other.checkboxes', context)
+        .once('webform-checkboxes-required')
+        .each(function () {
+          var $element = $(this);
+          $element.find('input[type="checkbox"]').on('click', statesCheckboxesRequiredEventHandler);
+          setTimeout(function () {checkboxesRequired($element);});
+        });
     }
-    else {
-      $checkboxes.attr({'required': 'required', 'aria-required': 'true'});
+  };
+
+  /**
+   * Adds HTML5 validation to required radios.
+   *
+   * @type {Drupal~behavior}
+   *
+   * @see https://www.drupal.org/project/webform/issues/2856795
+   */
+  Drupal.behaviors.webformRadiosRequired = {
+    attach: function (context) {
+      $('.js-form-type-radios, .js-form-type-webform-radios-other, .js-webform-type-radios, .js-webform-type-webform-radios-other', context)
+        .once('webform-radios-required')
+        .each(function () {
+          var $element = $(this);
+          setTimeout(function () {radiosRequired($(this))});
+        });
     }
+  };
+
+  /**
+   * Add HTML5 multiple checkboxes required validation.
+   *
+   * @param {jQuery} $element
+   *   An jQuery object containing HTML5 radios.
+   *
+   * @see https://stackoverflow.com/a/37825072/145846
+   */
+  function checkboxesRequired($element) {
+    var $firstCheckbox = $element.find('input[type="checkbox"]').first();
+    var isChecked = $element.find('input[type="checkbox"]').is(':checked');
+    toggleRequired($firstCheckbox, !isChecked);
+    copyRequireMessage($element, $firstCheckbox);
+  }
+
+  /**
+   * Add HTML5 radios required validation.
+   *
+   * @param {jQuery} $element
+   *   An jQuery object containing HTML5 radios.
+   *
+   * @see https://www.drupal.org/project/webform/issues/2856795
+   */
+  function radiosRequired($element) {
+    var $radios = $element.find('input[type="radio"]');
+    var isRequired = $element.hasClass('required');
+    toggleRequired($radios, isRequired);
+    copyRequireMessage($element, $radios);
+  }
+
+  /* ************************************************************************ */
+  // Event handlers.
+  /* ************************************************************************ */
+
+  /**
+   * Trigger #states API HTML5 multiple checkboxes required validation.
+   *
+   * @see https://stackoverflow.com/a/37825072/145846
+   */
+  function statesCheckboxesRequiredEventHandler() {
+    var $element = $(this).closest('.js-webform-type-checkboxes, .js-webform-type-webform-checkboxes-other');
+    checkboxesRequired($element);
   }
 
   /**
@@ -311,6 +406,10 @@
     }
   }
 
+  /* ************************************************************************ */
+  // Backup and restore value functions.
+  /* ************************************************************************ */
+
   /**
    * Backup an input's current value and required attribute
    *
@@ -421,4 +520,38 @@
     $input.prop('required', false);
   }
 
+  /* ************************************************************************ */
+  // Helper functions.
+  /* ************************************************************************ */
+
+  /**
+   * Toggle an input's required attributes.
+   *
+   * @param {element} $input
+   *   An input.
+   * @param {boolean} required
+   */
+  function toggleRequired($input, required) {
+    if (required) {
+      $input.attr({'required': 'required', 'aria-required': 'true'});
+    }
+    else {
+      $input.removeAttr('required aria-required');
+    }
+  }
+
+  /**
+   * Copy the clientside_validation.module's message.
+   *
+   * @param {jQuery} $source
+   *   The source element.
+   * @param {jQuery} $destination
+   *   The destination element.
+   */
+  function copyRequireMessage($source, $destination) {
+    if ($source.attr('data-msg-required')) {
+      $destination.attr('data-msg-required', $source.attr('data-msg-required'));
+    }
+  }
+
 })(jQuery, Drupal);
diff --git a/web/modules/webform/modules/webform_access/src/Breadcrumb/WebformAccessBreadcrumbBuilder.php b/web/modules/webform/modules/webform_access/src/Breadcrumb/WebformAccessBreadcrumbBuilder.php
index ec7a068f28..8af228a3e6 100644
--- a/web/modules/webform/modules/webform_access/src/Breadcrumb/WebformAccessBreadcrumbBuilder.php
+++ b/web/modules/webform/modules/webform_access/src/Breadcrumb/WebformAccessBreadcrumbBuilder.php
@@ -43,6 +43,11 @@ public function applies(RouteMatchInterface $route_match) {
     if (strpos($route_name, 'webform_access') === FALSE) {
       return FALSE;
     }
+
+    if (!$route_match->getRouteObject()) {
+      return FALSE;
+    }
+
     $path = Url::fromRouteMatch($route_match)->toString();
 
     if (strpos($path, 'admin/structure/webform/access/') === FALSE) {
diff --git a/web/modules/webform/modules/webform_access/webform_access.info.yml b/web/modules/webform/modules/webform_access/webform_access.info.yml
index 9bafe54c88..ef6e6ef9fa 100644
--- a/web/modules/webform/modules/webform_access/webform_access.info.yml
+++ b/web/modules/webform/modules/webform_access/webform_access.info.yml
@@ -7,7 +7,7 @@ dependencies:
   - 'webform:webform'
   - 'webform:webform_node'
 
-# Information added by Drupal.org packaging script on 2020-07-02
-version: '8.x-5.19'
+# Information added by Drupal.org packaging script on 2020-10-05
+version: '8.x-5.22'
 project: 'webform'
-datestamp: 1593681142
+datestamp: 1601919526
diff --git a/web/modules/webform/modules/webform_attachment/src/Controller/WebformAttachmentController.php b/web/modules/webform/modules/webform_attachment/src/Controller/WebformAttachmentController.php
index 1e2efb5159..b0f87d299c 100644
--- a/web/modules/webform/modules/webform_attachment/src/Controller/WebformAttachmentController.php
+++ b/web/modules/webform/modules/webform_attachment/src/Controller/WebformAttachmentController.php
@@ -4,6 +4,7 @@
 
 use Drupal\Core\Controller\ControllerBase;
 use Drupal\Core\DependencyInjection\ContainerInjectionInterface;
+use Drupal\Core\Render\Element;
 use Drupal\Core\Render\ElementInfoManagerInterface;
 use Drupal\webform\Plugin\WebformElementManagerInterface;
 use Drupal\webform\WebformInterface;
@@ -89,7 +90,7 @@ public function download(WebformInterface $webform, WebformSubmissionInterface $
     // Make sure element #access is not FALSE.
     // The #private property is used to to set #access to FALSE.
     // @see \Drupal\webform\Entity\Webform::initElementsRecursive
-    if (isset($element['#access']) && $element['#access'] === FALSE) {
+    if (!Element::isVisibleElement($element)) {
       throw new AccessDeniedHttpException();
     }
 
diff --git a/web/modules/webform/modules/webform_attachment/tests/modules/webform_attachment_test/config/install/webform.webform.test_attachment_access.yml b/web/modules/webform/modules/webform_attachment/tests/modules/webform_attachment_test/config/install/webform.webform.test_attachment_access.yml
index 1384dabccb..89f04765c4 100644
--- a/web/modules/webform/modules/webform_attachment/tests/modules/webform_attachment_test/config/install/webform.webform.test_attachment_access.yml
+++ b/web/modules/webform/modules/webform_attachment/tests/modules/webform_attachment_test/config/install/webform.webform.test_attachment_access.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -46,7 +47,7 @@ elements: |
     '#template': 'Admin users can access this attachment'
     '#private': true
     '#display_on': both
-
+  
 css: ''
 javascript: ''
 settings:
@@ -119,6 +120,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -174,6 +177,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/modules/webform_attachment/tests/modules/webform_attachment_test/config/install/webform.webform.test_attachment_email.yml b/web/modules/webform/modules/webform_attachment/tests/modules/webform_attachment_test/config/install/webform.webform.test_attachment_email.yml
index e359be96ff..204dcbab9f 100644
--- a/web/modules/webform/modules/webform_attachment/tests/modules/webform_attachment_test/config/install/webform.webform.test_attachment_email.yml
+++ b/web/modules/webform/modules/webform_attachment/tests/modules/webform_attachment_test/config/install/webform.webform.test_attachment_email.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -140,6 +141,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -195,6 +198,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
@@ -248,6 +252,7 @@ handlers:
   email:
     id: email
     label: Email
+    notes: ''
     handler_id: email
     status: true
     conditions: {  }
diff --git a/web/modules/webform/modules/webform_attachment/tests/modules/webform_attachment_test/config/install/webform.webform.test_attachment_sanitize.yml b/web/modules/webform/modules/webform_attachment/tests/modules/webform_attachment_test/config/install/webform.webform.test_attachment_sanitize.yml
index b019e38eb7..db0f67256f 100644
--- a/web/modules/webform/modules/webform_attachment/tests/modules/webform_attachment_test/config/install/webform.webform.test_attachment_sanitize.yml
+++ b/web/modules/webform/modules/webform_attachment/tests/modules/webform_attachment_test/config/install/webform.webform.test_attachment_sanitize.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -26,7 +27,7 @@ elements: |
     '#sanitize': true
     '#template': |
       textfield: [webform_submission:values:textfield]
-
+  
 css: ''
 javascript: ''
 settings:
@@ -99,6 +100,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -154,6 +157,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/modules/webform_attachment/tests/modules/webform_attachment_test/config/install/webform.webform.test_attachment_states.yml b/web/modules/webform/modules/webform_attachment/tests/modules/webform_attachment_test/config/install/webform.webform.test_attachment_states.yml
index f53fd70d52..858742ed6a 100644
--- a/web/modules/webform/modules/webform_attachment/tests/modules/webform_attachment_test/config/install/webform.webform.test_attachment_states.yml
+++ b/web/modules/webform/modules/webform_attachment/tests/modules/webform_attachment_test/config/install/webform.webform.test_attachment_states.yml
@@ -1,3 +1,4 @@
+uuid: 08971b54-57be-4bc9-956a-8cfa57c7cadd
 langcode: en
 status: open
 dependencies:
@@ -100,6 +101,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -155,6 +158,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
@@ -206,6 +210,7 @@ handlers:
   email:
     id: email
     label: Email
+    notes: ''
     handler_id: email
     status: true
     conditions: {  }
@@ -240,6 +245,5 @@ handlers:
       theme_name: ''
       parameters: {  }
 variants: {  }
-uuid: 08971b54-57be-4bc9-956a-8cfa57c7cadd
 _core:
   default_config_hash: XUf67HS7kvhJPn6INGzCeH3OdEnQNm9Kb_H5o-HfYlQ
diff --git a/web/modules/webform/modules/webform_attachment/tests/modules/webform_attachment_test/config/install/webform.webform.test_attachment_token.yml b/web/modules/webform/modules/webform_attachment/tests/modules/webform_attachment_test/config/install/webform.webform.test_attachment_token.yml
index 1216242a9a..dfe8d5ec8c 100644
--- a/web/modules/webform/modules/webform_attachment/tests/modules/webform_attachment_test/config/install/webform.webform.test_attachment_token.yml
+++ b/web/modules/webform/modules/webform_attachment/tests/modules/webform_attachment_test/config/install/webform.webform.test_attachment_token.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -34,7 +35,7 @@ elements: |
       textfield: [webform_submission:values:textfield]
     '#download': true
     '#display_on': both
-
+  
 css: ''
 javascript: ''
 settings:
@@ -107,6 +108,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -162,6 +165,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/modules/webform_attachment/tests/modules/webform_attachment_test/config/install/webform.webform.test_attachment_twig.yml b/web/modules/webform/modules/webform_attachment/tests/modules/webform_attachment_test/config/install/webform.webform.test_attachment_twig.yml
index 1239a801cb..18874de25b 100644
--- a/web/modules/webform/modules/webform_attachment/tests/modules/webform_attachment_test/config/install/webform.webform.test_attachment_twig.yml
+++ b/web/modules/webform/modules/webform_attachment/tests/modules/webform_attachment_test/config/install/webform.webform.test_attachment_twig.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -36,7 +37,7 @@ elements: |
       <textfield>{{ webform_token('[webform_submission:values:textfield:xmlencode]', webform_submission) }}</textfield>
     '#download': true
     '#display_on': both
-
+  
 css: ''
 javascript: ''
 settings:
@@ -109,6 +110,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -164,6 +167,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/modules/webform_attachment/tests/modules/webform_attachment_test/config/install/webform.webform.test_attachment_url.yml b/web/modules/webform/modules/webform_attachment/tests/modules/webform_attachment_test/config/install/webform.webform.test_attachment_url.yml
index bef72cf834..f4020c2a89 100644
--- a/web/modules/webform/modules/webform_attachment/tests/modules/webform_attachment_test/config/install/webform.webform.test_attachment_url.yml
+++ b/web/modules/webform/modules/webform_attachment/tests/modules/webform_attachment_test/config/install/webform.webform.test_attachment_url.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -37,7 +38,7 @@ elements: |
     '#url': ''
     '#download': true
     '#display_on': both
-
+  
 css: ''
 javascript: ''
 settings:
@@ -110,6 +111,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -165,6 +168,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/modules/webform_attachment/tests/modules/webform_attachment_test/webform_attachment_test.info.yml b/web/modules/webform/modules/webform_attachment/tests/modules/webform_attachment_test/webform_attachment_test.info.yml
index 9fc10a2760..a49b123868 100644
--- a/web/modules/webform/modules/webform_attachment/tests/modules/webform_attachment_test/webform_attachment_test.info.yml
+++ b/web/modules/webform/modules/webform_attachment/tests/modules/webform_attachment_test/webform_attachment_test.info.yml
@@ -6,7 +6,7 @@ core_version_requirement: ^8.8
 dependencies:
   - 'webform:webform_attachment'
 
-# Information added by Drupal.org packaging script on 2020-07-02
-version: '8.x-5.19'
+# Information added by Drupal.org packaging script on 2020-10-05
+version: '8.x-5.22'
 project: 'webform'
-datestamp: 1593681142
+datestamp: 1601919526
diff --git a/web/modules/webform/modules/webform_attachment/webform_attachment.info.yml b/web/modules/webform/modules/webform_attachment/webform_attachment.info.yml
index 41db4f6beb..64cbc944f2 100644
--- a/web/modules/webform/modules/webform_attachment/webform_attachment.info.yml
+++ b/web/modules/webform/modules/webform_attachment/webform_attachment.info.yml
@@ -6,7 +6,7 @@ core_version_requirement: ^8.8
 dependencies:
   - 'webform:webform'
 
-# Information added by Drupal.org packaging script on 2020-07-02
-version: '8.x-5.19'
+# Information added by Drupal.org packaging script on 2020-10-05
+version: '8.x-5.22'
 project: 'webform'
-datestamp: 1593681142
+datestamp: 1601919526
diff --git a/web/modules/webform/modules/webform_bootstrap/tests/modules/webform_bootstrap_test_module/webform_bootstrap_test_module.info.yml b/web/modules/webform/modules/webform_bootstrap/tests/modules/webform_bootstrap_test_module/webform_bootstrap_test_module.info.yml
index 8cf9b1528d..ca5de7c22f 100644
--- a/web/modules/webform/modules/webform_bootstrap/tests/modules/webform_bootstrap_test_module/webform_bootstrap_test_module.info.yml
+++ b/web/modules/webform/modules/webform_bootstrap/tests/modules/webform_bootstrap_test_module/webform_bootstrap_test_module.info.yml
@@ -8,7 +8,7 @@ dependencies:
   - 'webform:webform'
   - 'webform:webform_bootstrap'
 
-# Information added by Drupal.org packaging script on 2020-07-02
-version: '8.x-5.19'
+# Information added by Drupal.org packaging script on 2020-10-05
+version: '8.x-5.22'
 project: 'webform'
-datestamp: 1593681142
+datestamp: 1601919526
diff --git a/web/modules/webform/modules/webform_bootstrap/tests/themes/webform_bootstrap_test_theme/webform_bootstrap_test_theme.info.yml b/web/modules/webform/modules/webform_bootstrap/tests/themes/webform_bootstrap_test_theme/webform_bootstrap_test_theme.info.yml
index 21ec6199b2..78645a70a0 100644
--- a/web/modules/webform/modules/webform_bootstrap/tests/themes/webform_bootstrap_test_theme/webform_bootstrap_test_theme.info.yml
+++ b/web/modules/webform/modules/webform_bootstrap/tests/themes/webform_bootstrap_test_theme/webform_bootstrap_test_theme.info.yml
@@ -22,7 +22,7 @@ regions:
 libraries:
   - 'webform_bootstrap_test_theme/global-styling'
 
-# Information added by Drupal.org packaging script on 2020-07-02
-version: '8.x-5.19'
+# Information added by Drupal.org packaging script on 2020-10-05
+version: '8.x-5.22'
 project: 'webform'
-datestamp: 1593681142
+datestamp: 1601919526
diff --git a/web/modules/webform/modules/webform_bootstrap/webform_bootstrap.info.yml b/web/modules/webform/modules/webform_bootstrap/webform_bootstrap.info.yml
index ba4951a7e0..6ccc6cb871 100644
--- a/web/modules/webform/modules/webform_bootstrap/webform_bootstrap.info.yml
+++ b/web/modules/webform/modules/webform_bootstrap/webform_bootstrap.info.yml
@@ -6,7 +6,7 @@ core_version_requirement: ^8.8
 dependencies:
   - 'webform:webform'
 
-# Information added by Drupal.org packaging script on 2020-07-02
-version: '8.x-5.19'
+# Information added by Drupal.org packaging script on 2020-10-05
+version: '8.x-5.22'
 project: 'webform'
-datestamp: 1593681142
+datestamp: 1601919526
diff --git a/web/modules/webform/modules/webform_bootstrap/webform_bootstrap.module b/web/modules/webform/modules/webform_bootstrap/webform_bootstrap.module
index 09c02cd2dc..16aa3a7fd9 100644
--- a/web/modules/webform/modules/webform_bootstrap/webform_bootstrap.module
+++ b/web/modules/webform/modules/webform_bootstrap/webform_bootstrap.module
@@ -109,17 +109,17 @@ function webform_bootstrap_js_alter(&$javascript, AttachedAssetsInterface $asset
     return;
   }
 
-  $path = drupal_get_path('module', 'webform_bootstrap');
-  // Make sure jQuery tooltip is never loaded and use custom
-  // webform.element.help.js.
-  unset(
-    $javascript['core/assets/vendor/jquery.ui/ui/tooltip-min.js'],
-    $javascript['core/assets/vendor/jquery.ui/ui/widgets/tooltip-min.js']
-  );
-
+  // Make sure jQuery tooltip is never loaded and use
+  // bootstrap specific webform.element.help.js.
+  foreach ($javascript as $javascript_path => $javascript_item) {
+    if (strpos($javascript_path, 'tooltip-min') !== FALSE) {
+      unset($javascript[$javascript_path]);
+    }
+  }
   $webform_help_path = drupal_get_path('module', 'webform') . '/js/webform.element.help.js';
+  $webform_bootstrap_help_path = drupal_get_path('module', 'webform_bootstrap') . '/js/webform.element.help.js';;
   if (isset($javascript[$webform_help_path])) {
-    $javascript[$webform_help_path]['data'] = $path . '/js/webform.element.help.js';
+    $javascript[$webform_help_path]['data'] = $webform_bootstrap_help_path;
   }
 }
 
@@ -271,7 +271,21 @@ function _webform_bootstrap_convert_button_classes(array &$classes) {
  *   TRUE if Bootstrap is the active theme.
  */
 function _webform_bootstrap_is_active_theme() {
-  /** @var \Drupal\webform\WebformThemeManagerInterface $theme_manager */
-  $theme_manager = \Drupal::service('webform.theme_manager');
-  return $theme_manager->isActiveTheme('bootstrap');
+  $is_active_theme = &drupal_static(__FUNCTION__);
+  if (isset($is_active_theme)) {
+    return $is_active_theme;
+  }
+
+  // Catch 'TypeError' in Drupal\webform\WebformThemeManager::__construct()
+  // which is triggered by service argument changes before the cache is cleared.
+  try {
+    /** @var \Drupal\webform\WebformThemeManagerInterface $theme_manager */
+    $theme_manager = \Drupal::service('webform.theme_manager');
+    $is_active_theme = $theme_manager->isActiveTheme('bootstrap');
+  }
+  catch (\TypeError $error) {
+    $is_active_theme = FALSE;
+  }
+
+  return $is_active_theme;
 }
diff --git a/web/modules/webform/modules/webform_cards/css/webform_cards.css b/web/modules/webform/modules/webform_cards/css/webform_cards.css
index c6dbe6acea..2fa6d741ca 100644
--- a/web/modules/webform/modules/webform_cards/css/webform_cards.css
+++ b/web/modules/webform/modules/webform_cards/css/webform_cards.css
@@ -21,8 +21,7 @@ html.js .webform-card.webform-card--error[style*="display: block"] {
   display: block !important;
 }
 
-.webform-cards .webform-cards-button--previous,
-.webform-cards .webform-cards-button--next {
+html.js .webform-cards .form-actions {
   display: none;
 }
 
@@ -73,6 +72,10 @@ html.js form.webform-cards-toggle-show .webform-card[style*="display: block"] {
   display: block !important;
 }
 
+html.js form.webform-cards-toggle-show .webform-card[style*="display: none"] {
+  display: none !important;
+}
+
 html.js form.webform-cards-toggle-show .webform-progress {
   display: none;
 }
diff --git a/web/modules/webform/modules/webform_cards/js/webform_cards.js b/web/modules/webform/modules/webform_cards/js/webform_cards.js
index 76d2594abe..1b25de702f 100644
--- a/web/modules/webform/modules/webform_cards/js/webform_cards.js
+++ b/web/modules/webform/modules/webform_cards/js/webform_cards.js
@@ -7,6 +7,11 @@
 
   'use strict';
 
+  Drupal.webform = Drupal.webform || {};
+  Drupal.webform.cards = Drupal.webform.cards || {};
+  // Autoforward (defaults to 1/4 second delay).
+  Drupal.webform.cards.autoForwardDelay = Drupal.webform.cards.autoForwardDelay || 250;
+
   /**
    * Initialize webform cards.
    *
@@ -28,6 +33,8 @@
           progressStates: $form[0].hasAttribute('data-progress-states'),
           progressLink: $form[0].hasAttribute('data-progress-link'),
           autoForward: $form[0].hasAttribute('data-auto-forward'),
+          autoForwardHideNextButton: $form[0].hasAttribute('data-auto-forward-hide-next-button'),
+          keyboard: $form[0].hasAttribute('data-keyboard'),
           previewLink: $form[0].hasAttribute('data-preview-link'),
           confirmation: $form[0].hasAttribute('data-confirmation'),
           track: $form.data('track'),
@@ -49,9 +56,16 @@
         // Cards.
         var $allCards = $form.find('.webform-card');
 
+        // Actions and buttons.
+        var $formActions = $form.find('.form-actions').show();
+        var $previewButton = $formActions.find('.webform-button--preview');
+        var $submitButton = $formActions.find('.webform-button--submit');
+        var $previousButton = $formActions.find('.webform-button--previous');
+        var $nextButton = $formActions.find('.webform-button--next');
+
         // Preview.
         if (!$allCards.length) {
-          setPreviewLinks();
+          setPreview();
           return;
         }
 
@@ -73,14 +87,7 @@
           return;
         }
 
-        // Actions, preview, and submit buttons.
-        var $formActions = $form.find('.form-actions');
-        var $previewButton = $formActions.find('.webform-button--preview');
-        var $submitButton = $formActions.find('.webform-button--submit');
-
         // Previous and next buttons.
-        var $previousButton = $form.find('.webform-button--previous');
-        var $nextButton = $form.find('.webform-button--next');
         $previousButton.data('default-label', $previousButton.val());
         $nextButton.data('default-label', $nextButton.val());
         $previousButton.on('click', previousButtonClickEventHandler).show();
@@ -91,7 +98,7 @@
           // Auto-forward on enter.
           $form.find('input')
             .not(':button, :submit, :reset, :image, :file')
-            .on('keypress', function (event) {
+            .on('keydown', function (event) {
               if (event.which === 13) {
                 autoForwardEventHandler(event);
                 // Disable auto submit.
@@ -119,6 +126,43 @@
             });
         }
 
+        // Keyboard navigation.
+        if (options.keyboard) {
+          $('body').on('keydown', function (event) {
+            // Only track left and right keys.
+            if (event.which !== 37 && event.which !== 39) {
+              return;
+            }
+
+            // If input and the cursor is not at the end of the input, do not
+            // trigger navigation.
+            // @see https://stackoverflow.com/questions/21177489/selectionstart-selectionend-on-input-type-number-no-longer-allowed-in-chrome
+            if (event.target.value !== undefined
+              && event.target.selectionStart !== undefined
+              && event.target.selectionStart !== null) {
+              if (event.target.value.length !== event.target.selectionStart) {
+                return;
+              }
+              // Ignore the left keydown event if the input has a value.
+              if (event.target.value.length && event.which === 37) {
+                return;
+              }
+            }
+
+            switch (event.which) {
+              // Left key triggers the previous button.
+              case 37:
+                setTimeout(function () {$previousButton.click();}, Drupal.webform.cards.autoForwardDelay);
+                break;
+
+              // Right key triggers the next button.
+              case 39:
+                setTimeout(function () {$nextButton.click();}, Drupal.webform.cards.autoForwardDelay);
+                break;
+            }
+          });
+        }
+
         // Track when cards are hidden/shown via #states conditional logic.
         if (options.progressStates) {
           $(document).on('state:visible state:visible-slide', function stateVisibleEventHandler(e) {
@@ -179,24 +223,31 @@
           // Activate the card.
           $activeCard.addClass('webform-card--active');
 
+          // Hide the next button when auto-forwarding.
+          if (hideAutoForwardNextButton()) {
+            $nextButton.hide();
+          }
+
           // Show the active card.
           if (!initialize) {
             applyAjaxEffect($activeCard);
           }
 
           // Focus the active card's first visible input.
-          if (!initialize || $form.hasClass('js-webform-autofocus')) {
-            $activeCard.find(':input:visible').first().focus();
-          }
+          autofocus($activeCard);
 
-          // Set current page.
+          // Set current card.
           $currentCardInput.val($activeCard.data('webform-key'));
+          $form.attr('data-webform-current-card', $activeCard.data('webform-key'));
 
           // Track the current page in a form data attribute and the URL.
           trackCurrentPage($activeCard);
 
           // Track progress.
           trackProgress();
+
+          // Trigger card change event.
+          $form.trigger('webform_cards:change', [$activeCard]);
         }
 
         /**
@@ -325,13 +376,33 @@
         }
 
         /**
-         * Set links to previous pages/cards in preview.
+         * Set preview.
          */
-        function setPreviewLinks() {
+        function setPreview() {
           if (currentPage !== 'webform_preview' || !$form.find('.webform-preview').length) {
             return;
           }
 
+          if (options.keyboard) {
+            $('body').on('keydown', function (event) {
+              switch (event.which) {
+                case 37: // left.
+                  setTimeout(function () {$previousButton.click();}, Drupal.webform.cards.autoForwardDelay);
+                  break;
+
+                case 39: // right
+                  setTimeout(function () {$submitButton.click();}, Drupal.webform.cards.autoForwardDelay);
+                  break;
+              }
+            });
+          }
+          setPreviewLinks();
+        }
+
+        /**
+         * Set links to previous pages/cards in preview.
+         */
+        function setPreviewLinks() {
           var $button = $form.find('.js-webform-wizard-pages-link[data-webform-page="webform_start"]');
 
           // Link to previous pages in progress steps (aka bar).
@@ -504,9 +575,9 @@
           }
         }
 
-        /**********************************************************************/
+        /* ****************************************************************** */
         // Event handlers.
-        /**********************************************************************/
+        /* ****************************************************************** */
 
         /**
          * Toggle event handler.
@@ -534,6 +605,9 @@
             $previousButton.hide();
             $previewButton.show();
             $submitButton.show();
+
+            // Trigger card change event with no active card.
+            $form.trigger('webform_cards:change');
           }
         }
 
@@ -560,7 +634,7 @@
          *   The event triggered.
          */
         function nextButtonClickEventHandler(event) {
-          var validator = $form.validate();
+          var validator = $form.validate(drupalSettings.cvJqueryValidateOptions);
           if (!$form.valid()) {
             // Focus first invalid input.
             validator.focusInvalid();
@@ -614,7 +688,7 @@
             if (this.type === 'radio' && this.checked) {
               inputValues[name] = true;
             }
-            else if (this.type === 'select' && this.selectedIndex !== -1) {
+            else if (this.type === 'select-one' && this.selectedIndex !== -1) {
               inputValues[name] = true;
             }
             else if (this.type === 'range' && this.value) {
@@ -631,10 +705,113 @@
             return value;
           });
           if (inputHasValue) {
-            $nextButton.click();
+            setTimeout(function () {$nextButton.click();}, Drupal.webform.cards.autoForwardDelay);
           }
         }
+
+        /**
+         * Determine if next button is hidden when auto-forwarding
+         *
+         * @return {{boolean}}
+         *   TRUE if next button should be hidden
+         */
+        function hideAutoForwardNextButton() {
+          if (!options.autoForwardHideNextButton) {
+            return false;
+          }
+
+          if ($form.hasClass('webform-cards-toggle-show')) {
+            return false;
+          }
+
+          var $activeCard = $allCards.filter('.webform-card--active');
+          var $allInputs = $activeCard.find('input:visible, select:visible, textarea:visible');
+          var $autoForwardInputs = $activeCard.find('input[type="radio"], select[data-images]:not([multiple]), input[type="range"].form-webform-rating');
+          if (!$autoForwardInputs.length || $allInputs.length !== $autoForwardInputs.length) {
+            return false;
+          }
+
+          var inputValues = [];
+          var name, type;
+          $autoForwardInputs.each(function () {
+            name = this.name;
+            type = this.type;
+            if (type === 'radio') {
+              inputValues[name] = 'radio';
+            }
+            else if (type === 'select-one') {
+              inputValues[name] = 'select-one';
+            }
+            else if (type === 'range') {
+              inputValues[name] = 'range';
+            }
+          });
+
+          // Only auto-forward when a single input is visible.
+          if (Object.keys(inputValues).length !== 1) {
+            return false;
+          }
+
+          // Determine if the auto-forward input has a value.
+          switch (type) {
+            case 'radio':
+              return $('[name="' + name + '"]:checked').length ? false : true;
+
+            case 'range':
+              return $('[name="' + name + '"]').val() !== '0' ? false : true;
+
+            case 'select-one':
+              return $('[name="' + name + '"]').val() ? false : true;
+          }
+        }
+
+        /**
+         * Auto focus a card's first input, if it has not been entered.
+         *
+         * @param {jQuery} $activeCard
+         *   An jQuery object containing the active card.
+         *
+         */
+        function autofocus($activeCard) {
+          if (!$form.hasClass('js-webform-autofocus')) {
+            return;
+          }
+
+          var $firstInput = $activeCard.find(':input:visible').first();
+          if (!inputHasValue($firstInput)) {
+            $firstInput.focus();
+          }
+        }
+
+        /**
+         * Determine if an input has been entered.
+         *
+         * @param {jQuery} $input
+         *   An jQuery object containing an :input.
+         *
+         * @return {{boolean}}
+         *   TRUE if next button should be hidden
+         */
+        function inputHasValue($input) {
+          var type = $input[0].type;
+          var name = $input[0].name;
+          switch (type) {
+            case 'checkbox':
+            case 'radio':
+              return $('[name="' + name + '"]:checked').length ? true : false;
+
+            case 'range':
+              return $('[name="' + name + '"]').val() !== '0' ? true : false;
+
+            case 'select-one':
+            default:
+              return $('[name="' + name + '"]').val() ? true : false;
+          }
+          return false;
+        }
+
       });
+
     }
   };
 
diff --git a/web/modules/webform/modules/webform_cards/js/webform_cards.test.js b/web/modules/webform/modules/webform_cards/js/webform_cards.test.js
new file mode 100644
index 0000000000..d893c56597
--- /dev/null
+++ b/web/modules/webform/modules/webform_cards/js/webform_cards.test.js
@@ -0,0 +1,25 @@
+/**
+ * @file
+ * JavaScript behaviors for webform cards.
+ */
+
+(function ($, Drupal) {
+
+  'use strict';
+
+  /**
+   * Initialize webform cards test.
+   *
+   * @type {Drupal~behavior}
+   */
+  Drupal.behaviors.webformCardsTest = {
+    attach: function (context) {
+      $('.js-webform-card-test-submit-form', context).once('webform-card-test-submit-form').on('click', function () {
+        var selector = $(this).attr('href').replace('#', '.') + ' .webform-button--submit';
+        $(selector).trigger('click');
+        return false;
+      });
+    }
+  };
+
+})(jQuery, Drupal);
diff --git a/web/modules/webform/modules/webform_cards/src/Element/WebformCard.php b/web/modules/webform/modules/webform_cards/src/Element/WebformCard.php
index 5457e6344a..8cda67b1f8 100644
--- a/web/modules/webform/modules/webform_cards/src/Element/WebformCard.php
+++ b/web/modules/webform/modules/webform_cards/src/Element/WebformCard.php
@@ -44,13 +44,13 @@ public function getInfo() {
    */
   public static function preRenderWebformCard(array $element) {
     $element['#attributes']['data-title'] = $element['#title'];
-    if ($element['#webform_key']) {
+    if (!empty($element['#webform_key'])) {
       $element['#attributes']['data-webform-key'] = $element['#webform_key'];
     }
-    if ($element['#prev_button_label']) {
+    if (!empty($element['#prev_button_label'])) {
       $element['#attributes']['data-prev-button-label'] = $element['#prev_button_label'];
     }
-    if ($element['#next_button_label']) {
+    if (!empty($element['#next_button_label'])) {
       $element['#attributes']['data-next-button-label'] = $element['#next_button_label'];
     }
     return $element;
diff --git a/web/modules/webform/modules/webform_cards/src/Plugin/WebformElement/WebformCard.php b/web/modules/webform/modules/webform_cards/src/Plugin/WebformElement/WebformCard.php
index f0c0932f55..5d7b0b8441 100644
--- a/web/modules/webform/modules/webform_cards/src/Plugin/WebformElement/WebformCard.php
+++ b/web/modules/webform/modules/webform_cards/src/Plugin/WebformElement/WebformCard.php
@@ -136,6 +136,11 @@ public function form(array $form, FormStateInterface $form_state) {
       $this->t('Defaults to: %value', ['%value' => $webform->getSetting('wizard_next_button_label', TRUE)]),
     ];
 
+    $form['form']['display_container']['title_display']['#options'] = [
+      'none' => $this->t('None'),
+      'invisible' => $this->t('Invisible'),
+    ];
+
     return $form;
   }
 
diff --git a/web/modules/webform/modules/webform_cards/src/WebformCardsManager.php b/web/modules/webform/modules/webform_cards/src/WebformCardsManager.php
index 5c68e725bb..ddbe2ece51 100644
--- a/web/modules/webform/modules/webform_cards/src/WebformCardsManager.php
+++ b/web/modules/webform/modules/webform_cards/src/WebformCardsManager.php
@@ -44,7 +44,16 @@ public function __construct(WebformElementManagerInterface $element_manager, Web
    * {@inheritdoc}
    */
   public function hasCards(WebformInterface $webform) {
-    return (strpos($webform->getElementsRaw(), "'#type': webform_card") !== FALSE);
+    $elements = $webform->getElementsDecoded();
+    foreach ($elements as $element) {
+      if (is_array($element)) {
+        $element_plugin = $this->elementManager->getElementInstance($element);
+        if ($element_plugin instanceof WebformCard) {
+          return TRUE;
+        }
+      }
+    }
+    return FALSE;
   }
 
   /**
diff --git a/web/modules/webform/modules/webform_cards/templates/webform-card.html.twig b/web/modules/webform/modules/webform_cards/templates/webform-card.html.twig
index 34c92e944b..f03588d9de 100644
--- a/web/modules/webform/modules/webform_cards/templates/webform-card.html.twig
+++ b/web/modules/webform/modules/webform_cards/templates/webform-card.html.twig
@@ -34,7 +34,7 @@
       'webform-card-title',
     ]
   %}
-  {% if title %}
+  {% if title and title_display != 'none' %}
     <{{ title_tag }}{{ title_attributes.addClass(title_classes) }}>{{ title }}</{{ title_tag }}>
   {% endif %}
   <div class="webform-card-wrapper">
diff --git a/web/modules/webform/modules/webform_cards/tests/modules/webform_cards_test/config/install/webform.webform.test_cards_access.yml b/web/modules/webform/modules/webform_cards/tests/modules/webform_cards_test/config/install/webform.webform.test_cards_access.yml
index a5b92e45af..e5882c57af 100644
--- a/web/modules/webform/modules/webform_cards/tests/modules/webform_cards_test/config/install/webform.webform.test_cards_access.yml
+++ b/web/modules/webform/modules/webform_cards/tests/modules/webform_cards_test/config/install/webform.webform.test_cards_access.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -56,7 +57,7 @@ elements: |
       '#type': textfield
       '#title': textfield_private
       '#default_value': '{textfield_private}'
-
+  
 css: ''
 javascript: ''
 settings:
@@ -129,6 +130,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -184,6 +187,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/modules/webform_cards/tests/modules/webform_cards_test/config/install/webform.webform.test_cards_ajax.yml b/web/modules/webform/modules/webform_cards/tests/modules/webform_cards_test/config/install/webform.webform.test_cards_ajax.yml
index 06ae63d004..9df9758476 100644
--- a/web/modules/webform/modules/webform_cards/tests/modules/webform_cards_test/config/install/webform.webform.test_cards_ajax.yml
+++ b/web/modules/webform/modules/webform_cards/tests/modules/webform_cards_test/config/install/webform.webform.test_cards_ajax.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -29,7 +30,7 @@ elements: |
       '#type': textfield
       '#title': 'Element 2'
       '#default_value': '{element_2}'
-
+  
 css: ''
 javascript: ''
 settings:
@@ -102,6 +103,8 @@ settings:
   wizard_progress_link: true
   wizard_progress_states: true
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: true
   wizard_confirmation: true
@@ -157,6 +160,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/modules/webform_cards/tests/modules/webform_cards_test/config/install/webform.webform.test_cards_auto_forward.yml b/web/modules/webform/modules/webform_cards/tests/modules/webform_cards_test/config/install/webform.webform.test_cards_auto_forward.yml
index 0d5a366021..7ecc59b1d2 100644
--- a/web/modules/webform/modules/webform_cards/tests/modules/webform_cards_test/config/install/webform.webform.test_cards_auto_forward.yml
+++ b/web/modules/webform/modules/webform_cards/tests/modules/webform_cards_test/config/install/webform.webform.test_cards_auto_forward.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -12,7 +13,7 @@ template: false
 archive: false
 id: test_cards_auto_forward
 title: 'Test: Webform: Cards auto-forward'
-description: 'Test cards progress auto_forward.'
+description: 'Test cards progress with auto forwarding.'
 category: 'Test: Cards'
 elements: |
   textfield_example:
@@ -91,7 +92,7 @@ elements: |
         two: Two
         three: Three
       '#options_display': buttons
-
+  
 css: ''
 javascript: ''
 settings:
@@ -164,6 +165,8 @@ settings:
   wizard_progress_link: true
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: true
   wizard_confirmation: false
@@ -219,6 +222,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/modules/webform_cards/tests/modules/webform_cards_test/config/install/webform.webform.test_cards_auto_forward_hide.yml b/web/modules/webform/modules/webform_cards/tests/modules/webform_cards_test/config/install/webform.webform.test_cards_auto_forward_hide.yml
new file mode 100644
index 0000000000..c8710f8d4d
--- /dev/null
+++ b/web/modules/webform/modules/webform_cards/tests/modules/webform_cards_test/config/install/webform.webform.test_cards_auto_forward_hide.yml
@@ -0,0 +1,249 @@
+uuid: null
+langcode: en
+status: open
+dependencies:
+  enforced:
+    module:
+      - webform_cards_test
+open: null
+close: null
+weight: 0
+uid: null
+template: false
+archive: false
+id: test_cards_auto_forward_hide
+title: 'Test: Webform: Cards auto-forward hide next button'
+description: 'Test cards progress with auto_forward and hiding the next button.'
+category: 'Test: Cards'
+elements: |
+  radios_example:
+    '#type': webform_card
+    '#title': 'Radios'
+    radios:
+      '#type': radios
+      '#title': 'Radios'
+      '#options':
+        one: One
+        two: Two
+        three: Three
+      '#options_display': buttons
+  radios_other_example:
+    '#type': webform_card
+    '#title': 'Radios other'
+    radios_other:
+      '#type': webform_radios_other
+      '#title': 'Radios other'
+      '#options':
+        one: One
+        two: Two
+        three: Three
+      '#options_display': buttons
+  scale_example:
+    '#type': webform_card
+    '#title': 'Scale'
+    scale:
+      '#type': webform_scale
+      '#title': 'Scale'
+  rating_example:
+    '#type': webform_card
+    '#title': 'Rating'
+    rating:
+      '#type': webform_rating
+      '#title': 'Rating'
+  image_select_example:
+    '#type': webform_card
+    '#title': 'Image select'
+    image_select:
+      '#type': webform_image_select
+      '#title': 'Image select'
+      '#show_label': true
+      '#images':
+        kitten_1:
+          text: 'Cute Kitten 1'
+          src: 'http://placekitten.com/220/200'
+        kitten_2:
+          text: 'Cute Kitten 2'
+          src: 'http://placekitten.com/180/200'
+        kitten_3:
+          text: 'Cute Kitten 3'
+          src: 'http://placekitten.com/130/200'
+  
+css: ''
+javascript: ''
+settings:
+  ajax: false
+  ajax_scroll_top: form
+  ajax_progress_type: ''
+  ajax_effect: ''
+  ajax_speed: null
+  page: true
+  page_submit_path: ''
+  page_confirm_path: ''
+  page_theme_name: ''
+  form_title: source_entity_webform
+  form_submit_once: false
+  form_exception_message: ''
+  form_open_message: ''
+  form_close_message: ''
+  form_previous_submissions: true
+  form_confidential: false
+  form_confidential_message: ''
+  form_remote_addr: true
+  form_convert_anonymous: false
+  form_prepopulate: false
+  form_prepopulate_source_entity: false
+  form_prepopulate_source_entity_required: false
+  form_prepopulate_source_entity_type: ''
+  form_reset: false
+  form_disable_autocomplete: false
+  form_novalidate: false
+  form_disable_inline_errors: false
+  form_required: false
+  form_unsaved: false
+  form_disable_back: false
+  form_submit_back: false
+  form_autofocus: false
+  form_details_toggle: false
+  form_access_denied: default
+  form_access_denied_title: ''
+  form_access_denied_message: ''
+  form_access_denied_attributes: {  }
+  form_file_limit: ''
+  share: false
+  share_node: false
+  share_theme_name: ''
+  share_title: true
+  share_page_body_attributes: {  }
+  submission_label: ''
+  submission_log: false
+  submission_views: {  }
+  submission_views_replace: {  }
+  submission_user_columns: {  }
+  submission_user_duplicate: false
+  submission_access_denied: default
+  submission_access_denied_title: ''
+  submission_access_denied_message: ''
+  submission_access_denied_attributes: {  }
+  submission_exception_message: ''
+  submission_locked_message: ''
+  submission_excluded_elements: {  }
+  submission_exclude_empty: false
+  submission_exclude_empty_checkbox: false
+  previous_submission_message: ''
+  previous_submissions_message: ''
+  autofill: false
+  autofill_message: ''
+  autofill_excluded_elements: {  }
+  wizard_progress_bar: true
+  wizard_progress_pages: true
+  wizard_progress_percentage: true
+  wizard_progress_link: true
+  wizard_progress_states: false
+  wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: true
+  wizard_keyboard: true
+  wizard_start_label: ''
+  wizard_preview_link: true
+  wizard_confirmation: false
+  wizard_confirmation_label: ''
+  wizard_track: ''
+  wizard_prev_button_label: ''
+  wizard_next_button_label: ''
+  wizard_toggle: false
+  wizard_toggle_show_label: ''
+  wizard_toggle_hide_label: ''
+  preview: 1
+  preview_label: ''
+  preview_title: ''
+  preview_message: ''
+  preview_attributes: {  }
+  preview_excluded_elements: {  }
+  preview_exclude_empty: true
+  preview_exclude_empty_checkbox: false
+  draft: all
+  draft_multiple: false
+  draft_auto_save: false
+  draft_saved_message: ''
+  draft_loaded_message: ''
+  draft_pending_single_message: ''
+  draft_pending_multiple_message: ''
+  confirmation_type: page
+  confirmation_title: ''
+  confirmation_message: ''
+  confirmation_url: ''
+  confirmation_attributes: {  }
+  confirmation_back: true
+  confirmation_back_label: ''
+  confirmation_back_attributes: {  }
+  confirmation_exclude_query: false
+  confirmation_exclude_token: false
+  confirmation_update: false
+  limit_total: null
+  limit_total_interval: null
+  limit_total_message: ''
+  limit_total_unique: false
+  limit_user: null
+  limit_user_interval: null
+  limit_user_message: ''
+  limit_user_unique: false
+  entity_limit_total: null
+  entity_limit_total_interval: null
+  entity_limit_user: null
+  entity_limit_user_interval: null
+  purge: none
+  purge_days: null
+  results_disabled: false
+  results_disabled_ignore: false
+  results_customize: false
+  token_view: false
+  token_update: false
+  serial_disabled: false
+access:
+  create:
+    roles:
+      - anonymous
+      - authenticated
+    users: {  }
+    permissions: {  }
+  view_any:
+    roles: {  }
+    users: {  }
+    permissions: {  }
+  update_any:
+    roles: {  }
+    users: {  }
+    permissions: {  }
+  delete_any:
+    roles: {  }
+    users: {  }
+    permissions: {  }
+  purge_any:
+    roles: {  }
+    users: {  }
+    permissions: {  }
+  view_own:
+    roles: {  }
+    users: {  }
+    permissions: {  }
+  update_own:
+    roles: {  }
+    users: {  }
+    permissions: {  }
+  delete_own:
+    roles: {  }
+    users: {  }
+    permissions: {  }
+  administer:
+    roles: {  }
+    users: {  }
+    permissions: {  }
+  test:
+    roles: {  }
+    users: {  }
+    permissions: {  }
+  configuration:
+    roles: {  }
+    users: {  }
+    permissions: {  }
+handlers: {  }
+variants: {  }
diff --git a/web/modules/webform/modules/webform_cards/tests/modules/webform_cards_test/config/install/webform.webform.test_cards_draft.yml b/web/modules/webform/modules/webform_cards/tests/modules/webform_cards_test/config/install/webform.webform.test_cards_draft.yml
index 41d5c2d358..389b35722a 100644
--- a/web/modules/webform/modules/webform_cards/tests/modules/webform_cards_test/config/install/webform.webform.test_cards_draft.yml
+++ b/web/modules/webform/modules/webform_cards/tests/modules/webform_cards_test/config/install/webform.webform.test_cards_draft.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -29,7 +30,7 @@ elements: |
       '#type': textfield
       '#title': 'Element 2'
       '#default_value': '{element_2}'
-
+  
 css: ''
 javascript: ''
 settings:
@@ -102,6 +103,8 @@ settings:
   wizard_progress_link: true
   wizard_progress_states: true
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: true
   wizard_confirmation: true
@@ -157,6 +160,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/modules/webform_cards/tests/modules/webform_cards_test/config/install/webform.webform.test_cards_javascript.yml b/web/modules/webform/modules/webform_cards/tests/modules/webform_cards_test/config/install/webform.webform.test_cards_javascript.yml
new file mode 100644
index 0000000000..1d55dfa60f
--- /dev/null
+++ b/web/modules/webform/modules/webform_cards/tests/modules/webform_cards_test/config/install/webform.webform.test_cards_javascript.yml
@@ -0,0 +1,234 @@
+uuid: c7f06b04-8c3c-421b-b38a-c882ede175fd
+langcode: en
+status: open
+dependencies:
+  enforced:
+    module:
+      - webform_cards_test
+_core:
+  default_config_hash: ahRBaC5cLszQYVnyTm6-FNHsoxJRBnXqznJTPThCO7k
+open: null
+close: null
+weight: 0
+uid: null
+template: false
+archive: false
+id: test_cards_javascript
+title: 'Test: Webform: Cards JavaScript'
+description: 'Test cards JavaScript events.'
+category: 'Test: Cards'
+elements: |
+  card_1:
+    '#type': webform_card
+    '#title': 'Card 1'
+    element_1:
+      '#type': textfield
+      '#title': 'Element 1'
+      '#default_value': '{element_1}'
+      '#required': true
+  card_2:
+    '#type': webform_card
+    '#title': 'Card 2'
+    element_2:
+      '#type': textfield
+      '#title': 'Element 2'
+      '#default_value': '{element_2}'
+      '#required': true
+css: ''
+javascript: |
+  (function ($, Drupal) {
+
+    'use strict';
+
+    Drupal.behaviors.webformCardsTestJavaScript = {
+      attach: function (context) {
+        var $forms = $(context).is('form.webform-submission-form')
+          ? $(context)
+          : $('form.webform-submission-form', context);
+
+        $forms.once('webform-cards-test-javascript')
+          .on('webform_cards:change', function (event, $activeCard) {
+            console.log('webform_cards:change');
+            console.log(event);
+            console.log($activeCard);
+          });
+      }
+    };
+
+  })(jQuery, Drupal);
+
+settings:
+  ajax: false
+  ajax_scroll_top: form
+  ajax_progress_type: ''
+  ajax_effect: ''
+  ajax_speed: null
+  page: true
+  page_submit_path: ''
+  page_confirm_path: ''
+  page_theme_name: ''
+  form_title: source_entity_webform
+  form_submit_once: false
+  form_exception_message: ''
+  form_open_message: ''
+  form_close_message: ''
+  form_previous_submissions: true
+  form_confidential: false
+  form_confidential_message: ''
+  form_remote_addr: true
+  form_convert_anonymous: false
+  form_prepopulate: false
+  form_prepopulate_source_entity: false
+  form_prepopulate_source_entity_required: false
+  form_prepopulate_source_entity_type: ''
+  form_reset: false
+  form_disable_autocomplete: false
+  form_novalidate: false
+  form_disable_inline_errors: false
+  form_required: false
+  form_unsaved: false
+  form_disable_back: false
+  form_submit_back: false
+  form_autofocus: false
+  form_details_toggle: false
+  form_access_denied: default
+  form_access_denied_title: ''
+  form_access_denied_message: ''
+  form_access_denied_attributes: {  }
+  form_file_limit: ''
+  share: false
+  share_node: false
+  share_theme_name: ''
+  share_title: true
+  share_page_body_attributes: {  }
+  submission_label: ''
+  submission_log: false
+  submission_views: {  }
+  submission_views_replace: {  }
+  submission_user_columns: {  }
+  submission_user_duplicate: false
+  submission_access_denied: default
+  submission_access_denied_title: ''
+  submission_access_denied_message: ''
+  submission_access_denied_attributes: {  }
+  submission_exception_message: ''
+  submission_locked_message: ''
+  submission_excluded_elements: {  }
+  submission_exclude_empty: false
+  submission_exclude_empty_checkbox: false
+  previous_submission_message: ''
+  previous_submissions_message: ''
+  autofill: false
+  autofill_message: ''
+  autofill_excluded_elements: {  }
+  wizard_progress_bar: true
+  wizard_progress_pages: true
+  wizard_progress_percentage: true
+  wizard_progress_link: true
+  wizard_progress_states: true
+  wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_start_label: ''
+  wizard_preview_link: false
+  wizard_confirmation: true
+  wizard_confirmation_label: ''
+  wizard_track: ''
+  wizard_prev_button_label: ''
+  wizard_next_button_label: ''
+  wizard_toggle: true
+  wizard_toggle_show_label: ''
+  wizard_toggle_hide_label: ''
+  preview: 0
+  preview_label: ''
+  preview_title: ''
+  preview_message: ''
+  preview_attributes: {  }
+  preview_excluded_elements: {  }
+  preview_exclude_empty: true
+  preview_exclude_empty_checkbox: false
+  draft: none
+  draft_multiple: false
+  draft_auto_save: false
+  draft_saved_message: ''
+  draft_loaded_message: ''
+  draft_pending_single_message: ''
+  draft_pending_multiple_message: ''
+  confirmation_type: page
+  confirmation_title: ''
+  confirmation_message: ''
+  confirmation_url: ''
+  confirmation_attributes: {  }
+  confirmation_back: true
+  confirmation_back_label: ''
+  confirmation_back_attributes: {  }
+  confirmation_exclude_query: false
+  confirmation_exclude_token: false
+  confirmation_update: false
+  limit_total: null
+  limit_total_interval: null
+  limit_total_message: ''
+  limit_total_unique: false
+  limit_user: null
+  limit_user_interval: null
+  limit_user_message: ''
+  limit_user_unique: false
+  entity_limit_total: null
+  entity_limit_total_interval: null
+  entity_limit_user: null
+  entity_limit_user_interval: null
+  purge: none
+  purge_days: null
+  results_disabled: false
+  results_disabled_ignore: false
+  results_customize: false
+  token_view: false
+  token_update: false
+access:
+  create:
+    roles:
+      - anonymous
+      - authenticated
+    users: {  }
+    permissions: {  }
+  view_any:
+    roles: {  }
+    users: {  }
+    permissions: {  }
+  update_any:
+    roles: {  }
+    users: {  }
+    permissions: {  }
+  delete_any:
+    roles: {  }
+    users: {  }
+    permissions: {  }
+  purge_any:
+    roles: {  }
+    users: {  }
+    permissions: {  }
+  view_own:
+    roles: {  }
+    users: {  }
+    permissions: {  }
+  update_own:
+    roles: {  }
+    users: {  }
+    permissions: {  }
+  delete_own:
+    roles: {  }
+    users: {  }
+    permissions: {  }
+  administer:
+    roles: {  }
+    users: {  }
+    permissions: {  }
+  test:
+    roles: {  }
+    users: {  }
+    permissions: {  }
+  configuration:
+    roles: {  }
+    users: {  }
+    permissions: {  }
+handlers: {  }
+variants: {  }
diff --git a/web/modules/webform/modules/webform_cards/tests/modules/webform_cards_test/config/install/webform.webform.test_cards_long_100.yml b/web/modules/webform/modules/webform_cards/tests/modules/webform_cards_test/config/install/webform.webform.test_cards_long_100.yml
index a94d7db950..4ef5fa6598 100644
--- a/web/modules/webform/modules/webform_cards/tests/modules/webform_cards_test/config/install/webform.webform.test_cards_long_100.yml
+++ b/web/modules/webform/modules/webform_cards/tests/modules/webform_cards_test/config/install/webform.webform.test_cards_long_100.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -615,7 +616,7 @@ elements: |
     element_100:
       '#type': textfield
       '#title': 'Element #100'
-
+  
 css: ''
 javascript: ''
 settings:
@@ -688,6 +689,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -743,6 +746,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/modules/webform_cards/tests/modules/webform_cards_test/config/install/webform.webform.test_cards_progress.yml b/web/modules/webform/modules/webform_cards/tests/modules/webform_cards_test/config/install/webform.webform.test_cards_progress.yml
index b7301fad30..7e62c551d9 100644
--- a/web/modules/webform/modules/webform_cards/tests/modules/webform_cards_test/config/install/webform.webform.test_cards_progress.yml
+++ b/web/modules/webform/modules/webform_cards/tests/modules/webform_cards_test/config/install/webform.webform.test_cards_progress.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -29,7 +30,7 @@ elements: |
       '#type': textfield
       '#title': 'Element 2'
       '#default_value': '{element_2}'
-
+  
 css: ''
 javascript: ''
 settings:
@@ -102,6 +103,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: false
@@ -157,6 +160,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/modules/webform_cards/tests/modules/webform_cards_test/config/install/webform.webform.test_cards_progress_custom.yml b/web/modules/webform/modules/webform_cards/tests/modules/webform_cards_test/config/install/webform.webform.test_cards_progress_custom.yml
index 5388ff0fe7..1abe08679e 100644
--- a/web/modules/webform/modules/webform_cards/tests/modules/webform_cards_test/config/install/webform.webform.test_cards_progress_custom.yml
+++ b/web/modules/webform/modules/webform_cards/tests/modules/webform_cards_test/config/install/webform.webform.test_cards_progress_custom.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -118,7 +119,7 @@ elements: |
       '#type': textfield
       '#title': 'Element 5'
       '#default_value': '{element_5}'
-
+  
 css: ''
 javascript: ''
 settings:
@@ -191,6 +192,8 @@ settings:
   wizard_progress_link: true
   wizard_progress_states: true
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: true
   wizard_confirmation: true
@@ -246,6 +249,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/modules/webform_cards/tests/modules/webform_cards_test/config/install/webform.webform.test_cards_progress_links.yml b/web/modules/webform/modules/webform_cards/tests/modules/webform_cards_test/config/install/webform.webform.test_cards_progress_links.yml
index f932468153..02ffabf547 100644
--- a/web/modules/webform/modules/webform_cards/tests/modules/webform_cards_test/config/install/webform.webform.test_cards_progress_links.yml
+++ b/web/modules/webform/modules/webform_cards/tests/modules/webform_cards_test/config/install/webform.webform.test_cards_progress_links.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -29,7 +30,7 @@ elements: |
       '#type': textfield
       '#title': 'Element 2'
       '#default_value': '{element_2}'
-
+  
 css: ''
 javascript: ''
 settings:
@@ -102,6 +103,8 @@ settings:
   wizard_progress_link: true
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: true
   wizard_confirmation: true
@@ -157,6 +160,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/modules/webform_cards/tests/modules/webform_cards_test/config/install/webform.webform.test_cards_states.yml b/web/modules/webform/modules/webform_cards/tests/modules/webform_cards_test/config/install/webform.webform.test_cards_states.yml
index e09676f11c..cd08c521bd 100644
--- a/web/modules/webform/modules/webform_cards/tests/modules/webform_cards_test/config/install/webform.webform.test_cards_states.yml
+++ b/web/modules/webform/modules/webform_cards/tests/modules/webform_cards_test/config/install/webform.webform.test_cards_states.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -118,7 +119,7 @@ elements: |
       '#type': textfield
       '#title': 'Element 5'
       '#default_value': '{element_5}'
-
+  
 css: ''
 javascript: ''
 settings:
@@ -191,6 +192,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: true
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -246,6 +249,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/modules/webform_cards/tests/modules/webform_cards_test/config/install/webform.webform.test_cards_titles.yml b/web/modules/webform/modules/webform_cards/tests/modules/webform_cards_test/config/install/webform.webform.test_cards_titles.yml
index 599b2e99ef..eec8a72053 100644
--- a/web/modules/webform/modules/webform_cards/tests/modules/webform_cards_test/config/install/webform.webform.test_cards_titles.yml
+++ b/web/modules/webform/modules/webform_cards/tests/modules/webform_cards_test/config/install/webform.webform.test_cards_titles.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -32,7 +33,7 @@ elements: |
       '#type': textfield
       '#title': 'Element 2'
       '#default_value': '{element_2}'
-
+  
 css: ''
 javascript: ''
 settings:
@@ -105,6 +106,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: false
@@ -160,6 +163,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/modules/webform_cards/tests/modules/webform_cards_test/config/install/webform.webform.test_cards_toggle.yml b/web/modules/webform/modules/webform_cards/tests/modules/webform_cards_test/config/install/webform.webform.test_cards_toggle.yml
index 84c20ea2c2..c4d45fa606 100644
--- a/web/modules/webform/modules/webform_cards/tests/modules/webform_cards_test/config/install/webform.webform.test_cards_toggle.yml
+++ b/web/modules/webform/modules/webform_cards/tests/modules/webform_cards_test/config/install/webform.webform.test_cards_toggle.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -29,7 +30,7 @@ elements: |
       '#type': textfield
       '#title': 'Element 2'
       '#default_value': '{element_2}'
-
+  
 css: ''
 javascript: ''
 settings:
@@ -102,6 +103,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: false
@@ -157,6 +160,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/modules/webform_cards/tests/modules/webform_cards_test/config/install/webform.webform.test_cards_validation_errors.yml b/web/modules/webform/modules/webform_cards/tests/modules/webform_cards_test/config/install/webform.webform.test_cards_validation_errors.yml
index 822fff13c4..83545210e0 100644
--- a/web/modules/webform/modules/webform_cards/tests/modules/webform_cards_test/config/install/webform.webform.test_cards_validation_errors.yml
+++ b/web/modules/webform/modules/webform_cards/tests/modules/webform_cards_test/config/install/webform.webform.test_cards_validation_errors.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -37,7 +38,7 @@ elements: |
       '#type': textfield
       '#title': 'Element 2'
       '#default_value': '{element_2}'
-
+  
 css: ''
 javascript: ''
 settings:
@@ -110,6 +111,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -165,6 +168,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/modules/webform_cards/tests/modules/webform_cards_test/webform_cards_test.info.yml b/web/modules/webform/modules/webform_cards/tests/modules/webform_cards_test/webform_cards_test.info.yml
index fb9091ebc6..2ab111efd0 100644
--- a/web/modules/webform/modules/webform_cards/tests/modules/webform_cards_test/webform_cards_test.info.yml
+++ b/web/modules/webform/modules/webform_cards/tests/modules/webform_cards_test/webform_cards_test.info.yml
@@ -6,7 +6,7 @@ core_version_requirement: ^8.8
 dependencies:
   - 'webform:webform_cards'
 
-# Information added by Drupal.org packaging script on 2020-07-02
-version: '8.x-5.19'
+# Information added by Drupal.org packaging script on 2020-10-05
+version: '8.x-5.22'
 project: 'webform'
-datestamp: 1593681142
+datestamp: 1601919526
diff --git a/web/modules/webform/modules/webform_cards/tests/src/FunctionalJavaScript/WebformCardsAjaxJavaScriptTest.php b/web/modules/webform/modules/webform_cards/tests/src/FunctionalJavaScript/WebformCardsAjaxJavaScriptTest.php
index 49c1d79c22..ab32e8b968 100644
--- a/web/modules/webform/modules/webform_cards/tests/src/FunctionalJavaScript/WebformCardsAjaxJavaScriptTest.php
+++ b/web/modules/webform/modules/webform_cards/tests/src/FunctionalJavaScript/WebformCardsAjaxJavaScriptTest.php
@@ -53,6 +53,32 @@ public function testAjax() {
     // Confirm that the confirmation page is inline.
     $actual_path = parse_url($this->getSession()->getCurrentUrl(), PHP_URL_PATH) ?: '';
     $this->assertEquals($base_path . 'webform/test_cards_ajax', $actual_path);
+
+    /**************************************************************************/
+
+    // Get the webform and load card 1.
+    $this->drupalGet('/webform/test_cards_ajax');
+    $assert_session->waitForElement('css', '.webform-card--active[data-webform-key="card_1"]');
+    $this->assertCssSelect('[data-webform-card="card_1"].is-active');
+
+    // Move to card 2.
+    $this->executeJqueryEvent('body', 'keydown', ['which' => 39]);
+    $assert_session->waitForElement('css', '.webform-card--active[data-webform-key="card_2"]');
+    $this->assertCssSelect('[data-webform-card="card_2"].is-active');
+
+    // Move to preview.
+    $this->executeJqueryEvent('body', 'keydown', ['which' => 39]);
+    $assert_session->waitForElement('css', '.webform-preview');
+    $this->assertCssSelect('[data-webform-page="webform_preview"].is-active');
+
+    // Submit the form.
+    $this->executeJqueryEvent('body', 'keydown', ['which' => 39]);
+    $assert_session->waitForElement('css', '.webform-confirmation');
+    $this->assertCssSelect('[data-webform-page="webform_confirmation"].is-active');
+
+    // Confirm that the confirmation page is inline.
+    $actual_path = parse_url($this->getSession()->getCurrentUrl(), PHP_URL_PATH) ?: '';
+    $this->assertEquals($base_path . 'webform/test_cards_ajax', $actual_path);
   }
 
 }
diff --git a/web/modules/webform/modules/webform_cards/tests/src/FunctionalJavaScript/WebformCardsAutoForwardJavaScriptTest.php b/web/modules/webform/modules/webform_cards/tests/src/FunctionalJavaScript/WebformCardsAutoForwardJavaScriptTest.php
index abefa8a4f3..1959fd9961 100644
--- a/web/modules/webform/modules/webform_cards/tests/src/FunctionalJavaScript/WebformCardsAutoForwardJavaScriptTest.php
+++ b/web/modules/webform/modules/webform_cards/tests/src/FunctionalJavaScript/WebformCardsAutoForwardJavaScriptTest.php
@@ -32,7 +32,7 @@ public function testAutoForward() {
     $assert_session->waitForElement('css', '.webform-card--active[data-webform-key="textfield"]');
 
     // Check that enter in textfield auto-forwards.
-    $session->executeScript('var event = jQuery.Event("keypress"); event.which = 13; jQuery("#edit-textfield").trigger(event);');
+    $this->executeJqueryEvent('#edit-textfield', 'keydown', ['which' => 13]);
     $assert_session->waitForElement('css', '.webform-card--active[data-webform-key="radios_example"]');
 
     // Check that radios auto-forwards.
@@ -66,6 +66,30 @@ public function testAutoForward() {
     // Check that the form can be submitted.
     $page->pressButton('edit-submit');
     $assert_session->pageTextContains('New submission added to Test: Webform: Cards auto-forward.');
+
+    /**************************************************************************/
+
+    $this->drupalGet('/webform/test_cards_auto_forward_hide');
+
+    $assert_session->waitForElement('css', '.webform-card--active[data-webform-key="radios_example"]');
+
+    // Check that next button is hidden.
+    $this->assertElementNotVisible('#edit-cards-prev');
+    $this->assertElementNotVisible('#edit-cards-next');
+
+    // Move to the next page.
+    // Click the radio's label because radio is not visible.
+    $this->click('label[for="edit-radios-one"]');
+    $assert_session->waitForElement('css', '.webform-card--active[data-webform-key="radios_other_example"]');
+
+    // Go back to previous page.
+    $this->assertElementVisible('#edit-cards-prev');
+    $this->assertElementNotVisible('#edit-cards-next');
+    $page->pressButton('edit-cards-prev');
+    $assert_session->waitForElementVisible('css', '#edit-cards-next');
+
+    // Check that next button is now visible.
+    $this->assertElementVisible('#edit-cards-next');
   }
 
 }
diff --git a/web/modules/webform/modules/webform_cards/tests/src/FunctionalJavaScript/WebformCardsProgressJavaScriptTest.php b/web/modules/webform/modules/webform_cards/tests/src/FunctionalJavaScript/WebformCardsProgressJavaScriptTest.php
index e0865a1747..d5e922d41a 100644
--- a/web/modules/webform/modules/webform_cards/tests/src/FunctionalJavaScript/WebformCardsProgressJavaScriptTest.php
+++ b/web/modules/webform/modules/webform_cards/tests/src/FunctionalJavaScript/WebformCardsProgressJavaScriptTest.php
@@ -151,7 +151,7 @@ public function testProgress() {
     // Move to card 2.
     $assert_session->waitForElement('css', '.webform-card--active[data-webform-key="card_1"]');
     $page->pressButton('edit-cards-next');
-    $assert_session->waitForElement('css',  '#edit-element-2');
+    $assert_session->waitForElement('css', '#edit-element-2');
 
     // Check that only card 1 is linked in the progress bar.
     $assert_session->waitForElement('css', '.webform-card--active[data-webform-key="card_2"]');
diff --git a/web/modules/webform/modules/webform_cards/webform_cards.info.yml b/web/modules/webform/modules/webform_cards/webform_cards.info.yml
index 9c14051876..4cd771df83 100644
--- a/web/modules/webform/modules/webform_cards/webform_cards.info.yml
+++ b/web/modules/webform/modules/webform_cards/webform_cards.info.yml
@@ -9,7 +9,7 @@ dependencies:
   - 'webform:webform_clientside_validation'
   - 'drupal:inline_form_errors'
 
-# Information added by Drupal.org packaging script on 2020-07-02
-version: '8.x-5.19'
+# Information added by Drupal.org packaging script on 2020-10-05
+version: '8.x-5.22'
 project: 'webform'
-datestamp: 1593681142
+datestamp: 1601919526
diff --git a/web/modules/webform/modules/webform_cards/webform_cards.libraries.yml b/web/modules/webform/modules/webform_cards/webform_cards.libraries.yml
index 93903414e7..e3ecff9937 100644
--- a/web/modules/webform/modules/webform_cards/webform_cards.libraries.yml
+++ b/web/modules/webform/modules/webform_cards/webform_cards.libraries.yml
@@ -20,3 +20,11 @@ webform_cards.admin:
   dependencies:
     - core/drupal
     - core/jquery.once
+
+webform_cards.test:
+  version: VERSION
+  js:
+    js/webform_cards.test.js: { }
+  dependencies:
+    - core/drupal
+    - core/jquery.once
diff --git a/web/modules/webform/modules/webform_cards/webform_cards.module b/web/modules/webform/modules/webform_cards/webform_cards.module
index 85a8a2dc41..7a1dbbf6f5 100644
--- a/web/modules/webform/modules/webform_cards/webform_cards.module
+++ b/web/modules/webform/modules/webform_cards/webform_cards.module
@@ -5,6 +5,7 @@
  * Provides a 'Card' container element for clientside multistep form pagination.
  */
 
+use Drupal\Component\Utility\Html;
 use Drupal\Component\Utility\NestedArray;
 use Drupal\Core\EventSubscriber\MainContentViewSubscriber;
 use Drupal\Core\Render\Element;
@@ -105,6 +106,20 @@ function webform_cards_webform_submission_form_alter(array &$form, FormStateInte
     return;
   }
 
+  // Display quick form submit when testing webform cards.
+  if ($form_object->getOperation() === 'test'
+    && \Drupal::request()->getMethod() === 'GET') {
+    $form_id = Html::getId($form_object->getFormId());
+    $build = [
+      '#type' => 'link',
+      '#url' => Url::fromRoute('<none>', [], ['fragment' => $form_id]),
+      '#title' => t('Submit %title form', ['%title' => $webform->label()]),
+      '#attributes' => ['class' => ['js-webform-card-test-submit-form']],
+    ];
+    \Drupal::messenger()->addWarning(\Drupal::service('renderer')->render($build));
+    $form['#attached']['library'][] = 'webform_cards/webform_cards.test';
+  }
+
   // Add cards JavaScript.
   $form['#attached']['library'][] = 'webform_cards/webform_cards';
 
@@ -143,6 +158,10 @@ function webform_cards_webform_submission_form_alter(array &$form, FormStateInte
     'wizard_progress_link',
     // Auto forward to next page when the page is completed.
     'wizard_auto_forward',
+    // Hide the next button when auto-forwarding.
+    'wizard_auto_forward_hide_next_button',
+    // Navigate between cards using left or right arrow keys.
+    'wizard_keyboard',
     // Link to previous pages in preview.
     'wizard_preview_link',
     // Include confirmation page in progress.
@@ -175,7 +194,7 @@ function webform_cards_webform_submission_form_alter(array &$form, FormStateInte
       WebformInterface::PAGE_PREVIEW,
       WebformInterface::PAGE_CONFIRMATION,
     ])) {
-      $current_page = $current_card ?: array_key_first($pages);
+      $current_page = $current_card ?: key($pages);
     }
     $form['progress'] = [
       '#theme' => 'webform_progress',
@@ -208,6 +227,11 @@ function webform_cards_webform_submission_form_alter(array &$form, FormStateInte
       'class' => ['webform-button--previous', 'webform-cards-button--previous'],
     ],
     '#weight' => 0,
+    // Cards and previews previous button labels can have the same value.
+    // Issue #1342066 Document that buttons with the same #value need a unique
+    // #name for the Form API to distinguish them, or change the Form API to
+    // assign unique #names automatically.
+    '#name' => $webform->id() . '_card_previous_button',
   ];
   $form['actions']['cards_next'] = [
     '#type' => 'submit',
@@ -218,6 +242,14 @@ function webform_cards_webform_submission_form_alter(array &$form, FormStateInte
     '#weight' => 1,
   ];
 
+  // Add 'data-webform-unsaved-ignore' attribute to forms with unsaved
+  // data warning.
+  // @see webform.form.unsaved.js
+  if ($webform->getSetting('form_unsaved', TRUE)) {
+    $form['actions']['cards_prev']['#attributes']['data-webform-unsaved-ignore'] = TRUE;
+    $form['actions']['cards_next']['#attributes']['data-webform-unsaved-ignore'] = TRUE;
+  };
+
   // Process the submitted values before they are stored.
   $form['#entity_builders'][] = 'webform_card_webform_submission_builder';
 }
@@ -338,6 +370,12 @@ function webform_cards_form_webform_settings_form_form_alter(array &$form, FormS
       'wizard_auto_forward' => [
         '#access' => TRUE,
       ],
+      'wizard_auto_forward_hide_next_button' => [
+        '#access' => TRUE,
+      ],
+      'wizard_keyboard' => [
+        '#access' => TRUE,
+      ],
       'wizard_start_label' => [
         '#title' => t('Wizard/cards start label'),
         '#description' => t('The first page label in the progress bar. Subsequent pages are titled by their wizard/card page title.'),
diff --git a/web/modules/webform/modules/webform_clientside_validation/js/webform_clientside_validation.ife.js b/web/modules/webform/modules/webform_clientside_validation/js/webform_clientside_validation.ife.js
index b0fddf78b6..60075694ce 100644
--- a/web/modules/webform/modules/webform_clientside_validation/js/webform_clientside_validation.ife.js
+++ b/web/modules/webform/modules/webform_clientside_validation/js/webform_clientside_validation.ife.js
@@ -3,10 +3,28 @@
  * Attaches behaviors for the Clientside Validation jQuery module.
  */
 
-(function ($) {
+(function ($, drupalSettings) {
 
   'use strict';
 
+  // Disable clientside validation for webforms submitted using Ajax.
+  // This prevents Computed elements with Ajax from breaking.
+  // @see \Drupal\clientside_validation_jquery\Form\ClientsideValidationjQuerySettingsForm
+  drupalSettings.clientside_validation_jquery.validate_all_ajax_forms = 0;
+
+  /**
+   * Add .cv-validate-before-ajax to all webform submit buttons.
+   *
+   * @type {Drupal~behavior}
+   */
+  Drupal.behaviors.webformClientSideValidationAjax = {
+    attach: function (context) {
+      $('form.webform-submission-form .form-actions :submit:not([formnovalidate])')
+        .once('webform-clientside-validation-ajax')
+        .addClass('cv-validate-before-ajax');
+    }
+  };
+
   $(document).once('webform_cvjquery').on('cv-jquery-validate-options-update', function (event, options) {
     options.errorElement = 'strong';
     options.showErrors = function (errorMap, errorList) {
@@ -17,12 +35,19 @@
       $(this.currentForm).find('strong.error').addClass('form-item--error-message');
 
       // Move all radios, checkbox, and datelist errors to parent container.
-      $(this.currentForm).find('.form-checkboxes, .form-radios, .form-type-datelist .container-inline, .form-type-tel').each(function () {
+      $(this.currentForm).find('.form-checkboxes, .form-radios, .form-type-datelist .container-inline, .form-type-tel, .webform-type-webform-height .form--inline').each(function () {
         var $container = $(this);
         var $errorMessages = $container.find('strong.error.form-item--error-message');
-        $container.append($errorMessages);
+        $errorMessages.insertAfter($container);
+      });
+
+      // Move error after field suffix.
+      $(this.currentForm).find('strong.error.form-item--error-message ~ .field-suffix').each(function () {
+        var $fieldSuffix = $(this);
+        var $errorMessages = $fieldSuffix.prev('strong.error.form-item--error-message');
+        $errorMessages.insertAfter($fieldSuffix);
       });
     };
   });
 
-})(jQuery);
+})(jQuery, drupalSettings);
diff --git a/web/modules/webform/modules/webform_clientside_validation/tests/modules/webform_clientside_validation_test/config/install/webform.webform.test_clientside_validation.yml b/web/modules/webform/modules/webform_clientside_validation/tests/modules/webform_clientside_validation_test/config/install/webform.webform.test_clientside_validation.yml
index 52731f0307..151f03ade2 100644
--- a/web/modules/webform/modules/webform_clientside_validation/tests/modules/webform_clientside_validation_test/config/install/webform.webform.test_clientside_validation.yml
+++ b/web/modules/webform/modules/webform_clientside_validation/tests/modules/webform_clientside_validation_test/config/install/webform.webform.test_clientside_validation.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -23,6 +24,12 @@ elements: |
       '#type': textfield
       '#title': textfield
       '#required': true
+    textfield_prefix_suffix:
+      '#type': textfield
+      '#title': textfield_prefix_suffix
+      '#field_prefix': '{field_prefix}'
+      '#field_suffix': '{field_suffix}'
+      '#required': true
     pattern:
       '#type': textfield
       '#title': 'pattern (^[a-z]+$)'
@@ -59,6 +66,16 @@ elements: |
         two: Two
         three: Three
       '#required': true
+    checkboxes_two_columns:
+      '#type': checkboxes
+      '#title': checkboxes_two_columns
+      '#options_display': two_columns
+      '#options':
+        one: One
+        two: Two
+        three: Three
+        four: Four
+      '#required': true
   date_elements:
     '#type': details
     '#title': 'Date elements'
@@ -165,7 +182,7 @@ elements: |
       '#type': webform_signature
       '#title': signature
       '#required': true
-
+  
 css: ''
 javascript: ''
 settings:
@@ -238,6 +255,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -293,6 +312,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/modules/webform_clientside_validation/tests/modules/webform_clientside_validation_test/webform_clientside_validation_test.info.yml b/web/modules/webform/modules/webform_clientside_validation/tests/modules/webform_clientside_validation_test/webform_clientside_validation_test.info.yml
index baed14609d..1749a41f24 100644
--- a/web/modules/webform/modules/webform_clientside_validation/tests/modules/webform_clientside_validation_test/webform_clientside_validation_test.info.yml
+++ b/web/modules/webform/modules/webform_clientside_validation/tests/modules/webform_clientside_validation_test/webform_clientside_validation_test.info.yml
@@ -6,7 +6,7 @@ core_version_requirement: ^8.8
 dependencies:
   - 'webform:webform_clientside_validation'
 
-# Information added by Drupal.org packaging script on 2020-07-02
-version: '8.x-5.19'
+# Information added by Drupal.org packaging script on 2020-10-05
+version: '8.x-5.22'
 project: 'webform'
-datestamp: 1593681142
+datestamp: 1601919526
diff --git a/web/modules/webform/modules/webform_clientside_validation/webform_clientside_validation.info.yml b/web/modules/webform/modules/webform_clientside_validation/webform_clientside_validation.info.yml
index 982ae1b637..a806997e3c 100644
--- a/web/modules/webform/modules/webform_clientside_validation/webform_clientside_validation.info.yml
+++ b/web/modules/webform/modules/webform_clientside_validation/webform_clientside_validation.info.yml
@@ -1,6 +1,6 @@
 name: 'Webform Clientside Validation'
 type: module
-description: 'Helps support Webform to Clientside Validation integration.'
+description: 'Helps support Webform Clientside Validation integration.'
 package: Webform
 core_version_requirement: ^8.8
 dependencies:
@@ -8,7 +8,7 @@ dependencies:
   - 'clientside_validation:clientside_validation'
   - 'clientside_validation:clientside_validation_jquery'
 
-# Information added by Drupal.org packaging script on 2020-07-02
-version: '8.x-5.19'
+# Information added by Drupal.org packaging script on 2020-10-05
+version: '8.x-5.22'
 project: 'webform'
-datestamp: 1593681142
+datestamp: 1601919526
diff --git a/web/modules/webform/modules/webform_clientside_validation/webform_clientside_validation.libraries.yml b/web/modules/webform/modules/webform_clientside_validation/webform_clientside_validation.libraries.yml
index f3925c41e2..43a984e92a 100644
--- a/web/modules/webform/modules/webform_clientside_validation/webform_clientside_validation.libraries.yml
+++ b/web/modules/webform/modules/webform_clientside_validation/webform_clientside_validation.libraries.yml
@@ -8,7 +8,7 @@ webform_clientside_validation.novalidate:
 webform_clientside_validation.ife:
   version: VERSION
   js:
-    js/webform_clientside_validation.ife.js: {}
+    js/webform_clientside_validation.ife.js: { weight: -1 }
   css:
     component:
       css/webform_clientside_validation.ife.css: { }
diff --git a/web/modules/webform/modules/webform_demo/webform_demo_application_evaluation/config/install/webform.webform.demo_application.yml b/web/modules/webform/modules/webform_demo/webform_demo_application_evaluation/config/install/webform.webform.demo_application.yml
index 81488ed2e4..612ed4beba 100644
--- a/web/modules/webform/modules/webform_demo/webform_demo_application_evaluation/config/install/webform.webform.demo_application.yml
+++ b/web/modules/webform/modules/webform_demo/webform_demo_application_evaluation/config/install/webform.webform.demo_application.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -157,7 +158,7 @@ elements: |
       '#access_update_roles': {  }
       '#access_view_roles':
         - authenticated
-
+  
 css: ''
 javascript: ''
 settings:
@@ -230,6 +231,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -285,6 +288,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/modules/webform_demo/webform_demo_application_evaluation/config/install/webform.webform.demo_application_evaluation.yml b/web/modules/webform/modules/webform_demo/webform_demo_application_evaluation/config/install/webform.webform.demo_application_evaluation.yml
index 3e379b9a7e..13f645bc98 100644
--- a/web/modules/webform/modules/webform_demo/webform_demo_application_evaluation/config/install/webform.webform.demo_application_evaluation.yml
+++ b/web/modules/webform/modules/webform_demo/webform_demo_application_evaluation/config/install/webform.webform.demo_application_evaluation.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -25,12 +26,12 @@ elements: |
       {{ children }}
       <div>{{ 'Submitted by'|t }}: <em>[webform_submission:user]</em></div>
       <hr/>
-
+  
     '#format_text': |
       {{ children }}
       {{ 'Submitted by'|t }} [webform_submission:user]
       ------------------------------------------------------------
-
+  
     rating:
       '#type': webform_rating
       '#title': Rating
@@ -38,7 +39,7 @@ elements: |
     comments:
       '#type': textarea
       '#title': Comments
-
+  
 css: ''
 javascript: ''
 settings:
@@ -111,6 +112,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -166,6 +169,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/modules/webform_demo/webform_demo_application_evaluation/webform_demo_application_evaluation.info.yml b/web/modules/webform/modules/webform_demo/webform_demo_application_evaluation/webform_demo_application_evaluation.info.yml
index 04cf0903ee..9b04f98b11 100644
--- a/web/modules/webform/modules/webform_demo/webform_demo_application_evaluation/webform_demo_application_evaluation.info.yml
+++ b/web/modules/webform/modules/webform_demo/webform_demo_application_evaluation/webform_demo_application_evaluation.info.yml
@@ -9,7 +9,7 @@ dependencies:
   - 'webform:webform'
   - 'webform:webform_node'
 
-# Information added by Drupal.org packaging script on 2020-07-02
-version: '8.x-5.19'
+# Information added by Drupal.org packaging script on 2020-10-05
+version: '8.x-5.22'
 project: 'webform'
-datestamp: 1593681142
+datestamp: 1601919526
diff --git a/web/modules/webform/modules/webform_demo/webform_demo_event_registration/config/install/webform.webform.demo_event_registration.yml b/web/modules/webform/modules/webform_demo/webform_demo_event_registration/config/install/webform.webform.demo_event_registration.yml
index e2bb3cbff2..531e535515 100644
--- a/web/modules/webform/modules/webform_demo/webform_demo_event_registration/config/install/webform.webform.demo_event_registration.yml
+++ b/web/modules/webform/modules/webform_demo/webform_demo_event_registration/config/install/webform.webform.demo_event_registration.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -133,6 +134,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -188,6 +191,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
@@ -231,6 +235,7 @@ handlers:
   email_notification:
     id: email
     label: 'Email Notification'
+    notes: ''
     handler_id: email_notification
     status: true
     conditions: {  }
@@ -267,6 +272,7 @@ handlers:
   email_reminder:
     id: scheduled_email
     label: 'Email Reminder'
+    notes: ''
     handler_id: email_reminder
     status: true
     conditions: {  }
@@ -308,6 +314,7 @@ handlers:
   submission_limit:
     id: settings
     label: 'Submission limit'
+    notes: ''
     handler_id: submission_limit
     status: true
     conditions: {  }
@@ -323,6 +330,7 @@ handlers:
   teeshirt_options_limits:
     id: options_limit
     label: 'Tee shirt limits'
+    notes: ''
     handler_id: teeshirt_options_limits
     status: true
     conditions: {  }
diff --git a/web/modules/webform/modules/webform_demo/webform_demo_event_registration/webform_demo_event_registration.info.yml b/web/modules/webform/modules/webform_demo/webform_demo_event_registration/webform_demo_event_registration.info.yml
index 9d9f566248..cc8517efb0 100644
--- a/web/modules/webform/modules/webform_demo/webform_demo_event_registration/webform_demo_event_registration.info.yml
+++ b/web/modules/webform/modules/webform_demo/webform_demo_event_registration/webform_demo_event_registration.info.yml
@@ -13,7 +13,7 @@ dependencies:
   - 'webform:webform_scheduled_email'
   - 'webform:webform_share'
 
-# Information added by Drupal.org packaging script on 2020-07-02
-version: '8.x-5.19'
+# Information added by Drupal.org packaging script on 2020-10-05
+version: '8.x-5.22'
 project: 'webform'
-datestamp: 1593681142
+datestamp: 1601919526
diff --git a/web/modules/webform/modules/webform_demo/webform_demo_group/config/install/webform.webform.webform_group_contact.yml b/web/modules/webform/modules/webform_demo/webform_demo_group/config/install/webform.webform.webform_group_contact.yml
index 453d978dda..835cf54fb9 100644
--- a/web/modules/webform/modules/webform_demo/webform_demo_group/config/install/webform.webform.webform_group_contact.yml
+++ b/web/modules/webform/modules/webform_demo/webform_demo_group/config/install/webform.webform.webform_group_contact.yml
@@ -1,3 +1,4 @@
+uuid: 6f8e252a-8dee-4d99-8362-77b02dcf54d1
 langcode: en
 status: open
 dependencies:
@@ -159,6 +160,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -214,6 +217,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles: {  }
@@ -283,6 +287,7 @@ handlers:
   email_confirmation:
     id: email
     label: 'Email confirmation'
+    notes: ''
     handler_id: email_confirmation
     status: true
     conditions: {  }
@@ -319,6 +324,7 @@ handlers:
   email_notification:
     id: email
     label: 'Email notification'
+    notes: ''
     handler_id: email_notification
     status: true
     conditions: {  }
@@ -353,6 +359,5 @@ handlers:
       sender_mail: ''
       sender_name: ''
 variants: {  }
-uuid: 6f8e252a-8dee-4d99-8362-77b02dcf54d1
 _core:
   default_config_hash: ibrQM-l73s998t710tfXCiZlMT_13oFxxPmVh7tBHIk
diff --git a/web/modules/webform/modules/webform_demo/webform_demo_group/webform_demo_group.info.yml b/web/modules/webform/modules/webform_demo/webform_demo_group/webform_demo_group.info.yml
index a2bef7eb9b..49fa8ea2a6 100644
--- a/web/modules/webform/modules/webform_demo/webform_demo_group/webform_demo_group.info.yml
+++ b/web/modules/webform/modules/webform_demo/webform_demo_group/webform_demo_group.info.yml
@@ -11,7 +11,7 @@ dependencies:
   - 'webform:webform_node'
   - 'webform:webform_group'
 
-# Information added by Drupal.org packaging script on 2020-07-02
-version: '8.x-5.19'
+# Information added by Drupal.org packaging script on 2020-10-05
+version: '8.x-5.22'
 project: 'webform'
-datestamp: 1593681142
+datestamp: 1601919526
diff --git a/web/modules/webform/modules/webform_demo/webform_demo_group/webform_demo_group.install b/web/modules/webform/modules/webform_demo/webform_demo_group/webform_demo_group.install
index 47057ed5fe..64eda4150c 100644
--- a/web/modules/webform/modules/webform_demo/webform_demo_group/webform_demo_group.install
+++ b/web/modules/webform/modules/webform_demo/webform_demo_group/webform_demo_group.install
@@ -8,8 +8,10 @@
  * drush php-eval "module_load_include('install', 'webform_demo_group'); webform_demo_group_uninstall()";
  */
 
+use Drupal\Core\Language\Language;
 use Drupal\group\Entity\Group;
 use Drupal\node\Entity\Node;
+use Drupal\path_alias\Entity\PathAlias;
 use Drupal\user\Entity\Role;
 use Drupal\user\Entity\User;
 use Drupal\webform\WebformInterface;
@@ -22,8 +24,6 @@
 function webform_demo_group_install() {
   /** @var \Drupal\webform\WebformSubmissionGenerateInterface $submission_generate */
   $submission_generate = \Drupal::service('webform_submission.generate');
-  /** @var \Drupal\Core\Path\AliasStorageInterface $path_alias_storage */
-  $path_alias_storage = \Drupal::service('path.alias_storage');
 
   $demo_base_path = '/webform/group';
 
@@ -101,9 +101,11 @@ function webform_demo_group_install() {
       $group->save();
 
       // Create URL alias.
-      $source = $group->toUrl()->toString();
-      $alias = "$demo_base_path/$letter/$number";
-      $path_alias_storage->save($source, $alias);
+      PathAlias::create([
+        'path' => $group->toUrl()->toString(),
+        'alias' => "$demo_base_path/$letter/$number",
+        'langcode' => Language::LANGCODE_NOT_SPECIFIED,
+      ])->save();
 
       // Create webform node.
       /** @var \Drupal\node\NodeInterface $webform_node */
@@ -125,9 +127,11 @@ function webform_demo_group_install() {
       $group->addContent($webform_node, 'group_node:webform');
 
       // Create URL alias.
-      $source = $webform_node->toUrl()->toString();
-      $alias = "$demo_base_path/$letter/$number/contact";
-      $path_alias_storage->save($source, $alias);
+      PathAlias::create([
+        'path' => $webform_node->toUrl()->toString(),
+        'alias' => "$demo_base_path/$letter/$number/contact",
+        'langcode' => Language::LANGCODE_NOT_SPECIFIED,
+      ])->save();
 
       foreach ($role_types as $role_type => $role_settings) {
         // Create users with roles and add them as members to the group.
diff --git a/web/modules/webform/modules/webform_demo/webform_demo_region_contact/config/install/webform.webform.demo_region_contact.yml b/web/modules/webform/modules/webform_demo/webform_demo_region_contact/config/install/webform.webform.demo_region_contact.yml
index 34d532807a..115337785b 100644
--- a/web/modules/webform/modules/webform_demo/webform_demo_region_contact/config/install/webform.webform.demo_region_contact.yml
+++ b/web/modules/webform/modules/webform_demo/webform_demo_region_contact/config/install/webform.webform.demo_region_contact.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -112,6 +113,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -167,6 +170,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
@@ -218,6 +222,7 @@ handlers:
   employee_email:
     id: email
     label: 'Employee: Email'
+    notes: ''
     handler_id: employee_email
     status: true
     conditions: {  }
@@ -254,6 +259,7 @@ handlers:
   manager_email:
     id: email
     label: 'Manager: Email'
+    notes: ''
     handler_id: manager_email
     status: true
     conditions: {  }
@@ -290,6 +296,7 @@ handlers:
   manager_admins_email:
     id: email
     label: 'Manager: Admins: Email'
+    notes: ''
     handler_id: manager_admins_email
     status: true
     conditions: {  }
@@ -326,6 +333,7 @@ handlers:
   manager_users_email:
     id: email
     label: 'Manager: Users: Email'
+    notes: ''
     handler_id: manager_users_email
     status: true
     conditions: {  }
@@ -362,6 +370,7 @@ handlers:
   manager_email_addresses_email:
     id: email
     label: 'Manager: Email addresses: Email'
+    notes: ''
     handler_id: manager_email_addresses_email
     status: true
     conditions: {  }
@@ -398,6 +407,7 @@ handlers:
   everyone_email:
     id: email
     label: 'Everyone: Email'
+    notes: ''
     handler_id: everyone_email
     status: true
     conditions: {  }
diff --git a/web/modules/webform/modules/webform_demo/webform_demo_region_contact/webform_demo_region_contact.info.yml b/web/modules/webform/modules/webform_demo/webform_demo_region_contact/webform_demo_region_contact.info.yml
index 0d19bda837..6bf37872f6 100644
--- a/web/modules/webform/modules/webform_demo/webform_demo_region_contact/webform_demo_region_contact.info.yml
+++ b/web/modules/webform/modules/webform_demo/webform_demo_region_contact/webform_demo_region_contact.info.yml
@@ -10,7 +10,7 @@ dependencies:
   - 'webform:webform_node'
   - 'webform:webform_access'
 
-# Information added by Drupal.org packaging script on 2020-07-02
-version: '8.x-5.19'
+# Information added by Drupal.org packaging script on 2020-10-05
+version: '8.x-5.22'
 project: 'webform'
-datestamp: 1593681142
+datestamp: 1601919526
diff --git a/web/modules/webform/modules/webform_devel/webform_devel.info.yml b/web/modules/webform/modules/webform_devel/webform_devel.info.yml
index e906910031..6cb5928bd3 100644
--- a/web/modules/webform/modules/webform_devel/webform_devel.info.yml
+++ b/web/modules/webform/modules/webform_devel/webform_devel.info.yml
@@ -7,7 +7,7 @@ dependencies:
   - 'devel:devel'
   - 'webform:webform'
 
-# Information added by Drupal.org packaging script on 2020-07-02
-version: '8.x-5.19'
+# Information added by Drupal.org packaging script on 2020-10-05
+version: '8.x-5.22'
 project: 'webform'
-datestamp: 1593681142
+datestamp: 1601919526
diff --git a/web/modules/webform/modules/webform_editorial/src/Controller/WebformEditorialController.php b/web/modules/webform/modules/webform_editorial/src/Controller/WebformEditorialController.php
index 8c15136a37..9fb856824c 100644
--- a/web/modules/webform/modules/webform_editorial/src/Controller/WebformEditorialController.php
+++ b/web/modules/webform/modules/webform_editorial/src/Controller/WebformEditorialController.php
@@ -10,6 +10,7 @@
 use Drupal\Core\Link;
 use Drupal\Core\Render\Markup;
 use Drupal\Core\Render\RendererInterface;
+use Drupal\Core\Serialization\Yaml;
 use Drupal\Core\Url;
 use Symfony\Component\DependencyInjection\ContainerInterface;
 use Symfony\Component\HttpFoundation\Response;
@@ -103,6 +104,31 @@ public static function create(ContainerInterface $container) {
     );
   }
 
+  /**
+   * Returns webform help index page.
+   *
+   * @return array
+   *   A renderable array containing webform help index page.
+   */
+  public function index() {
+    $path = drupal_get_path('module', 'webform_editorial') . '/webform_editorial.links.task.yml';
+    $tasks = Yaml::decode(file_get_contents($path));
+    $content = [];
+    foreach ($tasks as $id => $task) {
+      if (isset($task['parent_id'])) {
+        $content[$id] = [
+          'title' => $task['title'],
+          'description' => $task['description'],
+          'url' => Url::fromRoute($task['route_name']),
+        ];
+      }
+    }
+    return [
+      '#theme' => 'admin_block_content',
+      '#content' => $content,
+    ];
+  }
+
   /****************************************************************************/
   // Help.
   /****************************************************************************/
diff --git a/web/modules/webform/modules/webform_editorial/webform_editorial.info.yml b/web/modules/webform/modules/webform_editorial/webform_editorial.info.yml
index 6233d63e71..d5f6ecf95a 100644
--- a/web/modules/webform/modules/webform_editorial/webform_editorial.info.yml
+++ b/web/modules/webform/modules/webform_editorial/webform_editorial.info.yml
@@ -8,7 +8,7 @@ hidden: true
 dependencies:
   - 'webform:webform'
 
-# Information added by Drupal.org packaging script on 2020-07-02
-version: '8.x-5.19'
+# Information added by Drupal.org packaging script on 2020-10-05
+version: '8.x-5.22'
 project: 'webform'
-datestamp: 1593681142
+datestamp: 1601919526
diff --git a/web/modules/webform/modules/webform_editorial/webform_editorial.links.menu.yml b/web/modules/webform/modules/webform_editorial/webform_editorial.links.menu.yml
deleted file mode 100644
index 7bb2a26bed..0000000000
--- a/web/modules/webform/modules/webform_editorial/webform_editorial.links.menu.yml
+++ /dev/null
@@ -1,47 +0,0 @@
-webform_editorial.index:
-  title: 'Editorial'
-  route_name: webform_editorial.index
-  parent: entity.webform.collection
-  description: 'Editorial management tools for the Webform module.'
-
-webform_editorial.help:
-  title: 'Help'
-  description: 'Review and download Webform help titles and descriptions.'
-  parent: webform_editorial.index
-  route_name: webform_editorial.help
-  weight: 0
-
-webform_editorial.videos:
-  title: 'Videos'
-  description: 'Review and download Webform video titles and descriptions.'
-  parent: webform_editorial.index
-  route_name: webform_editorial.videos
-  weight: 10
-
-webform_editorial.elements:
-  title: 'Elements'
-  description: 'Review and download Webform element titles and descriptions.'
-  parent: webform_editorial.index
-  route_name: webform_editorial.elements
-  weight: 20
-
-webform_editorial.libraries:
-  title: 'Libraries'
-  description: 'Review and download Webform libraries titles and descriptions.'
-  parent: webform_editorial.index
-  route_name: webform_editorial.libraries
-  weight: 30
-
-webform_editorial.schema:
-  title: 'Schema'
-  description: 'Review and download Webform schema.'
-  parent: webform_editorial.index
-  route_name: webform_editorial.schema
-  weight: 40
-
-webform_editorial.drush:
-  title: 'Drush'
-  description: 'Review and download Webform drush documents.'
-  parent: webform_editorial.index
-  route_name: webform_editorial.drush
-  weight: 40
diff --git a/web/modules/webform/modules/webform_editorial/webform_editorial.links.task.yml b/web/modules/webform/modules/webform_editorial/webform_editorial.links.task.yml
index 0cf73a9445..1085e359f6 100644
--- a/web/modules/webform/modules/webform_editorial/webform_editorial.links.task.yml
+++ b/web/modules/webform/modules/webform_editorial/webform_editorial.links.task.yml
@@ -3,3 +3,39 @@ webform_editorial.index:
   route_name: webform_editorial.index
   base_route: entity.webform.collection
   weight: 90
+
+webform_editorial.help:
+  title: 'Help'
+  description: 'Review and download Webform help titles and descriptions.'
+  parent_id: webform_editorial.index
+  route_name: webform_editorial.help
+
+webform_editorial.videos:
+  title: 'Videos'
+  description: 'Review and download Webform video titles and descriptions.'
+  parent_id: webform_editorial.index
+  route_name: webform_editorial.videos
+
+webform_editorial.elements:
+  title: 'Elements'
+  description: 'Review and download Webform element titles and descriptions.'
+  parent_id: webform_editorial.index
+  route_name: webform_editorial.elements
+
+webform_editorial.libraries:
+  title: 'Libraries'
+  description: 'Review and download Webform libraries titles and descriptions.'
+  parent_id: webform_editorial.index
+  route_name: webform_editorial.libraries
+
+webform_editorial.schema:
+  title: 'Schema'
+  description: 'Review and download Webform schema.'
+  parent_id: webform_editorial.index
+  route_name: webform_editorial.schema
+
+webform_editorial.drush:
+  title: 'Drush'
+  description: 'Review and download Webform drush documents.'
+  parent_id: webform_editorial.index
+  route_name: webform_editorial.drush
diff --git a/web/modules/webform/modules/webform_editorial/webform_editorial.routing.yml b/web/modules/webform/modules/webform_editorial/webform_editorial.routing.yml
index 6c749a26a7..8f2a300c31 100644
--- a/web/modules/webform/modules/webform_editorial/webform_editorial.routing.yml
+++ b/web/modules/webform/modules/webform_editorial/webform_editorial.routing.yml
@@ -1,7 +1,7 @@
 webform_editorial.index:
   path: '/admin/structure/webform/editorial'
   defaults:
-    _controller: '\Drupal\system\Controller\SystemController::systemAdminMenuBlockPage'
+    _controller: '\Drupal\webform_editorial\Controller\WebformEditorialController::index'
     _title: 'Webform: Editorial'
   requirements:
     _permission: 'administer webform'
diff --git a/web/modules/webform/modules/webform_entity_print/tests/modules/webform_entity_print_test/config/install/webform.webform.test_entity_print.yml b/web/modules/webform/modules/webform_entity_print/tests/modules/webform_entity_print_test/config/install/webform.webform.test_entity_print.yml
index 9b96c400ad..d35752323f 100644
--- a/web/modules/webform/modules/webform_entity_print/tests/modules/webform_entity_print_test/config/install/webform.webform.test_entity_print.yml
+++ b/web/modules/webform/modules/webform_entity_print/tests/modules/webform_entity_print_test/config/install/webform.webform.test_entity_print.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -18,7 +19,7 @@ elements: |
   textfield:
     '#type': textfield
     '#title': textfield
-
+  
 css: '/** custom webform css **/'
 javascript: ''
 settings:
@@ -91,6 +92,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -146,6 +149,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/modules/webform_entity_print/tests/modules/webform_entity_print_test/config/install/webform.webform.test_entity_print_custom.yml b/web/modules/webform/modules/webform_entity_print/tests/modules/webform_entity_print_test/config/install/webform.webform.test_entity_print_custom.yml
index e94d9f5e99..43114bdbee 100644
--- a/web/modules/webform/modules/webform_entity_print/tests/modules/webform_entity_print_test/config/install/webform.webform.test_entity_print_custom.yml
+++ b/web/modules/webform/modules/webform_entity_print/tests/modules/webform_entity_print_test/config/install/webform.webform.test_entity_print_custom.yml
@@ -1,9 +1,24 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
   enforced:
     module:
       - webform_entity_print_test
+third_party_settings:
+  webform_entity_print:
+    template:
+      header: '<div>{custom header}</div>'
+      footer: '<div>{custom footer}</div>'
+      css: '/** custom webform print css **/'
+    export_types:
+      pdf:
+        enabled: true
+        link_text: '{custom link text}'
+        link_attributes:
+          style: 'color: red'
+          class:
+            - custom-class
 open: null
 close: null
 weight: 0
@@ -18,7 +33,7 @@ elements: |
   textfield:
     '#type': textfield
     '#title': textfield
-
+  
 css: '/** custom webform css **/'
 javascript: ''
 settings:
@@ -91,6 +106,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -146,6 +163,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
@@ -195,17 +213,3 @@ access:
     permissions: {  }
 handlers: {  }
 variants: {  }
-third_party_settings:
-  webform_entity_print:
-    template:
-      header: '<div>{custom header}</div>'
-      footer: '<div>{custom footer}</div>'
-      css: '/** custom webform print css **/'
-    export_types:
-      pdf:
-        enabled: true
-        link_text: '{custom link text}'
-        link_attributes:
-          style: 'color: red'
-          class:
-            - custom-class
diff --git a/web/modules/webform/modules/webform_entity_print/tests/modules/webform_entity_print_test/webform_entity_print_test.info.yml b/web/modules/webform/modules/webform_entity_print/tests/modules/webform_entity_print_test/webform_entity_print_test.info.yml
index 785507fd10..2510d4c905 100644
--- a/web/modules/webform/modules/webform_entity_print/tests/modules/webform_entity_print_test/webform_entity_print_test.info.yml
+++ b/web/modules/webform/modules/webform_entity_print/tests/modules/webform_entity_print_test/webform_entity_print_test.info.yml
@@ -6,7 +6,7 @@ core_version_requirement: ^8.8
 dependencies:
   - 'webform:webform_entity_print'
 
-# Information added by Drupal.org packaging script on 2020-07-02
-version: '8.x-5.19'
+# Information added by Drupal.org packaging script on 2020-10-05
+version: '8.x-5.22'
 project: 'webform'
-datestamp: 1593681142
+datestamp: 1601919526
diff --git a/web/modules/webform/modules/webform_entity_print/webform_entity_print.info.yml b/web/modules/webform/modules/webform_entity_print/webform_entity_print.info.yml
index e8a0a66e1c..bcf201bd1c 100644
--- a/web/modules/webform/modules/webform_entity_print/webform_entity_print.info.yml
+++ b/web/modules/webform/modules/webform_entity_print/webform_entity_print.info.yml
@@ -7,7 +7,7 @@ dependencies:
   - 'webform:webform'
   - 'entity_print:entity_print'
 
-# Information added by Drupal.org packaging script on 2020-07-02
-version: '8.x-5.19'
+# Information added by Drupal.org packaging script on 2020-10-05
+version: '8.x-5.22'
 project: 'webform'
-datestamp: 1593681142
+datestamp: 1601919526
diff --git a/web/modules/webform/modules/webform_entity_print_attachment/tests/modules/webform_entity_print_attachment_test/config/install/webform.webform.test_entity_print_attachment.yml b/web/modules/webform/modules/webform_entity_print_attachment/tests/modules/webform_entity_print_attachment_test/config/install/webform.webform.test_entity_print_attachment.yml
index c78b2a91ae..696a83f6da 100644
--- a/web/modules/webform/modules/webform_entity_print_attachment/tests/modules/webform_entity_print_attachment_test/config/install/webform.webform.test_entity_print_attachment.yml
+++ b/web/modules/webform/modules/webform_entity_print_attachment/tests/modules/webform_entity_print_attachment_test/config/install/webform.webform.test_entity_print_attachment.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -106,6 +107,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -161,6 +164,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
@@ -212,6 +216,7 @@ handlers:
   email:
     id: email
     label: Email
+    notes: ''
     handler_id: email
     status: true
     conditions: {  }
diff --git a/web/modules/webform/modules/webform_entity_print_attachment/tests/modules/webform_entity_print_attachment_test/webform_entity_print_attachment_test.info.yml b/web/modules/webform/modules/webform_entity_print_attachment/tests/modules/webform_entity_print_attachment_test/webform_entity_print_attachment_test.info.yml
index 1c0a21f61b..27e5126651 100644
--- a/web/modules/webform/modules/webform_entity_print_attachment/tests/modules/webform_entity_print_attachment_test/webform_entity_print_attachment_test.info.yml
+++ b/web/modules/webform/modules/webform_entity_print_attachment/tests/modules/webform_entity_print_attachment_test/webform_entity_print_attachment_test.info.yml
@@ -6,7 +6,7 @@ core_version_requirement: ^8.8
 dependencies:
   - 'webform:webform_entity_print_attachment'
 
-# Information added by Drupal.org packaging script on 2020-07-02
-version: '8.x-5.19'
+# Information added by Drupal.org packaging script on 2020-10-05
+version: '8.x-5.22'
 project: 'webform'
-datestamp: 1593681142
+datestamp: 1601919526
diff --git a/web/modules/webform/modules/webform_entity_print_attachment/webform_entity_print_attachment.info.yml b/web/modules/webform/modules/webform_entity_print_attachment/webform_entity_print_attachment.info.yml
index d7f5a99f83..258a8bca02 100644
--- a/web/modules/webform/modules/webform_entity_print_attachment/webform_entity_print_attachment.info.yml
+++ b/web/modules/webform/modules/webform_entity_print_attachment/webform_entity_print_attachment.info.yml
@@ -7,7 +7,7 @@ dependencies:
   - 'webform:webform_attachment'
   - 'webform:webform_entity_print'
 
-# Information added by Drupal.org packaging script on 2020-07-02
-version: '8.x-5.19'
+# Information added by Drupal.org packaging script on 2020-10-05
+version: '8.x-5.22'
 project: 'webform'
-datestamp: 1593681142
+datestamp: 1601919526
diff --git a/web/modules/webform/modules/webform_example_composite/config/install/webform.webform.webform_example_composite.yml b/web/modules/webform/modules/webform_example_composite/config/install/webform.webform.webform_example_composite.yml
index 154acab85d..93e1b76e54 100644
--- a/web/modules/webform/modules/webform_example_composite/config/install/webform.webform.webform_example_composite.yml
+++ b/web/modules/webform/modules/webform_example_composite/config/install/webform.webform.webform_example_composite.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -23,7 +24,7 @@ elements: |
     '#title': 'Webform Example Composite Multiple'
     '#multiple': true
     '#multiple__header': true
-
+  
 css: ''
 javascript: ''
 settings:
@@ -96,6 +97,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -151,6 +154,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/modules/webform_example_composite/webform_example_composite.info.yml b/web/modules/webform/modules/webform_example_composite/webform_example_composite.info.yml
index 4f765fc8c7..e45e78dbed 100644
--- a/web/modules/webform/modules/webform_example_composite/webform_example_composite.info.yml
+++ b/web/modules/webform/modules/webform_example_composite/webform_example_composite.info.yml
@@ -6,7 +6,7 @@ core_version_requirement: ^8.8
 dependencies:
   - 'webform:webform'
 
-# Information added by Drupal.org packaging script on 2020-07-02
-version: '8.x-5.19'
+# Information added by Drupal.org packaging script on 2020-10-05
+version: '8.x-5.22'
 project: 'webform'
-datestamp: 1593681142
+datestamp: 1601919526
diff --git a/web/modules/webform/modules/webform_example_custom_form/config/install/webform.webform.webform_example_custom_form.yml b/web/modules/webform/modules/webform_example_custom_form/config/install/webform.webform.webform_example_custom_form.yml
index 3fc73f2751..b163434390 100644
--- a/web/modules/webform/modules/webform_example_custom_form/config/install/webform.webform.webform_example_custom_form.yml
+++ b/web/modules/webform/modules/webform_example_custom_form/config/install/webform.webform.webform_example_custom_form.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -303,7 +304,7 @@ elements: |
           last_name: Smith
         - first_name: Jane
           last_name: Doe
-
+  
 css: ''
 javascript: ''
 settings:
@@ -376,6 +377,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -431,6 +434,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/modules/webform_example_custom_form/webform_example_custom_form.info.yml b/web/modules/webform/modules/webform_example_custom_form/webform_example_custom_form.info.yml
index 969668b4ea..db7878c2ec 100644
--- a/web/modules/webform/modules/webform_example_custom_form/webform_example_custom_form.info.yml
+++ b/web/modules/webform/modules/webform_example_custom_form/webform_example_custom_form.info.yml
@@ -8,7 +8,7 @@ dependencies:
   - 'webform:webform'
   - 'webform:webform_devel'
 
-# Information added by Drupal.org packaging script on 2020-07-02
-version: '8.x-5.19'
+# Information added by Drupal.org packaging script on 2020-10-05
+version: '8.x-5.22'
 project: 'webform'
-datestamp: 1593681142
+datestamp: 1601919526
diff --git a/web/modules/webform/modules/webform_example_element/config/install/webform.webform.webform_example_element.yml b/web/modules/webform/modules/webform_example_element/config/install/webform.webform.webform_example_element.yml
index a336919001..86a38519a5 100644
--- a/web/modules/webform/modules/webform_example_element/config/install/webform.webform.webform_example_element.yml
+++ b/web/modules/webform/modules/webform_example_element/config/install/webform.webform.webform_example_element.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -22,7 +23,7 @@ elements: |
     '#type': webform_example_element
     '#title': 'Webform Example Element Multiple'
     '#multiple': true
-
+  
 css: ''
 javascript: ''
 settings:
@@ -95,6 +96,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -150,6 +153,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/modules/webform_example_element/tests/src/Functional/WebformExampleElementTest.php b/web/modules/webform/modules/webform_example_element/tests/src/Functional/WebformExampleElementTest.php
index 22896987f6..ddea5c70ac 100644
--- a/web/modules/webform/modules/webform_example_element/tests/src/Functional/WebformExampleElementTest.php
+++ b/web/modules/webform/modules/webform_example_element/tests/src/Functional/WebformExampleElementTest.php
@@ -31,7 +31,7 @@ public function testWebformExampleElement() {
     // NOTE:
     // This is a very lazy but easy way to check that the element is rendering
     // as expected.
-    $this->assertRaw('<div class="js-form-item form-item js-form-type-webform-example-element form-type-webform-example-element js-form-item-webform-example-element form-item-webform-example-element">');
+    $this->assertRaw('<div class="js-form-item form-item js-form-type-webform-example-element form-item-webform-example-element js-form-item-webform-example-element">');
     $this->assertRaw('<label for="edit-webform-example-element">Webform Example Element</label>');
     $this->assertRaw('<input data-drupal-selector="edit-webform-example-element" type="text" id="edit-webform-example-element" name="webform_example_element" value="" size="60" class="form-text webform-example-element" />');
 
diff --git a/web/modules/webform/modules/webform_example_element/webform_example_element.info.yml b/web/modules/webform/modules/webform_example_element/webform_example_element.info.yml
index 21d296d8dc..a15463670e 100644
--- a/web/modules/webform/modules/webform_example_element/webform_example_element.info.yml
+++ b/web/modules/webform/modules/webform_example_element/webform_example_element.info.yml
@@ -6,7 +6,7 @@ core_version_requirement: ^8.8
 dependencies:
   - 'webform:webform'
 
-# Information added by Drupal.org packaging script on 2020-07-02
-version: '8.x-5.19'
+# Information added by Drupal.org packaging script on 2020-10-05
+version: '8.x-5.22'
 project: 'webform'
-datestamp: 1593681142
+datestamp: 1601919526
diff --git a/web/modules/webform/modules/webform_example_element_properties/webform_example_element_properties.info.yml b/web/modules/webform/modules/webform_example_element_properties/webform_example_element_properties.info.yml
index c406002014..ce11d56081 100644
--- a/web/modules/webform/modules/webform_example_element_properties/webform_example_element_properties.info.yml
+++ b/web/modules/webform/modules/webform_example_element_properties/webform_example_element_properties.info.yml
@@ -7,7 +7,7 @@ dependencies:
   - 'webform:webform'
   - 'webform:webform_ui'
 
-# Information added by Drupal.org packaging script on 2020-07-02
-version: '8.x-5.19'
+# Information added by Drupal.org packaging script on 2020-10-05
+version: '8.x-5.22'
 project: 'webform'
-datestamp: 1593681142
+datestamp: 1601919526
diff --git a/web/modules/webform/modules/webform_example_handler/config/install/webform.webform.webform_example_handler.yml b/web/modules/webform/modules/webform_example_handler/config/install/webform.webform.webform_example_handler.yml
index 5a888bed1a..df34ed978a 100644
--- a/web/modules/webform/modules/webform_example_handler/config/install/webform.webform.webform_example_handler.yml
+++ b/web/modules/webform/modules/webform_example_handler/config/install/webform.webform.webform_example_handler.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -95,6 +96,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -150,6 +153,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
@@ -201,6 +205,7 @@ handlers:
   example:
     id: example
     label: Example
+    notes: ''
     handler_id: example
     status: true
     conditions: {  }
diff --git a/web/modules/webform/modules/webform_example_handler/webform_example_handler.info.yml b/web/modules/webform/modules/webform_example_handler/webform_example_handler.info.yml
index 740dbd9eb7..a5c76f1bc9 100644
--- a/web/modules/webform/modules/webform_example_handler/webform_example_handler.info.yml
+++ b/web/modules/webform/modules/webform_example_handler/webform_example_handler.info.yml
@@ -6,7 +6,7 @@ core_version_requirement: ^8.8
 dependencies:
   - 'webform:webform'
 
-# Information added by Drupal.org packaging script on 2020-07-02
-version: '8.x-5.19'
+# Information added by Drupal.org packaging script on 2020-10-05
+version: '8.x-5.22'
 project: 'webform'
-datestamp: 1593681142
+datestamp: 1601919526
diff --git a/web/modules/webform/modules/webform_example_remote_post/config/install/webform.webform.example_remote_post.yml b/web/modules/webform/modules/webform_example_remote_post/config/install/webform.webform.example_remote_post.yml
index 3b4be2a462..8d954c2c96 100644
--- a/web/modules/webform/modules/webform_example_remote_post/config/install/webform.webform.example_remote_post.yml
+++ b/web/modules/webform/modules/webform_example_remote_post/config/install/webform.webform.example_remote_post.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -112,6 +113,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -169,6 +172,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
@@ -220,6 +224,7 @@ handlers:
   remote_post:
     id: remote_post
     label: 'Remote post'
+    notes: ''
     handler_id: remote_post
     status: true
     conditions: {  }
diff --git a/web/modules/webform/modules/webform_example_remote_post/webform_example_remote_post.info.yml b/web/modules/webform/modules/webform_example_remote_post/webform_example_remote_post.info.yml
index fef24e31d0..4ef3218c4e 100644
--- a/web/modules/webform/modules/webform_example_remote_post/webform_example_remote_post.info.yml
+++ b/web/modules/webform/modules/webform_example_remote_post/webform_example_remote_post.info.yml
@@ -7,7 +7,7 @@ dependencies:
   - 'token:token'
   - 'webform:webform'
 
-# Information added by Drupal.org packaging script on 2020-07-02
-version: '8.x-5.19'
+# Information added by Drupal.org packaging script on 2020-10-05
+version: '8.x-5.22'
 project: 'webform'
-datestamp: 1593681142
+datestamp: 1601919526
diff --git a/web/modules/webform/modules/webform_example_variant/config/install/webform.webform.webform_example_variant_ab_test.yml b/web/modules/webform/modules/webform_example_variant/config/install/webform.webform.webform_example_variant_ab_test.yml
index dc4cf207b2..132a15db07 100644
--- a/web/modules/webform/modules/webform_example_variant/config/install/webform.webform.webform_example_variant_ab_test.yml
+++ b/web/modules/webform/modules/webform_example_variant/config/install/webform.webform.webform_example_variant_ab_test.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -118,6 +119,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -173,6 +176,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
@@ -224,6 +228,7 @@ handlers:
   email_confirmation:
     id: email
     label: 'Email confirmation'
+    notes: ''
     handler_id: email_confirmation
     status: true
     conditions: {  }
@@ -259,6 +264,7 @@ handlers:
   email_notification:
     id: email
     label: 'Email notification'
+    notes: ''
     handler_id: email_notification
     status: true
     conditions: {  }
diff --git a/web/modules/webform/modules/webform_example_variant/config/install/webform.webform.webform_example_variant_segments.yml b/web/modules/webform/modules/webform_example_variant/config/install/webform.webform.webform_example_variant_segments.yml
index b222cc943c..6417b6ffb7 100644
--- a/web/modules/webform/modules/webform_example_variant/config/install/webform.webform.webform_example_variant_segments.yml
+++ b/web/modules/webform/modules/webform_example_variant/config/install/webform.webform.webform_example_variant_segments.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -33,7 +34,7 @@ elements: |
   notes:
     '#type': textfield
     '#title': Notes
-
+  
 css: ''
 javascript: ''
 settings:
@@ -106,6 +107,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -161,6 +164,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/modules/webform_example_variant/webform_example_variant.info.yml b/web/modules/webform/modules/webform_example_variant/webform_example_variant.info.yml
index 0786a91d18..665b1cff9c 100644
--- a/web/modules/webform/modules/webform_example_variant/webform_example_variant.info.yml
+++ b/web/modules/webform/modules/webform_example_variant/webform_example_variant.info.yml
@@ -6,7 +6,7 @@ core_version_requirement: ^8.8
 dependencies:
   - 'webform:webform'
 
-# Information added by Drupal.org packaging script on 2020-07-02
-version: '8.x-5.19'
+# Information added by Drupal.org packaging script on 2020-10-05
+version: '8.x-5.22'
 project: 'webform'
-datestamp: 1593681142
+datestamp: 1601919526
diff --git a/web/modules/webform/modules/webform_examples/config/install/webform.webform.example_computed_elements.yml b/web/modules/webform/modules/webform_examples/config/install/webform.webform.example_computed_elements.yml
index 36d89cdb2c..5783576c73 100644
--- a/web/modules/webform/modules/webform_examples/config/install/webform.webform.example_computed_elements.yml
+++ b/web/modules/webform/modules/webform_examples/config/install/webform.webform.example_computed_elements.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -46,7 +47,7 @@ elements: |
           Hello {{ data.first_name }} {{ data.last_name }}!!!
         </h2>
         <p>You are {{ ('now'|date('Y')) - (data.date_of_birth|date('Y'))  }} years old.</p>
-
+  
 css: ''
 javascript: ''
 settings:
@@ -119,6 +120,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -174,6 +177,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/modules/webform_examples/config/install/webform.webform.example_computed_elements_ajax.yml b/web/modules/webform/modules/webform_examples/config/install/webform.webform.example_computed_elements_ajax.yml
index 75c2b57905..45a012b6e1 100644
--- a/web/modules/webform/modules/webform_examples/config/install/webform.webform.example_computed_elements_ajax.yml
+++ b/web/modules/webform/modules/webform_examples/config/install/webform.webform.example_computed_elements_ajax.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -63,48 +64,81 @@ elements: |
         '#title_display': invisible
         '#ajax': true
         '#template': '{% if data.a|length and data.b|length %}{{ data.a + data.b }}{% else %}c{% endif %}'
-  user_information:
+  user_summary:
     '#type': fieldset
     '#title': 'User information'
     user:
       '#type': webform_entity_select
-      '#title': User
+      '#title': 'User: Summary'
       '#target_type': user
       '#selection_handler': 'default:user'
       '#selection_settings':
         include_anonymous: false
         filter:
           type: _none
-    user_ud:
+    user_preview:
       '#type': webform_computed_token
-      '#title': 'User: ID'
+      '#title': 'User'
+      '#title_display': none
       '#ajax': true
       '#hide_empty': true
+      '#template': |
+        <strong>User: ID:</strong> [webform_submission:values:user:entity:uid:clear]<br/>
+        <strong>User: Display name:</strong> [webform_submission:values:user:entity:display-name:clear]<br/>
+        <strong>User: Email:</strong> [webform_submission:values:user:entity:mail:clear]<br/>
+        <strong>User: URL:</strong> [webform_submission:values:user:entity:url:clear]<br/>
+        <strong>User: Created:</strong> [webform_submission:values:user:entity:created:clear]
+      '#display_on': form
+    user_uid:
+      '#type': webform_computed_token
+      '#title': 'User: ID'
       '#template': '[webform_submission:values:user:entity:uid:clear]'
+      '#display_on': view
     user_display_name:
       '#type': webform_computed_token
       '#title': 'User: Display name'
-      '#ajax': true
-      '#hide_empty': true
       '#template': '[webform_submission:values:user:entity:display-name:clear]'
+      '#display_on': view
     user_mail:
       '#type': webform_computed_token
       '#title': 'User: Email'
-      '#ajax': true
-      '#hide_empty': true
       '#template': '[webform_submission:values:user:entity:mail:clear]'
+      '#display_on': view
     user_url:
       '#type': webform_computed_token
       '#title': 'User: URL'
-      '#ajax': true
-      '#hide_empty': true
       '#template': '[webform_submission:values:user:entity:url:clear]'
+      '#display_on': view
     user_created:
       '#type': webform_computed_token
       '#title': 'User: Created'
-      '#ajax': true
-      '#hide_empty': true
       '#template': '[webform_submission:values:user:entity:created:clear]'
+      '#display_on': view
+  bmi_calculator:
+    '#type': fieldset
+    '#title': 'Body Mass Index (BMI) calculator'
+    '#description': |
+      Formula: weight (lb) / [height (in)]2 x 703<br/>
+      @see <a href="https://www.cdc.gov/nccdphp/dnpao/growthcharts/training/bmiage/page5_2.html">https://www.cdc.gov/nccdphp/dnpao/growthcharts/training/bmiage/page5_2.html</a>
+    weight:
+      '#type': number
+      '#title': Weight
+      '#field_suffix': ' pounds'
+      '#default_value': 37.25
+      '#step': .25
+      '#min': 1
+    height:
+      '#type': webform_height
+      '#title': Height
+      '#default_value': 41.5
+      '#inches__step': .5
+    bmi:
+      '#type': webform_computed_twig
+      '#title': BMI
+      '#ajax': true
+      '#template': '{% if data.weight|length and data.height|length %}{{ (data.weight / (data.height * data.height) * 703)|number_format(2) }}{% endif %}'
+
+
 
 css: |
   .calculation {
@@ -186,6 +220,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -241,6 +277,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/modules/webform_examples/config/install/webform.webform.example_element_states.yml b/web/modules/webform/modules/webform_examples/config/install/webform.webform.example_element_states.yml
index df7676951c..f1530c808c 100644
--- a/web/modules/webform/modules/webform_examples/config/install/webform.webform.example_element_states.yml
+++ b/web/modules/webform/modules/webform_examples/config/install/webform.webform.example_element_states.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -191,7 +192,7 @@ elements: |
         readonly:
           ':input[name="readonly_checkbox"]':
             checked: true
-
+  
 css: ''
 javascript: ''
 settings:
@@ -264,6 +265,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -319,6 +322,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/modules/webform_examples/config/install/webform.webform.example_flexbox_layout.yml b/web/modules/webform/modules/webform_examples/config/install/webform.webform.example_flexbox_layout.yml
index b6dae0b8e6..cdc3f92f57 100644
--- a/web/modules/webform/modules/webform_examples/config/install/webform.webform.example_flexbox_layout.yml
+++ b/web/modules/webform/modules/webform_examples/config/install/webform.webform.example_flexbox_layout.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -117,7 +118,7 @@ elements: |
     url:
       '#type': url
       '#title': 'Home page (URL)'
-
+  
 css: ''
 javascript: ''
 settings:
@@ -190,6 +191,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -245,6 +248,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/modules/webform_examples/config/install/webform.webform.example_input_masks.yml b/web/modules/webform/modules/webform_examples/config/install/webform.webform.example_input_masks.yml
index 4d0d018ab8..05a7dcf727 100644
--- a/web/modules/webform/modules/webform_examples/config/install/webform.webform.example_input_masks.yml
+++ b/web/modules/webform/modules/webform_examples/config/install/webform.webform.example_input_masks.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -85,7 +86,7 @@ elements: |
       '#type': textfield
       '#title': lowercase
       '#input_mask': '''casing'': ''lower'''
-
+  
 css: ''
 javascript: ''
 settings:
@@ -158,6 +159,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -213,6 +216,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/modules/webform_examples/config/install/webform.webform.example_style_guide.yml b/web/modules/webform/modules/webform_examples/config/install/webform.webform.example_style_guide.yml
index 9102ae2067..bf3f1c5f3d 100644
--- a/web/modules/webform/modules/webform_examples/config/install/webform.webform.example_style_guide.yml
+++ b/web/modules/webform/modules/webform_examples/config/install/webform.webform.example_style_guide.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -215,6 +216,9 @@ elements: |
       '#type': webform_codemirror
       '#title': CodeMirror
       '#mode': yaml
+    webform_height:
+      '#type': webform_height
+      '#title': Height
     webform_image_select:
       '#type': webform_image_select
       '#title': 'Image select'
@@ -716,6 +720,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -771,6 +777,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/modules/webform_examples/config/install/webform.webform.example_wizard.yml b/web/modules/webform/modules/webform_examples/config/install/webform.webform.example_wizard.yml
index 168be2eb38..97408bcef3 100644
--- a/web/modules/webform/modules/webform_examples/config/install/webform.webform.example_wizard.yml
+++ b/web/modules/webform/modules/webform_examples/config/install/webform.webform.example_wizard.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -56,7 +57,7 @@ elements: |
     '#open': true
     comments:
       '#type': textarea
-
+  
 css: ''
 javascript: ''
 settings:
@@ -129,6 +130,8 @@ settings:
   wizard_progress_link: true
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: true
   wizard_confirmation: true
@@ -184,6 +187,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/modules/webform_examples/config/optional/webform.webform.example_cards.yml b/web/modules/webform/modules/webform_examples/config/optional/webform.webform.example_cards.yml
index 882b90cf6b..07bb31ef0c 100644
--- a/web/modules/webform/modules/webform_examples/config/optional/webform.webform.example_cards.yml
+++ b/web/modules/webform/modules/webform_examples/config/optional/webform.webform.example_cards.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -82,7 +83,7 @@ elements: |
     comments:
       '#title': Comments
       '#type': textarea
-
+  
 css: ''
 javascript: ''
 settings:
@@ -155,6 +156,8 @@ settings:
   wizard_progress_link: true
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -210,6 +213,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/modules/webform_examples/webform_examples.info.yml b/web/modules/webform/modules/webform_examples/webform_examples.info.yml
index 6a7a041c0f..eaf2293a50 100644
--- a/web/modules/webform/modules/webform_examples/webform_examples.info.yml
+++ b/web/modules/webform/modules/webform_examples/webform_examples.info.yml
@@ -6,7 +6,7 @@ core_version_requirement: ^8.8
 dependencies:
   - 'webform:webform'
 
-# Information added by Drupal.org packaging script on 2020-07-02
-version: '8.x-5.19'
+# Information added by Drupal.org packaging script on 2020-10-05
+version: '8.x-5.22'
 project: 'webform'
-datestamp: 1593681142
+datestamp: 1601919526
diff --git a/web/modules/webform/modules/webform_examples_accessibility/config/install/webform.webform.example_accessibility_advanced.yml b/web/modules/webform/modules/webform_examples_accessibility/config/install/webform.webform.example_accessibility_advanced.yml
index 2f645a81e6..9ea1f90140 100644
--- a/web/modules/webform/modules/webform_examples_accessibility/config/install/webform.webform.example_accessibility_advanced.yml
+++ b/web/modules/webform/modules/webform_examples_accessibility/config/install/webform.webform.example_accessibility_advanced.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -209,7 +210,7 @@ elements: |
         last_name:
           '#type': textfield
           '#title': 'Last name'
-
+  
 css: ''
 javascript: ''
 settings:
@@ -282,6 +283,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -337,6 +340,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/modules/webform_examples_accessibility/config/install/webform.webform.example_accessibility_basic.yml b/web/modules/webform/modules/webform_examples_accessibility/config/install/webform.webform.example_accessibility_basic.yml
index 770dac41f3..a0391df6b3 100644
--- a/web/modules/webform/modules/webform_examples_accessibility/config/install/webform.webform.example_accessibility_basic.yml
+++ b/web/modules/webform/modules/webform_examples_accessibility/config/install/webform.webform.example_accessibility_basic.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -125,7 +126,7 @@ elements: |
       '#output': right
       '#output__field_prefix': $
       '#output__field_suffix': '.00'
-
+  
 css: ''
 javascript: ''
 settings:
@@ -198,6 +199,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -253,6 +256,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/modules/webform_examples_accessibility/config/install/webform.webform.example_accessibility_containers.yml b/web/modules/webform/modules/webform_examples_accessibility/config/install/webform.webform.example_accessibility_containers.yml
index 82546e017f..bb198a271b 100644
--- a/web/modules/webform/modules/webform_examples_accessibility/config/install/webform.webform.example_accessibility_containers.yml
+++ b/web/modules/webform/modules/webform_examples_accessibility/config/install/webform.webform.example_accessibility_containers.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -50,7 +51,7 @@ elements: |
     '#help': 'This is help text'
     '#required': true
     '#description': 'This is a description'
-
+  
 css: ''
 javascript: ''
 settings:
@@ -123,6 +124,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -178,6 +181,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/modules/webform_examples_accessibility/config/install/webform.webform.example_accessibility_labels.yml b/web/modules/webform/modules/webform_examples_accessibility/config/install/webform.webform.example_accessibility_labels.yml
index 5c95fcafa1..d79a556f14 100644
--- a/web/modules/webform/modules/webform_examples_accessibility/config/install/webform.webform.example_accessibility_labels.yml
+++ b/web/modules/webform/modules/webform_examples_accessibility/config/install/webform.webform.example_accessibility_labels.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -180,7 +181,7 @@ elements: |
       '#help': 'This is help text'
       '#required': true
       '#description': 'This is a description'
-
+  
 css: ''
 javascript: ''
 settings:
@@ -253,6 +254,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -308,6 +311,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/modules/webform_examples_accessibility/config/install/webform.webform.example_accessibility_wizard.yml b/web/modules/webform/modules/webform_examples_accessibility/config/install/webform.webform.example_accessibility_wizard.yml
index f538771f26..f5a94e7b1f 100644
--- a/web/modules/webform/modules/webform_examples_accessibility/config/install/webform.webform.example_accessibility_wizard.yml
+++ b/web/modules/webform/modules/webform_examples_accessibility/config/install/webform.webform.example_accessibility_wizard.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -55,7 +56,7 @@ elements: |
     '#type': webform_actions
     '#title': 'Submit button(s)'
     '#submit__label': Apply
-
+  
 css: ''
 javascript: ''
 settings:
@@ -128,6 +129,8 @@ settings:
   wizard_progress_link: true
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: true
   wizard_confirmation: true
@@ -183,6 +186,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/modules/webform_examples_accessibility/webform_examples_accessibility.info.yml b/web/modules/webform/modules/webform_examples_accessibility/webform_examples_accessibility.info.yml
index d396c7eb47..1591c2f6ca 100644
--- a/web/modules/webform/modules/webform_examples_accessibility/webform_examples_accessibility.info.yml
+++ b/web/modules/webform/modules/webform_examples_accessibility/webform_examples_accessibility.info.yml
@@ -6,7 +6,7 @@ core_version_requirement: ^8.8
 dependencies:
   - 'drupal:webform'
 
-# Information added by Drupal.org packaging script on 2020-07-02
-version: '8.x-5.19'
+# Information added by Drupal.org packaging script on 2020-10-05
+version: '8.x-5.22'
 project: 'webform'
-datestamp: 1593681142
+datestamp: 1601919526
diff --git a/web/modules/webform/modules/webform_group/tests/modules/webform_group_test/config/install/webform.webform.test_element_group_roles.yml b/web/modules/webform/modules/webform_group/tests/modules/webform_group_test/config/install/webform.webform.test_element_group_roles.yml
index 2b2e5a4510..3601733a37 100644
--- a/web/modules/webform/modules/webform_group/tests/modules/webform_group_test/config/install/webform.webform.test_element_group_roles.yml
+++ b/web/modules/webform/modules/webform_group/tests/modules/webform_group_test/config/install/webform.webform.test_element_group_roles.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -98,6 +99,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -153,6 +156,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
@@ -204,6 +208,7 @@ handlers:
   debug:
     id: debug
     label: Debug
+    notes: ''
     handler_id: debug
     status: true
     conditions: {  }
diff --git a/web/modules/webform/modules/webform_group/tests/modules/webform_group_test/config/install/webform.webform.test_group_element_access.yml b/web/modules/webform/modules/webform_group/tests/modules/webform_group_test/config/install/webform.webform.test_group_element_access.yml
index 31e16e9ff9..c6318fc222 100644
--- a/web/modules/webform/modules/webform_group/tests/modules/webform_group_test/config/install/webform.webform.test_group_element_access.yml
+++ b/web/modules/webform/modules/webform_group/tests/modules/webform_group_test/config/install/webform.webform.test_group_element_access.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -116,6 +117,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -171,6 +174,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
@@ -222,6 +226,7 @@ handlers:
   debug:
     id: debug
     label: Debug
+    notes: ''
     handler_id: debug
     status: true
     conditions: {  }
diff --git a/web/modules/webform/modules/webform_group/tests/modules/webform_group_test/webform_group_test.info.yml b/web/modules/webform/modules/webform_group/tests/modules/webform_group_test/webform_group_test.info.yml
index 69f9fa407b..2911278cc2 100644
--- a/web/modules/webform/modules/webform_group/tests/modules/webform_group_test/webform_group_test.info.yml
+++ b/web/modules/webform/modules/webform_group/tests/modules/webform_group_test/webform_group_test.info.yml
@@ -7,7 +7,7 @@ dependencies:
   - 'webform:webform_group'
   - 'group:group_test_config'
 
-# Information added by Drupal.org packaging script on 2020-07-02
-version: '8.x-5.19'
+# Information added by Drupal.org packaging script on 2020-10-05
+version: '8.x-5.22'
 project: 'webform'
-datestamp: 1593681142
+datestamp: 1601919526
diff --git a/web/modules/webform/modules/webform_group/tests/src/Functional/WebformGroupBrowserTestBase.php b/web/modules/webform/modules/webform_group/tests/src/Functional/WebformGroupBrowserTestBase.php
index 4da9a1e6f5..d839c549ec 100644
--- a/web/modules/webform/modules/webform_group/tests/src/Functional/WebformGroupBrowserTestBase.php
+++ b/web/modules/webform/modules/webform_group/tests/src/Functional/WebformGroupBrowserTestBase.php
@@ -2,6 +2,7 @@
 
 namespace Drupal\Tests\webform_group\Functional;
 
+use Drupal\group\Entity\GroupRole;
 use Drupal\Tests\group\Functional\GroupBrowserTestBase;
 use Drupal\Tests\webform\Traits\WebformBrowserTestTrait;
 use Drupal\Tests\webform\Traits\WebformAssertLegacyTrait;
@@ -23,6 +24,21 @@ abstract class WebformGroupBrowserTestBase extends GroupBrowserTestBase {
    */
   public static $modules = ['webform_group', 'webform_group_test'];
 
+  /**
+   * {@inheritdoc}
+   */
+  protected function setUp() {
+    parent::setUp();
+
+    // Allow all roles to view webform nodes.
+    /** @var \Drupal\group\Entity\GroupRoleInterface[] $group_roles */
+    $group_roles = GroupRole::loadMultiple();
+    foreach ($group_roles as $group_role) {
+      $group_role->grantPermission('view group_node:webform entity');
+      $group_role->save();
+    }
+  }
+
   /**
    * {@inheritdoc}
    */
diff --git a/web/modules/webform/modules/webform_group/webform_group.info.yml b/web/modules/webform/modules/webform_group/webform_group.info.yml
index 9770e984e0..5f71b3a363 100644
--- a/web/modules/webform/modules/webform_group/webform_group.info.yml
+++ b/web/modules/webform/modules/webform_group/webform_group.info.yml
@@ -10,7 +10,7 @@ dependencies:
   - 'group:group'
   - 'group:gnode'
 
-# Information added by Drupal.org packaging script on 2020-07-02
-version: '8.x-5.19'
+# Information added by Drupal.org packaging script on 2020-10-05
+version: '8.x-5.22'
 project: 'webform'
-datestamp: 1593681142
+datestamp: 1601919526
diff --git a/web/modules/webform/modules/webform_icheck/tests/modules/webform_icheck_test/config/install/webform.webform.test_element_icheck.yml b/web/modules/webform/modules/webform_icheck/tests/modules/webform_icheck_test/config/install/webform.webform.test_element_icheck.yml
index 0d0c1af0ac..ec9f3643c3 100644
--- a/web/modules/webform/modules/webform_icheck/tests/modules/webform_icheck_test/config/install/webform.webform.test_element_icheck.yml
+++ b/web/modules/webform/modules/webform_icheck/tests/modules/webform_icheck_test/config/install/webform.webform.test_element_icheck.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -97,7 +98,7 @@ elements: |
         enabled:
           ':input[name="checkboxes_trigger"]':
             filled: true
-
+  
 css: ''
 javascript: ''
 settings:
@@ -170,6 +171,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -225,6 +228,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/modules/webform_icheck/tests/modules/webform_icheck_test/config/install/webform.webform.test_element_icheck_styles.yml b/web/modules/webform/modules/webform_icheck/tests/modules/webform_icheck_test/config/install/webform.webform.test_element_icheck_styles.yml
index c3fa046020..943b5b68ee 100644
--- a/web/modules/webform/modules/webform_icheck/tests/modules/webform_icheck_test/config/install/webform.webform.test_element_icheck_styles.yml
+++ b/web/modules/webform/modules/webform_icheck/tests/modules/webform_icheck_test/config/install/webform.webform.test_element_icheck_styles.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -831,7 +832,7 @@ elements: |
         three: Three
       '#default_value': one
       '#icheck': square-aero
-
+  
 css: ''
 javascript: ''
 settings:
@@ -904,6 +905,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -959,6 +962,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/modules/webform_icheck/tests/modules/webform_icheck_test/webform_icheck_test.info.yml b/web/modules/webform/modules/webform_icheck/tests/modules/webform_icheck_test/webform_icheck_test.info.yml
index 3ceaf1dbce..b0bb977082 100644
--- a/web/modules/webform/modules/webform_icheck/tests/modules/webform_icheck_test/webform_icheck_test.info.yml
+++ b/web/modules/webform/modules/webform_icheck/tests/modules/webform_icheck_test/webform_icheck_test.info.yml
@@ -6,7 +6,7 @@ core_version_requirement: ^8.8
 dependencies:
   - 'webform:webform_icheck'
 
-# Information added by Drupal.org packaging script on 2020-07-02
-version: '8.x-5.19'
+# Information added by Drupal.org packaging script on 2020-10-05
+version: '8.x-5.22'
 project: 'webform'
-datestamp: 1593681142
+datestamp: 1601919526
diff --git a/web/modules/webform/modules/webform_icheck/tests/src/Functional/WebformIcheckElementTest.php b/web/modules/webform/modules/webform_icheck/tests/src/Functional/WebformIcheckElementTest.php
index cb95f50c46..d125f4bda9 100644
--- a/web/modules/webform/modules/webform_icheck/tests/src/Functional/WebformIcheckElementTest.php
+++ b/web/modules/webform/modules/webform_icheck/tests/src/Functional/WebformIcheckElementTest.php
@@ -25,15 +25,15 @@ public function testIcheckElement() {
     $this->drupalGet('/webform/test_element_icheck');
 
     // Check custom iCheck style set to 'flat'.
-    $this->assertRaw('<div class="js-form-item form-item js-form-type-checkbox form-type-checkbox js-form-item-checkbox-custom form-item-checkbox-custom">');
+    $this->assertCssSelect('.js-form-item-checkbox-custom.form-item-checkbox-custom');
     $this->assertRaw('<input data-webform-icheck="flat" data-drupal-selector="edit-checkbox-custom" type="checkbox" id="edit-checkbox-custom" name="checkbox_custom" value="1" class="form-checkbox" />');
 
     // Check default iCheck style not set.
-    $this->assertRaw('<div class="js-form-item form-item js-form-type-checkbox form-type-checkbox js-form-item-checkbox-default form-item-checkbox-default">');
+    $this->assertCssSelect('.js-form-item-checkbox-default.form-item-checkbox-default');
     $this->assertRaw('<input data-drupal-selector="edit-checkbox-default" type="checkbox" id="edit-checkbox-default" name="checkbox_default" value="1" class="form-checkbox" />');
 
     // Check none iCheck style not set.
-    $this->assertRaw('<div class="js-form-item form-item js-form-type-checkbox form-type-checkbox js-form-item-checkbox-none form-item-checkbox-none">');
+    $this->assertCssSelect('.js-form-item-checkbox-none.form-item-checkbox-none');
     $this->assertRaw('<input data-drupal-selector="edit-checkbox-none" type="checkbox" id="edit-checkbox-none" name="checkbox_none" value="1" class="form-checkbox" />');
 
     // Enable default icheck style.
@@ -44,15 +44,15 @@ public function testIcheckElement() {
     $this->drupalGet('/webform/test_element_icheck');
 
     // Check custom iCheck style still set to 'flat'.
-    $this->assertRaw('<div class="js-form-item form-item js-form-type-checkbox form-type-checkbox js-form-item-checkbox-custom form-item-checkbox-custom">');
+    $this->assertCssSelect('.js-form-item-checkbox-custom.form-item-checkbox-custom');
     $this->assertRaw('<input data-webform-icheck="flat" data-drupal-selector="edit-checkbox-custom" type="checkbox" id="edit-checkbox-custom" name="checkbox_custom" value="1" class="form-checkbox" />');
 
     // Check default iCheck style set to 'minimal'.
-    $this->assertRaw('<div class="js-form-item form-item js-form-type-checkbox form-type-checkbox js-form-item-checkbox-default form-item-checkbox-default">');
+    $this->assertCssSelect('.js-form-item-checkbox-default.form-item-checkbox-default');
     $this->assertRaw('<input data-webform-icheck="minimal" data-drupal-selector="edit-checkbox-default" type="checkbox" id="edit-checkbox-default" name="checkbox_default" value="1" class="form-checkbox" />');
 
     // Check none iCheck style not set.
-    $this->assertRaw('<div class="js-form-item form-item js-form-type-checkbox form-type-checkbox js-form-item-checkbox-none form-item-checkbox-none">');
+    $this->assertCssSelect('.js-form-item-checkbox-none.form-item-checkbox-none');
     $this->assertRaw('<input data-drupal-selector="edit-checkbox-none" type="checkbox" id="edit-checkbox-none" name="checkbox_none" value="1" class="form-checkbox" />');
   }
 
diff --git a/web/modules/webform/modules/webform_icheck/webform_icheck.info.yml b/web/modules/webform/modules/webform_icheck/webform_icheck.info.yml
index cb872068d3..37b1dc0a24 100644
--- a/web/modules/webform/modules/webform_icheck/webform_icheck.info.yml
+++ b/web/modules/webform/modules/webform_icheck/webform_icheck.info.yml
@@ -6,7 +6,7 @@ core_version_requirement: ^8.8
 dependencies:
   - 'webform:webform'
 
-# Information added by Drupal.org packaging script on 2020-07-02
-version: '8.x-5.19'
+# Information added by Drupal.org packaging script on 2020-10-05
+version: '8.x-5.22'
 project: 'webform'
-datestamp: 1593681142
+datestamp: 1601919526
diff --git a/web/modules/webform/modules/webform_image_select/src/Element/WebformImageSelectElementImages.php b/web/modules/webform/modules/webform_image_select/src/Element/WebformImageSelectElementImages.php
index 2373c4afc1..f23928d374 100644
--- a/web/modules/webform/modules/webform_image_select/src/Element/WebformImageSelectElementImages.php
+++ b/web/modules/webform/modules/webform_image_select/src/Element/WebformImageSelectElementImages.php
@@ -4,6 +4,7 @@
 
 use Drupal\Component\Utility\NestedArray;
 use Drupal\Core\Form\FormStateInterface;
+use Drupal\Core\Render\Element;
 use Drupal\Core\Render\Element\FormElement;
 use Drupal\Core\Url;
 use Drupal\webform\Entity\WebformOptions as WebformOptionsEntity;
@@ -130,8 +131,7 @@ public static function validateWebformImageSelectElementImages(&$element, FormSt
       $value = $custom_value;
     }
 
-    $has_access = (!isset($element['#access']) || $element['#access'] === TRUE);
-    if ($element['#required'] && empty($value) && $has_access) {
+    if (Element::isVisibleElement($element) && $element['#required'] && empty($value)) {
       WebformElementHelper::setRequiredError($element, $form_state);
     }
 
diff --git a/web/modules/webform/modules/webform_image_select/src/Plugin/WebformElement/WebformImageSelect.php b/web/modules/webform/modules/webform_image_select/src/Plugin/WebformElement/WebformImageSelect.php
index 14eeb0e618..d221017604 100644
--- a/web/modules/webform/modules/webform_image_select/src/Plugin/WebformElement/WebformImageSelect.php
+++ b/web/modules/webform/modules/webform_image_select/src/Plugin/WebformElement/WebformImageSelect.php
@@ -252,6 +252,7 @@ public function form(array $form, FormStateInterface $form_state) {
     ];
     $form['options']['filter_container'] = [
       '#type' => 'container',
+      '#attributes' => ['data-webform-states-no-clear' => TRUE],
       '#states' => [
         'visible' => [
           ':input[name="properties[filter]"]' => ['checked' => TRUE],
diff --git a/web/modules/webform/modules/webform_image_select/tests/modules/webform_image_select_test/config/install/webform.webform.test_element_image_select.yml b/web/modules/webform/modules/webform_image_select/tests/modules/webform_image_select_test/config/install/webform.webform.test_element_image_select.yml
index 7c337f110b..9a6bb34f73 100644
--- a/web/modules/webform/modules/webform_image_select/tests/modules/webform_image_select_test/config/install/webform.webform.test_element_image_select.yml
+++ b/web/modules/webform/modules/webform_image_select/tests/modules/webform_image_select_test/config/install/webform.webform.test_element_image_select.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -163,7 +164,7 @@ elements: |
     '#filter__singular': 'animal'
     '#filter__plural': 'animals'
     '#filter__no_results': 'No animals found.'
-
+  
 css: ''
 javascript: ''
 settings:
@@ -236,6 +237,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -291,6 +294,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/modules/webform_image_select/tests/modules/webform_image_select_test/config/install/webform.webform.test_element_images.yml b/web/modules/webform/modules/webform_image_select/tests/modules/webform_image_select_test/config/install/webform.webform.test_element_images.yml
index fca607cd61..a8856758d1 100644
--- a/web/modules/webform/modules/webform_image_select/tests/modules/webform_image_select_test/config/install/webform.webform.test_element_images.yml
+++ b/web/modules/webform/modules/webform_image_select/tests/modules/webform_image_select_test/config/install/webform.webform.test_element_images.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -137,6 +138,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -192,6 +195,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
@@ -243,6 +247,7 @@ handlers:
   debug:
     id: debug
     label: Debug
+    notes: ''
     handler_id: debug
     status: true
     conditions: {  }
diff --git a/web/modules/webform/modules/webform_image_select/tests/modules/webform_image_select_test/webform_image_select_test.info.yml b/web/modules/webform/modules/webform_image_select/tests/modules/webform_image_select_test/webform_image_select_test.info.yml
index 66cea1d101..9c8c2cf09f 100644
--- a/web/modules/webform/modules/webform_image_select/tests/modules/webform_image_select_test/webform_image_select_test.info.yml
+++ b/web/modules/webform/modules/webform_image_select/tests/modules/webform_image_select_test/webform_image_select_test.info.yml
@@ -6,7 +6,7 @@ core_version_requirement: ^8.8
 dependencies:
   - 'webform:webform_image_select'
 
-# Information added by Drupal.org packaging script on 2020-07-02
-version: '8.x-5.19'
+# Information added by Drupal.org packaging script on 2020-10-05
+version: '8.x-5.22'
 project: 'webform'
-datestamp: 1593681142
+datestamp: 1601919526
diff --git a/web/modules/webform/modules/webform_image_select/webform_image_select.info.yml b/web/modules/webform/modules/webform_image_select/webform_image_select.info.yml
index b536d9d211..1c45af2567 100644
--- a/web/modules/webform/modules/webform_image_select/webform_image_select.info.yml
+++ b/web/modules/webform/modules/webform_image_select/webform_image_select.info.yml
@@ -6,7 +6,7 @@ core_version_requirement: ^8.8
 dependencies:
   - 'webform:webform'
 
-# Information added by Drupal.org packaging script on 2020-07-02
-version: '8.x-5.19'
+# Information added by Drupal.org packaging script on 2020-10-05
+version: '8.x-5.22'
 project: 'webform'
-datestamp: 1593681142
+datestamp: 1601919526
diff --git a/web/modules/webform/modules/webform_jqueryui_buttons/tests/modules/webform_jqueryui_buttons_test/config/install/webform.webform.test_element_buttons.yml b/web/modules/webform/modules/webform_jqueryui_buttons/tests/modules/webform_jqueryui_buttons_test/config/install/webform.webform.test_element_buttons.yml
index 5600870963..bc4c85bfda 100644
--- a/web/modules/webform/modules/webform_jqueryui_buttons/tests/modules/webform_jqueryui_buttons_test/config/install/webform.webform.test_element_buttons.yml
+++ b/web/modules/webform/modules/webform_jqueryui_buttons/tests/modules/webform_jqueryui_buttons_test/config/install/webform.webform.test_element_buttons.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -120,6 +121,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -175,6 +178,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
@@ -226,6 +230,7 @@ handlers:
   debug:
     id: debug
     label: Debug
+    notes: ''
     handler_id: debug
     status: true
     conditions: {  }
diff --git a/web/modules/webform/modules/webform_jqueryui_buttons/tests/modules/webform_jqueryui_buttons_test/webform_jqueryui_buttons_test.info.yml b/web/modules/webform/modules/webform_jqueryui_buttons/tests/modules/webform_jqueryui_buttons_test/webform_jqueryui_buttons_test.info.yml
index 2d2a1998df..465d45477b 100644
--- a/web/modules/webform/modules/webform_jqueryui_buttons/tests/modules/webform_jqueryui_buttons_test/webform_jqueryui_buttons_test.info.yml
+++ b/web/modules/webform/modules/webform_jqueryui_buttons/tests/modules/webform_jqueryui_buttons_test/webform_jqueryui_buttons_test.info.yml
@@ -6,7 +6,7 @@ core_version_requirement: ^8.8
 dependencies:
   - 'webform:webform_jqueryui_buttons'
 
-# Information added by Drupal.org packaging script on 2020-07-02
-version: '8.x-5.19'
+# Information added by Drupal.org packaging script on 2020-10-05
+version: '8.x-5.22'
 project: 'webform'
-datestamp: 1593681142
+datestamp: 1601919526
diff --git a/web/modules/webform/modules/webform_jqueryui_buttons/webform_jqueryui_buttons.info.yml b/web/modules/webform/modules/webform_jqueryui_buttons/webform_jqueryui_buttons.info.yml
index 8e8006cb86..54867ee755 100644
--- a/web/modules/webform/modules/webform_jqueryui_buttons/webform_jqueryui_buttons.info.yml
+++ b/web/modules/webform/modules/webform_jqueryui_buttons/webform_jqueryui_buttons.info.yml
@@ -6,7 +6,7 @@ core_version_requirement: ^8.8
 dependencies:
   - 'webform:webform'
 
-# Information added by Drupal.org packaging script on 2020-07-02
-version: '8.x-5.19'
+# Information added by Drupal.org packaging script on 2020-10-05
+version: '8.x-5.22'
 project: 'webform'
-datestamp: 1593681142
+datestamp: 1601919526
diff --git a/web/modules/webform/modules/webform_location_geocomplete/tests/modules/webform_location_geocomplete_test/config/install/webform.webform.test_element_loc_geocomplete.yml b/web/modules/webform/modules/webform_location_geocomplete/tests/modules/webform_location_geocomplete_test/config/install/webform.webform.test_element_loc_geocomplete.yml
index 601251e32e..ea65cbda9f 100644
--- a/web/modules/webform/modules/webform_location_geocomplete/tests/modules/webform_location_geocomplete_test/config/install/webform.webform.test_element_loc_geocomplete.yml
+++ b/web/modules/webform/modules/webform_location_geocomplete/tests/modules/webform_location_geocomplete_test/config/install/webform.webform.test_element_loc_geocomplete.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -167,6 +168,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -222,6 +225,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
@@ -273,6 +277,7 @@ handlers:
   debug:
     id: debug
     label: Debug
+    notes: ''
     handler_id: debug
     status: true
     conditions: {  }
diff --git a/web/modules/webform/modules/webform_location_geocomplete/tests/modules/webform_location_geocomplete_test/webform_location_geocomplete_test.info.yml b/web/modules/webform/modules/webform_location_geocomplete/tests/modules/webform_location_geocomplete_test/webform_location_geocomplete_test.info.yml
index 105f3f81da..42da050f22 100644
--- a/web/modules/webform/modules/webform_location_geocomplete/tests/modules/webform_location_geocomplete_test/webform_location_geocomplete_test.info.yml
+++ b/web/modules/webform/modules/webform_location_geocomplete/tests/modules/webform_location_geocomplete_test/webform_location_geocomplete_test.info.yml
@@ -6,7 +6,7 @@ core_version_requirement: ^8.8
 dependencies:
   - 'webform:webform_location_geocomplete'
 
-# Information added by Drupal.org packaging script on 2020-07-02
-version: '8.x-5.19'
+# Information added by Drupal.org packaging script on 2020-10-05
+version: '8.x-5.22'
 project: 'webform'
-datestamp: 1593681142
+datestamp: 1601919526
diff --git a/web/modules/webform/modules/webform_location_geocomplete/webform_location_geocomplete.info.yml b/web/modules/webform/modules/webform_location_geocomplete/webform_location_geocomplete.info.yml
index 6b98829bec..4a079015ac 100644
--- a/web/modules/webform/modules/webform_location_geocomplete/webform_location_geocomplete.info.yml
+++ b/web/modules/webform/modules/webform_location_geocomplete/webform_location_geocomplete.info.yml
@@ -6,7 +6,7 @@ core_version_requirement: ^8.8
 dependencies:
   - 'webform:webform'
 
-# Information added by Drupal.org packaging script on 2020-07-02
-version: '8.x-5.19'
+# Information added by Drupal.org packaging script on 2020-10-05
+version: '8.x-5.22'
 project: 'webform'
-datestamp: 1593681142
+datestamp: 1601919526
diff --git a/web/modules/webform/modules/webform_node/src/Access/WebformNodeAccess.php b/web/modules/webform/modules/webform_node/src/Access/WebformNodeAccess.php
index 1ff83655ee..e0bfe09cab 100644
--- a/web/modules/webform/modules/webform_node/src/Access/WebformNodeAccess.php
+++ b/web/modules/webform/modules/webform_node/src/Access/WebformNodeAccess.php
@@ -195,8 +195,25 @@ public static function checkAccess($operation, $entity_access, NodeInterface $no
       }
     }
 
+    // Determine if this is a group node.
+    $is_group_node = \Drupal::moduleHandler()->moduleExists('webform_group')
+      && \Drupal::entityTypeManager()->getStorage('group_content')->loadByEntity($node);
+
     // Check the node operation.
-    $result = $operation ? $node->access($operation, $account, TRUE) : AccessResult::neutral();
+    if (!$operation) {
+      $result = AccessResult::neutral();
+    }
+    elseif ($is_group_node && strpos($operation, 'webform_submission_') === 0) {
+      // For group nodes, we need to bypass node access checking for
+      // 'webform_submission_*' operations which trigger access forbidden.
+      // @see group_entity_access()
+      // @see https://www.drupal.org/project/webform/issues/3132204
+      // @todo Add Webform node group permission provider w/ submission perms.
+      $result = webform_node_node_access($node, $operation, $account);
+    }
+    else {
+      $result = $node->access($operation, $account, TRUE);
+    }
 
     // Check entity access.
     if ($entity_access) {
diff --git a/web/modules/webform/modules/webform_node/tests/modules/webform_node_test_multiple/config/install/webform.webform.webform_node_test_multiple_a.yml b/web/modules/webform/modules/webform_node/tests/modules/webform_node_test_multiple/config/install/webform.webform.webform_node_test_multiple_a.yml
index e506049254..fef29e7032 100644
--- a/web/modules/webform/modules/webform_node/tests/modules/webform_node_test_multiple/config/install/webform.webform.webform_node_test_multiple_a.yml
+++ b/web/modules/webform/modules/webform_node/tests/modules/webform_node_test_multiple/config/install/webform.webform.webform_node_test_multiple_a.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -18,7 +19,7 @@ elements: |
   textfield_a:
     '#title': textfield_a
     '#type': textfield
-
+  
 css: ''
 javascript: ''
 settings:
@@ -91,6 +92,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -146,6 +149,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/modules/webform_node/tests/modules/webform_node_test_multiple/config/install/webform.webform.webform_node_test_multiple_b.yml b/web/modules/webform/modules/webform_node/tests/modules/webform_node_test_multiple/config/install/webform.webform.webform_node_test_multiple_b.yml
index 24c6a8cc7a..45b280f87a 100644
--- a/web/modules/webform/modules/webform_node/tests/modules/webform_node_test_multiple/config/install/webform.webform.webform_node_test_multiple_b.yml
+++ b/web/modules/webform/modules/webform_node/tests/modules/webform_node_test_multiple/config/install/webform.webform.webform_node_test_multiple_b.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -18,7 +19,7 @@ elements: |
   textfield_b:
     '#title': textfield_b
     '#type': textfield
-
+  
 css: ''
 javascript: ''
 settings:
@@ -91,6 +92,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -146,6 +149,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/modules/webform_node/tests/modules/webform_node_test_multiple/webform_node_test_multiple.info.yml b/web/modules/webform/modules/webform_node/tests/modules/webform_node_test_multiple/webform_node_test_multiple.info.yml
index 48f1d65ae4..508df80d5b 100644
--- a/web/modules/webform/modules/webform_node/tests/modules/webform_node_test_multiple/webform_node_test_multiple.info.yml
+++ b/web/modules/webform/modules/webform_node/tests/modules/webform_node_test_multiple/webform_node_test_multiple.info.yml
@@ -13,7 +13,7 @@ dependencies:
   - 'webform:webform'
   - 'webform:webform_node'
 
-# Information added by Drupal.org packaging script on 2020-07-02
-version: '8.x-5.19'
+# Information added by Drupal.org packaging script on 2020-10-05
+version: '8.x-5.22'
 project: 'webform'
-datestamp: 1593681142
+datestamp: 1601919526
diff --git a/web/modules/webform/modules/webform_node/tests/modules/webform_node_test_translation/config/install/webform.webform.webform_node_test_translation.yml b/web/modules/webform/modules/webform_node/tests/modules/webform_node_test_translation/config/install/webform.webform.webform_node_test_translation.yml
index 9c40d2acc4..bbd0bb9fab 100644
--- a/web/modules/webform/modules/webform_node/tests/modules/webform_node_test_translation/config/install/webform.webform.webform_node_test_translation.yml
+++ b/web/modules/webform/modules/webform_node/tests/modules/webform_node_test_translation/config/install/webform.webform.webform_node_test_translation.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -19,7 +20,7 @@ elements: |
     '#type': webform_computed_token
     '#title': computed_token
     '#value': '[webform_submission:node:title]'
-
+  
 css: ''
 javascript: ''
 settings:
@@ -92,6 +93,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -147,6 +150,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/modules/webform_node/tests/modules/webform_node_test_translation/webform_node_test_translation.info.yml b/web/modules/webform/modules/webform_node/tests/modules/webform_node_test_translation/webform_node_test_translation.info.yml
index 9a50c8893f..879bcdf0a1 100644
--- a/web/modules/webform/modules/webform_node/tests/modules/webform_node_test_translation/webform_node_test_translation.info.yml
+++ b/web/modules/webform/modules/webform_node/tests/modules/webform_node_test_translation/webform_node_test_translation.info.yml
@@ -9,7 +9,7 @@ dependencies:
   - 'webform:webform_test_translation'
   - 'drupal:content_translation'
 
-# Information added by Drupal.org packaging script on 2020-07-02
-version: '8.x-5.19'
+# Information added by Drupal.org packaging script on 2020-10-05
+version: '8.x-5.22'
 project: 'webform'
-datestamp: 1593681142
+datestamp: 1601919526
diff --git a/web/modules/webform/modules/webform_node/tests/src/Functional/WebformNodeResultsTest.php b/web/modules/webform/modules/webform_node/tests/src/Functional/WebformNodeResultsTest.php
index 4bacfc3b0b..9a1f0a0259 100644
--- a/web/modules/webform/modules/webform_node/tests/src/Functional/WebformNodeResultsTest.php
+++ b/web/modules/webform/modules/webform_node/tests/src/Functional/WebformNodeResultsTest.php
@@ -107,8 +107,8 @@ public function testResults() {
 
     $this->drupalGet('/node/' . $node->id() . '/webform/results/submissions');
     $this->assertResponse(200);
-    $this->assertRaw('<h1 class="page-title">' . $node->label() . '</h1>');
-    $this->assertNoRaw('<h1 class="page-title">' . $webform->label() . '</h1>');
+    $this->assertRaw('<h1>' . $node->label() . '</h1>');
+    $this->assertNoRaw('<h1>' . $webform->label() . '</h1>');
     $this->assertRaw(('<a href="' . $node_submission_url->toString() . '" title="' . Html::escape($node_submission_title) . '" aria-label="' . Html::escape($node_submission_title) . '">' . $node_sids[1] . '</a>'));
     $this->assertNoRaw(('<a href="' . $webform_submission_url->toString() . '">' . $webform_sids[1] . '</a>'));
 
diff --git a/web/modules/webform/modules/webform_node/webform_node.info.yml b/web/modules/webform/modules/webform_node/webform_node.info.yml
index cbd79e58e1..52fb750e6f 100644
--- a/web/modules/webform/modules/webform_node/webform_node.info.yml
+++ b/web/modules/webform/modules/webform_node/webform_node.info.yml
@@ -11,7 +11,7 @@ dependencies:
   - 'drupal:user'
   - 'webform:webform'
 
-# Information added by Drupal.org packaging script on 2020-07-02
-version: '8.x-5.19'
+# Information added by Drupal.org packaging script on 2020-10-05
+version: '8.x-5.22'
 project: 'webform'
-datestamp: 1593681142
+datestamp: 1601919526
diff --git a/web/modules/webform/modules/webform_options_custom/config/install/webform.webform.example_options_custom.yml b/web/modules/webform/modules/webform_options_custom/config/install/webform.webform.example_options_custom.yml
index bc4a73db17..fd3d02defd 100644
--- a/web/modules/webform/modules/webform_options_custom/config/install/webform.webform.example_options_custom.yml
+++ b/web/modules/webform/modules/webform_options_custom/config/install/webform.webform.example_options_custom.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -27,7 +28,7 @@ elements: |
       one: One -- This is the number 1.
       two: Two -- This is the number 2.
       three:  Three -- This is the number 3.
-
+  
 css: ''
 javascript: ''
 settings:
@@ -100,6 +101,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -155,6 +158,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/modules/webform_options_custom/src/Access/WebformOptionsCustomAccess.php b/web/modules/webform/modules/webform_options_custom/src/Access/WebformOptionsCustomAccess.php
index 616438f98f..49054b4831 100644
--- a/web/modules/webform/modules/webform_options_custom/src/Access/WebformOptionsCustomAccess.php
+++ b/web/modules/webform/modules/webform_options_custom/src/Access/WebformOptionsCustomAccess.php
@@ -12,7 +12,7 @@
 class WebformOptionsCustomAccess {
 
   /**
-   * Check that webform options custom ource can be updated by a user.
+   * Check that webform options custom source can be updated by a user.
    *
    * @param \Drupal\webform_options_custom\WebformOptionsCustomInterface $webform_options_custom
    *   A webform options custome entity.
diff --git a/web/modules/webform/modules/webform_options_custom/src/Element/WebformOptionsCustom.php b/web/modules/webform/modules/webform_options_custom/src/Element/WebformOptionsCustom.php
index 824e4aae50..8701c5b2e2 100644
--- a/web/modules/webform/modules/webform_options_custom/src/Element/WebformOptionsCustom.php
+++ b/web/modules/webform/modules/webform_options_custom/src/Element/WebformOptionsCustom.php
@@ -7,13 +7,13 @@
 use Drupal\Component\Utility\NestedArray;
 use Drupal\Component\Utility\Xss;
 use Drupal\Core\Form\FormStateInterface;
+use Drupal\Core\Render\Element;
 use Drupal\Core\Render\Element\FormElement;
 use Drupal\Core\Render\Markup;
 use Drupal\webform\Element\WebformCompositeFormElementTrait;
 use Drupal\webform\Utility\WebformArrayHelper;
 use Drupal\webform\Utility\WebformElementHelper;
 use Drupal\webform\Utility\WebformOptionsHelper;
-use Symfony\Component\CssSelector\CssSelectorConverter;
 use Drupal\webform_options_custom\Entity\WebformOptionsCustom as WebformOptionsCustomEntity;
 
 /**
@@ -223,9 +223,6 @@ public static function processWebformOptionsCustom(&$element, FormStateInterface
   public static function validateWebformOptionsCustom(&$element, FormStateInterface $form_state, &$complete_form) {
     $value = NestedArray::getValue($form_state->getValues(), $element['select']['#parents']);
 
-    // Determine if the element is visible. (#access !== FALSE)
-    $has_access = (!isset($element['#access']) || $element['#access'] === TRUE);
-
     // Determine if the element has multiple values.
     $is_multiple = (empty($element['#multiple'])) ? FALSE : TRUE;
 
@@ -238,7 +235,7 @@ public static function validateWebformOptionsCustom(&$element, FormStateInterfac
     }
 
     // Validate on elements with #access.
-    if ($has_access && !empty($element['#required']) && $is_empty) {
+    if (Element::isVisibleElement($element) && !empty($element['#required']) && $is_empty) {
       WebformElementHelper::setRequiredError($element, $form_state);
     }
 
@@ -343,12 +340,11 @@ public static function setTemplateOptions(array &$element) {
     // DOM element which contain any of the attributes.
     $css_attributes = array_map(
       function ($value) {
-        return '[' . $value . ']';
+        return 'descendant-or-self::*[@' . $value . ']';
       },
       $custom_attributes
     );
-    $css_selector_converter = new CssSelectorConverter();
-    $xpath_expression = $css_selector_converter->toXPath(implode(',', $css_attributes));
+    $xpath_expression = implode(' | ', $css_attributes);
 
     // Remove XML tag from SVG file.
     $xml_tag = NULL;
diff --git a/web/modules/webform/modules/webform_options_custom/tests/modules/webform_options_custom_entity_test/config/install/webform.webform.test_element_options_custom_ent.yml b/web/modules/webform/modules/webform_options_custom/tests/modules/webform_options_custom_entity_test/config/install/webform.webform.test_element_options_custom_ent.yml
index 06cfd37760..e70373c663 100644
--- a/web/modules/webform/modules/webform_options_custom/tests/modules/webform_options_custom_entity_test/config/install/webform.webform.test_element_options_custom_ent.yml
+++ b/web/modules/webform/modules/webform_options_custom/tests/modules/webform_options_custom_entity_test/config/install/webform.webform.test_element_options_custom_ent.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -100,6 +101,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -155,6 +158,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
@@ -206,6 +210,7 @@ handlers:
   debug:
     id: debug
     label: Debug
+    notes: ''
     handler_id: debug
     status: true
     conditions: {  }
@@ -214,6 +219,7 @@ handlers:
   options_limit:
     id: options_limit
     label: 'Options limit'
+    notes: ''
     handler_id: options_limit
     status: true
     conditions: {  }
diff --git a/web/modules/webform/modules/webform_options_custom/tests/modules/webform_options_custom_entity_test/webform_options_custom_entity_test.info.yml b/web/modules/webform/modules/webform_options_custom/tests/modules/webform_options_custom_entity_test/webform_options_custom_entity_test.info.yml
index e15027cc33..41c2b6adb0 100644
--- a/web/modules/webform/modules/webform_options_custom/tests/modules/webform_options_custom_entity_test/webform_options_custom_entity_test.info.yml
+++ b/web/modules/webform/modules/webform_options_custom/tests/modules/webform_options_custom_entity_test/webform_options_custom_entity_test.info.yml
@@ -8,7 +8,7 @@ dependencies:
   - 'webform:webform_options_limit'
   - 'webform:webform_options_custom'
 
-# Information added by Drupal.org packaging script on 2020-07-02
-version: '8.x-5.19'
+# Information added by Drupal.org packaging script on 2020-10-05
+version: '8.x-5.22'
 project: 'webform'
-datestamp: 1593681142
+datestamp: 1601919526
diff --git a/web/modules/webform/modules/webform_options_custom/tests/modules/webform_options_custom_test/config/install/webform.webform.test_element_options_custom_html.yml b/web/modules/webform/modules/webform_options_custom/tests/modules/webform_options_custom_test/config/install/webform.webform.test_element_options_custom_html.yml
index 7bda41c3c6..7aba9c35ab 100644
--- a/web/modules/webform/modules/webform_options_custom/tests/modules/webform_options_custom_test/config/install/webform.webform.test_element_options_custom_html.yml
+++ b/web/modules/webform/modules/webform_options_custom/tests/modules/webform_options_custom_test/config/install/webform.webform.test_element_options_custom_html.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -121,6 +122,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -176,6 +179,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
@@ -227,6 +231,7 @@ handlers:
   debug:
     id: debug
     label: Debug
+    notes: ''
     handler_id: debug
     status: true
     conditions: {  }
diff --git a/web/modules/webform/modules/webform_options_custom/tests/modules/webform_options_custom_test/config/install/webform.webform.test_element_options_custom_imap.yml b/web/modules/webform/modules/webform_options_custom/tests/modules/webform_options_custom_test/config/install/webform.webform.test_element_options_custom_imap.yml
index 9290afcc17..02815fda27 100644
--- a/web/modules/webform/modules/webform_options_custom/tests/modules/webform_options_custom_test/config/install/webform.webform.test_element_options_custom_imap.yml
+++ b/web/modules/webform/modules/webform_options_custom/tests/modules/webform_options_custom_test/config/install/webform.webform.test_element_options_custom_imap.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -91,6 +92,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -146,6 +149,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
@@ -197,6 +201,7 @@ handlers:
   debug:
     id: debug
     label: Debug
+    notes: ''
     handler_id: debug
     status: true
     conditions: {  }
diff --git a/web/modules/webform/modules/webform_options_custom/tests/modules/webform_options_custom_test/config/install/webform.webform.test_element_options_custom_svg.yml b/web/modules/webform/modules/webform_options_custom/tests/modules/webform_options_custom_test/config/install/webform.webform.test_element_options_custom_svg.yml
index d8570be23c..2e9bb08e08 100644
--- a/web/modules/webform/modules/webform_options_custom/tests/modules/webform_options_custom_test/config/install/webform.webform.test_element_options_custom_svg.yml
+++ b/web/modules/webform/modules/webform_options_custom/tests/modules/webform_options_custom_test/config/install/webform.webform.test_element_options_custom_svg.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -97,6 +98,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -152,6 +155,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
@@ -203,6 +207,7 @@ handlers:
   debug:
     id: debug
     label: Debug
+    notes: ''
     handler_id: debug
     status: true
     conditions: {  }
diff --git a/web/modules/webform/modules/webform_options_custom/tests/modules/webform_options_custom_test/config/install/webform.webform.test_element_options_custom_twig.yml b/web/modules/webform/modules/webform_options_custom/tests/modules/webform_options_custom_test/config/install/webform.webform.test_element_options_custom_twig.yml
index 267cc50c45..6bb58fca44 100644
--- a/web/modules/webform/modules/webform_options_custom/tests/modules/webform_options_custom_test/config/install/webform.webform.test_element_options_custom_twig.yml
+++ b/web/modules/webform/modules/webform_options_custom/tests/modules/webform_options_custom_test/config/install/webform.webform.test_element_options_custom_twig.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -95,6 +96,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -150,6 +153,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
@@ -201,6 +205,7 @@ handlers:
   debug:
     id: debug
     label: Debug
+    notes: ''
     handler_id: debug
     status: true
     conditions: {  }
diff --git a/web/modules/webform/modules/webform_options_custom/tests/modules/webform_options_custom_test/webform_options_custom_test.info.yml b/web/modules/webform/modules/webform_options_custom/tests/modules/webform_options_custom_test/webform_options_custom_test.info.yml
index 1135576ac8..2b3a76d230 100644
--- a/web/modules/webform/modules/webform_options_custom/tests/modules/webform_options_custom_test/webform_options_custom_test.info.yml
+++ b/web/modules/webform/modules/webform_options_custom/tests/modules/webform_options_custom_test/webform_options_custom_test.info.yml
@@ -6,7 +6,7 @@ core_version_requirement: ^8.8
 dependencies:
   - 'webform:webform_options_custom'
 
-# Information added by Drupal.org packaging script on 2020-07-02
-version: '8.x-5.19'
+# Information added by Drupal.org packaging script on 2020-10-05
+version: '8.x-5.22'
 project: 'webform'
-datestamp: 1593681142
+datestamp: 1601919526
diff --git a/web/modules/webform/modules/webform_options_custom/webform_options_custom.info.yml b/web/modules/webform/modules/webform_options_custom/webform_options_custom.info.yml
index 6d934332fd..5a2b648934 100644
--- a/web/modules/webform/modules/webform_options_custom/webform_options_custom.info.yml
+++ b/web/modules/webform/modules/webform_options_custom/webform_options_custom.info.yml
@@ -6,7 +6,7 @@ core_version_requirement: ^8.8
 dependencies:
   - 'webform:webform'
 
-# Information added by Drupal.org packaging script on 2020-07-02
-version: '8.x-5.19'
+# Information added by Drupal.org packaging script on 2020-10-05
+version: '8.x-5.22'
 project: 'webform'
-datestamp: 1593681142
+datestamp: 1601919526
diff --git a/web/modules/webform/modules/webform_options_limit/src/Plugin/WebformHandler/OptionsLimitWebformHandler.php b/web/modules/webform/modules/webform_options_limit/src/Plugin/WebformHandler/OptionsLimitWebformHandler.php
index 0679a2eb4d..7f59be2092 100644
--- a/web/modules/webform/modules/webform_options_limit/src/Plugin/WebformHandler/OptionsLimitWebformHandler.php
+++ b/web/modules/webform/modules/webform_options_limit/src/Plugin/WebformHandler/OptionsLimitWebformHandler.php
@@ -11,6 +11,7 @@
 use Drupal\Core\Form\FormStateInterface;
 use Drupal\Core\Form\OptGroup;
 use Drupal\Core\Logger\LoggerChannelFactoryInterface;
+use Drupal\Core\Render\Element;
 use Drupal\webform\Element\WebformAjaxElementTrait;
 use Drupal\webform\Element\WebformEntityTrait;
 use Drupal\webform\Element\WebformMessage;
@@ -532,7 +533,7 @@ public function alterElement(array &$element, FormStateInterface $form_state, ar
    */
   public static function validateElement(&$element, FormStateInterface $form_state, &$complete_form) {
     // Skip if element is not visible.
-    if (isset($element['#access']) && $element['#access'] === FALSE) {
+    if (!Element::isVisibleElement($element)) {
       return;
     }
 
diff --git a/web/modules/webform/modules/webform_options_limit/tests/modules/webform_options_limit_test/config/install/webform.webform.test_handler_boolean_limit.yml b/web/modules/webform/modules/webform_options_limit/tests/modules/webform_options_limit_test/config/install/webform.webform.test_handler_boolean_limit.yml
index c5cce92c08..0a97b937a5 100644
--- a/web/modules/webform/modules/webform_options_limit/tests/modules/webform_options_limit_test/config/install/webform.webform.test_handler_boolean_limit.yml
+++ b/web/modules/webform/modules/webform_options_limit/tests/modules/webform_options_limit_test/config/install/webform.webform.test_handler_boolean_limit.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -102,6 +103,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -157,6 +160,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
@@ -208,6 +212,7 @@ handlers:
   boolean_limit_default:
     id: options_limit
     label: boolean_limit_default
+    notes: ''
     handler_id: boolean_limit_default
     status: true
     conditions: {  }
@@ -229,6 +234,7 @@ handlers:
   boolean_limit_message:
     id: options_limit
     label: boolean_limit_message
+    notes: ''
     handler_id: boolean_limit_message
     status: true
     conditions: {  }
@@ -250,6 +256,7 @@ handlers:
   boolean_limit_remove:
     id: options_limit
     label: boolean_limit_remove
+    notes: ''
     handler_id: boolean_limit_remove
     status: true
     conditions: {  }
diff --git a/web/modules/webform/modules/webform_options_limit/tests/modules/webform_options_limit_test/config/install/webform.webform.test_handler_options_limit.yml b/web/modules/webform/modules/webform_options_limit/tests/modules/webform_options_limit_test/config/install/webform.webform.test_handler_options_limit.yml
index ad44708fa4..a6a5bb470d 100644
--- a/web/modules/webform/modules/webform_options_limit/tests/modules/webform_options_limit_test/config/install/webform.webform.test_handler_options_limit.yml
+++ b/web/modules/webform/modules/webform_options_limit/tests/modules/webform_options_limit_test/config/install/webform.webform.test_handler_options_limit.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -184,6 +185,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -239,6 +242,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
@@ -290,6 +294,7 @@ handlers:
   options_limit_default:
     id: options_limit
     label: options_limit_default
+    notes: ''
     handler_id: options_limit_default
     status: true
     conditions: {  }
@@ -314,6 +319,7 @@ handlers:
   options_limit_messages:
     id: options_limit
     label: options_limit_messages
+    notes: ''
     handler_id: options_limit_messages
     status: true
     conditions: {  }
@@ -337,6 +343,7 @@ handlers:
   options_limit_select_disable:
     id: options_limit
     label: options_limit_select_disable
+    notes: ''
     handler_id: options_limit_select_disable
     status: true
     conditions: {  }
@@ -360,6 +367,7 @@ handlers:
   options_limit_select_remove:
     id: options_limit
     label: options_limit_select_remove
+    notes: ''
     handler_id: options_limit_select_remove
     status: true
     conditions: {  }
@@ -383,6 +391,7 @@ handlers:
   options_limit_select_none:
     id: options_limit
     label: options_limit_select_none
+    notes: ''
     handler_id: options_limit_select_none
     status: true
     conditions: {  }
@@ -406,6 +415,7 @@ handlers:
   options_limit_select_other:
     id: options_limit
     label: options_limit_select_other
+    notes: ''
     handler_id: options_limit_select_other
     status: true
     conditions: {  }
@@ -429,6 +439,7 @@ handlers:
   options_limit_tableselect_multiple:
     id: options_limit
     label: options_limit_tableselect_multiple
+    notes: ''
     handler_id: options_limit_tableselect_multiple
     status: true
     conditions: {  }
@@ -452,6 +463,7 @@ handlers:
   options_limit_tableselect_single:
     id: options_limit
     label: options_limit_tableselect_single
+    notes: ''
     handler_id: options_limit_tableselect_single
     status: true
     conditions: {  }
diff --git a/web/modules/webform/modules/webform_options_limit/tests/modules/webform_options_limit_test/config/install/webform.webform.test_handler_options_limit_ent.yml b/web/modules/webform/modules/webform_options_limit/tests/modules/webform_options_limit_test/config/install/webform.webform.test_handler_options_limit_ent.yml
index 08129b6f36..2921fa8dde 100644
--- a/web/modules/webform/modules/webform_options_limit/tests/modules/webform_options_limit_test/config/install/webform.webform.test_handler_options_limit_ent.yml
+++ b/web/modules/webform/modules/webform_options_limit/tests/modules/webform_options_limit_test/config/install/webform.webform.test_handler_options_limit_ent.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -99,6 +100,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -154,6 +157,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
@@ -205,6 +209,7 @@ handlers:
   options_limits_entity_select:
     id: options_limit
     label: options_limits_entity_select
+    notes: ''
     handler_id: options_limits_entity_select
     status: true
     conditions: {  }
diff --git a/web/modules/webform/modules/webform_options_limit/tests/modules/webform_options_limit_test/config/install/webform.webform.test_handler_options_limit_user.yml b/web/modules/webform/modules/webform_options_limit/tests/modules/webform_options_limit_test/config/install/webform.webform.test_handler_options_limit_user.yml
index 1edb4062ec..db11287896 100644
--- a/web/modules/webform/modules/webform_options_limit/tests/modules/webform_options_limit_test/config/install/webform.webform.test_handler_options_limit_user.yml
+++ b/web/modules/webform/modules/webform_options_limit/tests/modules/webform_options_limit_test/config/install/webform.webform.test_handler_options_limit_user.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -101,6 +102,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -156,6 +159,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
@@ -207,6 +211,7 @@ handlers:
   options_limit_user:
     id: options_limit
     label: options_limit_user
+    notes: ''
     handler_id: options_limit_user
     status: true
     conditions: {  }
diff --git a/web/modules/webform/modules/webform_options_limit/tests/modules/webform_options_limit_test/webform_options_limit_test.info.yml b/web/modules/webform/modules/webform_options_limit/tests/modules/webform_options_limit_test/webform_options_limit_test.info.yml
index 0cb0e82b50..bd84b17d85 100644
--- a/web/modules/webform/modules/webform_options_limit/tests/modules/webform_options_limit_test/webform_options_limit_test.info.yml
+++ b/web/modules/webform/modules/webform_options_limit/tests/modules/webform_options_limit_test/webform_options_limit_test.info.yml
@@ -7,7 +7,7 @@ dependencies:
   - 'webform:webform'
   - 'webform:webform_options_limit'
 
-# Information added by Drupal.org packaging script on 2020-07-02
-version: '8.x-5.19'
+# Information added by Drupal.org packaging script on 2020-10-05
+version: '8.x-5.22'
 project: 'webform'
-datestamp: 1593681142
+datestamp: 1601919526
diff --git a/web/modules/webform/modules/webform_options_limit/webform_options_limit.info.yml b/web/modules/webform/modules/webform_options_limit/webform_options_limit.info.yml
index fb8b7a011c..78aca19341 100644
--- a/web/modules/webform/modules/webform_options_limit/webform_options_limit.info.yml
+++ b/web/modules/webform/modules/webform_options_limit/webform_options_limit.info.yml
@@ -6,7 +6,7 @@ core_version_requirement: ^8.8
 dependencies:
   - 'webform:webform'
 
-# Information added by Drupal.org packaging script on 2020-07-02
-version: '8.x-5.19'
+# Information added by Drupal.org packaging script on 2020-10-05
+version: '8.x-5.22'
 project: 'webform'
-datestamp: 1593681142
+datestamp: 1601919526
diff --git a/web/modules/webform/modules/webform_scheduled_email/src/WebformScheduledEmailManager.php b/web/modules/webform/modules/webform_scheduled_email/src/WebformScheduledEmailManager.php
index a9375e4729..598df32b00 100644
--- a/web/modules/webform/modules/webform_scheduled_email/src/WebformScheduledEmailManager.php
+++ b/web/modules/webform/modules/webform_scheduled_email/src/WebformScheduledEmailManager.php
@@ -278,7 +278,7 @@ public function schedule(EntityInterface $entity, $handler_id) {
         'send' => $send_timestamp,
       ])->execute();
 
-      // If email is alread scheduled when don't need to log anything.
+      // If email is already scheduled when don't need to log anything.
       if ($status === WebformScheduledEmailManagerInterface::EMAIL_ALREADY_SCHEDULED) {
         return $status;
       }
diff --git a/web/modules/webform/modules/webform_scheduled_email/tests/modules/webform_scheduled_email_test/config/install/webform.webform.test_handler_scheduled_email.yml b/web/modules/webform/modules/webform_scheduled_email/tests/modules/webform_scheduled_email_test/config/install/webform.webform.test_handler_scheduled_email.yml
index caf44ae734..5601112e16 100644
--- a/web/modules/webform/modules/webform_scheduled_email/tests/modules/webform_scheduled_email_test/config/install/webform.webform.test_handler_scheduled_email.yml
+++ b/web/modules/webform/modules/webform_scheduled_email/tests/modules/webform_scheduled_email_test/config/install/webform.webform.test_handler_scheduled_email.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -112,6 +113,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -167,6 +170,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
@@ -218,6 +222,7 @@ handlers:
   tomorrow:
     id: scheduled_email
     label: Tomorow
+    notes: ''
     handler_id: tomorrow
     status: true
     conditions: {  }
@@ -261,6 +266,7 @@ handlers:
   yesterday:
     id: scheduled_email
     label: Yesterday
+    notes: ''
     handler_id: yesterday
     status: true
     conditions: {  }
@@ -304,6 +310,7 @@ handlers:
   last_year:
     id: scheduled_email
     label: 'Last year'
+    notes: ''
     handler_id: last_year
     status: true
     conditions: {  }
@@ -347,6 +354,7 @@ handlers:
   broken:
     id: scheduled_email
     label: Broken
+    notes: ''
     handler_id: broken
     status: true
     conditions: {  }
@@ -390,6 +398,7 @@ handlers:
   other:
     id: scheduled_email
     label: Other
+    notes: ''
     handler_id: other
     status: true
     conditions: {  }
@@ -436,6 +445,7 @@ handlers:
   draft_reminder:
     id: scheduled_email
     label: 'Draft reminder'
+    notes: ''
     handler_id: draft_reminder
     status: true
     conditions: {  }
diff --git a/web/modules/webform/modules/webform_scheduled_email/tests/modules/webform_scheduled_email_test/webform_scheduled_email_test.info.yml b/web/modules/webform/modules/webform_scheduled_email/tests/modules/webform_scheduled_email_test/webform_scheduled_email_test.info.yml
index fd9e9ec37c..80451f29a2 100644
--- a/web/modules/webform/modules/webform_scheduled_email/tests/modules/webform_scheduled_email_test/webform_scheduled_email_test.info.yml
+++ b/web/modules/webform/modules/webform_scheduled_email/tests/modules/webform_scheduled_email_test/webform_scheduled_email_test.info.yml
@@ -7,7 +7,7 @@ dependencies:
   - 'webform:webform'
   - 'webform:webform_scheduled_email'
 
-# Information added by Drupal.org packaging script on 2020-07-02
-version: '8.x-5.19'
+# Information added by Drupal.org packaging script on 2020-10-05
+version: '8.x-5.22'
 project: 'webform'
-datestamp: 1593681142
+datestamp: 1601919526
diff --git a/web/modules/webform/modules/webform_scheduled_email/tests/modules/webform_scheduled_email_test_translation/config/install/webform.webform.test_handler_scheduled_translate.yml b/web/modules/webform/modules/webform_scheduled_email/tests/modules/webform_scheduled_email_test_translation/config/install/webform.webform.test_handler_scheduled_translate.yml
index 4341d6910c..7a6dfa563e 100644
--- a/web/modules/webform/modules/webform_scheduled_email/tests/modules/webform_scheduled_email_test_translation/config/install/webform.webform.test_handler_scheduled_translate.yml
+++ b/web/modules/webform/modules/webform_scheduled_email/tests/modules/webform_scheduled_email_test_translation/config/install/webform.webform.test_handler_scheduled_translate.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -93,6 +94,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -148,6 +151,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
@@ -199,6 +203,7 @@ handlers:
   yesterday:
     id: scheduled_email
     label: Yesterday
+    notes: ''
     handler_id: yesterday
     status: true
     conditions: {  }
diff --git a/web/modules/webform/modules/webform_scheduled_email/tests/modules/webform_scheduled_email_test_translation/webform_scheduled_email_test_translation.info.yml b/web/modules/webform/modules/webform_scheduled_email/tests/modules/webform_scheduled_email_test_translation/webform_scheduled_email_test_translation.info.yml
index 60cce0a1c7..a9f4d730d9 100644
--- a/web/modules/webform/modules/webform_scheduled_email/tests/modules/webform_scheduled_email_test_translation/webform_scheduled_email_test_translation.info.yml
+++ b/web/modules/webform/modules/webform_scheduled_email/tests/modules/webform_scheduled_email_test_translation/webform_scheduled_email_test_translation.info.yml
@@ -10,7 +10,7 @@ dependencies:
   - 'webform:webform'
   - 'webform:webform_scheduled_email'
 
-# Information added by Drupal.org packaging script on 2020-07-02
-version: '8.x-5.19'
+# Information added by Drupal.org packaging script on 2020-10-05
+version: '8.x-5.22'
 project: 'webform'
-datestamp: 1593681142
+datestamp: 1601919526
diff --git a/web/modules/webform/modules/webform_scheduled_email/webform_scheduled_email.info.yml b/web/modules/webform/modules/webform_scheduled_email/webform_scheduled_email.info.yml
index 6484ae453b..92ed5e5ecc 100644
--- a/web/modules/webform/modules/webform_scheduled_email/webform_scheduled_email.info.yml
+++ b/web/modules/webform/modules/webform_scheduled_email/webform_scheduled_email.info.yml
@@ -6,7 +6,7 @@ core_version_requirement: ^8.8
 dependencies:
   - 'webform:webform'
 
-# Information added by Drupal.org packaging script on 2020-07-02
-version: '8.x-5.19'
+# Information added by Drupal.org packaging script on 2020-10-05
+version: '8.x-5.22'
 project: 'webform'
-datestamp: 1593681142
+datestamp: 1601919526
diff --git a/web/modules/webform/modules/webform_scheduled_email/webform_scheduled_email.module b/web/modules/webform/modules/webform_scheduled_email/webform_scheduled_email.module
index 2f2e208d53..ef7e7ef685 100644
--- a/web/modules/webform/modules/webform_scheduled_email/webform_scheduled_email.module
+++ b/web/modules/webform/modules/webform_scheduled_email/webform_scheduled_email.module
@@ -14,10 +14,11 @@
  * Implements hook_config_schema_info_alter().
  */
 function webform_scheduled_email_config_schema_info_alter(&$definitions) {
-  $mapping = $definitions['webform.handler.email']['mapping'];
-
   // Append email handler to scheduled email handler settings.
-  $definitions['webform.handler.scheduled_email']['mapping'] += $mapping;
+  if (isset($definitions['webform.handler.email']['mapping'])
+    && isset($definitions['webform.handler.scheduled_email'])) {
+    $definitions['webform.handler.scheduled_email']['mapping'] += $definitions['webform.handler.email']['mapping'];
+  }
 }
 
 /**
diff --git a/web/modules/webform/modules/webform_share/webform_share.info.yml b/web/modules/webform/modules/webform_share/webform_share.info.yml
index f307f51ee1..d839848e0c 100644
--- a/web/modules/webform/modules/webform_share/webform_share.info.yml
+++ b/web/modules/webform/modules/webform_share/webform_share.info.yml
@@ -7,7 +7,7 @@ core_version_requirement: ^8.8
 dependencies:
   - 'webform:webform'
 
-# Information added by Drupal.org packaging script on 2020-07-02
-version: '8.x-5.19'
+# Information added by Drupal.org packaging script on 2020-10-05
+version: '8.x-5.22'
 project: 'webform'
-datestamp: 1593681142
+datestamp: 1601919526
diff --git a/web/modules/webform/modules/webform_shortcuts/tests/src/Functional/WebformShortcutsFunctionalTest.php b/web/modules/webform/modules/webform_shortcuts/tests/src/Functional/WebformShortcutsFunctionalTest.php
index 15283c1079..f7d4b5e711 100644
--- a/web/modules/webform/modules/webform_shortcuts/tests/src/Functional/WebformShortcutsFunctionalTest.php
+++ b/web/modules/webform/modules/webform_shortcuts/tests/src/Functional/WebformShortcutsFunctionalTest.php
@@ -37,7 +37,7 @@ public function testShortcuts() {
 
     // Check default shortcuts.
     $this->drupalGet('/admin/structure/webform/manage/contact');
-    $this->assertRaw('<span class="webform-element-help" role="tooltip" tabindex="0" data-webform-help="&lt;div class=&quot;webform-element-help--title&quot;&gt;Keyboard shortcuts&lt;/div&gt;&lt;div class=&quot;webform-element-help--content&quot;&gt;&lt;hr /&gt;CTRL+E = Add element&lt;br /&gt;CTRL+P = Add page&lt;br /&gt;CTRL+L = Add layout&lt;br /&gt;&lt;hr /&gt;CTRL+S = Save element or elements&lt;br /&gt;CTRL+R = Reset elements&lt;br /&gt;&lt;hr /&gt;CTRL+W = Show/hide row weights&lt;br /&gt;&lt;hr /&gt;&lt;/div&gt;"><span aria-hidden="true">?</span></span>');
+    $this->assertRaw('<span class="webform-element-help js-webform-element-help" role="tooltip" tabindex="0" data-webform-help="&lt;div class=&quot;webform-element-help--title&quot;&gt;Keyboard shortcuts&lt;/div&gt;&lt;div class=&quot;webform-element-help--content&quot;&gt;&lt;hr /&gt;CTRL+E = Add element&lt;br /&gt;CTRL+P = Add page&lt;br /&gt;CTRL+L = Add layout&lt;br /&gt;&lt;hr /&gt;CTRL+S = Save element or elements&lt;br /&gt;CTRL+R = Reset elements&lt;br /&gt;&lt;hr /&gt;CTRL+W = Show/hide row weights&lt;br /&gt;&lt;hr /&gt;&lt;/div&gt;"><span aria-hidden="true">?</span></span>');
 
     // Customize the shortcuts.
     $edit = [
@@ -48,7 +48,7 @@ public function testShortcuts() {
 
     // Check customized shortcuts.
     $this->drupalGet('/admin/structure/webform/manage/contact');
-    $this->assertRaw('<span class="webform-element-help" role="tooltip" tabindex="0" data-webform-help="&lt;div class=&quot;webform-element-help--title&quot;&gt;Keyboard shortcuts&lt;/div&gt;&lt;div class=&quot;webform-element-help--content&quot;&gt;&lt;hr /&gt;CRTL+Z = Add element&lt;br /&gt;CTRL+P = Add page&lt;br /&gt;CTRL+L = Add layout&lt;br /&gt;&lt;hr /&gt;CTRL+S = Save element or elements&lt;br /&gt;CTRL+R = Reset elements&lt;br /&gt;&lt;hr /&gt;&lt;/div&gt;"><span aria-hidden="true">?</span></span>');
+    $this->assertRaw('<span class="webform-element-help js-webform-element-help" role="tooltip" tabindex="0" data-webform-help="&lt;div class=&quot;webform-element-help--title&quot;&gt;Keyboard shortcuts&lt;/div&gt;&lt;div class=&quot;webform-element-help--content&quot;&gt;&lt;hr /&gt;CRTL+Z = Add element&lt;br /&gt;CTRL+P = Add page&lt;br /&gt;CTRL+L = Add layout&lt;br /&gt;&lt;hr /&gt;CTRL+S = Save element or elements&lt;br /&gt;CTRL+R = Reset elements&lt;br /&gt;&lt;hr /&gt;&lt;/div&gt;"><span aria-hidden="true">?</span></span>');
   }
 
 }
diff --git a/web/modules/webform/modules/webform_shortcuts/webform_shortcuts.info.yml b/web/modules/webform/modules/webform_shortcuts/webform_shortcuts.info.yml
index 78905deb32..34445a8c76 100644
--- a/web/modules/webform/modules/webform_shortcuts/webform_shortcuts.info.yml
+++ b/web/modules/webform/modules/webform_shortcuts/webform_shortcuts.info.yml
@@ -7,7 +7,7 @@ dependencies:
   - 'webform:webform'
   - 'webform:webform_ui'
 
-# Information added by Drupal.org packaging script on 2020-07-02
-version: '8.x-5.19'
+# Information added by Drupal.org packaging script on 2020-10-05
+version: '8.x-5.22'
 project: 'webform'
-datestamp: 1593681142
+datestamp: 1601919526
diff --git a/web/modules/webform/modules/webform_submission_export_import/tests/modules/webform_submission_export_import_test/config/install/webform.webform.test_submission_export_import.yml b/web/modules/webform/modules/webform_submission_export_import/tests/modules/webform_submission_export_import_test/config/install/webform.webform.test_submission_export_import.yml
index b4540b8c70..c408f54d92 100644
--- a/web/modules/webform/modules/webform_submission_export_import/tests/modules/webform_submission_export_import_test/config/install/webform.webform.test_submission_export_import.yml
+++ b/web/modules/webform/modules/webform_submission_export_import/tests/modules/webform_submission_export_import_test/config/install/webform.webform.test_submission_export_import.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -75,7 +76,7 @@ elements: |
     '#selection_handler': 'default:user'
     '#selection_settings':
       include_anonymous: true
-
+  
 css: ''
 javascript: ''
 settings:
@@ -148,6 +149,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -203,6 +206,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/modules/webform_submission_export_import/tests/modules/webform_submission_export_import_test/webform_submission_export_import_test.info.yml b/web/modules/webform/modules/webform_submission_export_import/tests/modules/webform_submission_export_import_test/webform_submission_export_import_test.info.yml
index 88ae2014ad..304b4d3eb5 100644
--- a/web/modules/webform/modules/webform_submission_export_import/tests/modules/webform_submission_export_import_test/webform_submission_export_import_test.info.yml
+++ b/web/modules/webform/modules/webform_submission_export_import/tests/modules/webform_submission_export_import_test/webform_submission_export_import_test.info.yml
@@ -7,7 +7,7 @@ dependencies:
   - 'webform:webform_submission_export_import'
   - 'webform:webform_image_select'
 
-# Information added by Drupal.org packaging script on 2020-07-02
-version: '8.x-5.19'
+# Information added by Drupal.org packaging script on 2020-10-05
+version: '8.x-5.22'
 project: 'webform'
-datestamp: 1593681142
+datestamp: 1601919526
diff --git a/web/modules/webform/modules/webform_submission_export_import/webform_submission_export_import.info.yml b/web/modules/webform/modules/webform_submission_export_import/webform_submission_export_import.info.yml
index f3c6c2ebb1..f247f2b520 100644
--- a/web/modules/webform/modules/webform_submission_export_import/webform_submission_export_import.info.yml
+++ b/web/modules/webform/modules/webform_submission_export_import/webform_submission_export_import.info.yml
@@ -6,7 +6,7 @@ core_version_requirement: ^8.8
 dependencies:
   - 'webform:webform'
 
-# Information added by Drupal.org packaging script on 2020-07-02
-version: '8.x-5.19'
+# Information added by Drupal.org packaging script on 2020-10-05
+version: '8.x-5.22'
 project: 'webform'
-datestamp: 1593681142
+datestamp: 1601919526
diff --git a/web/modules/webform/modules/webform_submission_log/webform_submission_log.info.yml b/web/modules/webform/modules/webform_submission_log/webform_submission_log.info.yml
index 9382471d6c..b3e9da6498 100644
--- a/web/modules/webform/modules/webform_submission_log/webform_submission_log.info.yml
+++ b/web/modules/webform/modules/webform_submission_log/webform_submission_log.info.yml
@@ -6,7 +6,7 @@ core_version_requirement: ^8.8
 dependencies:
   - 'webform:webform'
 
-# Information added by Drupal.org packaging script on 2020-07-02
-version: '8.x-5.19'
+# Information added by Drupal.org packaging script on 2020-10-05
+version: '8.x-5.22'
 project: 'webform'
-datestamp: 1593681142
+datestamp: 1601919526
diff --git a/web/modules/webform/modules/webform_submission_log/webform_submission_log.module b/web/modules/webform/modules/webform_submission_log/webform_submission_log.module
index 5fef695aca..95d3a9cce3 100644
--- a/web/modules/webform/modules/webform_submission_log/webform_submission_log.module
+++ b/web/modules/webform/modules/webform_submission_log/webform_submission_log.module
@@ -28,7 +28,7 @@ function webform_submission_log_webform_help_info() {
     'content' => t("The <strong>Log</strong> page shows all events and transactions for a submission."),
     'video_id' => 'submission',
     'routes' => [
-      // @see /admin/structure/webform/manage/{webform}/submission/{webform_submisssion}/log
+      // @see /admin/structure/webform/manage/{webform}/submission/{webform_submission}/log
       'entity.webform_submission.log',
       // @see /node/{node}/webform/submission/{webform_submission}/log
       'entity.node.webform_submission.log',
diff --git a/web/modules/webform/modules/webform_templates/config/install/webform.webform.template_contact.yml b/web/modules/webform/modules/webform_templates/config/install/webform.webform.template_contact.yml
index a59fbd0335..e5fe53221e 100644
--- a/web/modules/webform/modules/webform_templates/config/install/webform.webform.template_contact.yml
+++ b/web/modules/webform/modules/webform_templates/config/install/webform.webform.template_contact.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: closed
 dependencies:
@@ -108,6 +109,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -163,6 +166,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
@@ -214,6 +218,7 @@ handlers:
   email_confirmation:
     id: email
     label: 'Email confirmation'
+    notes: ''
     handler_id: email_confirmation
     status: true
     conditions: {  }
@@ -250,6 +255,7 @@ handlers:
   email_notification:
     id: email
     label: 'Email notification'
+    notes: ''
     handler_id: email_notification
     status: true
     conditions: {  }
diff --git a/web/modules/webform/modules/webform_templates/config/install/webform.webform.template_employee_evaluation.yml b/web/modules/webform/modules/webform_templates/config/install/webform.webform.template_employee_evaluation.yml
index 85ea628238..0a602b264b 100644
--- a/web/modules/webform/modules/webform_templates/config/install/webform.webform.template_employee_evaluation.yml
+++ b/web/modules/webform/modules/webform_templates/config/install/webform.webform.template_employee_evaluation.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: closed
 dependencies:
@@ -82,7 +83,7 @@ elements: |
     '#type': webform_actions
     '#title': 'Submit button(s)'
     '#submit__label': Apply
-
+  
 css: ''
 javascript: ''
 settings:
@@ -155,6 +156,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -210,6 +213,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/modules/webform_templates/config/install/webform.webform.template_feedback.yml b/web/modules/webform/modules/webform_templates/config/install/webform.webform.template_feedback.yml
index 3abe8af274..2d7c6265ca 100644
--- a/web/modules/webform/modules/webform_templates/config/install/webform.webform.template_feedback.yml
+++ b/web/modules/webform/modules/webform_templates/config/install/webform.webform.template_feedback.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: closed
 dependencies:
@@ -113,6 +114,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -168,6 +171,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
@@ -219,6 +223,7 @@ handlers:
   email_confirmation:
     id: email
     label: 'Email confirmation'
+    notes: ''
     handler_id: email_confirmation
     status: true
     conditions: {  }
@@ -255,6 +260,7 @@ handlers:
   email_notification:
     id: email
     label: 'Email notification'
+    notes: ''
     handler_id: email_notification
     status: true
     conditions: {  }
diff --git a/web/modules/webform/modules/webform_templates/config/install/webform.webform.template_issue.yml b/web/modules/webform/modules/webform_templates/config/install/webform.webform.template_issue.yml
index 0349e4dc38..94348e35d2 100644
--- a/web/modules/webform/modules/webform_templates/config/install/webform.webform.template_issue.yml
+++ b/web/modules/webform/modules/webform_templates/config/install/webform.webform.template_issue.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: closed
 dependencies:
@@ -123,7 +124,7 @@ elements: |
       '#type': managed_file
       '#title': Files
       '#multiple': true
-
+  
 css: ''
 javascript: ''
 settings:
@@ -196,6 +197,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -251,6 +254,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/modules/webform_templates/config/install/webform.webform.template_job_application.yml b/web/modules/webform/modules/webform_templates/config/install/webform.webform.template_job_application.yml
index 1edb4d21af..f49468deb4 100644
--- a/web/modules/webform/modules/webform_templates/config/install/webform.webform.template_job_application.yml
+++ b/web/modules/webform/modules/webform_templates/config/install/webform.webform.template_job_application.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: closed
 dependencies:
@@ -156,6 +157,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -211,6 +214,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
@@ -262,6 +266,7 @@ handlers:
   email_notification:
     id: email
     label: 'Email Notification'
+    notes: ''
     handler_id: email_notification
     status: true
     conditions: {  }
diff --git a/web/modules/webform/modules/webform_templates/config/install/webform.webform.template_job_seeker_profile.yml b/web/modules/webform/modules/webform_templates/config/install/webform.webform.template_job_seeker_profile.yml
index ea658166f4..86ecf18e7d 100644
--- a/web/modules/webform/modules/webform_templates/config/install/webform.webform.template_job_seeker_profile.yml
+++ b/web/modules/webform/modules/webform_templates/config/install/webform.webform.template_job_seeker_profile.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: closed
 dependencies:
@@ -156,6 +157,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -211,6 +214,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
@@ -262,6 +266,7 @@ handlers:
   email_notification:
     id: email
     label: 'Email Notification'
+    notes: ''
     handler_id: email_notification
     status: true
     conditions: {  }
diff --git a/web/modules/webform/modules/webform_templates/config/install/webform.webform.template_medical_appointment.yml b/web/modules/webform/modules/webform_templates/config/install/webform.webform.template_medical_appointment.yml
index c2fa3ec692..9f528b8c2d 100644
--- a/web/modules/webform/modules/webform_templates/config/install/webform.webform.template_medical_appointment.yml
+++ b/web/modules/webform/modules/webform_templates/config/install/webform.webform.template_medical_appointment.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: closed
 dependencies:
@@ -17,7 +18,7 @@ category: ''
 elements: |
   introduction:
     '#markup': 'After you submit the form, a care specialist will call you back within XX hours to schedule an appointment.'
-  h2:
+  hr:
     '#type': webform_horizontal_rule
   call:
     '#markup': 'You may also speak with a care specialist directly by calling <a href="tel:XXX-XXX-XXXX">XXX-XXX-XXXX</a> on Monday–Friday between 8:30 am to 5:00 pm EST.'
@@ -278,6 +279,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -333,6 +336,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
@@ -384,6 +388,7 @@ handlers:
   email_notification:
     id: email
     label: 'Email notification'
+    notes: ''
     handler_id: email_notification
     status: true
     conditions: {  }
diff --git a/web/modules/webform/modules/webform_templates/config/install/webform.webform.template_registration.yml b/web/modules/webform/modules/webform_templates/config/install/webform.webform.template_registration.yml
index 2868a5a4eb..10cfeda9d1 100644
--- a/web/modules/webform/modules/webform_templates/config/install/webform.webform.template_registration.yml
+++ b/web/modules/webform/modules/webform_templates/config/install/webform.webform.template_registration.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: closed
 dependencies:
@@ -125,6 +126,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -180,6 +183,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
@@ -231,6 +235,7 @@ handlers:
   email_notification:
     id: email
     label: 'Email Notification'
+    notes: ''
     handler_id: email_notification
     status: true
     conditions: {  }
diff --git a/web/modules/webform/modules/webform_templates/config/install/webform.webform.template_session_evaluation.yml b/web/modules/webform/modules/webform_templates/config/install/webform.webform.template_session_evaluation.yml
index 4674ce4076..a1ff554169 100644
--- a/web/modules/webform/modules/webform_templates/config/install/webform.webform.template_session_evaluation.yml
+++ b/web/modules/webform/modules/webform_templates/config/install/webform.webform.template_session_evaluation.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: closed
 dependencies:
@@ -117,6 +118,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -172,6 +175,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
@@ -223,6 +227,7 @@ handlers:
   email_notification:
     id: email
     label: 'Email Notification'
+    notes: ''
     handler_id: email_notification
     status: true
     conditions: {  }
diff --git a/web/modules/webform/modules/webform_templates/config/install/webform.webform.template_subscribe.yml b/web/modules/webform/modules/webform_templates/config/install/webform.webform.template_subscribe.yml
index bb9d45f2f6..b9c74d479c 100644
--- a/web/modules/webform/modules/webform_templates/config/install/webform.webform.template_subscribe.yml
+++ b/web/modules/webform/modules/webform_templates/config/install/webform.webform.template_subscribe.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: closed
 dependencies:
@@ -104,6 +105,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -159,6 +162,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
@@ -210,6 +214,7 @@ handlers:
   email_notification:
     id: email
     label: 'Email Notification'
+    notes: ''
     handler_id: email_notification
     status: true
     conditions: {  }
diff --git a/web/modules/webform/modules/webform_templates/config/install/webform.webform.template_user_profile.yml b/web/modules/webform/modules/webform_templates/config/install/webform.webform.template_user_profile.yml
index d81a4f5208..be799217f5 100644
--- a/web/modules/webform/modules/webform_templates/config/install/webform.webform.template_user_profile.yml
+++ b/web/modules/webform/modules/webform_templates/config/install/webform.webform.template_user_profile.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: closed
 dependencies:
@@ -198,6 +199,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -253,6 +256,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
@@ -304,6 +308,7 @@ handlers:
   email_notification:
     id: email
     label: 'Email Notification'
+    notes: ''
     handler_id: email_notification
     status: true
     conditions: {  }
diff --git a/web/modules/webform/modules/webform_templates/webform_templates.info.yml b/web/modules/webform/modules/webform_templates/webform_templates.info.yml
index 5ee0597285..28b24ce53d 100644
--- a/web/modules/webform/modules/webform_templates/webform_templates.info.yml
+++ b/web/modules/webform/modules/webform_templates/webform_templates.info.yml
@@ -6,7 +6,7 @@ core_version_requirement: ^8.8
 dependencies:
   - 'webform:webform'
 
-# Information added by Drupal.org packaging script on 2020-07-02
-version: '8.x-5.19'
+# Information added by Drupal.org packaging script on 2020-10-05
+version: '8.x-5.22'
 project: 'webform'
-datestamp: 1593681142
+datestamp: 1601919526
diff --git a/web/modules/webform/modules/webform_toggles/tests/modules/webform_toggles_test/config/install/webform.webform.test_element_toggles.yml b/web/modules/webform/modules/webform_toggles/tests/modules/webform_toggles_test/config/install/webform.webform.test_element_toggles.yml
index aef1311481..b8a5934233 100644
--- a/web/modules/webform/modules/webform_toggles/tests/modules/webform_toggles_test/config/install/webform.webform.test_element_toggles.yml
+++ b/web/modules/webform/modules/webform_toggles/tests/modules/webform_toggles_test/config/install/webform.webform.test_element_toggles.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -122,6 +123,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -177,6 +180,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
@@ -228,6 +232,7 @@ handlers:
   debug:
     id: debug
     label: Debug
+    notes: ''
     handler_id: debug
     status: true
     conditions: {  }
diff --git a/web/modules/webform/modules/webform_toggles/tests/modules/webform_toggles_test/webform_toggles_test.info.yml b/web/modules/webform/modules/webform_toggles/tests/modules/webform_toggles_test/webform_toggles_test.info.yml
index 00a9a0bdac..3db2169d70 100644
--- a/web/modules/webform/modules/webform_toggles/tests/modules/webform_toggles_test/webform_toggles_test.info.yml
+++ b/web/modules/webform/modules/webform_toggles/tests/modules/webform_toggles_test/webform_toggles_test.info.yml
@@ -6,7 +6,7 @@ core_version_requirement: ^8.8
 dependencies:
   - 'webform:webform_toggles'
 
-# Information added by Drupal.org packaging script on 2020-07-02
-version: '8.x-5.19'
+# Information added by Drupal.org packaging script on 2020-10-05
+version: '8.x-5.22'
 project: 'webform'
-datestamp: 1593681142
+datestamp: 1601919526
diff --git a/web/modules/webform/modules/webform_toggles/tests/src/Functional/WebformTogglesElementTest.php b/web/modules/webform/modules/webform_toggles/tests/src/Functional/WebformTogglesElementTest.php
index a0b9d70010..17d5383a02 100644
--- a/web/modules/webform/modules/webform_toggles/tests/src/Functional/WebformTogglesElementTest.php
+++ b/web/modules/webform/modules/webform_toggles/tests/src/Functional/WebformTogglesElementTest.php
@@ -25,13 +25,13 @@ public function testTogglesElement() {
     $this->drupalGet('/webform/test_element_toggles');
 
     // Check basic toggle.
-    $this->assertRaw('<div class="js-form-item form-item js-form-type-webform-toggle form-type-webform-toggle js-form-item-toggle-basic form-item-toggle-basic">');
+    $this->assertCssSelect('.js-form-item-toggle-basic.form-item-toggle-basic');
     $this->assertRaw('<input data-drupal-selector="edit-toggle-basic" type="checkbox" id="edit-toggle-basic" name="toggle_basic" value="1" class="form-checkbox" />');
     $this->assertRaw('<div class="js-webform-toggle webform-toggle toggle toggle-medium toggle-light" data-toggle-height="24" data-toggle-width="48" data-toggle-text-on="" data-toggle-text-off=""></div>');
     $this->assertRaw('<label for="edit-toggle-basic" class="option">Basic toggle</label>');
 
     // Check advanced toggle.
-    $this->assertRaw('<div class="js-form-item form-item js-form-type-webform-toggle form-type-webform-toggle js-form-item-toggle-advanced form-item-toggle-advanced">');
+    $this->assertCssSelect('.js-form-item-toggle-advanced.form-item-toggle-advanced');
     $this->assertRaw('<label for="edit-toggle-advanced">Advanced toggle</label>');
     $this->assertRaw('<input data-drupal-selector="edit-toggle-advanced" type="checkbox" id="edit-toggle-advanced" name="toggle_advanced" value="1" class="form-checkbox" />');
     $this->assertRaw('<div class="js-webform-toggle webform-toggle toggle toggle-large toggle-iphone" data-toggle-height="36" data-toggle-width="108" data-toggle-text-on="Yes" data-toggle-text-off="No"></div>');
@@ -39,14 +39,16 @@ public function testTogglesElement() {
     // Check basic toggles.
     $this->assertRaw('<fieldset data-drupal-selector="edit-toggles-basic" id="edit-toggles-basic--wrapper" class="webform-toggles--wrapper fieldgroup form-composite webform-composite-visible-title js-webform-type-webform-toggles webform-type-webform-toggles js-form-item form-item js-form-wrapper form-wrapper">');
     $this->assertRaw('<span class="fieldset-legend">Basic toggles</span>');
-    $this->assertRaw('<div id="edit-toggles-basic" class="js-webform-webform-toggles form-checkboxes"><div class="js-form-item form-item js-form-type-webform-toggle form-type-webform-toggle js-form-item-toggles-basic-one form-item-toggles-basic-one">');
+    $this->assertCssSelect('[id="edit-toggles-basic"].js-webform-webform-toggles.form-checkboxes');
+    $this->assertCssSelect('.js-form-item-toggles-basic-one.form-item-toggles-basic-one');
     $this->assertRaw('<input data-drupal-selector="edit-toggles-basic-one" type="checkbox" id="edit-toggles-basic-one" name="toggles_basic[one]" value="one" class="form-checkbox" /><div class="js-webform-toggle webform-toggle toggle toggle-medium toggle-light" data-toggle-height="24" data-toggle-width="48" data-toggle-text-on="" data-toggle-text-off=""></div>');
     $this->assertRaw('<label for="edit-toggles-basic-one" class="option">One</label>');
 
     // Check advanced toggles.
     $this->assertRaw('<fieldset data-drupal-selector="edit-toggles-advanced" id="edit-toggles-advanced--wrapper" class="webform-toggles--wrapper fieldgroup form-composite webform-composite-visible-title js-webform-type-webform-toggles webform-type-webform-toggles js-form-item form-item js-form-wrapper form-wrapper">');
     $this->assertRaw('<span class="fieldset-legend">Advanced toggles</span>');
-    $this->assertRaw('<div id="edit-toggles-advanced" class="js-webform-webform-toggles form-checkboxes"><div class="js-form-item form-item js-form-type-webform-toggle form-type-webform-toggle js-form-item-toggles-advanced-one form-item-toggles-advanced-one">');
+    $this->assertCssSelect('[id="edit-toggles-advanced"].js-webform-webform-toggles.form-checkboxes');
+    $this->assertCssSelect('.js-form-item-toggles-advanced-one.form-item-toggles-advanced-one');
     $this->assertRaw('<input data-drupal-selector="edit-toggles-advanced-one" type="checkbox" id="edit-toggles-advanced-one" name="toggles_advanced[one]" value="one" class="form-checkbox" /><div class="js-webform-toggle webform-toggle toggle toggle-large toggle-iphone" data-toggle-height="36" data-toggle-width="108" data-toggle-text-on="Yes" data-toggle-text-off="No"></div>');
   }
 
diff --git a/web/modules/webform/modules/webform_toggles/webform_toggles.info.yml b/web/modules/webform/modules/webform_toggles/webform_toggles.info.yml
index e036250a31..bea80fd56c 100644
--- a/web/modules/webform/modules/webform_toggles/webform_toggles.info.yml
+++ b/web/modules/webform/modules/webform_toggles/webform_toggles.info.yml
@@ -6,7 +6,7 @@ core_version_requirement: ^8.8
 dependencies:
   - 'webform:webform'
 
-# Information added by Drupal.org packaging script on 2020-07-02
-version: '8.x-5.19'
+# Information added by Drupal.org packaging script on 2020-10-05
+version: '8.x-5.22'
 project: 'webform'
-datestamp: 1593681142
+datestamp: 1601919526
diff --git a/web/modules/webform/modules/webform_ui/src/Form/WebformUiElementDeleteForm.php b/web/modules/webform/modules/webform_ui/src/Form/WebformUiElementDeleteForm.php
index 3e990dd4a8..9c0ab6d048 100644
--- a/web/modules/webform/modules/webform_ui/src/Form/WebformUiElementDeleteForm.php
+++ b/web/modules/webform/modules/webform_ui/src/Form/WebformUiElementDeleteForm.php
@@ -8,6 +8,7 @@
 use Drupal\webform\Form\WebformDeleteFormBase;
 use Drupal\webform\Plugin\WebformElementManagerInterface;
 use Drupal\webform\Plugin\WebformElementVariantInterface;
+use Drupal\webform\Utility\WebformElementHelper;
 use Drupal\webform\WebformEntityElementsValidatorInterface;
 use Drupal\webform\WebformInterface;
 use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
@@ -273,7 +274,7 @@ protected function getDeletedElementsItemList(array $children) {
    *   The webform element's title or key,
    */
   protected function getElementTitle() {
-    return (!empty($this->element['#title'])) ? $this->element['#title'] : $this->key;
+    return WebformElementHelper::getAdminTitle($this->element);
   }
 
   /**
diff --git a/web/modules/webform/modules/webform_ui/src/Form/WebformUiElementDuplicateForm.php b/web/modules/webform/modules/webform_ui/src/Form/WebformUiElementDuplicateForm.php
index 697d1561ab..4cdc4817c6 100644
--- a/web/modules/webform/modules/webform_ui/src/Form/WebformUiElementDuplicateForm.php
+++ b/web/modules/webform/modules/webform_ui/src/Form/WebformUiElementDuplicateForm.php
@@ -3,6 +3,7 @@
 namespace Drupal\webform_ui\Form;
 
 use Drupal\Core\Form\FormStateInterface;
+use Drupal\webform\Utility\WebformElementHelper;
 use Drupal\webform\WebformInterface;
 use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
 
@@ -31,7 +32,7 @@ public function buildForm(array $form, FormStateInterface $form_state, WebformIn
 
     $element_initialized = $webform->getElement($key);
 
-    $t_args = ['@title' => $element_initialized['#admin_title'] ?: $element_initialized['#title']];
+    $t_args = ['@title' => WebformElementHelper::getAdminTitle($element_initialized)];
     $form['#title'] = $this->t('Duplicate @title element', $t_args);
 
     $this->action = $this->t('created');
diff --git a/web/modules/webform/modules/webform_ui/src/Form/WebformUiElementEditForm.php b/web/modules/webform/modules/webform_ui/src/Form/WebformUiElementEditForm.php
index 651dfb3214..98109a4645 100644
--- a/web/modules/webform/modules/webform_ui/src/Form/WebformUiElementEditForm.php
+++ b/web/modules/webform/modules/webform_ui/src/Form/WebformUiElementEditForm.php
@@ -6,6 +6,7 @@
 use Drupal\Core\Form\FormStateInterface;
 use Drupal\Core\Render\Markup;
 use Drupal\Core\Url;
+use Drupal\webform\Utility\WebformElementHelper;
 use Drupal\webform\WebformInterface;
 use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
 
@@ -41,8 +42,9 @@ public function buildForm(array $form, FormStateInterface $form_state, WebformIn
 
     // Issue: #title is display as modal dialog's title and can't be escaped.
     // Workaround: Filter and define @title as safe markup.
+    $title = WebformElementHelper::getAdminTitle($this->element);
     $form['#title'] = $this->t('Edit @title element', [
-      '@title' => (!empty($this->element['#title'])) ? Markup::create(Xss::filterAdmin($this->element['#title'])) : $key,
+      '@title' => Markup::create(Xss::filterAdmin($title)),
     ]);
 
     $this->action = $this->t('updated');
diff --git a/web/modules/webform/modules/webform_ui/src/Form/WebformUiElementTypeFormBase.php b/web/modules/webform/modules/webform_ui/src/Form/WebformUiElementTypeFormBase.php
index 85b00c36b5..85072780c2 100644
--- a/web/modules/webform/modules/webform_ui/src/Form/WebformUiElementTypeFormBase.php
+++ b/web/modules/webform/modules/webform_ui/src/Form/WebformUiElementTypeFormBase.php
@@ -242,7 +242,7 @@ protected function buildRow(WebformElementInterface $webform_element, Url $url,
       '#type' => 'link',
       '#title' => $webform_element->getPluginLabel(),
       '#url' => $url,
-      '#attributes' => WebformDialogHelper::getOffCanvasDialogAttributes(),
+      '#attributes' => WebformDialogHelper::getOffCanvasDialogAttributes($webform_element->getOffCanvasWidth()),
       '#prefix' => '<span class="webform-form-filter-text-source">',
       '#suffix' => '</span>',
     ];
@@ -264,7 +264,7 @@ protected function buildRow(WebformElementInterface $webform_element, Url $url,
       // Must clone the URL object to prevent the above 'label' link attributes
       // (i.e. webform-tooltip-link) from being copied to 'operation' link.
       '#url' => clone $url,
-      '#attributes' => WebformDialogHelper::getOffCanvasDialogAttributes(WebformDialogHelper::DIALOG_NORMAL, ['button', 'button--primary', 'button--small']),
+      '#attributes' => WebformDialogHelper::getOffCanvasDialogAttributes($webform_element->getOffCanvasWidth(), ['button', 'button--primary', 'button--small']),
     ];
 
     // Issue #2741877 Nested modals don't work: when using CKEditor in a
diff --git a/web/modules/webform/modules/webform_ui/src/WebformUiEntityElementsForm.php b/web/modules/webform/modules/webform_ui/src/WebformUiEntityElementsForm.php
index 466d5f8c9c..dcdd69b34f 100644
--- a/web/modules/webform/modules/webform_ui/src/WebformUiEntityElementsForm.php
+++ b/web/modules/webform/modules/webform_ui/src/WebformUiEntityElementsForm.php
@@ -461,19 +461,21 @@ protected function getElementRow(array $element, $delta, array $parent_options)
     $row = [];
 
     $element_state_options = OptGroup::flattenOptions(WebformElementStates::getStateOptions());
-    $element_dialog_attributes = WebformDialogHelper::getOffCanvasDialogAttributes();
     $key = $element['#webform_key'];
     $title = $element['#admin_title'] ?: $element['#title'];
     $title = (is_array($title)) ? $this->renderer->render($title) : $title;
+
     $plugin_id = $this->elementManager->getElementPluginId($element);
 
     /** @var \Drupal\webform\Plugin\WebformElementInterface $webform_element */
     $webform_element = $this->elementManager->createInstance($plugin_id);
 
+    $offcanvas_dialog_attributes = WebformDialogHelper::getOffCanvasDialogAttributes($webform_element->getOffCanvasWidth());
+
     $is_container = $webform_element->isContainer($element);
     $is_root = $webform_element->isRoot();
     $is_element_disabled = $webform_element->isDisabled();
-    $is_access_disabled = (isset($element['#access']) && $element['#access'] === FALSE);
+    $is_access_disabled = !Element::isVisibleElement($element);
 
     // If disabled, display warning.
     if ($is_element_disabled) {
@@ -517,15 +519,25 @@ protected function getElementRow(array $element, $delta, array $parent_options)
     }
 
     $row['title'] = [
-      '#type' => 'link',
-      '#title' => $element['#admin_title'] ?: $element['#title'],
-      '#url' => new Url('entity.webform_ui.element.edit_form', [
-        'webform' => $webform->id(),
-        'key' => $key,
-      ]),
-      '#attributes' => $element_dialog_attributes,
-      '#prefix' => !empty($indentation) ? $this->renderer->renderPlain($indentation) : '',
+      'link' => [
+        '#type' => 'link',
+        '#title' => $element['#admin_title'] ?: $element['#title'],
+        '#url' => new Url('entity.webform_ui.element.edit_form', [
+          'webform' => $webform->id(),
+          'key' => $key,
+        ]),
+        '#attributes' => $offcanvas_dialog_attributes,
+        '#prefix' => !empty($indentation) ? $this->renderer->renderPlain($indentation) : '',
+      ],
     ];
+    if (!empty($element['#admin_notes'])) {
+      $row['title']['notes'] = [
+        '#type' => 'webform_help',
+        '#help_title' => $element['#admin_title'] ?: $element['#title'],
+        '#help' => $element['#admin_notes'],
+        '#weight' => 100,
+      ];
+    }
 
     if ($webform->hasContainer()) {
       if ($is_container) {
@@ -590,7 +602,7 @@ protected function getElementRow(array $element, $delta, array $parent_options)
           'entity.webform_ui.element.edit_form',
           ['webform' => $webform->id(), 'key' => $key]
         ),
-        '#attributes' => $element_dialog_attributes + [
+        '#attributes' => $offcanvas_dialog_attributes + [
           // Add custom hash to current page's location.
           // @see Drupal.behaviors.webformAjaxLink
           'data-hash' => 'webform-tab--conditions',
@@ -678,7 +690,7 @@ protected function getElementRow(array $element, $delta, array $parent_options)
           'key' => $key,
         ]
       ),
-      'attributes' => $element_dialog_attributes,
+      'attributes' => $offcanvas_dialog_attributes,
     ];
     // Issue #2741877 Nested modals don't work: when using CKEditor in a
     // modal, then clicking the image button opens another modal,
@@ -697,7 +709,7 @@ protected function getElementRow(array $element, $delta, array $parent_options)
             'key' => $key,
           ]
         ),
-        'attributes' => $element_dialog_attributes,
+        'attributes' => $offcanvas_dialog_attributes,
       ];
     }
     $row['operations']['#links']['delete'] = [
diff --git a/web/modules/webform/modules/webform_ui/tests/src/Functional/WebformUiElementTest.php b/web/modules/webform/modules/webform_ui/tests/src/Functional/WebformUiElementTest.php
index 3feb18d788..b81ee4fa71 100644
--- a/web/modules/webform/modules/webform_ui/tests/src/Functional/WebformUiElementTest.php
+++ b/web/modules/webform/modules/webform_ui/tests/src/Functional/WebformUiElementTest.php
@@ -17,7 +17,7 @@ class WebformUiElementTest extends WebformBrowserTestBase {
    *
    * @var array
    */
-  public static $modules = ['filter', 'webform', 'webform_ui'];
+  public static $modules = ['filter', 'webform', 'webform_ui', 'webform_test_element'];
 
   /**
    * Webforms to load.
@@ -141,6 +141,17 @@ public function testElements() {
     $this->drupalPostForm('/admin/structure/webform/manage/contact', $edit, 'Save elements');
     $this->assertNoFieldChecked('edit-webform-ui-elements-name-required');
 
+    /**************************************************************************/
+    // Notes.
+    /**************************************************************************/
+
+    // Add admin notes to contact name element.
+    $edit = [
+      'properties[admin_notes][value]' => 'This is an admin note.',
+    ];
+    $this->drupalPostForm('/admin/structure/webform/manage/contact/element/name/edit', $edit, 'Save');
+    $this->assertRaw('<span data-drupal-selector="edit-webform-ui-elements-name-title-notes" class="webform-element-help js-webform-element-help" role="tooltip" tabindex="0" data-webform-help="&lt;div class=&quot;webform-element-help--title&quot;&gt;Your Name&lt;/div&gt;&lt;div class=&quot;webform-element-help--content&quot;&gt;This is an admin note.&lt;/div&gt;"><span aria-hidden="true">?</span></span>');
+
     /**************************************************************************/
     // CRUD
     /**************************************************************************/
@@ -222,8 +233,6 @@ public function testElements() {
     $this->drupalGet('/admin/structure/webform/manage/contact/element/test/change');
     $this->assertRaw(t('Hidden'));
     $this->assertCssSelect('a[href$="admin/structure/webform/manage/contact/element/test/edit?type=hidden"][data-dialog-type][data-dialog-options][data-drupal-selector="edit-elements-hidden-operation"]');
-    $this->assertRaw(t('value'));
-    $this->assertCssSelect('a[href$="admin/structure/webform/manage/contact/element/test/edit?type=value"][data-dialog-type][data-dialog-options][data-drupal-selector="edit-elements-value-operation"]');
     $this->assertRaw(t('Search'));
     $this->assertCssSelect('a[href$="admin/structure/webform/manage/contact/element/test/edit?type=search"][data-dialog-type][data-dialog-options][data-drupal-selector="edit-elements-search-operation"]');
     $this->assertRaw(t('Telephone'));
@@ -232,20 +241,20 @@ public function testElements() {
     $this->assertCssSelect('a[href$="admin/structure/webform/manage/contact/element/test/edit?type=url"][data-dialog-type][data-dialog-options][data-drupal-selector="edit-elements-url-operation"]');
 
     // Check change element type.
-    $this->drupalGet('/admin/structure/webform/manage/contact/element/test/edit', ['query' => ['type' => 'value']]);
-    // Check value has no description.
+    $this->drupalGet('/admin/structure/webform/manage/contact/element/test/edit', ['query' => ['type' => 'hidden']]);
+    // Check hidden has no description.
     $this->assertNoRaw(t('A short description of the element used as help for the user when he/she uses the webform.'));
-    $this->assertRaw('Value <a href="' . $base_path . 'admin/structure/webform/manage/contact/element/test/edit" class="button button--small webform-ajax-link" data-dialog-type="dialog" data-dialog-renderer="off_canvas" data-dialog-options="{&quot;width&quot;:600,&quot;dialogClass&quot;:&quot;ui-dialog-off-canvas webform-off-canvas&quot;}" data-drupal-selector="edit-cancel" id="edit-cancel">Cancel</a>');
+    $this->assertRaw('Hidden <a href="' . $base_path . 'admin/structure/webform/manage/contact/element/test/edit" class="button button--small webform-ajax-link" data-dialog-type="dialog" data-dialog-renderer="off_canvas" data-dialog-options="{&quot;width&quot;:600,&quot;dialogClass&quot;:&quot;ui-dialog-off-canvas webform-off-canvas&quot;}" data-drupal-selector="edit-cancel" id="edit-cancel">Cancel</a>');
     $this->assertRaw('(Changing from <em class="placeholder">Text field</em>)');
 
     // Change the element type.
-    $this->drupalPostForm('/admin/structure/webform/manage/contact/element/test/edit', [], 'Save', ['query' => ['type' => 'value']]);
+    $this->drupalPostForm('/admin/structure/webform/manage/contact/element/test/edit', [], 'Save', ['query' => ['type' => 'hidden']]);
 
-    // Change the element type from 'textfield' to 'value'.
+    // Change the element type from 'textfield' to 'hidden'.
     $this->drupalGet('/admin/structure/webform/manage/contact/element/test/edit');
 
     // Check change element type link.
-    $this->assertRaw('Value <a href="' . $base_path . 'admin/structure/webform/manage/contact/element/test/change" class="button button--small webform-ajax-link" data-dialog-type="modal" data-dialog-options="{&quot;width&quot;:800,&quot;dialogClass&quot;:&quot;webform-ui-dialog&quot;}" data-drupal-selector="edit-change-type" id="edit-change-type">Change</a>');
+    $this->assertRaw('Hidden <a href="' . $base_path . 'admin/structure/webform/manage/contact/element/test/change" class="button button--small webform-ajax-link" data-dialog-type="modal" data-dialog-options="{&quot;width&quot;:800,&quot;dialogClass&quot;:&quot;webform-ui-dialog&quot;}" data-drupal-selector="edit-change-type" id="edit-change-type">Change</a>');
 
     // Check color element that does not have related type and return 404.
     $this->drupalPostForm('/admin/structure/webform/manage/contact/element/add/color', ['key' => 'test_color', 'properties[title]' => 'Test color'], 'Save');
@@ -262,6 +271,23 @@ public function testElements() {
     ];
     $this->drupalPostForm('/admin/structure/webform/manage/test_element_date/element/date_min_max_dynamic/edit', $edit, 'Save');
     $this->assertRaw('The Default value could not be interpreted in <a href="https://www.gnu.org/software/tar/manual/html_chapter/tar_7.html#Date-input-formats">GNU Date Input Format</a>.');
+
+    /**************************************************************************/
+    // Off-canvas width.
+    /**************************************************************************/
+
+    // Check add off-canvas element width is 800.
+    $this->drupalGet('/admin/structure/webform/manage/contact/element/add');
+    $this->assertCssSelect('[href$="/admin/structure/webform/manage/contact/element/add/webform_test_offcanvas_width_element"][data-dialog-options*="800"]');
+    $this->assertNoCssSelect('[href$="/admin/structure/webform/manage/contact/element/add/webform_test_offcanvas_width_element"][data-dialog-options*="550"]');
+
+    // Create element.
+    $this->drupalPostForm('/admin/structure/webform/manage/contact/element/add/webform_test_offcanvas_width_element', ['key' => 'webform_test_offcanvas_width_element'], 'Save');
+
+    // Check edit off-canvas element width is 800.
+    $this->drupalGet('/admin/structure/webform/manage/contact');
+    $this->assertCssSelect('[href$="/admin/structure/webform/manage/contact/element/webform_test_offcanvas_width_element/edit"][data-dialog-options*="800"]');
+    $this->assertNoCssSelect('[href$="/admin/structure/webform/manage/contact/element/webform_test_offcanvas_width_element/edit"][data-dialog-options*="550"]');
   }
 
   /**
diff --git a/web/modules/webform/modules/webform_ui/webform_ui.info.yml b/web/modules/webform/modules/webform_ui/webform_ui.info.yml
index 28f783ef89..3497327e4e 100644
--- a/web/modules/webform/modules/webform_ui/webform_ui.info.yml
+++ b/web/modules/webform/modules/webform_ui/webform_ui.info.yml
@@ -6,7 +6,7 @@ core_version_requirement: ^8.8
 dependencies:
   - 'webform:webform'
 
-# Information added by Drupal.org packaging script on 2020-07-02
-version: '8.x-5.19'
+# Information added by Drupal.org packaging script on 2020-10-05
+version: '8.x-5.22'
 project: 'webform'
-datestamp: 1593681142
+datestamp: 1601919526
diff --git a/web/modules/webform/reports/accessiblity/text/example_accessibility_advanced.txt b/web/modules/webform/reports/accessiblity/text/example_accessibility_advanced.txt
index 704c785698..271d5044fc 100644
--- a/web/modules/webform/reports/accessiblity/text/example_accessibility_advanced.txt
+++ b/web/modules/webform/reports/accessiblity/text/example_accessibility_advanced.txt
@@ -85,5 +85,15 @@ Results for URL: http://localhost/wf/webform/example_accessibility_advanced
    ├── #edit-webform-tableselect-sort > tbody > tr:nth-child(3) > td:nth-child(2)
    └── <td>Three</td>
 
-16 Errors
+ • Error: Duplicate id attribute value "edit-actions" found on the web page.
+   ├── WCAG2AA.Principle4.Guideline4_1.4_1_1.F77
+   ├── #edit-actions
+   └── <div data-drupal-selector="edit-actions" class="form-actions js-form-wrapper form-wrapper" id="edit-actions"><input class="search-form__subm...</div>
+
+ • Error: Duplicate id attribute value "edit-submit" found on the web page.
+   ├── WCAG2AA.Principle4.Guideline4_1.4_1_1.F77
+   ├── #edit-submit
+   └── <input class="search-form__submit button js-form-submit form-submit" data-drupal-selector="edit-submit" type="submit" id="edit-submit" value="Search">
+
+18 Errors
 
diff --git a/web/modules/webform/reports/accessiblity/text/example_accessibility_basic.txt b/web/modules/webform/reports/accessiblity/text/example_accessibility_basic.txt
index d7603d0f9e..296af482ed 100644
--- a/web/modules/webform/reports/accessiblity/text/example_accessibility_basic.txt
+++ b/web/modules/webform/reports/accessiblity/text/example_accessibility_basic.txt
@@ -3,5 +3,17 @@ Welcome to Pa11y
 
  > Running Pa11y on URL http://localhost/wf/webform/example_accessibility_basic
 
-No issues found!
+Results for URL: http://localhost/wf/webform/example_accessibility_basic
+
+ • Error: Duplicate id attribute value "edit-actions" found on the web page.
+   ├── WCAG2AA.Principle4.Guideline4_1.4_1_1.F77
+   ├── #edit-actions
+   └── <div data-drupal-selector="edit-actions" class="form-actions js-form-wrapper form-wrapper" id="edit-actions"><input class="search-form__subm...</div>
+
+ • Error: Duplicate id attribute value "edit-submit" found on the web page.
+   ├── WCAG2AA.Principle4.Guideline4_1.4_1_1.F77
+   ├── #edit-submit
+   └── <input class="search-form__submit button js-form-submit form-submit" data-drupal-selector="edit-submit" type="submit" id="edit-submit" value="Search">
+
+2 Errors
 
diff --git a/web/modules/webform/reports/accessiblity/text/example_accessibility_containers.txt b/web/modules/webform/reports/accessiblity/text/example_accessibility_containers.txt
index 9473edfd12..6a6ee8ee2d 100644
--- a/web/modules/webform/reports/accessiblity/text/example_accessibility_containers.txt
+++ b/web/modules/webform/reports/accessiblity/text/example_accessibility_containers.txt
@@ -3,5 +3,17 @@ Welcome to Pa11y
 
  > Running Pa11y on URL http://localhost/wf/webform/example_accessibility_containers
 
-No issues found!
+Results for URL: http://localhost/wf/webform/example_accessibility_containers
+
+ • Error: Duplicate id attribute value "edit-actions" found on the web page.
+   ├── WCAG2AA.Principle4.Guideline4_1.4_1_1.F77
+   ├── #edit-actions
+   └── <div data-drupal-selector="edit-actions" class="form-actions js-form-wrapper form-wrapper" id="edit-actions"><input class="search-form__subm...</div>
+
+ • Error: Duplicate id attribute value "edit-submit" found on the web page.
+   ├── WCAG2AA.Principle4.Guideline4_1.4_1_1.F77
+   ├── #edit-submit
+   └── <input class="search-form__submit button js-form-submit form-submit" data-drupal-selector="edit-submit" type="submit" id="edit-submit" value="Search">
+
+2 Errors
 
diff --git a/web/modules/webform/reports/accessiblity/text/example_accessibility_labels.txt b/web/modules/webform/reports/accessiblity/text/example_accessibility_labels.txt
index 1e235c5e07..fc75ffc778 100644
--- a/web/modules/webform/reports/accessiblity/text/example_accessibility_labels.txt
+++ b/web/modules/webform/reports/accessiblity/text/example_accessibility_labels.txt
@@ -3,5 +3,17 @@ Welcome to Pa11y
 
  > Running Pa11y on URL http://localhost/wf/webform/example_accessibility_labels
 
-No issues found!
+Results for URL: http://localhost/wf/webform/example_accessibility_labels
+
+ • Error: Duplicate id attribute value "edit-actions" found on the web page.
+   ├── WCAG2AA.Principle4.Guideline4_1.4_1_1.F77
+   ├── #edit-actions
+   └── <div data-drupal-selector="edit-actions" class="form-actions js-form-wrapper form-wrapper" id="edit-actions"><input class="search-form__subm...</div>
+
+ • Error: Duplicate id attribute value "edit-submit" found on the web page.
+   ├── WCAG2AA.Principle4.Guideline4_1.4_1_1.F77
+   ├── #edit-submit
+   └── <input class="search-form__submit button js-form-submit form-submit" data-drupal-selector="edit-submit" type="submit" id="edit-submit" value="Search">
+
+2 Errors
 
diff --git a/web/modules/webform/reports/accessiblity/text/example_accessibility_wizard.txt b/web/modules/webform/reports/accessiblity/text/example_accessibility_wizard.txt
index 8bcaefe8e4..569329732e 100644
--- a/web/modules/webform/reports/accessiblity/text/example_accessibility_wizard.txt
+++ b/web/modules/webform/reports/accessiblity/text/example_accessibility_wizard.txt
@@ -50,5 +50,10 @@ Results for URL: http://localhost/wf/webform/example_accessibility_wizard
    ├── #webform-submission-example-accessibility-wizard-add-form > div:nth-child(7) > ul > li:nth-child(5) > span:nth-child(2) > span
    └── <span class="progress-title" data-webform-progress-link=""> <span class="visua...</span>
 
-9 Errors
+ • Error: Duplicate id attribute value "edit-actions" found on the web page.
+   ├── WCAG2AA.Principle4.Guideline4_1.4_1_1.F77
+   ├── #edit-actions
+   └── <div data-drupal-selector="edit-actions" class="form-actions js-form-wrapper form-wrapper" id="edit-actions"><input class="search-form__subm...</div>
+
+10 Errors
 
diff --git a/web/modules/webform/src/Access/WebformSubmissionAccess.php b/web/modules/webform/src/Access/WebformSubmissionAccess.php
index 82d3ef19ad..60ddd2e297 100644
--- a/web/modules/webform/src/Access/WebformSubmissionAccess.php
+++ b/web/modules/webform/src/Access/WebformSubmissionAccess.php
@@ -21,10 +21,20 @@ class WebformSubmissionAccess {
    *   The access result.
    */
   public static function checkWizardPagesAccess(WebformSubmissionInterface $webform_submission) {
-    $elements_raw = $webform_submission->getWebform()->getElementsRaw();
-    $has_pages = (strpos($elements_raw, "'#type': webform_wizard_page") !== FALSE
-      || strpos($elements_raw, "'#type': webform_card") !== FALSE);
-    return AccessResult::allowedIf($has_pages);
+    // Check wizard pages.
+    $has_wizard_pages = ($webform_submission->getWebform()->hasWizardPages());
+
+    // Check cards.
+    if (\Drupal::moduleHandler()->moduleExists('webform_cards')) {
+      /** @var \Drupal\webform_cards\WebformCardsManagerInterface $webform_cards_manager */
+      $webform_cards_manager = \Drupal::service('webform_cards.manager');
+      $has_cards = $webform_cards_manager->hasCards($webform_submission->getWebform());
+    }
+    else {
+      $has_cards = FALSE;
+    }
+
+    return AccessResult::allowedIf($has_wizard_pages || $has_cards);
   }
 
   /**
diff --git a/web/modules/webform/src/Breadcrumb/WebformBreadcrumbBuilder.php b/web/modules/webform/src/Breadcrumb/WebformBreadcrumbBuilder.php
index 963c908c14..a930b73c62 100644
--- a/web/modules/webform/src/Breadcrumb/WebformBreadcrumbBuilder.php
+++ b/web/modules/webform/src/Breadcrumb/WebformBreadcrumbBuilder.php
@@ -4,6 +4,7 @@
 
 use Drupal\Core\Breadcrumb\BreadcrumbBuilderInterface;
 use Drupal\Core\Breadcrumb\Breadcrumb;
+use Drupal\Core\Config\ConfigFactoryInterface;
 use Drupal\Core\Extension\ModuleHandlerInterface;
 use Drupal\Core\Link;
 use Drupal\Core\Routing\RouteMatchInterface;
@@ -29,18 +30,25 @@ class WebformBreadcrumbBuilder implements BreadcrumbBuilderInterface {
   protected $type;
 
   /**
-   * The webform request handler.
+   * The module handler service.
    *
-   * @var \Drupal\webform\WebformRequestInterface
+   * @var \Drupal\Core\Extension\ModuleHandlerInterface
    */
-  protected $requestHandler;
+  protected $moduleHandler;
 
   /**
-   * The module handler service.
+   * The configuration object factory.
    *
-   * @var \Drupal\Core\Extension\ModuleHandlerInterface
+   * @var \Drupal\Core\Config\ConfigFactoryInterface
    */
-  protected $moduleHandler;
+  protected $configFactory;
+
+  /**
+   * The webform request handler.
+   *
+   * @var \Drupal\webform\WebformRequestInterface
+   */
+  protected $requestHandler;
 
   /**
    * Constructs a WebformBreadcrumbBuilder.
@@ -51,11 +59,14 @@ class WebformBreadcrumbBuilder implements BreadcrumbBuilderInterface {
    *   The webform request handler.
    * @param \Drupal\Core\StringTranslation\TranslationInterface $string_translation
    *   The string translation service.
+   * @param \Drupal\Core\Config\ConfigFactoryInterface $config_factory
+   *   The configuration object factory.
    */
-  public function __construct(ModuleHandlerInterface $module_handler, WebformRequestInterface $request_handler, TranslationInterface $string_translation) {
+  public function __construct(ModuleHandlerInterface $module_handler, WebformRequestInterface $request_handler, TranslationInterface $string_translation, ConfigFactoryInterface $config_factory = NULL) {
     $this->moduleHandler = $module_handler;
     $this->requestHandler = $request_handler;
     $this->setStringTranslation($string_translation);
+    $this->configFactory = $config_factory ?: \Drupal::configFactory();
   }
 
   /**
@@ -180,7 +191,9 @@ public function build(RouteMatchInterface $route_match) {
       $breadcrumb = new Breadcrumb();
       $breadcrumb->addLink(Link::createFromRoute($this->t('Home'), '<front>'));
       $breadcrumb->addLink(Link::createFromRoute($this->t('Administration'), 'system.admin'));
-      $breadcrumb->addLink(Link::createFromRoute($this->t('Structure'), 'system.admin_structure'));
+      if (!$this->configFactory->get('webform.settings')->get('ui.toolbar_item')) {
+        $breadcrumb->addLink(Link::createFromRoute($this->t('Structure'), 'system.admin_structure'));
+      }
       $breadcrumb->addLink(Link::createFromRoute($this->t('Webforms'), 'entity.webform.collection'));
       switch ($this->type) {
         case 'webform_config':
diff --git a/web/modules/webform/src/Controller/WebformPluginHandlerController.php b/web/modules/webform/src/Controller/WebformPluginHandlerController.php
index 8de9a824e4..538513d8c4 100644
--- a/web/modules/webform/src/Controller/WebformPluginHandlerController.php
+++ b/web/modules/webform/src/Controller/WebformPluginHandlerController.php
@@ -175,7 +175,7 @@ public function listHandlers(Request $request, WebformInterface $webform) {
           '#type' => 'link',
           '#title' => $definition['label'],
           '#url' => Url::fromRoute('entity.webform.handler.add_form', ['webform' => $webform->id(), 'webform_handler' => $plugin_id]),
-          '#attributes' => WebformDialogHelper::getOffCanvasDialogAttributes(),
+          '#attributes' => WebformDialogHelper::getOffCanvasDialogAttributes($handler_plugin->getOffCanvasWidth()),
           '#prefix' => '<div class="webform-form-filter-text-source">',
           '#suffix' => '</div>',
         ];
@@ -202,7 +202,7 @@ public function listHandlers(Request $request, WebformInterface $webform) {
         $links['add'] = [
           'title' => $this->t('Add handler'),
           'url' => Url::fromRoute('entity.webform.handler.add_form', ['webform' => $webform->id(), 'webform_handler' => $plugin_id]),
-          'attributes' => WebformDialogHelper::getOffCanvasDialogAttributes(),
+          'attributes' => WebformDialogHelper::getOffCanvasDialogAttributes($handler_plugin->getOffCanvasWidth()),
         ];
         $row['operations']['data'] = [
           '#type' => 'operations',
diff --git a/web/modules/webform/src/Controller/WebformPluginVariantController.php b/web/modules/webform/src/Controller/WebformPluginVariantController.php
index 0f5da17e0f..197f743bf7 100644
--- a/web/modules/webform/src/Controller/WebformPluginVariantController.php
+++ b/web/modules/webform/src/Controller/WebformPluginVariantController.php
@@ -144,13 +144,16 @@ public function listVariants(Request $request, WebformInterface $webform) {
         continue;
       }
 
+      /** @var \Drupal\webform\Plugin\WebformVariantInterface $variant_plugin */
+      $variant_plugin = $this->pluginManager->createInstance($plugin_id);
+
       $row = [];
 
       $row['title']['data'] = [
         '#type' => 'link',
         '#title' => $definition['label'],
         '#url' => Url::fromRoute('entity.webform.variant.add_form', ['webform' => $webform->id(), 'webform_variant' => $plugin_id]),
-        '#attributes' => WebformDialogHelper::getOffCanvasDialogAttributes(),
+        '#attributes' => WebformDialogHelper::getOffCanvasDialogAttributes($variant_plugin->getOffCanvasWidth()),
         '#prefix' => '<div class="webform-form-filter-text-source">',
         '#suffix' => '</div>',
       ];
@@ -166,7 +169,7 @@ public function listVariants(Request $request, WebformInterface $webform) {
       $links['add'] = [
         'title' => $this->t('Add variant'),
         'url' => Url::fromRoute('entity.webform.variant.add_form', ['webform' => $webform->id(), 'webform_variant' => $plugin_id]),
-        'attributes' => WebformDialogHelper::getOffCanvasDialogAttributes(),
+        'attributes' => WebformDialogHelper::getOffCanvasDialogAttributes($variant_plugin->getOffCanvasWidth()),
       ];
       $row['operations']['data'] = [
         '#type' => 'operations',
diff --git a/web/modules/webform/src/Controller/WebformResultsExportController.php b/web/modules/webform/src/Controller/WebformResultsExportController.php
index dd28b95f50..7d205ac5df 100644
--- a/web/modules/webform/src/Controller/WebformResultsExportController.php
+++ b/web/modules/webform/src/Controller/WebformResultsExportController.php
@@ -294,9 +294,12 @@ public static function batchProcess(WebformInterface $webform, EntityInterface $
     $context['message'] = t('Exported @count of @total submissions…', ['@count' => $context['sandbox']['progress'], '@total' => $context['sandbox']['max']]);
 
     // Track finished.
-    if ($context['sandbox']['progress'] !== $context['sandbox']['max']) {
+    if ($context['sandbox']['max'] > 0 && $context['sandbox']['progress'] !== $context['sandbox']['max']) {
       $context['finished'] = $context['sandbox']['progress'] / $context['sandbox']['max'];
     }
+    else {
+      $context['finished'] = 1;
+    }
   }
 
   /**
diff --git a/web/modules/webform/src/Element/WebformActions.php b/web/modules/webform/src/Element/WebformActions.php
index 9b30317c2d..0002fd9cbc 100644
--- a/web/modules/webform/src/Element/WebformActions.php
+++ b/web/modules/webform/src/Element/WebformActions.php
@@ -4,7 +4,9 @@
 
 use Drupal\Component\Utility\Html;
 use Drupal\Core\Form\FormStateInterface;
+use Drupal\Core\Render\Element;
 use Drupal\Core\Render\Element\Container;
+use Drupal\webform\Utility\WebformDialogHelper;
 use Drupal\webform\Utility\WebformElementHelper;
 
 /**
@@ -19,6 +21,7 @@ class WebformActions extends Container {
   public static $buttons = [
     'submit',
     'reset',
+    'delete',
     'draft',
     'wizard_prev',
     'wizard_next',
@@ -57,7 +60,7 @@ public function getInfo() {
   public static function processWebformActions(&$element, FormStateInterface $form_state, &$complete_form) {
     /** @var \Drupal\webform\WebformSubmissionForm $form_object */
     $form_object = $form_state->getFormObject();
-    /** @var \Drupal\webform\webform_submission $webform_submission */
+    /** @var \Drupal\webform\WebformSubmissionInterface $webform_submission */
     $webform_submission = $form_object->getEntity();
 
     $prefix = ($element['#webform_key']) ? 'edit-' . $element['#webform_key'] . '-' : '';
@@ -71,6 +74,31 @@ public static function processWebformActions(&$element, FormStateInterface $form
     // Copy the form's actions to this element.
     $element += $complete_form['actions'];
 
+    // Custom processing for the delete (link) action.
+    if (isset($element['delete'])) {
+      // Clone the URL so that each delete URL can have custom attributes.
+      $element['delete']['#url'] = clone $element['delete']['#url'];
+
+      // Add dialog attributes to the delete button.
+      if (!empty($element['#delete__dialog'])) {
+        $element['delete'] += ['#attributes' => []];
+        $element['delete']['#attributes'] += ['class' => []];
+
+        $dialog_attributes = WebformDialogHelper::getModalDialogAttributes(WebformDialogHelper::DIALOG_NARROW, $element['delete']['#attributes']['class']);
+        $element['delete']['#attributes'] += $dialog_attributes;
+        $element['delete']['#attributes']['class'] = $dialog_attributes['class'];
+
+        WebformDialogHelper::attachLibraries($element);
+      }
+
+      // Restore access checking to the delete button.
+      // @see \Drupal\webform\WebformSubmissionForm::actions
+      if (isset($element['#delete_hide']) && $element['#delete_hide'] === FALSE) {
+        $element['delete']['#access'] = $webform_submission->access('delete');
+        unset($element['#delete_hide']);
+      }
+    }
+
     // Track if buttons are visible.
     $has_visible_button = FALSE;
     foreach (static::$buttons as $button_name) {
@@ -97,7 +125,12 @@ public static function processWebformActions(&$element, FormStateInterface $form
       // Apply custom label.
       $has_custom_label = !empty($element[$button_name]['#webform_actions_button_custom']);
       if (!empty($element['#' . $settings_name . '__label']) && !$has_custom_label) {
-        $element[$button_name]['#value'] = $element['#' . $settings_name . '__label'];
+        if ($element[$button_name]['#type'] === 'link') {
+          $element[$button_name]['#title'] = $element['#' . $settings_name . '__label'];
+        }
+        else {
+          $element[$button_name]['#value'] = $element['#' . $settings_name . '__label'];
+        }
       }
 
       // Apply custom name when needed for multiple submit buttons with
@@ -109,8 +142,10 @@ public static function processWebformActions(&$element, FormStateInterface $form
 
       // Apply attributes (class, style, properties).
       if (!empty($element['#' . $settings_name . '__attributes'])) {
+        $element[$button_name] += ['#attributes' => []];
         foreach ($element['#' . $settings_name . '__attributes'] as $attribute_name => $attribute_value) {
           if ($attribute_name === 'class') {
+            $element[$button_name]['#attributes'] += ['class' => []];
             // Merge class names.
             $element[$button_name]['#attributes']['class'] = array_merge($element[$button_name]['#attributes']['class'], $attribute_value);
           }
@@ -120,15 +155,14 @@ public static function processWebformActions(&$element, FormStateInterface $form
         };
       }
 
-      if (!isset($element[$button_name]['#access']) || $element[$button_name]['#access'] === TRUE) {
+      if (Element::isVisibleElement($element[$button_name])) {
         $has_visible_button = TRUE;
       }
     }
 
     // Hide form actions only if the element is accessible.
     // This prevents form from having no actions.
-    $has_access = (!isset($element['#access']) || $element['#access'] === TRUE);
-    if ($has_access) {
+    if (Element::isVisibleElement($element)) {
       $complete_form['actions']['#access'] = FALSE;
     }
 
diff --git a/web/modules/webform/src/Element/WebformCompositeBase.php b/web/modules/webform/src/Element/WebformCompositeBase.php
index ef96c9ec1a..7994394164 100644
--- a/web/modules/webform/src/Element/WebformCompositeBase.php
+++ b/web/modules/webform/src/Element/WebformCompositeBase.php
@@ -168,8 +168,7 @@ public static function validateWebformComposite(&$element, FormStateInterface $f
     $value = NestedArray::getValue($form_state->getValues(), $element['#parents']);
 
     // Only validate composite elements that are visible.
-    $has_access = (!isset($element['#access']) || $element['#access'] === TRUE);
-    if ($has_access) {
+    if (Element::isVisibleElement($element)) {
       // Validate required composite elements.
       $composite_elements = static::getCompositeElements($element);
       $composite_elements = WebformElementHelper::getFlattened($composite_elements);
diff --git a/web/modules/webform/src/Element/WebformElementMultiple.php b/web/modules/webform/src/Element/WebformElementMultiple.php
index 3a56efcc0b..3cecebcde3 100644
--- a/web/modules/webform/src/Element/WebformElementMultiple.php
+++ b/web/modules/webform/src/Element/WebformElementMultiple.php
@@ -3,6 +3,7 @@
 namespace Drupal\webform\Element;
 
 use Drupal\Core\Form\FormStateInterface;
+use Drupal\Core\Render\Element;
 use Drupal\Core\Render\Element\FormElement;
 
 /**
@@ -111,13 +112,10 @@ public static function processWebformElementMultiple(&$element, FormStateInterfa
    * Validates element multiple.
    */
   public static function validateWebformElementMultiple(&$element, FormStateInterface $form_state, &$complete_form) {
-    $has_access = (!isset($element['#access']) || $element['#access'] === TRUE);
-    $is_disabled = (!empty($element['#disabled']));
-
-    if (!$has_access) {
+    if (!Element::isVisibleElement($element)) {
       $multiple = $element['#value'];
     }
-    elseif ($is_disabled) {
+    elseif (!empty($element['#disabled'])) {
       $multiple = $element['#default_value'];
     }
     else {
diff --git a/web/modules/webform/src/Element/WebformElementOptions.php b/web/modules/webform/src/Element/WebformElementOptions.php
index c895e0f278..d0e4ca44b0 100644
--- a/web/modules/webform/src/Element/WebformElementOptions.php
+++ b/web/modules/webform/src/Element/WebformElementOptions.php
@@ -3,6 +3,7 @@
 namespace Drupal\webform\Element;
 
 use Drupal\Component\Utility\NestedArray;
+use Drupal\Core\Render\Element;
 use Drupal\Core\Serialization\Yaml;
 use Drupal\Core\Form\FormStateInterface;
 use Drupal\Core\Render\Element\FormElement;
@@ -164,8 +165,7 @@ public static function validateWebformElementOptions(&$element, FormStateInterfa
       }
     }
 
-    $has_access = (!isset($element['#access']) || $element['#access'] === TRUE);
-    if ($element['#required'] && empty($value) && $has_access) {
+    if (Element::isVisibleElement($element) && $element['#required'] && empty($value)) {
       WebformElementHelper::setRequiredError($element, $form_state);
     }
 
diff --git a/web/modules/webform/src/Element/WebformElementStates.php b/web/modules/webform/src/Element/WebformElementStates.php
index 18ec64de70..b79850c434 100644
--- a/web/modules/webform/src/Element/WebformElementStates.php
+++ b/web/modules/webform/src/Element/WebformElementStates.php
@@ -483,9 +483,15 @@ protected static function buildConditionRow(array $element, array $condition, $t
           'or',
           [$trigger_selector => ['value' => 'greater']],
           'or',
+          [$trigger_selector => ['value' => 'greater_equal']],
+          'or',
           [$trigger_selector => ['value' => 'less']],
           'or',
+          [$trigger_selector => ['value' => 'less_equal']],
+          'or',
           [$trigger_selector => ['value' => 'between']],
+          'or',
+          [$trigger_selector => ['value' => '!between']],
         ],
       ],
       '#wrapper_attributes' => ['class' => ['webform-states-table--value']],
@@ -509,6 +515,8 @@ protected static function buildConditionRow(array $element, array $condition, $t
       '#states' => [
         'visible' => [
           [$trigger_selector => ['value' => 'between']],
+          'or',
+          [$trigger_selector => ['value' => '!between']],
         ],
       ],
     ];
@@ -931,7 +939,7 @@ protected static function getFormApiStatesCondition(array $condition) {
       if (in_array($trigger, ['value', '!value'])) {
         $value = $condition['value'];
       }
-      elseif (in_array($trigger, ['pattern', '!pattern', 'less', 'greater', 'between'])) {
+      elseif (in_array($trigger, ['pattern', '!pattern', 'less', 'less_equal', 'greater', 'greater_equal', 'between', '!between'])) {
         $value = [$trigger => $condition['value']];
         $trigger = 'value';
       }
@@ -1092,8 +1100,11 @@ public static function getTriggerOptions() {
       'pattern' => t('Pattern'),
       '!pattern' => t('Not Pattern'),
       'less' => t('Less than'),
+      'less_equal' => t('Less than/Equal to'),
       'greater' => t('Greater than'),
+      'greater_equal' => t('Greater than/Equal to'),
       'between' => t('Between'),
+      '!between' => t('Not between'),
     ];
   }
 
diff --git a/web/modules/webform/src/Element/WebformEmailConfirm.php b/web/modules/webform/src/Element/WebformEmailConfirm.php
index 24accdf6d0..96f667697c 100644
--- a/web/modules/webform/src/Element/WebformEmailConfirm.php
+++ b/web/modules/webform/src/Element/WebformEmailConfirm.php
@@ -2,6 +2,7 @@
 
 namespace Drupal\webform\Element;
 
+use Drupal\Core\Render\Element;
 use Drupal\Core\Render\Element\FormElement;
 use Drupal\Core\Form\FormStateInterface;
 use Drupal\webform\Utility\WebformElementHelper;
@@ -174,8 +175,7 @@ public static function validateWebformEmailConfirm(&$element, FormStateInterface
 
     $mail_1 = trim($mail_element['mail_1']['#value']);
     $mail_2 = trim($mail_element['mail_2']['#value']);
-    $has_access = (!isset($element['#access']) || $element['#access'] === TRUE);
-    if ($has_access) {
+    if (Element::isVisibleElement($element)) {
       // Compare email addresses.
       if ((!empty($mail_1) || !empty($mail_2)) && strcmp($mail_1, $mail_2)) {
         $form_state->setError($element, t('The specified email addresses do not match.'));
diff --git a/web/modules/webform/src/Element/WebformEntityTrait.php b/web/modules/webform/src/Element/WebformEntityTrait.php
index 497cb8b377..b2a99ef9d9 100644
--- a/web/modules/webform/src/Element/WebformEntityTrait.php
+++ b/web/modules/webform/src/Element/WebformEntityTrait.php
@@ -45,14 +45,14 @@ public static function setOptions(array &$element, array $settings = []) {
       return;
     }
 
+    $selection_settings = isset($element['#selection_settings']) ? $element['#selection_settings'] : [];
     $selection_handler_options = [
-      'target_type' => $element['#target_type'],
-      'handler' => $element['#selection_handler'],
-      'handler_settings' => (isset($element['#selection_settings'])) ? $element['#selection_settings'] : [],
-      // Set '_webform_settings' used to limit and randomize options.
-      // @see webform_query_entity_reference_alter()
-      '_webform_settings' => $settings,
-    ];
+        'target_type' => $element['#target_type'],
+        'handler' => $element['#selection_handler'],
+        // Set '_webform_settings' used to limit and randomize options.
+        // @see webform_query_entity_reference_alter()
+        '_webform_settings' => $settings,
+      ] + $selection_settings;
 
     // Make sure settings has a limit.
     $settings += ['limit' => 0];
diff --git a/web/modules/webform/src/Element/WebformHeight.php b/web/modules/webform/src/Element/WebformHeight.php
new file mode 100644
index 0000000000..92fc7429be
--- /dev/null
+++ b/web/modules/webform/src/Element/WebformHeight.php
@@ -0,0 +1,254 @@
+<?php
+
+namespace Drupal\webform\Element;
+
+use Drupal\Core\Render\Element;
+use Drupal\Core\Render\Element\FormElement;
+use Drupal\Core\Form\FormStateInterface;
+use Drupal\webform\Utility\WebformElementHelper;
+
+/**
+ * Provides a webform height element.
+ *
+ * @FormElement("webform_height")
+ */
+class WebformHeight extends FormElement {
+
+  use WebformCompositeFormElementTrait;
+
+  /**
+   * Denotes height symbol.
+   *
+   * @var string
+   */
+  const HEIGHT_SYMBOL = 'symbol';
+
+  /**
+   * Denotes height abbreviate.
+   *
+   * @var string
+   */
+  const HEIGHT_ABBREVIATE = 'abbreviate';
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getInfo() {
+    $class = get_class($this);
+    return [
+      '#input' => TRUE,
+      '#process' => [
+        [$class, 'processWebformHeight'],
+      ],
+      '#pre_render' => [
+        [$class, 'preRenderWebformCompositeFormElement'],
+      ],
+      '#required' => FALSE,
+      '#height_type' => 'number',
+      '#height_format' => '',
+      '#feet__min' => 0,
+      '#feet__max' => 8,
+      '#inches__step' => 1,
+    ];
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function valueCallback(&$element, $input, FormStateInterface $form_state) {
+    if ($input === FALSE) {
+      if (!isset($element['#default_value']) || $element['#default_value'] === '') {
+        $element['#default_value'] = ['feet' => NULL, 'inches' => NULL];
+      }
+      else {
+        $value = (float) $element['#default_value'];
+        $feet = floor($value / 12);
+        $inches = $value - ($feet * 12);
+        $element['#default_value'] = ['feet' => $feet, 'inches' => $inches];
+      }
+      return $element['#default_value'];
+    }
+    else {
+      $element['#default_value'] = $input;
+      return $input;
+    }
+  }
+
+  /**
+   * Display feet and inches for height element.
+   */
+  public static function processWebformHeight(&$element, FormStateInterface $form_state, &$complete_form) {
+    switch ($element['#height_format']) {
+      case static::HEIGHT_SYMBOL:
+        $feet_plural = '″';
+        $feet_singular = '″';
+        $inches_plural = '′';
+        $inches_singular = '′';
+        break;
+
+      case static::HEIGHT_ABBREVIATE:
+        $feet_plural = t('ft', [], ['context' => 'Imperial height unit abbreviate']);
+        $feet_singular = t('ft', [], ['context' => 'Imperial height unit abbreviate']);
+        $inches_plural = t('in', [], ['context' => 'Imperial height unit abbreviate']);
+        $inches_singular = t('in', [], ['context' => 'Imperial height unit abbreviate']);
+        break;
+
+      default:
+        $feet_plural = t('feet', [], ['context' => 'Imperial height unit']);
+        $feet_singular = t('foot', [], ['context' => 'Imperial height unit']);
+        $inches_plural = t('inches', [], ['context' => 'Imperial height unit']);
+        $inches_singular = t('inch', [], ['context' => 'Imperial height unit']);
+        break;
+    }
+
+    $select_element_defaults = [
+      '#type' => 'select',
+      '#empty_option' => '',
+    ];
+
+    $element['#tree'] = TRUE;
+
+    // Feet options.
+    $feet_range = range($element['#feet__min'], $element['#feet__max']);
+    $feet_options = array_combine($feet_range, $feet_range);
+
+    // Inches options.
+    $inches_step = $element['#inches__step'];
+    $inches_range = range(0, 11, $inches_step);
+    if ($inches_step !== 1 && floor($inches_step) !== $inches_step) {
+      $decimals = strlen(substr(strrchr($inches_step, '.'), 1));
+      $inches_range = array_map(function ($number) use ($decimals) {
+        return number_format($number, $decimals);
+      }, $inches_range);
+    }
+    $inches_options = array_combine($inches_range, $inches_range);
+
+    // Container.
+    $element['container'] = [
+      '#type' => 'container',
+      '#attributes' => ['class' => ['form--inline']],
+    ];
+
+    $t_args = [
+      '@title' => $element['#title'],
+      '@unit' => t('Feet', [], ['context' => 'Imperial height unit']),
+    ];
+    $element['container']['feet'] = [
+      '#title' => t('@title: @unit', $t_args),
+      '#title_display' => 'invisible',
+      '#required' => $element['#required'],
+      '#error_no_message' => TRUE,
+      '#default_value' => $element['#default_value']['feet'],
+      '#parents' => array_merge($element['#parents'], ['feet']),
+    ];
+    $t_args = [
+      '@title' => $element['#title'],
+      '@unit' => t('Inches', [], ['context' => 'Imperial height unit']),
+    ];
+    $element['container']['inches'] = [
+      '#title' => t('@title: @unit', $t_args),
+      '#title_display' => 'invisible',
+      '#field_prefix' => ' ',
+      '#required' => $element['#required'],
+      '#error_no_message' => TRUE,
+      '#default_value' => $element['#default_value']['inches'],
+      '#parents' => array_merge($element['#parents'], ['inches']),
+    ];
+
+    switch ($element['#height_type']) {
+      case 'select':
+        $element['container']['feet'] += $select_element_defaults + [
+          '#field_suffix' => $feet_plural,
+          '#options' => $feet_options,
+        ];
+        $element['container']['inches'] += $select_element_defaults + [
+          '#field_suffix' => $inches_plural,
+          '#options' => $inches_options,
+        ];
+        break;
+
+      case 'select_suffix':
+        foreach ($feet_options as $option_value => $option_text) {
+          $feet_options[$option_value] .= ' ' . ($option_value === 1 ? $feet_singular : $feet_plural);
+        }
+        foreach ($inches_options as $option_value => $option_text) {
+          $inches_options[$option_value] .= ' ' . ($option_value === 1 ? $inches_singular : $inches_plural);
+        }
+        $element['container']['feet'] += $select_element_defaults + [
+          '#options' => $feet_options,
+        ];
+        $element['container']['inches'] += $select_element_defaults + [
+          '#options' => $inches_options,
+        ];
+        break;
+
+      default:
+        $element['container']['feet'] += [
+          '#type' => 'number',
+          '#field_suffix' => $feet_plural,
+          '#min' => $element['#feet__min'],
+          '#max' => $element['#feet__max'],
+          '#step' => 1,
+        ];
+        $element['container']['inches'] += [
+          '#type' => 'number',
+          '#field_suffix' => $inches_plural,
+          '#min' => 0,
+          '#max' => 11,
+          '#step' => $inches_step,
+        ];
+        break;
+    }
+
+    // Apply custom properties to feet and inches elements.
+    foreach ($element as $key => $value) {
+      if (strpos($key, '__') !== FALSE) {
+        list($element_key, $property_key) = explode('__', ltrim($key, '#'));
+        if (isset($element['container'][$element_key])) {
+          $element['container'][$element_key]["#$property_key"] = $value;
+        }
+      }
+    }
+
+    // Initialize the feet and inches elements to allow
+    // for webform enhancements.
+    /** @var \Drupal\webform\Plugin\WebformElementManagerInterface $element_manager */
+    $element_manager = \Drupal::service('plugin.manager.webform.element');
+    $element_manager->buildElement($element['container']['feet'], $complete_form, $form_state);
+    $element_manager->buildElement($element['container']['inches'], $complete_form, $form_state);
+
+    // Add validate callback.
+    $element += ['#element_validate' => []];
+    array_unshift($element['#element_validate'], [get_called_class(), 'validateWebformHeight']);
+
+    return $element;
+  }
+
+  /**
+   * Validates an height element.
+   */
+  public static function validateWebformHeight(&$element, FormStateInterface $form_state, &$complete_form) {
+    $height_element =& $element['container'];
+
+   if ($height_element['feet']['#value'] === '' && $height_element['inches']['#value'] === '') {
+      $value = '';
+    }
+    else {
+      $feet = (float) $height_element['feet']['#value'];
+      $inches = (float) $height_element['inches']['#value'];
+      $value = ($feet * 12) + $inches;
+    }
+
+    if (Element::isVisibleElement($element) && $element['#required'] && empty($value)) {
+      WebformElementHelper::setRequiredError($element, $form_state);
+    }
+
+    $form_state->setValueForElement($height_element['feet'], NULL);
+    $form_state->setValueForElement($height_element['inches'], NULL);
+
+    $value = (string) $value;
+    $element['#value'] = $value;
+    $form_state->setValueForElement($element, $value);
+  }
+
+}
diff --git a/web/modules/webform/src/Element/WebformLocationBase.php b/web/modules/webform/src/Element/WebformLocationBase.php
index c594423091..92988bb6da 100644
--- a/web/modules/webform/src/Element/WebformLocationBase.php
+++ b/web/modules/webform/src/Element/WebformLocationBase.php
@@ -3,6 +3,7 @@
 namespace Drupal\webform\Element;
 
 use Drupal\Core\Form\FormStateInterface;
+use Drupal\Core\Render\Element;
 
 /**
  * Provides a webform base element for a location element.
@@ -92,7 +93,7 @@ public static function processWebformComposite(&$element, FormStateInterface $fo
     $composite_elements = static::getCompositeElements($element);
     foreach ($composite_elements as $composite_key => $composite_element) {
       if ($composite_key !== 'value') {
-        if (isset($element[$composite_key]['#access']) && $element[$composite_key]['#access'] === FALSE) {
+        if (!Element::isVisibleElement($element[$composite_key])) {
           unset($element[$composite_key]['#access']);
           unset($element[$composite_key]['#pre_render']);
           $element[$composite_key]['#type'] = 'hidden';
@@ -137,8 +138,7 @@ public static function processWebformComposite(&$element, FormStateInterface $fo
   public static function validateWebformLocation(&$element, FormStateInterface $form_state, &$complete_form) {
     $value = $element['#value'];
 
-    $has_access = (!isset($element['#access']) || $element['#access'] === TRUE);
-    if ($has_access && !empty($element['#required']) && empty($value['lat'])) {
+    if (Element::isVisibleElement($element) && !empty($element['#required']) && empty($value['lat'])) {
       $t_args = ['@title' => !empty($element['#title']) ? $element['#title'] : t('Location')];
       $form_state->setError($element['value'], t('The @title is not valid.', $t_args));
     }
diff --git a/web/modules/webform/src/Element/WebformMapping.php b/web/modules/webform/src/Element/WebformMapping.php
index 3c9359493c..39467b15e3 100644
--- a/web/modules/webform/src/Element/WebformMapping.php
+++ b/web/modules/webform/src/Element/WebformMapping.php
@@ -4,6 +4,7 @@
 
 use Drupal\Component\Utility\NestedArray;
 use Drupal\Core\Form\FormStateInterface;
+use Drupal\Core\Render\Element;
 use Drupal\Core\Render\Element\FormElement;
 use Drupal\webform\Utility\WebformElementHelper;
 use Drupal\webform\Utility\WebformOptionsHelper;
@@ -189,8 +190,10 @@ public static function validateWebformMapping(&$element, FormStateInterface $for
 
     // Note: Not validating REQUIRED_ALL because each destination element is
     // already required.
-    $has_access = (!isset($element['#access']) || $element['#access'] === TRUE);
-    if ($element['#required'] && $element['#required'] !== static::REQUIRED_ALL && empty($value) && $has_access) {
+    if (Element::isVisibleElement($element)
+      && $element['#required']
+      && $element['#required'] !== static::REQUIRED_ALL
+      && empty($value)) {
       WebformElementHelper::setRequiredError($element, $form_state);
     }
 
diff --git a/web/modules/webform/src/Element/WebformMultiple.php b/web/modules/webform/src/Element/WebformMultiple.php
index 2f510a1dbf..dc6923adbf 100644
--- a/web/modules/webform/src/Element/WebformMultiple.php
+++ b/web/modules/webform/src/Element/WebformMultiple.php
@@ -611,7 +611,7 @@ protected static function buildElementRow($table_id, $row_index, array $element,
           //
           // WORKAROUND:
           // Convert element to rendered hidden element.
-          if (!isset($element['#access']) || $element['#access'] !== FALSE) {
+          if (Element::isVisibleElement($element)) {
             $hidden_elements[$child_key]['#type'] = 'hidden';
             // Unset #access, #element_validate, and #pre_render.
             // @see \Drupal\webform\Plugin\WebformElementBase::prepare()
@@ -719,15 +719,7 @@ protected static function buildElementRow($table_id, $row_index, array $element,
    *   TRUE if the element is hidden.
    */
   protected static function isHidden(array $element) {
-    if (isset($element['#access']) && $element['#access'] === FALSE) {
-      return TRUE;
-    }
-    elseif (isset($element['#type']) && in_array($element['#type'], ['hidden', 'value'])) {
-      return TRUE;
-    }
-    else {
-      return FALSE;
-    }
+    return !Element::isVisibleElement($element);
   }
 
   /**
diff --git a/web/modules/webform/src/Element/WebformOtherBase.php b/web/modules/webform/src/Element/WebformOtherBase.php
index 19d1d55976..4a3a083800 100644
--- a/web/modules/webform/src/Element/WebformOtherBase.php
+++ b/web/modules/webform/src/Element/WebformOtherBase.php
@@ -5,6 +5,7 @@
 use Drupal\Component\Utility\NestedArray;
 use Drupal\Core\Form\FormStateInterface;
 use Drupal\Core\Form\OptGroup;
+use Drupal\Core\Render\Element;
 use Drupal\Core\Render\Element\FormElement;
 use Drupal\webform\Utility\WebformElementHelper;
 use Drupal\webform\Utility\WebformOptionsHelper;
@@ -209,9 +210,6 @@ public static function processWebformOther(&$element, FormStateInterface $form_s
   public static function validateWebformOther(&$element, FormStateInterface $form_state, &$complete_form) {
     $type = static::getElementType();
 
-    // Determine if the element is visible. (#access !== FALSE)
-    $has_access = (!isset($element['#access']) || $element['#access'] === TRUE);
-
     // Determine if the element has multiple values.
     $is_multiple = static::isMultiple($element);
 
@@ -239,7 +237,7 @@ public static function validateWebformOther(&$element, FormStateInterface $form_
     $other_is_empty = (isset($element_value[static::OTHER_OPTION]) && $other_value === '');
 
     // Display missing other or missing value error.
-    if ($has_access) {
+    if (Element::isVisibleElement($element)) {
       $required_error_title = (isset($element['#title'])) ? $element['#title'] : NULL;
       if ($other_is_empty) {
         WebformElementHelper::setRequiredError($element['other'], $form_state, $required_error_title);
diff --git a/web/modules/webform/src/Element/WebformRating.php b/web/modules/webform/src/Element/WebformRating.php
index 5ff2dd33cd..903d4a7885 100644
--- a/web/modules/webform/src/Element/WebformRating.php
+++ b/web/modules/webform/src/Element/WebformRating.php
@@ -144,8 +144,7 @@ public static function buildRateIt(array $element) {
    */
   public static function validateWebformRating(&$element, FormStateInterface $form_state, &$complete_form) {
     $value = $element['#value'];
-    $has_access = (!isset($element['#access']) || $element['#access'] === TRUE);
-    if ($has_access && !empty($element['#required']) && ($value === '0' || $value === '')) {
+    if (Element::isVisibleElement($element) && !empty($element['#required']) && ($value === '0' || $value === '')) {
       WebformElementHelper::setRequiredError($element, $form_state);
     }
   }
diff --git a/web/modules/webform/src/Element/WebformTime.php b/web/modules/webform/src/Element/WebformTime.php
index 7c34e64f47..019812fe91 100644
--- a/web/modules/webform/src/Element/WebformTime.php
+++ b/web/modules/webform/src/Element/WebformTime.php
@@ -98,7 +98,7 @@ public static function processWebformTime(&$element, FormStateInterface $form_st
    * Note that #required is validated by _form_valistatic::formatTime() already.
    */
   public static function validateWebformTime(&$element, FormStateInterface $form_state, &$complete_form) {
-    $has_access = (!isset($element['#access']) || $element['#access'] === TRUE);
+    $has_access = Element::isVisibleElement($element);
 
     $value = $element['#value'];
     if (trim($value) === '') {
diff --git a/web/modules/webform/src/Entity/Webform.php b/web/modules/webform/src/Entity/Webform.php
index a01b4fc1a4..c45948c73c 100644
--- a/web/modules/webform/src/Entity/Webform.php
+++ b/web/modules/webform/src/Entity/Webform.php
@@ -1094,6 +1094,8 @@ public static function getDefaultSettings() {
       'wizard_progress_link' => FALSE,
       'wizard_progress_states' => FALSE,
       'wizard_auto_forward' => TRUE,
+      'wizard_auto_forward_hide_next_button' => FALSE,
+      'wizard_keyboard' => TRUE,
       'wizard_start_label' => '',
       'wizard_preview_link' => FALSE,
       'wizard_confirmation' => TRUE,
@@ -1149,6 +1151,7 @@ public static function getDefaultSettings() {
       'results_customize' => FALSE,
       'token_view' => FALSE,
       'token_update' => FALSE,
+      'serial_disabled' => FALSE,
     ];
   }
 
@@ -1771,6 +1774,9 @@ public function setElementProperties($key, array $properties, $parent_key = '')
    */
   protected function setElementPropertiesRecursive(array &$elements, $key, array $properties, $parent_key = '') {
     foreach ($elements as $element_key => &$element) {
+      // Make sure the element key is a string.
+      $element_key = (string) $element_key;
+
       if (!WebformElementHelper::isElement($element, $element_key)) {
         continue;
       }
@@ -1834,6 +1840,9 @@ public function deleteElement($key) {
    */
   protected function deleteElementRecursive(array &$elements, $key) {
     foreach ($elements as $element_key => &$element) {
+      // Make sure the element key is a string.
+      $element_key = (string) $element_key;
+
       if (!WebformElementHelper::isElement($element, $element_key)) {
         continue;
       }
@@ -3041,6 +3050,17 @@ public function hasUserData($key) {
     return (isset($values[$key])) ? TRUE : FALSE;
   }
 
+  /****************************************************************************/
+  // Third party settings.
+  /****************************************************************************/
+
+  /**
+   * {@inheritdoc}
+   */
+  public function unsetThirdPartySettings($module) {
+    unset($this->third_party_settings[$module]);
+  }
+
   /****************************************************************************/
   // Dependency.
   /****************************************************************************/
diff --git a/web/modules/webform/src/Entity/WebformSubmission.php b/web/modules/webform/src/Entity/WebformSubmission.php
index b23c0c4204..74b1395fec 100644
--- a/web/modules/webform/src/Entity/WebformSubmission.php
+++ b/web/modules/webform/src/Entity/WebformSubmission.php
@@ -12,6 +12,7 @@
 use Drupal\Core\Entity\EntityTypeInterface;
 use Drupal\Core\Entity\EntityChangedTrait;
 use Drupal\Core\Session\AccountInterface;
+use Drupal\Core\Site\Settings;
 use Drupal\Core\StringTranslation\StringTranslationTrait;
 use Drupal\user\Entity\User;
 use Drupal\user\UserInterface;
@@ -114,6 +115,12 @@ class WebformSubmission extends ContentEntityBase implements WebformSubmissionIn
    */
   protected $computedData = [];
 
+  /**
+   * The data hashed.
+   *
+   * @var string
+   */
+  protected $dataHash;
   /**
    * Flag to indicated if submission is being converted from anonymous to authenticated.
    *
@@ -402,6 +409,7 @@ public function setElementData($key, $value) {
     if ($this->getWebform()->getElement($key)) {
       $this->data[$key] = $value;
       $this->computedData = NULL;
+      $this->dataHash = NULL;
     }
     return $this;
   }
@@ -453,6 +461,7 @@ public function getData() {
   public function setData(array $data) {
     $this->data = $data;
     $this->computedData = NULL;
+    $this->dataHash = NULL;
     return $this;
   }
 
@@ -478,6 +487,17 @@ public function getElementOriginalData($key) {
     return (isset($this->originalData[$key])) ? $this->originalData[$key] : NULL;
   }
 
+  /**
+   * {@inheritdoc}
+   */
+  public function getDataHash() {
+    if (isset($this->dataHash)) {
+      return $this->dataHash;
+    }
+    $this->dataHash = Crypt::hmacBase64(serialize($this->getRawData()), Settings::getHashSalt());
+    return $this->dataHash;
+  }
+
   /**
    * {@inheritdoc}
    */
diff --git a/web/modules/webform/src/EntitySettings/WebformEntitySettingsFormForm.php b/web/modules/webform/src/EntitySettings/WebformEntitySettingsFormForm.php
index 7133134825..3ebb1c74fb 100644
--- a/web/modules/webform/src/EntitySettings/WebformEntitySettingsFormForm.php
+++ b/web/modules/webform/src/EntitySettings/WebformEntitySettingsFormForm.php
@@ -358,12 +358,34 @@ public function form(array $form, FormStateInterface $form_state) {
     ];
     $form['wizard_settings']['wizard_auto_forward'] = [
       '#type' => 'checkbox',
-      '#title' => $this->t("Auto-forward to next page when a page with a single click-able input is completed"),
-      '#description' => $this->t("If checked, the used will be moved to the next page when a single click-able input is checked (i.e. radios, rating, and image select)."),
+      '#title' => $this->t('Auto-forward to next card when a card with a single click-able input is completed'),
+      '#description' => $this->t('If checked, the used will be moved to the next card when a single click-able input is checked (i.e. radios, rating, and image select).'),
       '#return_value' => TRUE,
       '#default_value' => $settings['wizard_auto_forward'],
       '#access' => FALSE,
     ];
+    $form['wizard_settings']['wizard_auto_forward_hide_next_button'] = [
+      '#type' => 'checkbox',
+      '#title' => $this->t('Hide the next button when auto-forwarding'),
+      '#description' => $this->t('If checked, the next button will be hidden when the input is not filled and can be auto-forwarded.'),
+      '#return_value' => TRUE,
+      '#default_value' => $settings['wizard_auto_forward_hide_next_button'],
+      '#access' => FALSE,
+      '#states' => [
+        'visible' => [
+          ':input[name="wizard_auto_forward]' => ['checked' => TRUE],
+        ],
+      ],
+    ];
+    $form['wizard_settings']['wizard_keyboard'] = [
+      '#type' => 'checkbox',
+      '#title' => $this->t('Navigate between cards using left or right arrow keys'),
+      '#description' => $this->t('If checked, users will be able to move between cards using the left or right arrow keys.'),
+      '#return_value' => TRUE,
+      '#default_value' => $settings['wizard_keyboard'],
+      '#access' => FALSE,
+    ];
+
     $form['wizard_settings']['wizard_confirmation'] = [
       '#type' => 'checkbox',
       '#title' => $this->t('Include confirmation page in progress'),
diff --git a/web/modules/webform/src/EntitySettings/WebformEntitySettingsGeneralForm.php b/web/modules/webform/src/EntitySettings/WebformEntitySettingsGeneralForm.php
index 6922d25b2a..12850b01b0 100644
--- a/web/modules/webform/src/EntitySettings/WebformEntitySettingsGeneralForm.php
+++ b/web/modules/webform/src/EntitySettings/WebformEntitySettingsGeneralForm.php
@@ -556,8 +556,13 @@ public function save(array $form, FormStateInterface $form_state) {
     if (isset($values['third_party_settings'])) {
       $third_party_settings = $values['third_party_settings'];
       foreach ($third_party_settings as $module => $third_party_setting) {
-        foreach ($third_party_setting as $key => $value) {
-          $webform->setThirdPartySetting($module, $key, $value);
+        if (empty($third_party_setting)) {
+          $webform->unsetThirdPartySettings($module);
+        }
+        else {
+          foreach ($third_party_setting as $key => $value) {
+            $webform->setThirdPartySetting($module, $key, $value);
+          }
         }
       }
       // Remove third party settings.
diff --git a/web/modules/webform/src/EntitySettings/WebformEntitySettingsSubmissionsForm.php b/web/modules/webform/src/EntitySettings/WebformEntitySettingsSubmissionsForm.php
index 3d25494399..6b041b0d29 100644
--- a/web/modules/webform/src/EntitySettings/WebformEntitySettingsSubmissionsForm.php
+++ b/web/modules/webform/src/EntitySettings/WebformEntitySettingsSubmissionsForm.php
@@ -117,6 +117,18 @@ public function form(array $form, FormStateInterface $form_state) {
       '#description' => $this->t('The value of the next submission number. This is usually 1 when you start and will go up with each webform submission.'),
       '#min' => 1,
       '#default_value' => $webform_storage->getNextSerial($webform),
+      '#states' => [
+        'visible' => [
+          ':input[name="serial_disabled"]' => ['checked' => FALSE],
+        ]
+      ],
+    ];
+    $form['submission_settings']['serial_disabled'] = [
+      '#type' => 'checkbox',
+      '#title' => $this->t('Disable next submission number'),
+      '#description' => $this->t('If checked the next number will be automatically set to the internal submission id.'),
+      '#return_value' => TRUE,
+      '#default_value' => $settings['serial_disabled'],
     ];
     $form['submission_settings']['token_tree_link'] = $this->tokenManager->buildTreeElement();
     $form['submission_settings']['submission_container']['elements'] = [
diff --git a/web/modules/webform/src/Form/AdminConfig/WebformAdminConfigAdvancedForm.php b/web/modules/webform/src/Form/AdminConfig/WebformAdminConfigAdvancedForm.php
index 2317863553..dc57580db4 100644
--- a/web/modules/webform/src/Form/AdminConfig/WebformAdminConfigAdvancedForm.php
+++ b/web/modules/webform/src/Form/AdminConfig/WebformAdminConfigAdvancedForm.php
@@ -110,6 +110,14 @@ public function buildForm(array $form, FormStateInterface $form_state) {
       ],
       '#default_value' => $config->get('ui.video_display'),
     ];
+    $form['ui']['toolbar_item'] = [
+      '#type' => 'checkbox',
+      '#title' => $this->t('Display Webforms as a top-level administration menu item in the toolbar'),
+      '#description' => $this->t('If checked, the Webforms section will be displayed as a top-level administration menu item in the toolbar.'),
+      '#return_value' => TRUE,
+      '#default_value' => $config->get('ui.toolbar_item'),
+      '#access' => $this->moduleHandler->moduleExists('toolbar'),
+    ];
     $form['ui']['description_help'] = [
       '#type' => 'checkbox',
       '#title' => $this->t('Display element description as help text (tooltip)'),
@@ -181,6 +189,15 @@ public function buildForm(array $form, FormStateInterface $form_state) {
       '#return_value' => TRUE,
       '#default_value' => $config->get('requirements.cdn'),
     ];
+
+    $form['requirements']['clientside_validation'] = [
+      '#type' => 'checkbox',
+      '#title' => $this->t('Check if Webform Clientside Validation module is installed when using the Clientside Validation module'),
+      '#description' => $this->t('If unchecked, all warnings about the Webform Clientside Validation will be disabled.'),
+      '#return_value' => TRUE,
+      '#default_value' => $config->get('requirements.clientside_validation'),
+    ];
+
     $form['requirements']['bootstrap'] = [
       '#type' => 'checkbox',
       '#title' => $this->t('Check if the Webform Bootstrap Integration module is installed when using the Bootstrap theme'),
@@ -363,11 +380,12 @@ public function submitForm(array &$form, FormStateInterface $form_state) {
       // Track if help is disabled.
       // @todo Figure out how to clear cached help block.
       $is_help_disabled = ($config->getOriginal('ui.help_disabled') !== $config->get('ui.help_disabled'));
+      $is_toolbar_item = ($config->getOriginal('ui.toolbar_item') !== $config->get('ui.toolbar_item'));
 
       parent::submitForm($form, $form_state);
 
       // Clear cached data.
-      if ($is_help_disabled) {
+      if ($is_help_disabled || $is_toolbar_item) {
         // Flush cache when help is being enabled.
         // @see webform_help()
         drupal_flush_all_caches();
@@ -379,6 +397,14 @@ public function submitForm(array &$form, FormStateInterface $form_state) {
         $this->renderCache->deleteAll();
         $this->routerBuilder->rebuild();
       }
+
+      // Redirect to the update advanced admin configuration form.
+      if ($is_toolbar_item) {
+        $path = $config->get('ui.toolbar_item')
+          ? '/admin/webform/config/advanced'
+          : '/admin/structure/webform/config/advanced';
+        $form_state->setRedirectUrl(Url::fromUserInput($path));
+      }
     }
   }
 
diff --git a/web/modules/webform/src/Form/AdminConfig/WebformAdminConfigFormsForm.php b/web/modules/webform/src/Form/AdminConfig/WebformAdminConfigFormsForm.php
index a9d8259647..4c3f78106c 100644
--- a/web/modules/webform/src/Form/AdminConfig/WebformAdminConfigFormsForm.php
+++ b/web/modules/webform/src/Form/AdminConfig/WebformAdminConfigFormsForm.php
@@ -247,6 +247,13 @@ public function buildForm(array $form, FormStateInterface $form_state) {
       '#size' => 20,
       '#default_value' => $settings['default_reset_button_label'],
     ];
+    $form['form_settings']['default_delete_button_label'] = [
+      '#type' => 'textfield',
+      '#title' => $this->t('Default delete button label'),
+      '#required' => TRUE,
+      '#size' => 20,
+      '#default_value' => $settings['default_delete_button_label'],
+    ];
     $form['form_settings']['form_classes'] = [
       '#type' => 'webform_codemirror',
       '#title' => $this->t('Form CSS classes'),
diff --git a/web/modules/webform/src/Form/WebformHandlerFormBase.php b/web/modules/webform/src/Form/WebformHandlerFormBase.php
index b430bbe42f..65944cd3fe 100644
--- a/web/modules/webform/src/Form/WebformHandlerFormBase.php
+++ b/web/modules/webform/src/Form/WebformHandlerFormBase.php
@@ -189,6 +189,13 @@ public function buildForm(array $form, FormStateInterface $form_state, WebformIn
         'exists' => [$this, 'exists'],
       ],
     ];
+    $form['general']['notes'] = [
+      '#type' => 'textarea',
+      '#title' => $this->t('Administrative notes'),
+      '#description' => $this->t("Entered text will be displayed on the handlers administrative page and replace this handler's default description."),
+      '#rows' => 2,
+      '#default_value' => $this->webformHandler->getNotes(),
+    ];
 
     $form['advanced'] = [
       '#type' => 'fieldset',
@@ -317,6 +324,7 @@ public function submitForm(array &$form, FormStateInterface $form_state) {
 
     $this->webformHandler->setHandlerId($form_state->getValue('handler_id'));
     $this->webformHandler->setLabel($form_state->getValue('label'));
+    $this->webformHandler->setNotes($form_state->getValue('notes'));
     $this->webformHandler->setStatus($form_state->getValue('status'));
     $this->webformHandler->setWeight($form_state->getValue('weight'));
     // Clear conditions if conditions or handler is disabled.
diff --git a/web/modules/webform/src/Form/WebformVariantFormBase.php b/web/modules/webform/src/Form/WebformVariantFormBase.php
index ae8ea6bdbd..fd220ab4ff 100644
--- a/web/modules/webform/src/Form/WebformVariantFormBase.php
+++ b/web/modules/webform/src/Form/WebformVariantFormBase.php
@@ -175,6 +175,8 @@ public function buildForm(array $form, FormStateInterface $form_state, WebformIn
     $form['general']['notes'] = [
       '#type' => 'textarea',
       '#title' => $this->t('Administrative notes'),
+      '#description' => $this->t("Entered text will be displayed on the variants administrative page."),
+      '#rows' => 2,
       '#default_value' => $this->webformVariant->getNotes(),
     ];
 
diff --git a/web/modules/webform/src/Plugin/Block/WebformBlock.php b/web/modules/webform/src/Plugin/Block/WebformBlock.php
index a3fab272bc..69fcaa0525 100644
--- a/web/modules/webform/src/Plugin/Block/WebformBlock.php
+++ b/web/modules/webform/src/Plugin/Block/WebformBlock.php
@@ -9,6 +9,7 @@
 use Drupal\Core\Form\FormStateInterface;
 use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
 use Drupal\Core\Session\AccountInterface;
+use Drupal\webform\Utility\WebformYaml;
 use Drupal\webform\WebformInterface;
 use Drupal\webform\WebformTokenManagerInterface;
 use Symfony\Component\DependencyInjection\ContainerInterface;
@@ -194,7 +195,7 @@ public function build() {
     $build = [
       '#type' => 'webform',
       '#webform' => $this->getWebform(),
-      '#default_data' => $this->configuration['default_data'],
+      '#default_data' => WebformYaml::decode($this->configuration['default_data']),
     ];
 
     // If redirect, set the #action property on the form.
diff --git a/web/modules/webform/src/Plugin/Field/FieldFormatter/WebformEntityReferenceEntityFormatter.php b/web/modules/webform/src/Plugin/Field/FieldFormatter/WebformEntityReferenceEntityFormatter.php
index c13056eb3c..b2d645c166 100644
--- a/web/modules/webform/src/Plugin/Field/FieldFormatter/WebformEntityReferenceEntityFormatter.php
+++ b/web/modules/webform/src/Plugin/Field/FieldFormatter/WebformEntityReferenceEntityFormatter.php
@@ -12,7 +12,9 @@
 use Drupal\Core\Field\FieldDefinitionInterface;
 use Drupal\Core\Render\RendererInterface;
 use Drupal\Core\Routing\RouteMatchInterface;
+use Drupal\webform\Plugin\WebformSourceEntityManager;
 use Drupal\webform\WebformMessageManagerInterface;
+use Drupal\webform\WebformRequestInterface;
 use Symfony\Component\DependencyInjection\ContainerInterface;
 
 /**
@@ -50,6 +52,13 @@ class WebformEntityReferenceEntityFormatter extends WebformEntityReferenceFormat
    */
   protected $messageManager;
 
+  /**
+   * Webform request handler.
+   *
+   * @var \Drupal\webform\WebformRequestInterface
+   */
+  protected $requestHandler;
+
   /**
    * WebformEntityReferenceEntityFormatter constructor.
    *
@@ -77,13 +86,16 @@ class WebformEntityReferenceEntityFormatter extends WebformEntityReferenceFormat
    *   The entity type manager.
    * @param \Drupal\webform\WebformMessageManagerInterface $message_manager
    *   The webform message manager.
+   * @param \Drupal\webform\WebformRequestInterface $request_handler
+   *   The webform request handler.
    */
-  public function __construct($plugin_id, $plugin_definition, FieldDefinitionInterface $field_definition, array $settings, $label, $view_mode, array $third_party_settings, RendererInterface $renderer, ConfigFactoryInterface $config_factory, RouteMatchInterface $route_match, EntityTypeManagerInterface $entity_type_manager, WebformMessageManagerInterface $message_manager) {
+  public function __construct($plugin_id, $plugin_definition, FieldDefinitionInterface $field_definition, array $settings, $label, $view_mode, array $third_party_settings, RendererInterface $renderer, ConfigFactoryInterface $config_factory, RouteMatchInterface $route_match, EntityTypeManagerInterface $entity_type_manager, WebformMessageManagerInterface $message_manager, WebformRequestInterface $request_handler = NULL) {
     parent::__construct($plugin_id, $plugin_definition, $field_definition, $settings, $label, $view_mode, $third_party_settings, $renderer, $config_factory);
 
     $this->routeMatch = $route_match;
     $this->entityTypeManager = $entity_type_manager;
     $this->messageManager = $message_manager;
+    $this->requestHandler = $request_handler ?: \Drupal::service('webform.request');
   }
 
   /**
@@ -102,7 +114,8 @@ public static function create(ContainerInterface $container, array $configuratio
       $container->get('config.factory'),
       $container->get('current_route_match'),
       $container->get('entity_type.manager'),
-      $container->get('webform.message_manager')
+      $container->get('webform.message_manager'),
+      $container->get('webform.request')
     );
   }
 
@@ -153,21 +166,35 @@ public function settingsForm(array $form, FormStateInterface $form_state) {
    * {@inheritdoc}
    */
   public function viewElements(FieldItemListInterface $items, $langcode) {
-    // Get source entity, which is the entity that the webform
+    // Get items entity, which is the entity that the webform
     // is directly attached to. For Paragraphs this would be the field's
     // paragraph entity.
-    $source_entity = $items->getEntity();
+    $items_entity = $items->getEntity();
+
+    // Get the items main entity. For Paragraphs this would be the parent entity
+    // of the the paragraph field.
+    $items_main_entity = WebformSourceEntityManager::getMainSourceEntity($items_entity);
+
+    $request_source_entity = $this->requestHandler->getCurrentSourceEntity();
 
     // Determine if webform is previewed within a Paragraph on
-    // node edit forms (via *.edit_form or .content_translation_add routes).
-    $route = $this->routeMatch->getRouteName();
-    $is_node_edit = (preg_match('/\.edit_form$/', $route) || preg_match('/\.content_translation_add$/', $route));
-    $is_paragraph = ($source_entity && $source_entity->getEntityTypeId() === 'paragraph');
-    $is_paragraph_node_edit = ($is_paragraph && $is_node_edit);
+    // entity edit forms (via *.edit_form or .content_translation_add routes).
+    $route_name = $this->routeMatch->getRouteName();
+    $is_entity_edit_form = (preg_match('/\.edit_form$/', $route_name)
+      || preg_match('/\.content_translation_add$/', $route_name)
+      || in_array($route_name, ['entity.block_content.canonical']));
+
+    $is_paragraph = ($items_entity && $items_entity->getEntityTypeId() === 'paragraph');
+
+    $is_paragraph_current_source_entity = ($items_main_entity && $request_source_entity)
+      && ($items_main_entity->getEntityTypeId() === $request_source_entity->getEntityTypeId())
+      && ($items_main_entity->id() === $request_source_entity->id());
+
+    $is_paragraph_entity_edit_form = ($is_entity_edit_form && $is_paragraph && $is_paragraph_current_source_entity);
 
     $elements = [];
     foreach ($this->getEntitiesToView($items, $langcode) as $delta => $entity) {
-      if ($is_paragraph_node_edit) {
+      if ($is_paragraph_entity_edit_form) {
         // Webform can not be nested within node edit form because the nested
         // <form> tags will cause unexpected validation issues.
         $elements[$delta] = [
@@ -181,7 +208,7 @@ public function viewElements(FieldItemListInterface $items, $langcode) {
           '#type' => 'webform',
           '#webform' => $entity,
           '#default_data' => (!empty($items[$delta]->default_data)) ? Yaml::decode($items[$delta]->default_data) : [],
-          '#entity' => ($this->getSetting('source_entity')) ? $source_entity : NULL,
+          '#entity' => ($this->getSetting('source_entity')) ? $items_entity : NULL,
         ];
       }
       $this->setCacheContext($elements[$delta], $entity, $items[$delta]);
diff --git a/web/modules/webform/src/Plugin/Field/FieldType/WebformEntityReferenceItem.php b/web/modules/webform/src/Plugin/Field/FieldType/WebformEntityReferenceItem.php
index 1d40b13ef0..4097862296 100644
--- a/web/modules/webform/src/Plugin/Field/FieldType/WebformEntityReferenceItem.php
+++ b/web/modules/webform/src/Plugin/Field/FieldType/WebformEntityReferenceItem.php
@@ -112,17 +112,10 @@ public static function getPreconfiguredOptions() {
    * {@inheritdoc}
    */
   public function getSettableOptions(AccountInterface $account = NULL) {
-    $options = parent::getSettableOptions($account);
-
-    // Remove all templates.
-    if ($options && \Drupal::moduleHandler()->moduleExists('webform_templates')) {
-      /** @var \Drupal\webform\WebformEntityStorageInterface $webform_storage */
-      $webform_storage = \Drupal::service('entity_type.manager')->getStorage('webform');
-      $webform_templates = $webform_storage->loadByProperties(['template' => TRUE]);
-      $options = array_diff_key($options, $webform_templates);
-    }
-
-    return $options;
+    // Get webform options grouped by category.
+    /** @var \Drupal\webform\WebformEntityStorageInterface $webform_storage */
+    $webform_storage = \Drupal::service('entity_type.manager')->getStorage('webform');
+    return $webform_storage->getOptions(FALSE);
   }
 
 }
diff --git a/web/modules/webform/src/Plugin/Field/FieldWidget/WebformEntityReferenceSelectWidget.php b/web/modules/webform/src/Plugin/Field/FieldWidget/WebformEntityReferenceSelectWidget.php
index 83fd6a4068..0e7ea5369f 100644
--- a/web/modules/webform/src/Plugin/Field/FieldWidget/WebformEntityReferenceSelectWidget.php
+++ b/web/modules/webform/src/Plugin/Field/FieldWidget/WebformEntityReferenceSelectWidget.php
@@ -27,6 +27,16 @@ class WebformEntityReferenceSelectWidget extends OptionsWidgetBase {
 
   use WebformEntityReferenceWidgetTrait;
 
+  /**
+   * {@inheritdoc}
+   */
+  public static function defaultSettings() {
+    return [
+      'default_data' => TRUE,
+      'webforms' => [],
+    ] + parent::defaultSettings();
+  }
+
   /**
    * {@inheritdoc}
    */
@@ -89,14 +99,26 @@ public static function validateWebformEntityReferenceSelectWidget(&$element, For
    */
   protected function getOptions(FieldableEntityInterface $entity) {
     if (!isset($this->options)) {
-      // Limit the settable options for the current user account.
-      // Note: All active webforms are returned and grouped by category.
-      // @see \Drupal\webform\Plugin\Field\FieldType\WebformEntityReferenceItem::getSettableOptions
-      // @see \Drupal\webform\WebformEntityStorageInterface::getOptions
-      $options = $this->fieldDefinition
-        ->getFieldStorageDefinition()
-        ->getOptionsProvider($this->column, $entity)
-        ->getSettableOptions(\Drupal::currentUser());
+      $webform_ids = $this->getSetting('webforms');
+      if ($webform_ids) {
+        $webforms = Webform::loadMultiple($webform_ids);
+        $options = [];
+        foreach ($webforms as $webform) {
+          $options[$webform->id()] = $webform->label();
+        }
+        asort($options);
+      }
+      else {
+        // Limit the settable options for the current user account.
+        // Note: All active webforms are returned and grouped by category.
+        // @see \Drupal\webform\Plugin\Field\FieldType\WebformEntityReferenceItem::getSettableOptions
+        // @see \Drupal\webform\WebformEntityStorageInterface::getOptions
+        $options = $this->fieldDefinition
+          ->getFieldStorageDefinition()
+          ->getOptionsProvider($this->column, $entity)
+          ->getSettableOptions(\Drupal::currentUser());
+
+      }
 
       $module_handler = \Drupal::moduleHandler();
       $context = [
diff --git a/web/modules/webform/src/Plugin/Field/FieldWidget/WebformEntityReferenceWidgetTrait.php b/web/modules/webform/src/Plugin/Field/FieldWidget/WebformEntityReferenceWidgetTrait.php
index 509397d3dc..9b862b8c99 100644
--- a/web/modules/webform/src/Plugin/Field/FieldWidget/WebformEntityReferenceWidgetTrait.php
+++ b/web/modules/webform/src/Plugin/Field/FieldWidget/WebformEntityReferenceWidgetTrait.php
@@ -9,6 +9,7 @@
 use Drupal\webform\Entity\Webform;
 use Drupal\webform\Utility\WebformDateHelper;
 use Drupal\webform\WebformInterface;
+use Symfony\Component\DependencyInjection\ContainerInterface;
 
 /**
  * Trait for webform entity reference and autocomplete widget.
@@ -17,12 +18,29 @@ trait WebformEntityReferenceWidgetTrait {
 
   use WebformAjaxElementTrait;
 
+  /**
+   * Webform element manager.
+   *
+   * @var \Drupal\webform\Plugin\WebformElementManagerInterface
+   */
+  protected $elementManager;
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
+    $instance = parent::create($container, $configuration, $plugin_id, $plugin_definition);
+    $instance->elementManager = $container->get('plugin.manager.webform.element');
+    return $instance;
+  }
+
   /**
    * {@inheritdoc}
    */
   public static function defaultSettings() {
     return [
       'default_data' => TRUE,
+      'webforms' => NULL,
     ] + parent::defaultSettings();
   }
 
@@ -37,6 +55,19 @@ public function settingsForm(array $form, FormStateInterface $form_state) {
       '#description' => t('If checked, site builders will be able to define default submission data (YAML)'),
       '#default_value' => $this->getSetting('default_data'),
     ];
+    if ($this->getSetting('webforms') !== NULL) {
+      $element['webforms'] = [
+        '#type' => 'webform_entity_select',
+        '#title' => t('Select webform'),
+        '#description' => t('If left blank all webforms will be listed in the select menu.'),
+        '#select2' => TRUE,
+        '#multiple' => TRUE,
+        '#target_type' => 'webform',
+        '#selection_handler' => 'default:webform',
+        '#default_value' => $this->getSetting('webforms'),
+      ];
+      $this->elementManager->processElement($element['webforms']);
+    }
     return $element;
   }
 
@@ -46,6 +77,15 @@ public function settingsForm(array $form, FormStateInterface $form_state) {
   public function settingsSummary() {
     $summary = parent::settingsSummary();
     $summary[] = t('Default submission data: @default_data', ['@default_data' => $this->getSetting('default_data') ? $this->t('Yes') : $this->t('No')]);
+    $webform_ids = $this->getSetting('webforms');
+    if ($webform_ids) {
+      $webforms = Webform::loadMultiple($webform_ids);
+      $webform_labels = [];
+      foreach ($webforms as $webform) {
+        $webform_labels[] = $webform->label();
+      }
+      $summary[] = t('Webforms: @webforms', ['@webforms' => implode('; ', $webform_labels)]);
+    }
     return $summary;
   }
 
@@ -120,7 +160,7 @@ public function formElement(FieldItemListInterface $items, $delta, array $elemen
       '#weight' => $weight++,
     ];
 
-    // Disable a warning message about the webform's state using Ajax
+    // Disable a warning message about the webform's state using Ajax.
     $is_webform_closed = ($webform && $webform->isClosed());
     if ($is_webform_closed) {
       $t_args = [
@@ -238,6 +278,14 @@ public function formElement(FieldItemListInterface $items, $delta, array $elemen
       $element['settings']['token_tree_link'] = $token_manager->buildTreeElement($token_types);
       $token_manager->elementValidate($element['settings']['default_data'], $token_types);
     }
+    else {
+      // Preserve default data set by variants passed via the URL.
+      // @see webform_node_node_prepare_form().
+      $element['settings']['default_data'] = [
+        '#type' => 'value',
+        '#value' => $items[$delta]->default_data,
+      ];
+    }
 
     return $element;
   }
diff --git a/web/modules/webform/src/Plugin/WebformElement/Checkboxes.php b/web/modules/webform/src/Plugin/WebformElement/Checkboxes.php
index 348b3fc564..96e0120a43 100644
--- a/web/modules/webform/src/Plugin/WebformElement/Checkboxes.php
+++ b/web/modules/webform/src/Plugin/WebformElement/Checkboxes.php
@@ -67,7 +67,6 @@ public function hasMultipleValues(array $element) {
     return TRUE;
   }
 
-
   /**
    * {@inheritdoc}
    */
@@ -110,9 +109,9 @@ public function prepare(array &$element, WebformSubmissionInterface $webform_sub
 
     $element['#attached']['library'][] = 'webform/webform.element.checkboxes';
 
-    if (!empty($element['#options_all']) || !empty($element['#options_none']))
-    $element['#element_validate'][] = [get_class($this), 'validateCheckAllOrNone'];
-
+    if (!empty($element['#options_all']) || !empty($element['#options_none'])) {
+      $element['#element_validate'][] = [get_class($this), 'validateCheckAllOrNone'];
+    }
   }
 
   /**
@@ -199,15 +198,15 @@ public function form(array $form, FormStateInterface $form_state) {
           'required' => [[':input[name="properties[' . $option_type . ']"]' => ['checked' => TRUE]]],
         ],
       ];
+      $form['options'][$option_type . '_container']['#attributes']['data-webform-states-no-clear'] = TRUE;
       $form['options'][$option_type . '_container'][$option_type . '_value'] = [
         '#type' => 'textfield',
         '#title' => $this->t("@type option value", $t_args),
-
       ];
       $form['options'][$option_type . '_container'][$option_type . '_text'] = [
         '#type' => 'textfield',
         '#title' => $this->t("@type option text", $t_args),
-        '#attributes' => ['class' => ['webform-ui-element-form-inline--input-double-width']]
+        '#attributes' => ['class' => ['webform-ui-element-form-inline--input-double-width']],
       ];
     }
     return $form;
diff --git a/web/modules/webform/src/Plugin/WebformElement/EntityAutocomplete.php b/web/modules/webform/src/Plugin/WebformElement/EntityAutocomplete.php
index 8d005394a7..0b20e31e2e 100644
--- a/web/modules/webform/src/Plugin/WebformElement/EntityAutocomplete.php
+++ b/web/modules/webform/src/Plugin/WebformElement/EntityAutocomplete.php
@@ -131,16 +131,19 @@ public static function validateEntityAutocomplete(array &$element, FormStateInte
       return;
     }
 
-    if (empty($element['#webform_multiple'])) {
-      $form_state->setValueForElement($element, static::getEntityIdFromItem($value));
-    }
-    else {
+    /** @var \Drupal\webform\Plugin\WebformElementManagerInterface $element_manager */
+    $element_manager = \Drupal::service('plugin.manager.webform.element');
+    $element_plugin = $element_manager->getElementInstance($element);
+    if ($element_plugin->hasMultipleValues($element)) {
       $entity_ids = [];
       foreach ($value as $item) {
-        $entity_ids[] = static::getEntityIdFromItem($item);
+        $entity_ids[] = (string) static::getEntityIdFromItem($item);
       }
       $form_state->setValueForElement($element, $entity_ids);
     }
+    else {
+      $form_state->setValueForElement($element, (string) static::getEntityIdFromItem($value));
+    }
   }
 
   /**
diff --git a/web/modules/webform/src/Plugin/WebformElement/OptionsBase.php b/web/modules/webform/src/Plugin/WebformElement/OptionsBase.php
index de34a0d12a..adb7275846 100644
--- a/web/modules/webform/src/Plugin/WebformElement/OptionsBase.php
+++ b/web/modules/webform/src/Plugin/WebformElement/OptionsBase.php
@@ -262,7 +262,7 @@ public static function processOptionsProperties(&$element, FormStateInterface $f
     }
 
     foreach ($element['#options__properties'] as $option_key => $options__properties) {
-      if (!isset($element[$option_key])) {
+      if (!isset($element[$option_key]) || !is_array($options__properties)) {
         continue;
       }
 
@@ -1074,7 +1074,8 @@ public function form(array $form, FormStateInterface $form_state) {
     $form['options_properties'] = [
       '#type' => 'details',
       '#title' => $this->t('Options (custom) properties'),
-      '#access' => $this->currentUser->hasPermission('edit webform source'),
+      '#access' => $this->hasProperty('options__properties')
+        && $this->currentUser->hasPermission('edit webform source'),
     ];
     $form['options_properties']['options__properties'] = [
       '#type' => 'webform_codemirror',
diff --git a/web/modules/webform/src/Plugin/WebformElement/Radios.php b/web/modules/webform/src/Plugin/WebformElement/Radios.php
index 38b04fe2f3..4342b5c3b1 100644
--- a/web/modules/webform/src/Plugin/WebformElement/Radios.php
+++ b/web/modules/webform/src/Plugin/WebformElement/Radios.php
@@ -2,8 +2,6 @@
 
 namespace Drupal\webform\Plugin\WebformElement;
 
-use Drupal\webform\WebformSubmissionInterface;
-
 /**
  * Provides a 'radios' element.
  *
@@ -39,18 +37,6 @@ protected function defineDefaultProperties() {
 
   /****************************************************************************/
 
-  /**
-   * {@inheritdoc}
-   */
-  public function prepare(array &$element, WebformSubmissionInterface $webform_submission = NULL) {
-    parent::prepare($element, $webform_submission);
-
-    // Issue #2856795: If radio buttons are required but not filled form is
-    // nevertheless submitted.
-    // Issue #2856315: Conditional Logic - Requiring Radios in a Fieldset.
-    $element['#attached']['library'][] = 'webform/webform.element.radios';
-  }
-
   /**
    * {@inheritdoc}
    */
diff --git a/web/modules/webform/src/Plugin/WebformElement/Telephone.php b/web/modules/webform/src/Plugin/WebformElement/Telephone.php
index 8e62d10cfe..0111237467 100644
--- a/web/modules/webform/src/Plugin/WebformElement/Telephone.php
+++ b/web/modules/webform/src/Plugin/WebformElement/Telephone.php
@@ -89,7 +89,8 @@ public function prepare(array &$element, WebformSubmissionInterface $webform_sub
 
     // Add support for telephone_validation.module.
     if (\Drupal::moduleHandler()->moduleExists('telephone_validation')) {
-      $format = (int) $this->getElementProperty($element, 'telephone_validation_format');
+      $format = $this->getElementProperty($element, 'telephone_validation_format');
+      $format = ($format !== '') ? (int) $format : '';
       if ($format === \libphonenumber\PhoneNumberFormat::NATIONAL) {
         $country = (array) $this->getElementProperty($element, 'telephone_validation_country');
       }
diff --git a/web/modules/webform/src/Plugin/WebformElement/TextFormat.php b/web/modules/webform/src/Plugin/WebformElement/TextFormat.php
index d6fd56ee21..9d8ebe54b7 100644
--- a/web/modules/webform/src/Plugin/WebformElement/TextFormat.php
+++ b/web/modules/webform/src/Plugin/WebformElement/TextFormat.php
@@ -5,6 +5,7 @@
 use Drupal\Component\Serialization\Json;
 use Drupal\Core\Form\FormStateInterface;
 use Drupal\Core\Mail\MailFormatHelper;
+use Drupal\Core\Render\Element;
 use Drupal\filter\Entity\FilterFormat;
 use Drupal\user\Entity\User;
 use Drupal\webform\Plugin\WebformElementBase;
@@ -140,8 +141,8 @@ public static function afterBuild(array $element, FormStateInterface $form_state
     }
 
     // Hide filter format if the select menu and help is hidden.
-    if (!empty($element['#hide_help']) &&
-      isset($element['format']['format']['#access']) && $element['format']['format']['#access'] === FALSE) {
+    if (!empty($element['#hide_help'])
+      && !Element::isVisibleElement($element['format']['format'])) {
       // Can't hide the format via #access but we can use CSS.
       $element['format']['#attributes']['style'] = 'display: none';
     }
diff --git a/web/modules/webform/src/Plugin/WebformElement/Value.php b/web/modules/webform/src/Plugin/WebformElement/Value.php
index 53d41f611d..68550f1d67 100644
--- a/web/modules/webform/src/Plugin/WebformElement/Value.php
+++ b/web/modules/webform/src/Plugin/WebformElement/Value.php
@@ -2,6 +2,7 @@
 
 namespace Drupal\webform\Plugin\WebformElement;
 
+use Drupal\webform\Plugin\WebformElementBase;
 use Drupal\webform\WebformInterface;
 
 /**
@@ -15,7 +16,7 @@
  *   category = @Translation("Advanced elements"),
  * )
  */
-class Value extends TextBase {
+class Value extends WebformElementBase {
 
   /**
    * {@inheritdoc}
diff --git a/web/modules/webform/src/Plugin/WebformElement/WebformActions.php b/web/modules/webform/src/Plugin/WebformElement/WebformActions.php
index e35c65fbb4..80742a27fc 100644
--- a/web/modules/webform/src/Plugin/WebformElement/WebformActions.php
+++ b/web/modules/webform/src/Plugin/WebformElement/WebformActions.php
@@ -30,11 +30,14 @@ protected function defineDefaultProperties() {
       // Attributes.
       'attributes' => [],
     ] + $this->defineDefaultBaseProperties();
-    foreach (WebformActionsElement::$buttons as $button) {
+    $buttons = array_merge(WebformActionsElement::$buttons, ['update']);
+    foreach ($buttons as $button) {
       $properties[$button . '_hide'] = FALSE;
       $properties[$button . '__label'] = '';
       $properties[$button . '__attributes'] = [];
     }
+    $properties['delete_hide'] = TRUE;
+    $properties['delete__dialog'] = FALSE;
     return $properties;
   }
 
@@ -134,7 +137,7 @@ public function form(array $form, FormStateInterface $form_state) {
       ],
       'update' => [
         'title' => $this->t('Update'),
-        'label' => $this->t('Update'),
+        'label' => $this->t('update'),
         'description' => $this->t('This is used after a submission has been saved and finalized to the database.'),
         'access' => !$webform->isResultsDisabled(),
       ],
@@ -162,6 +165,12 @@ public function form(array $form, FormStateInterface $form_state) {
         'description' => $this->t('The text for the button that will proceed to the preview page.'),
         'access' => $preview_enabled,
       ],
+      'delete' => [
+        'title' => $this->t('Delete'),
+        'label' => $this->t('delete'),
+        'description' => $this->t('This is displayed after a draft or submission has been saved to the database. The delete button is also included within the submission information.'),
+        'access' => !$webform->isResultsDisabled(),
+      ],
     ];
 
     foreach ($buttons as $name => $button) {
@@ -180,7 +189,7 @@ public function form(array $form, FormStateInterface $form_state) {
       ];
       if (!empty($button['description'])) {
         $form[$name . '_settings']['description'] = [
-          '#markup' => $button['description'],
+          '#markup' => '<p>' . $button['description'] . '</p>',
           '#access' => TRUE,
         ];
       }
@@ -189,7 +198,7 @@ public function form(array $form, FormStateInterface $form_state) {
         '#title' => $this->t('Hide @label button', $t_args),
         '#return_value' => TRUE,
       ];
-      if (strpos($name, '_prev') === FALSE && $name !== 'reset') {
+      if (strpos($name, '_prev') === FALSE && !in_array($name, ['delete', 'reset'])) {
         $form[$name . '_settings'][$name . '_hide_message'] = [
           '#type' => 'webform_message',
           '#access' => TRUE,
@@ -223,6 +232,15 @@ public function form(array $form, FormStateInterface $form_state) {
         ],
       ];
     }
+
+    $form['delete_settings']['delete__dialog'] = [
+      '#type' => 'checkbox',
+      '#title' => $this->t('Open delete confirmation form in a modal dialog.'),
+      '#states' => [
+        'visible' => [':input[name="properties[delete_hide]"]' => ['checked' => FALSE]],
+      ],
+    ];
+
     return $form;
   }
 
diff --git a/web/modules/webform/src/Plugin/WebformElement/WebformCompositeBase.php b/web/modules/webform/src/Plugin/WebformElement/WebformCompositeBase.php
index 1d8b4aa661..6dee9b7e36 100644
--- a/web/modules/webform/src/Plugin/WebformElement/WebformCompositeBase.php
+++ b/web/modules/webform/src/Plugin/WebformElement/WebformCompositeBase.php
@@ -10,6 +10,7 @@
 use Drupal\file\Entity\File;
 use Drupal\webform\Entity\WebformOptions;
 use Drupal\webform\Plugin\WebformElementAttachmentInterface;
+use Drupal\webform\Plugin\WebformElementCompositeInterface;
 use Drupal\webform\Plugin\WebformElementComputedInterface;
 use Drupal\webform\Plugin\WebformElementEntityReferenceInterface;
 use Drupal\webform\Utility\WebformArrayHelper;
@@ -22,25 +23,7 @@
 /**
  * Provides a base for composite elements.
  */
-abstract class WebformCompositeBase extends WebformElementBase implements WebformElementAttachmentInterface {
-
-  /**
-   * Composite elements defined in the webform composite form element.
-   *
-   * @var array
-   *
-   * @see \Drupal\webform\Element\WebformCompositeBase::processWebformComposite
-   */
-  protected $compositeElement;
-
-  /**
-   * Initialized composite element.
-   *
-   * @var array
-   *
-   * @see \Drupal\webform\Element\WebformCompositeBase::processWebformComputed
-   */
-  protected $initializedCompositeElement;
+abstract class WebformCompositeBase extends WebformElementBase implements WebformElementCompositeInterface, WebformElementAttachmentInterface {
 
   /**
    * Track managed file elements.
@@ -275,8 +258,7 @@ public function getElementSelectorOptions(array $element) {
     $selectors = [];
     $composite_elements = $this->getInitializedCompositeElement($element);
     foreach ($composite_elements as $composite_key => $composite_element) {
-      $has_access = (!isset($composite_elements['#access']) || $composite_elements['#access']);
-      if ($has_access && isset($composite_element['#type'])) {
+      if (Element::isVisibleElement($composite_elements) && isset($composite_element['#type'])) {
         $element_plugin = $this->elementManager->getElementInstance($composite_element);
         $composite_element['#webform_key'] = "{$name}[{$composite_key}]";
         $selectors += OptGroup::flattenOptions($element_plugin->getElementSelectorOptions($composite_element));
@@ -298,8 +280,7 @@ public function getElementSelectorSourceValues(array $element) {
     $source_values = [];
     $composite_elements = $this->getInitializedCompositeElement($element);
     foreach ($composite_elements as $composite_key => $composite_element) {
-      $has_access = (!isset($composite_elements['#access']) || $composite_elements['#access']);
-      if ($has_access && isset($composite_element['#type'])) {
+      if (Element::isVisibleElement($composite_elements) && isset($composite_element['#type'])) {
         $element_plugin = $this->elementManager->getElementInstance($composite_element);
         $composite_element['#webform_key'] = "{$name}[{$composite_key}]";
         $source_values += $element_plugin->getElementSelectorSourceValues($composite_element);
@@ -416,7 +397,7 @@ protected function formatHtmlItems(array &$element, WebformSubmissionInterface $
     // Get header.
     $header = [];
     foreach (RenderElement::children($composite_elements) as $composite_key) {
-      if (isset($composite_elements[$composite_key]['#access']) && $composite_elements[$composite_key]['#access'] === FALSE) {
+      if (!Element::isVisibleElement($composite_elements[$composite_key])) {
         unset($composite_elements[$composite_key]);
         continue;
       }
@@ -616,6 +597,13 @@ protected function formatComposite($type, array $element, WebformSubmissionInter
     $options['webform_key'] = $element['#webform_key'];
     $composite_element = $this->getInitializedCompositeElement($element, $options['composite_key']);
     $composite_plugin = $this->elementManager->getElementInstance($composite_element);
+
+    // Exclude attachments for composite element.
+    // @see \Drupal\webform\WebformSubmissionViewBuilder::isElementVisible
+    if (!empty($options['exclude_attachments']) && $composite_plugin instanceof WebformElementAttachmentInterface) {
+      return '';
+    }
+
     $format_function = 'format' . $type;
     return $composite_plugin->$format_function($composite_element, $webform_submission, $options);
   }
@@ -733,7 +721,7 @@ public function buildExportHeader(array $element, array $options) {
     $header = [];
     foreach (RenderElement::children($composite_elements) as $composite_key) {
       $composite_element = $composite_elements[$composite_key];
-      if (isset($composite_element['#access']) && $composite_element['#access'] === FALSE) {
+      if (!Element::isVisibleElement($composite_element)) {
         continue;
       }
 
@@ -764,7 +752,7 @@ public function buildExportRecord(array $element, WebformSubmissionInterface $we
     $composite_elements = $this->getInitializedCompositeElement($element);
     foreach (RenderElement::children($composite_elements) as $composite_key) {
       $composite_element = $composite_elements[$composite_key];
-      if (isset($composite_element['#access']) && $composite_element['#access'] === FALSE) {
+      if (!Element::isVisibleElement($composite_element)) {
         continue;
       }
 
diff --git a/web/modules/webform/src/Plugin/WebformElement/WebformComputedBase.php b/web/modules/webform/src/Plugin/WebformElement/WebformComputedBase.php
index 086b1afdc8..fa45fd43d7 100644
--- a/web/modules/webform/src/Plugin/WebformElement/WebformComputedBase.php
+++ b/web/modules/webform/src/Plugin/WebformElement/WebformComputedBase.php
@@ -6,6 +6,7 @@
 use Drupal\Core\Mail\MailFormatHelper;
 use Drupal\webform\Element\WebformComputedTwig as WebformComputedTwigElement;
 use Drupal\webform\Element\WebformComputedBase as WebformComputedBaseElement;
+use Drupal\webform\Element\WebformMessage as WebformMessageElement;
 use Drupal\webform\Plugin\WebformElementBase;
 use Drupal\webform\Plugin\WebformElementComputedInterface;
 use Drupal\webform\Plugin\WebformElementDisplayOnInterface;
@@ -160,6 +161,14 @@ public function form(array $form, FormStateInterface $form_state) {
       '#type' => 'fieldset',
       '#title' => $this->t('Computed settings'),
     ];
+    $form['computed']['warning'] = [
+      '#type' => 'webform_message',
+      '#message_message' => $this->t('Computing complex or multiple values with or without Ajax can be resource intensive and may have performance implications. When possible try limiting or combining computations or consider using custom Twig functions, JavaScript, or PHP.'),
+      '#message_type' => 'warning',
+      '#message_close' => TRUE,
+      '#message_storage' => WebformMessageElement::STORAGE_SESSION,
+      '#access' => TRUE,
+    ];
     $form['computed']['display_on'] = [
       '#type' => 'select',
       '#title' => $this->t('Display on'),
diff --git a/web/modules/webform/src/Plugin/WebformElement/WebformEntityReferenceTrait.php b/web/modules/webform/src/Plugin/WebformElement/WebformEntityReferenceTrait.php
index 34272ce9fe..eb19733780 100644
--- a/web/modules/webform/src/Plugin/WebformElement/WebformEntityReferenceTrait.php
+++ b/web/modules/webform/src/Plugin/WebformElement/WebformEntityReferenceTrait.php
@@ -537,8 +537,7 @@ public function form(array $form, FormStateInterface $form_state) {
     $entity_reference_selection_handler = $entity_reference_selection_manager->getInstance([
       'target_type' => $target_type,
       'handler' => $selection_handler,
-      'handler_settings' => $selection_settings,
-    ]);
+    ] + $selection_settings);
     $form['entity_reference']['selection_settings'] = $entity_reference_selection_handler->buildConfigurationForm([], $form_state);
     $form['entity_reference']['selection_settings']['#tree'] = TRUE;
 
diff --git a/web/modules/webform/src/Plugin/WebformElement/WebformHeight.php b/web/modules/webform/src/Plugin/WebformElement/WebformHeight.php
new file mode 100644
index 0000000000..8acc0cea15
--- /dev/null
+++ b/web/modules/webform/src/Plugin/WebformElement/WebformHeight.php
@@ -0,0 +1,184 @@
+<?php
+
+namespace Drupal\webform\Plugin\WebformElement;
+
+use Drupal\Core\Form\FormStateInterface;
+use Drupal\webform\Element\WebformHeight as WebformHeightElement;
+use Drupal\webform\Plugin\WebformElementBase;
+use Drupal\webform\WebformInterface;
+use Drupal\webform\WebformSubmissionConditionsValidator;
+use Drupal\webform\WebformSubmissionInterface;
+
+/**
+ * Provides a 'height' element.
+ *
+ * @WebformElement(
+ *   id = "webform_height",
+ *   label = @Translation("Height (feet/inches)"),
+ *   description = @Translation("Provides a form element to collect height in feet and inches."),
+ *   category = @Translation("Advanced elements"),
+ * )
+ */
+class WebformHeight extends WebformElementBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function defineDefaultProperties() {
+    return [
+      'height_type' => 'number',
+      'height_format' => '',
+      'feet__min' => 0,
+      'feet__max' => 8,
+    ] + parent::defineDefaultProperties() + $this->defineDefaultMultipleProperties();
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function formatTextItem(array $element, WebformSubmissionInterface $webform_submission, array $options = []) {
+    $value = $this->getValue($element, $webform_submission, $options);
+    $format = $this->getItemFormat($element);
+
+    if ($format === 'raw') {
+      return $value;
+    }
+
+    if (empty($value)) {
+      return '';
+    }
+
+    $value = (float) $value;
+    $feet = floor($value / 12);
+    $inches = $value - ($feet * 12);
+
+    $height_format = $this->getElementProperty($element, 'height_format');
+    switch ($height_format) {
+      case WebformHeightElement::HEIGHT_SYMBOL:
+        $feet_plural = '″';
+        $feet_singular = '″';
+        $inches_plural = '′';
+        $inches_singular = '′';
+        break;
+
+      case WebformHeightElement::HEIGHT_ABBREVIATE:
+        $feet_plural = ' ' . $this->t('ft', [], ['context' => 'Imperial height unit abbreviate']);
+        $feet_singular = ' ' . $this->t('ft', [], ['context' => 'Imperial height unit abbreviate']);
+        $inches_plural = ' ' . $this->t('in', [], ['context' => 'Imperial height unit abbreviate']);
+        $inches_singular = ' ' . $this->t('in', [], ['context' => 'Imperial height unit abbreviate']);
+        break;
+
+      default:
+        $feet_plural = ' ' . $this->t('feet', [], ['context' => 'Imperial height unit']);
+        $feet_singular = ' ' . $this->t('foot', [], ['context' => 'Imperial height unit']);
+        $inches_plural = ' ' . $this->t('inches', [], ['context' => 'Imperial height unit']);
+        $inches_singular = ' ' . $this->t('inch', [], ['context' => 'Imperial height unit']);
+        break;
+    }
+
+    return ($feet ? $feet . ($feet === 1 ? $feet_singular : $feet_plural) : '')
+      . ($height_format !== WebformHeightElement::HEIGHT_SYMBOL && $feet && $inches ? ' ' : '')
+      . ($inches ? $inches . ($inches === 1 ? $inches_singular : $inches_plural) : '');
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function hasValue(array $element, WebformSubmissionInterface $webform_submission, array $options = []) {
+    $value = $this->getValue($element, $webform_submission, $options);
+    return ($value === '0') ? FALSE : parent::hasValue($element, $webform_submission, $options);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getTestValues(array $element, WebformInterface $webform, array $options = []) {
+    return rand(30, 60);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function form(array $form, FormStateInterface $form_state) {
+    $form = parent::form($form, $form_state);
+    $form['height'] = [
+      '#type' => 'fieldset',
+      '#title' => $this->t('Height settings'),
+    ];
+    $form['height']['height_type'] = [
+      '#type' => 'select',
+      '#title' => $this->t('Height element type'),
+      '#options' => [
+        'number' => $this->t('Number input'),
+        'select' => $this->t('Select menu'),
+        'select_suffix' => $this->t('Select menu with suffixes'),
+      ],
+    ];
+    $form['height']['height_format'] = [
+      '#type' => 'select',
+      '#title' => $this->t('Height suffix format'),
+      '#options' => [
+        '' => $this->t('Units (feet/foot and inches/inch)'),
+        WebformHeightElement::HEIGHT_ABBREVIATE => $this->t('Abbreviated units (ft and in)'),
+        WebformHeightElement::HEIGHT_SYMBOL => $this->t('Symbols (″ and ′)'),
+      ],
+    ];
+    $form['height']['feet_container'] = $this->getFormInlineContainer();
+    $form['height']['feet_container']['feet__min'] = [
+      '#type' => 'number',
+      '#title' => $this->t('Feet minimum'),
+      '#description' => $this->t("Specifies the feet's minimum value."),
+      '#step' => 'any',
+      '#size' => 4,
+    ];
+    $form['height']['feet_container']['feet__max'] = [
+      '#type' => 'number',
+      '#title' => $this->t('Feet maximum'),
+      '#description' => $this->t("Specifies the feet's maximum value."),
+      '#step' => 'any',
+      '#size' => 4,
+    ];
+
+    return $form;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function getElementSelectorInputsOptions(array $element) {
+    $t_args = ['@title' => $this->getAdminLabel($element)];
+    return [
+      'feet' => (string) $this->t('@title: Feet', $t_args),
+      'inches' => (string) $this->t('@title: Inches', $t_args),
+    ];
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getElementSelectorInputValue($selector, $trigger, array $element, WebformSubmissionInterface $webform_submission) {
+    $value = $this->getRawValue($element, $webform_submission);
+    if (empty($value)) {
+      return NULL;
+    }
+
+    $input_name = WebformSubmissionConditionsValidator::getSelectorInputName($selector);
+    $part = WebformSubmissionConditionsValidator::getInputNameAsArray($input_name, 1);
+
+    $value = (float) $value;
+    $feet = floor($value / 12);
+    $inches = $value - ($feet * 12);
+
+    switch ($part) {
+      case 'feet':
+        return $feet;
+
+      case 'inches':
+        return $inches;
+
+      default:
+        return NULL;
+    }
+  }
+
+}
diff --git a/web/modules/webform/src/Plugin/WebformElement/WebformManagedFileBase.php b/web/modules/webform/src/Plugin/WebformElement/WebformManagedFileBase.php
index 11b48c02a2..2e1e1e1849 100644
--- a/web/modules/webform/src/Plugin/WebformElement/WebformManagedFileBase.php
+++ b/web/modules/webform/src/Plugin/WebformElement/WebformManagedFileBase.php
@@ -986,8 +986,7 @@ public static function validateManagedFileLimit(array &$element, FormStateInterf
     }
 
     // If has access and total file size exceeds file limit then display error.
-    $has_access = (!isset($element['#access']) || $element['#access']);
-    if ($has_access && $total_file_size > $file_limit) {
+    if (Element::isVisibleElement($element) && $total_file_size > $file_limit) {
       $t_args = ['%quota' => format_size($file_limit)];
       $message = t("This form's file upload quota of %quota has been exceeded. Please remove some files.", $t_args);
       $form_state->setError($element, $message);
diff --git a/web/modules/webform/src/Plugin/WebformElement/WebformSignature.php b/web/modules/webform/src/Plugin/WebformElement/WebformSignature.php
index 4b99f87d20..a7b153f6cd 100644
--- a/web/modules/webform/src/Plugin/WebformElement/WebformSignature.php
+++ b/web/modules/webform/src/Plugin/WebformElement/WebformSignature.php
@@ -322,7 +322,9 @@ protected function getImageUrl(array $element, WebformSubmissionInterface $webfo
     }
 
     $webform = $webform_submission->getWebform();
-    $element_key = $element['#webform_key'];
+    $element_key = (isset($element['#webform_composite_key']))
+      ? $element['#webform_composite_key']
+      : $element['#webform_key'];
     $sid = $webform_submission->id();
 
     $image_base_directory = 'public://webform/' . $webform->id();
diff --git a/web/modules/webform/src/Plugin/WebformElementBase.php b/web/modules/webform/src/Plugin/WebformElementBase.php
index d359c52482..36bb9b954d 100644
--- a/web/modules/webform/src/Plugin/WebformElementBase.php
+++ b/web/modules/webform/src/Plugin/WebformElementBase.php
@@ -30,6 +30,7 @@
 use Drupal\webform\Plugin\WebformElement\WebformCompositeBase;
 use Drupal\webform\Twig\WebformTwigExtension;
 use Drupal\webform\Utility\WebformArrayHelper;
+use Drupal\webform\Utility\WebformDialogHelper;
 use Drupal\webform\Utility\WebformElementHelper;
 use Drupal\webform\Utility\WebformFormHelper;
 use Drupal\webform\Utility\WebformHtmlHelper;
@@ -274,6 +275,8 @@ protected function defineDefaultMultipleProperties() {
       'multiple__no_items_message' => (string) $this->t('No items entered. Please add items below.'),
       'multiple__sorting' => TRUE,
       'multiple__operations' => TRUE,
+      'multiple__add' => TRUE,
+      'multiple__remove' => TRUE,
     ];
   }
 
@@ -287,8 +290,10 @@ protected function defineDefaultBaseProperties() {
     return [
       // Administration.
       'admin_title' => '',
+      'admin_notes' => '',
       'prepopulate' => FALSE,
       'private' => FALSE,
+      'access' => TRUE,
       // Flexbox.
       'flex' => 1,
       // Conditional logic.
@@ -327,6 +332,7 @@ protected function defineTranslatableProperties() {
       'required_error',
       'unique_error',
       'admin_title',
+      'admin_notes',
       'placeholder',
       'markup',
       'test',
@@ -1317,8 +1323,8 @@ protected function build($format, array &$element, WebformSubmissionInterface $w
     $format_function = 'format' . ucfirst($format);
     $value = $this->$format_function($element, $webform_submission, $options);
 
-    // Handle empty value.
-    if ($value === '') {
+    // Handle empty value or empty array.
+    if ($value === '' || (is_array($value) && $value === [])) {
       // Return NULL if empty is excluded.
       if ($this->isEmptyExcluded($element, $options)) {
         return NULL;
@@ -1464,7 +1470,14 @@ protected function formatHtmlItems(array &$element, WebformSubmissionInterface $
     // Get items.
     $items = [];
     foreach (array_keys($value) as $delta) {
-      $items[] = $this->formatHtmlItem($element, $webform_submission, ['delta' => $delta] + $options);
+      $item = $this->formatHtmlItem($element, $webform_submission, ['delta' => $delta] + $options);
+      if ($item) {
+        $items[] = $item;
+      }
+    }
+
+    if (empty($items)) {
+      return [];
     }
 
     $format = $this->getItemsFormat($element);
@@ -1548,7 +1561,14 @@ protected function formatTextItems(array &$element, WebformSubmissionInterface $
     // Get items.
     $items = [];
     foreach (array_keys($value) as $delta) {
-      $items[] = $this->formatTextItem($element, $webform_submission, ['delta' => $delta] + $options);
+      $item = $this->formatTextItem($element, $webform_submission, ['delta' => $delta] + $options);;
+      if ($item) {
+        $items[] = $item;
+      }
+    }
+
+    if (empty($items)) {
+      return '';
     }
 
     $format = $this->getItemsFormat($element);
@@ -2301,6 +2321,13 @@ public function postSave(array &$element, WebformSubmissionInterface $webform_su
   // Element configuration methods.
   /****************************************************************************/
 
+  /**
+   * {@inheritdoc}
+   */
+  public function getOffCanvasWidth() {
+    return WebformDialogHelper::DIALOG_NARROW;
+  }
+
   /**
    * {@inheritdoc}
    */
@@ -2790,7 +2817,7 @@ public function form(array $form, FormStateInterface $form_state) {
     ];
     $form['conditional_logic']['states_clear'] = [
       '#type' => 'checkbox',
-      '#title' => 'Clear value(s) when hidden',
+      '#title' => $this->t('Clear value(s) when hidden'),
       '#return_value' => TRUE,
       '#description' => ($this instanceof ContainerBase) ?
         $this->t("When this container is hidden all this container's subelement values will be cleared.")
@@ -2899,6 +2926,28 @@ public function form(array $form, FormStateInterface $form_state) {
       '#description' => $this->t('If unchecked, the add/remove (+/x) buttons will be removed from each table row.'),
       '#return_value' => TRUE,
     ];
+    $form['multiple']['multiple__add'] = [
+      '#type' => 'checkbox',
+      '#title' => $this->t('Show add element button'),
+      '#description' => $this->t('If unchecked, the add button will be removed from each table row.'),
+      '#return_value' => TRUE,
+      '#states' => [
+        'visible' => [
+          ':input[name="properties[multiple__operations]"]' => ['checked' => TRUE],
+        ],
+      ],
+    ];
+    $form['multiple']['multiple__remove'] = [
+      '#type' => 'checkbox',
+      '#title' => $this->t('Show remove element button'),
+      '#description' => $this->t('If unchecked, the remove button will be removed from each table row.'),
+      '#return_value' => TRUE,
+      '#states' => [
+        'visible' => [
+          ':input[name="properties[multiple__operations]"]' => ['checked' => TRUE],
+        ],
+      ],
+    ];
     $form['multiple']['multiple__add_more'] = [
       '#type' => 'checkbox',
       '#title' => $this->t('Allow users to add more items'),
@@ -3211,6 +3260,11 @@ public function form(array $form, FormStateInterface $form_state) {
         '<br/>' .
         $this->t("If an element's title is hidden, the element's admin title will be displayed when viewing a submission."),
     ];
+    $form['admin']['admin_notes'] = [
+      '#type' => 'webform_html_editor',
+      '#title' => $this->t('Admin notes/comments'),
+      '#description' => $this->t("Admin notes/comments are display next to the element title in the form builder and visible in the form's YAML source"),
+    ];
 
     /**************************************************************************/
     // Access.
@@ -3238,6 +3292,7 @@ public function form(array $form, FormStateInterface $form_state) {
 
     $form['access'] = [
       '#type' => 'container',
+      '#attributes' => ['data-webform-states-no-clear' => TRUE],
     ];
     if (!$this->currentUser->hasPermission('administer webform') && !$this->currentUser->hasPermission('administer webform element access')) {
       $form['access']['#access'] = FALSE;
@@ -3245,6 +3300,13 @@ public function form(array $form, FormStateInterface $form_state) {
     foreach ($operations as $operation => $operation_element) {
       $form['access']['access_' . $operation] = $operation_element + [
         '#type' => 'details',
+        '#states' => [
+          'visible' => [
+            ':input[name="properties[access]"]' => [
+              'checked' => TRUE,
+            ],
+          ]
+        ],
       ];
       $form['access']['access_' . $operation]['access_' . $operation . '_roles'] = [
         '#type' => 'webform_roles',
@@ -3261,6 +3323,13 @@ public function form(array $form, FormStateInterface $form_state) {
         '#select2' => TRUE,
       ];
     }
+    $form['access']['access'] = [
+      '#type' => 'checkbox',
+      '#title' => $this->t('Display element'),
+      '#description' => $this->t('If unchecked, the element is never displayed. The element will only be visible within the form builder and hidden from all other displays including submission details, results, and download.'),
+      '#weight' => 50,
+      '#return_value' => TRUE,
+    ];
 
     /**************************************************************************/
 
diff --git a/web/modules/webform/src/Plugin/WebformElementCompositeInterface.php b/web/modules/webform/src/Plugin/WebformElementCompositeInterface.php
new file mode 100644
index 0000000000..599a0d432c
--- /dev/null
+++ b/web/modules/webform/src/Plugin/WebformElementCompositeInterface.php
@@ -0,0 +1,10 @@
+<?php
+
+namespace Drupal\webform\Plugin;
+
+/**
+ * Defines the interface for webform composite elements.
+ */
+interface WebformElementCompositeInterface {
+
+}
diff --git a/web/modules/webform/src/Plugin/WebformElementInterface.php b/web/modules/webform/src/Plugin/WebformElementInterface.php
index 0321c6c044..35c484fa18 100644
--- a/web/modules/webform/src/Plugin/WebformElementInterface.php
+++ b/web/modules/webform/src/Plugin/WebformElementInterface.php
@@ -877,6 +877,19 @@ public function postDelete(array &$element, WebformSubmissionInterface $webform_
   // Element configuration methods.
   /****************************************************************************/
 
+  /**
+   * Get configuration form's off-canvas width.
+   *
+   * @return string
+   *   The off-canvas width.
+   *
+   * @see WebformDialogHelper::DIALOG_NARROW
+   * @see WebformDialogHelper::DIALOG_NORMAL
+   * @see WebformDialogHelper::DIALOG_WIDE
+   * @see WebformDialogHelper::DIALOG_NONE
+   */
+  public function getOffCanvasWidth();
+
   /**
    * Gets the actual configuration webform array to be built.
    *
diff --git a/web/modules/webform/src/Plugin/WebformExporter/TabularBaseWebformExporter.php b/web/modules/webform/src/Plugin/WebformExporter/TabularBaseWebformExporter.php
index 2ee5e576d8..4d05893894 100644
--- a/web/modules/webform/src/Plugin/WebformExporter/TabularBaseWebformExporter.php
+++ b/web/modules/webform/src/Plugin/WebformExporter/TabularBaseWebformExporter.php
@@ -134,15 +134,11 @@ protected function formatRecordFieldDefinitionValue(array &$record, WebformSubmi
 
       case 'entity_url':
       case 'entity_title':
-        if (empty($webform_submission->entity_type->value) || empty($webform_submission->entity_id->value)) {
-          $record[] = '';
-          break;
-        }
-        $entity_type = $webform_submission->entity_type->value;
-        $entity_id = $webform_submission->entity_id->value;
-        $entity = $this->entityTypeManager->getStorage($entity_type)->load($entity_id);
+        $entity = $webform_submission->getSourceEntity(TRUE);
         if ($entity) {
-          $record[] = ($field_type === 'entity_url' && $entity->hasLinkTemplate('canonical')) ? $entity->toUrl()->setOption('absolute', TRUE)->toString() : $entity->label();
+          $record[] = ($field_type === 'entity_url' && $entity->hasLinkTemplate('canonical'))
+            ? $entity->toUrl()->setOption('absolute', TRUE)->toString()
+            : $entity->label();
         }
         else {
           $record[] = '';
diff --git a/web/modules/webform/src/Plugin/WebformHandler/DebugWebformHandler.php b/web/modules/webform/src/Plugin/WebformHandler/DebugWebformHandler.php
index 748a0b83b3..97de98da4e 100644
--- a/web/modules/webform/src/Plugin/WebformHandler/DebugWebformHandler.php
+++ b/web/modules/webform/src/Plugin/WebformHandler/DebugWebformHandler.php
@@ -2,11 +2,17 @@
 
 namespace Drupal\webform\Plugin\WebformHandler;
 
+use Drupal\Core\Config\ConfigFactoryInterface;
+use Drupal\Core\Entity\EntityTypeManagerInterface;
 use Drupal\Core\Form\FormStateInterface;
+use Drupal\Core\Logger\LoggerChannelFactoryInterface;
+use Drupal\Core\Render\RendererInterface;
 use Drupal\webform\Plugin\WebformHandlerBase;
 use Drupal\webform\Utility\WebformElementHelper;
 use Drupal\webform\Utility\WebformYaml;
+use Drupal\webform\WebformSubmissionConditionsValidatorInterface;
 use Drupal\webform\WebformSubmissionInterface;
+use Symfony\Component\DependencyInjection\ContainerInterface;
 
 /**
  * Webform submission debug handler.
@@ -23,14 +29,142 @@
  */
 class DebugWebformHandler extends WebformHandlerBase {
 
+  /**
+   * Format YAML.
+   */
+  const FORMAT_YAML = 'yaml';
+
+  /**
+   * Format JSON.
+   */
+  const FORMAT_JSON = 'json';
+
+  /**
+   * The renderer.
+   *
+   * @var \Drupal\Core\Render\RendererInterface
+   */
+  protected $renderer;
+
+  /**
+   * {@inheritdoc}
+   */
+  public function __construct(array $configuration, $plugin_id, $plugin_definition, LoggerChannelFactoryInterface $logger_factory, ConfigFactoryInterface $config_factory, EntityTypeManagerInterface $entity_type_manager, WebformSubmissionConditionsValidatorInterface $conditions_validator, RendererInterface $renderer) {
+    parent::__construct($configuration, $plugin_id, $plugin_definition, $logger_factory, $config_factory, $entity_type_manager, $conditions_validator);
+    $this->renderer = $renderer;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
+    return new static(
+      $configuration,
+      $plugin_id,
+      $plugin_definition,
+      $container->get('logger.factory'),
+      $container->get('config.factory'),
+      $container->get('entity_type.manager'),
+      $container->get('webform_submission.conditions_validator'),
+      $container->get('renderer')
+    );
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function defaultConfiguration() {
+    return [
+      'format' => 'yaml',
+      'submission' => FALSE,
+    ];
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getSummary() {
+    $configuration = $this->getConfiguration();
+    $settings = $configuration['settings'];
+    switch ($settings['format']) {
+      case static::FORMAT_JSON:
+        $settings['format'] = $this->t('JSON');
+        break;
+
+      case static::FORMAT_YAML:
+      default:
+        $settings['format'] = $this->t('YAML');
+        break;
+    }
+    return [
+      '#settings' => $settings,
+    ] + parent::getSummary();
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function buildConfigurationForm(array $form, FormStateInterface $form_state) {
+    $form['debug_settings'] = [
+      '#type' => 'fieldset',
+      '#title' => $this->t('Debug settings'),
+    ];
+    $form['debug_settings']['format'] = [
+      '#type' => 'select',
+      '#title' => $this->t('Data format'),
+      '#options' => [
+        static::FORMAT_YAML => $this->t('YAML'),
+        static::FORMAT_JSON => $this->t('JSON'),
+      ],
+      '#default_value' => $this->configuration['format'],
+    ];
+    $form['debug_settings']['submission'] = [
+      '#type' => 'checkbox',
+      '#title' => $this->t('Include submission properties'),
+      '#description' => $this->t('If checked, all submission properties and values  will be included in the displayed debug information. This includes sid, created, updated, completed, and more.'),
+      '#return_value' => TRUE,
+      '#default_value' => $this->configuration['submission'],
+    ];
+    return $this->setSettingsParents($form);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function submitConfigurationForm(array &$form, FormStateInterface $form_state) {
+    parent::submitConfigurationForm($form, $form_state);
+    $this->applyFormStateToConfiguration($form_state);
+  }
+
   /**
    * {@inheritdoc}
    */
   public function submitForm(array &$form, FormStateInterface $form_state, WebformSubmissionInterface $webform_submission) {
-    $data = $webform_submission->getData();
+    $configuration = $this->getConfiguration();
+    $settings = $configuration['settings'];
+
+    $data = ($settings['submission'])
+      ? $webform_submission->toArray(TRUE)
+      : $webform_submission->getData();
     WebformElementHelper::convertRenderMarkupToStrings($data);
-    $build = ['#markup' => 'Submitted values are:<pre>' . WebformYaml::encode($data) . '</pre>'];
-    $this->messenger()->addWarning(\Drupal::service('renderer')->renderPlain($build));
+
+    $label = ($settings['submission'])
+      ? $this->t('Submitted properties and values are:')
+      : $this->t('Submitted values are:');
+
+    $build = [
+      'label' => ['#markup' => $label],
+      'data' => [
+        '#markup' => ($settings['format'] === static::FORMAT_JSON)
+          ? json_encode($data, JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX_AMP | JSON_HEX_QUOT | JSON_PRETTY_PRINT)
+          : WebformYaml::encode($data),
+        '#prefix' => '<pre>',
+        '#suffix' => '</pre>',
+      ],
+    ];
+    $message = $this->renderer->renderPlain($build);
+
+    $this->messenger()->addWarning($message);
   }
 
 }
diff --git a/web/modules/webform/src/Plugin/WebformHandler/EmailWebformHandler.php b/web/modules/webform/src/Plugin/WebformHandler/EmailWebformHandler.php
index 59e2af8436..343f9640a7 100644
--- a/web/modules/webform/src/Plugin/WebformHandler/EmailWebformHandler.php
+++ b/web/modules/webform/src/Plugin/WebformHandler/EmailWebformHandler.php
@@ -547,7 +547,7 @@ public function buildConfigurationForm(array $form, FormStateInterface $form_sta
     // webform_token() Twig function.
     // @see \Drupal\webform\Twig\WebformTwigExtension
     $twig_default_body = $body_custom_default_values[$body_default_format];
-    $twig_default_body = preg_replace('/(\[[^]]+\])/', '{{ webform_token(\'\1\', webform_submission) }}', $twig_default_body);
+    $twig_default_body = preg_replace('/(\[[^]]+\])/', '{{ webform_token(\'\1\', webform_submission, [], options) }}', $twig_default_body);
     $body_custom_default_values['twig'] = $twig_default_body;
 
     // Look at the 'body' and determine the body select and custom
diff --git a/web/modules/webform/src/Plugin/WebformHandler/RemotePostWebformHandler.php b/web/modules/webform/src/Plugin/WebformHandler/RemotePostWebformHandler.php
index 4c175b4e36..b4928642b7 100644
--- a/web/modules/webform/src/Plugin/WebformHandler/RemotePostWebformHandler.php
+++ b/web/modules/webform/src/Plugin/WebformHandler/RemotePostWebformHandler.php
@@ -267,6 +267,7 @@ public function buildConfigurationForm(array $form, FormStateInterface $form_sta
         '#title' => $this->t('@title URL', $t_args),
         '#description' => $this->t('The full URL to POST to when an existing webform submission is @state. (e.g. @url)', $t_args),
         '#required' => ($state === WebformSubmissionInterface::STATE_COMPLETED),
+        '#maxlength' => NULL,
         '#default_value' => $this->configuration[$state_url],
       ];
       $form[$state][$state_custom_data] = [
diff --git a/web/modules/webform/src/Plugin/WebformHandlerBase.php b/web/modules/webform/src/Plugin/WebformHandlerBase.php
index 825db8d8bf..1ab9fd3ee0 100644
--- a/web/modules/webform/src/Plugin/WebformHandlerBase.php
+++ b/web/modules/webform/src/Plugin/WebformHandlerBase.php
@@ -10,6 +10,7 @@
 use Drupal\Core\Plugin\PluginBase;
 use Drupal\Core\Session\AccountInterface;
 use Drupal\Core\Access\AccessResult;
+use Drupal\webform\Utility\WebformDialogHelper;
 use Drupal\webform\Utility\WebformElementHelper;
 use Drupal\webform\WebformInterface;
 use Drupal\webform\WebformSubmissionConditionsValidatorInterface;
@@ -54,6 +55,13 @@ abstract class WebformHandlerBase extends PluginBase implements WebformHandlerIn
    */
   protected $label;
 
+  /**
+   * The webform variant notes.
+   *
+   * @var string
+   */
+  protected $notes = '';
+
   /**
    * The webform handler status.
    *
@@ -75,6 +83,13 @@ abstract class WebformHandlerBase extends PluginBase implements WebformHandlerIn
    */
   protected $conditions = [];
 
+  /**
+   * The webform handler's conditions result cache.
+   *
+   * @var array
+   */
+  protected $conditionsResultCache = [];
+
   /**
    * The configuration factory.
    *
@@ -273,6 +288,21 @@ public function getLabel() {
     return $this->label ?: $this->pluginDefinition['label'];
   }
 
+  /**
+   * {@inheritdoc}
+   */
+  public function setNotes($notes) {
+    $this->notes = $notes;
+    return $this;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getNotes() {
+    return $this->notes;
+  }
+
   /**
    * {@inheritdoc}
    */
@@ -293,6 +323,7 @@ public function getStatus() {
    */
   public function setConditions(array $conditions) {
     $this->conditions = $conditions;
+    $this->conditionsResultCache = [];
     return $this;
   }
 
@@ -386,8 +417,14 @@ public function hasAnonymousSubmissionTracking() {
    * {@inheritdoc}
    */
   public function checkConditions(WebformSubmissionInterface $webform_submission) {
+    $hash = $webform_submission->getDataHash();
+    if (isset($this->conditionsResultCache[$hash])) {
+      return $this->conditionsResultCache[$hash];
+    }
+
     // Return TRUE if conditions are disabled for the handler.
     if (!$this->supportsConditions()) {
+      $this->conditionsResultCache[$hash] = TRUE;
       return TRUE;
     }
 
@@ -395,6 +432,7 @@ public function checkConditions(WebformSubmissionInterface $webform_submission)
 
     // Return TRUE if no conditions are defined.
     if (empty($conditions)) {
+      $this->conditionsResultCache[$hash] = TRUE;
       return TRUE;
     }
 
@@ -409,7 +447,9 @@ public function checkConditions(WebformSubmissionInterface $webform_submission)
     $result = $this->conditionsValidator->validateConditions($conditions, $webform_submission);
 
     // Negate result for 'disabled' state.
-    return ($state === 'disabled') ? !$result : $result;
+    $result = ($state === 'disabled') ? !$result : $result;
+    $this->conditionsResultCache[$hash] = $result;
+    return $result;
   }
 
   /**
@@ -419,6 +459,7 @@ public function getConfiguration() {
     return [
       'id' => $this->getPluginId(),
       'label' => $this->getLabel(),
+      'notes' => $this->getNotes(),
       'handler_id' => $this->getHandlerId(),
       'status' => $this->getStatus(),
       'conditions' => $this->getConditions(),
@@ -434,6 +475,7 @@ public function setConfiguration(array $configuration) {
     $configuration += [
       'handler_id' => '',
       'label' => '',
+      'notes' => '',
       'status' => 1,
       'conditions' => [],
       'weight' => '',
@@ -442,6 +484,7 @@ public function setConfiguration(array $configuration) {
     $this->configuration = $configuration['settings'] + $this->defaultConfiguration();
     $this->handler_id = $configuration['handler_id'];
     $this->label = $configuration['label'];
+    $this->notes = $configuration['notes'];
     $this->status = $configuration['status'];
     $this->conditions = $configuration['conditions'];
     $this->weight = $configuration['weight'];
@@ -455,6 +498,13 @@ public function defaultConfiguration() {
     return [];
   }
 
+  /**
+   * {@inheritdoc}
+   */
+  public function getOffCanvasWidth() {
+    return WebformDialogHelper::DIALOG_NORMAL;
+  }
+
   /**
    * {@inheritdoc}
    */
diff --git a/web/modules/webform/src/Plugin/WebformHandlerInterface.php b/web/modules/webform/src/Plugin/WebformHandlerInterface.php
index ed4cbad394..1cbc55f475 100644
--- a/web/modules/webform/src/Plugin/WebformHandlerInterface.php
+++ b/web/modules/webform/src/Plugin/WebformHandlerInterface.php
@@ -136,6 +136,24 @@ public function getLabel();
    */
   public function setLabel($label);
 
+  /**
+   * Returns notes of the webform variant.
+   *
+   * @return string
+   *   Notes for the webform variant, or an empty string.
+   */
+  public function getNotes();
+
+  /**
+   * Set notes for this webform variant.
+   *
+   * @param string $notes
+   *   Notes for this webform variant.
+   *
+   * @return $this
+   */
+  public function setNotes($notes);
+
   /**
    * Returns the weight of the webform handler.
    *
@@ -385,6 +403,19 @@ public function overrideSettings(array &$settings, WebformSubmissionInterface $w
   // Submission form methods.
   /****************************************************************************/
 
+  /**
+   * Get configuration form's off-canvas width.
+   *
+   * @return string
+   *   The off-canvas width.
+   *
+   * @see WebformDialogHelper::DIALOG_NARROW
+   * @see WebformDialogHelper::DIALOG_NORMAL
+   * @see WebformDialogHelper::DIALOG_WIDE
+   * @see WebformDialogHelper::DIALOG_NONE
+   */
+  public function getOffCanvasWidth();
+
   /**
    * Alter webform submission webform .
    *
diff --git a/web/modules/webform/src/Plugin/WebformHandlerPluginCollection.php b/web/modules/webform/src/Plugin/WebformHandlerPluginCollection.php
index 8a69eb724e..0094a984ef 100644
--- a/web/modules/webform/src/Plugin/WebformHandlerPluginCollection.php
+++ b/web/modules/webform/src/Plugin/WebformHandlerPluginCollection.php
@@ -22,7 +22,7 @@ public function sortHelper($a_id, $b_id) {
     $a_weight = $a->getWeight();
     $b_weight = $b->getWeight();
     if ($a_weight === $b_weight) {
-      return 0;
+      return strnatcasecmp($a->getHandlerId(), $b->getHandlerId());
     }
 
     return ($a_weight < $b_weight) ? -1 : 1;
diff --git a/web/modules/webform/src/Plugin/WebformVariantBase.php b/web/modules/webform/src/Plugin/WebformVariantBase.php
index cdbc2bbdbb..7de85512d6 100644
--- a/web/modules/webform/src/Plugin/WebformVariantBase.php
+++ b/web/modules/webform/src/Plugin/WebformVariantBase.php
@@ -5,6 +5,7 @@
 use Drupal\Core\Config\ConfigFactoryInterface;
 use Drupal\Core\Form\FormStateInterface;
 use Drupal\Core\Plugin\PluginBase;
+use Drupal\webform\Utility\WebformDialogHelper;
 use Drupal\webform\WebformInterface;
 use Symfony\Component\DependencyInjection\ContainerInterface;
 
@@ -41,7 +42,6 @@ abstract class WebformVariantBase extends PluginBase implements WebformVariantIn
    */
   protected $label;
 
-
   /**
    * The webform variant notes.
    *
@@ -338,6 +338,13 @@ public function validateConfigurationForm(array &$form, FormStateInterface $form
    */
   public function submitConfigurationForm(array &$form, FormStateInterface $form_state) {}
 
+  /**
+   * {@inheritdoc}
+   */
+  public function getOffCanvasWidth() {
+    return WebformDialogHelper::DIALOG_NORMAL;
+  }
+
   /**
    * {@inheritdoc}
    */
diff --git a/web/modules/webform/src/Plugin/WebformVariantInterface.php b/web/modules/webform/src/Plugin/WebformVariantInterface.php
index 058fa92b9e..8746be9154 100644
--- a/web/modules/webform/src/Plugin/WebformVariantInterface.php
+++ b/web/modules/webform/src/Plugin/WebformVariantInterface.php
@@ -200,6 +200,19 @@ public function isDisabled();
    */
   public function isApplicable(WebformInterface $webform);
 
+  /**
+   * Get configuration form's off-canvas width.
+   *
+   * @return string
+   *   The off-canvas width.
+   *
+   * @see WebformDialogHelper::DIALOG_NARROW
+   * @see WebformDialogHelper::DIALOG_NORMAL
+   * @see WebformDialogHelper::DIALOG_WIDE
+   * @see WebformDialogHelper::DIALOG_NONE
+   */
+  public function getOffCanvasWidth();
+
   /**
    * Apply variant to the webform.
    *
diff --git a/web/modules/webform/src/Routing/WebformRouteSubscriber.php b/web/modules/webform/src/Routing/WebformRouteSubscriber.php
index 60fefecbfa..8a19773af7 100644
--- a/web/modules/webform/src/Routing/WebformRouteSubscriber.php
+++ b/web/modules/webform/src/Routing/WebformRouteSubscriber.php
@@ -2,6 +2,7 @@
 
 namespace Drupal\webform\Routing;
 
+use Drupal\Core\Config\ConfigFactoryInterface;
 use Drupal\Core\Extension\ModuleHandlerInterface;
 use Drupal\Core\Routing\RouteSubscriberBase;
 use Symfony\Component\Routing\RouteCollection;
@@ -18,14 +19,24 @@ class WebformRouteSubscriber extends RouteSubscriberBase {
    */
   protected $moduleHandler;
 
+  /**
+   * The configuration object factory.
+   *
+   * @var \Drupal\Core\Config\ConfigFactoryInterface
+   */
+  protected $configFactory;
+
   /**
    * Constructs a WebformShareRouteSubscriber object.
    *
    * @param \Drupal\Core\Extension\ModuleHandlerInterface $module_handler
    *   The module handler.
+   * @param \Drupal\Core\Config\ConfigFactoryInterface $config_factory
+   *   The configuration object factory.
    */
-  public function __construct(ModuleHandlerInterface $module_handler) {
+  public function __construct(ModuleHandlerInterface $module_handler, ConfigFactoryInterface $config_factory = NULL) {
     $this->moduleHandler = $module_handler;
+    $this->configFactory = $config_factory ?: \Drupal::configFactory();
   }
 
   /**
@@ -40,6 +51,14 @@ protected function alterRoutes(RouteCollection $collection) {
         )) {
         $route->setOption('_admin_route', TRUE);
       }
+
+      // Change /admin/structure/webform/ to /admin/webform/.
+      if ($this->configFactory->get('webform.settings')->get('ui.toolbar_item')) {
+        if (strpos($route->getPath(), '/admin/structure/webform') === 0) {
+          $path = str_replace('/admin/structure/webform', '/admin/webform', $route->getPath());
+          $route->setPath($path);
+        }
+      }
     }
 
     // If the webform_share.module is not enabled, remove variant share route.
diff --git a/web/modules/webform/src/Twig/WebformTwigExtension.php b/web/modules/webform/src/Twig/WebformTwigExtension.php
index 73812ef2dc..d265f01fda 100644
--- a/web/modules/webform/src/Twig/WebformTwigExtension.php
+++ b/web/modules/webform/src/Twig/WebformTwigExtension.php
@@ -3,6 +3,7 @@
 namespace Drupal\webform\Twig;
 
 use Drupal\Core\Entity\EntityInterface;
+use Drupal\webform\Element\WebformHtmlEditor;
 use Drupal\webform\Element\WebformMessage;
 use Drupal\webform\Utility\WebformElementHelper;
 use Drupal\webform\Utility\WebformHtmlHelper;
@@ -25,6 +26,7 @@ class WebformTwigExtension extends \Twig_Extension {
    */
   public function getFunctions() {
     return [
+      new \Twig_SimpleFunction('webform_html_editor_check_markup', [$this, 'webformHtmlEditorCheckMarkup']),
       new \Twig_SimpleFunction('webform_debug', [$this, 'webformDebug']),
       new \Twig_SimpleFunction('webform_token', [$this, 'webformToken']),
     ];
@@ -37,6 +39,23 @@ public function getName() {
     return 'webform';
   }
 
+  /**
+   * Runs HTML markup through (optional) text format.
+   *
+   * @param string $text
+   *   The text to be filtered.
+   * @param array $options
+   *   HTML markup options.
+   *
+   * @return array
+   *   Render array containing 'processed_text' or 'webform_html_editor_markup'.
+   *
+   * @see \Drupal\webform\Element\WebformHtmlEditor::checkMarkup
+   */
+  public function webformHtmlEditorCheckMarkup($text, array $options = []) {
+    return WebformHtmlEditor::checkMarkup($text, $options);
+  }
+
   /**
    * Debug data by outputting YAML.
    *
diff --git a/web/modules/webform/src/Utility/WebformArrayHelper.php b/web/modules/webform/src/Utility/WebformArrayHelper.php
index c592cce099..5997f1045a 100644
--- a/web/modules/webform/src/Utility/WebformArrayHelper.php
+++ b/web/modules/webform/src/Utility/WebformArrayHelper.php
@@ -162,7 +162,7 @@ protected static function getKey(array $array, $key, $direction) {
     $array_keys = array_keys($array);
     $array_key = reset($array_keys);
     do {
-      if ($array_key === $key) {
+      if ($array_key == $key) {
         return $direction($array_keys);
       }
     } while ($array_key = next($array_keys));
diff --git a/web/modules/webform/src/Utility/WebformDialogHelper.php b/web/modules/webform/src/Utility/WebformDialogHelper.php
index 1fc0f25f53..78a663352f 100644
--- a/web/modules/webform/src/Utility/WebformDialogHelper.php
+++ b/web/modules/webform/src/Utility/WebformDialogHelper.php
@@ -36,6 +36,13 @@ class WebformDialogHelper {
    */
   const DIALOG_NARROW = 'narrow';
 
+  /**
+   * Prevent dialog from being displayed
+   *
+   * @var string
+   */
+  const DIALOG_NONE = 'none';
+
   /**
    * Use outside-in off-canvas system tray instead of dialogs.
    *
@@ -112,7 +119,8 @@ public static function getModalDialogAttributes($width = self::DIALOG_NORMAL, ar
    *   Modal dialog attributes.
    */
   public static function getOffCanvasDialogAttributes($width = self::DIALOG_NORMAL, array $class = []) {
-    if (\Drupal::config('webform.settings')->get('ui.dialog_disabled')) {
+    if (\Drupal::config('webform.settings')->get('ui.dialog_disabled')
+      || $width === self::DIALOG_NONE) {
       return $class ? ['class' => $class] : [];
     }
 
diff --git a/web/modules/webform/src/Utility/WebformElementHelper.php b/web/modules/webform/src/Utility/WebformElementHelper.php
index c7730793eb..1444eae757 100644
--- a/web/modules/webform/src/Utility/WebformElementHelper.php
+++ b/web/modules/webform/src/Utility/WebformElementHelper.php
@@ -314,15 +314,8 @@ public static function process(array &$element) {
    *   A webform element that is missing the 'data-drupal-states' attribute.
    */
   public static function fixStatesWrapper(array &$element) {
-    if (empty($element['#states'])) {
-      return;
-    }
-
     $attributes = [];
 
-    // Set .js-form-wrapper which is targeted by states.js hide/show logic.
-    $attributes['class'][] = 'js-form-wrapper';
-
     // Add .js-webform-states-hidden to hide elements when they are being rendered.
     $attributes_properties = ['#wrapper_attributes', '#attributes'];
     foreach ($attributes_properties as $attributes_property) {
@@ -336,27 +329,39 @@ public static function fixStatesWrapper(array &$element) {
       }
     }
 
-    $attributes['data-drupal-states'] = Json::encode($element['#states']);
+    // Do not add wrapper if there is no #states and
+    // is no .js-webform-states-hidden class.
+    if (empty($element['#states']) && empty($attributes)) {
+      return;
+    }
 
-    $element += ['#prefix' => '', '#suffix' => ''];
+    // Set .js-form-wrapper which is targeted by states.js hide/show logic.
+    $attributes['class'][] = 'js-form-wrapper';
 
-    // ISSUE: JSON is being corrupted when the prefix is rendered.
-    // $element['#prefix'] = '<div ' . new Attribute($attributes) . '>' . $element['#prefix'];
-    // WORKAROUND: Safely set filtered #prefix to FormattableMarkup.
-    $allowed_tags = isset($element['#allowed_tags']) ? $element['#allowed_tags'] : Xss::getHtmlTagList();
-    $element['#prefix'] = Markup::create('<div' . new Attribute($attributes) . '>' . Xss::filter($element['#prefix'], $allowed_tags));
+    // Move the element's #states the wrapper's #states.
+    if (isset($element['#states'])) {
+      $attributes['data-drupal-states'] = Json::encode($element['#states']);
+
+      // Copy #states to #_webform_states property which can be used by the
+      // WebformSubmissionConditionsValidator.
+      // @see \Drupal\webform\WebformSubmissionConditionsValidator
+      $element['#_webform_states'] = $element['#states'];
+
+      // Remove #states property to prevent nesting.
+      unset($element['#states']);
+    }
+
+    // If there are attributes for the wrapper do not add it.
+    if (empty($attributes)) {
+      return;
+    }
+
+    $element += ['#prefix' => '', '#suffix' => ''];
+    $element['#prefix'] = '<div' . new Attribute($attributes) . '>' . $element['#prefix'];
     $element['#suffix'] = $element['#suffix'] . '</div>';
 
     // Attach library.
     $element['#attached']['library'][] = 'core/drupal.states';
-
-    // Copy #states to #_webform_states property which can be used by the
-    // WebformSubmissionConditionsValidator.
-    // @see \Drupal\webform\WebformSubmissionConditionsValidator
-    $element['#_webform_states'] = $element['#states'];
-
-    // Remove #states property to prevent nesting.
-    unset($element['#states']);
   }
 
   /**
diff --git a/web/modules/webform/src/Utility/WebformOptionsHelper.php b/web/modules/webform/src/Utility/WebformOptionsHelper.php
index 3518698959..9694ad8e10 100644
--- a/web/modules/webform/src/Utility/WebformOptionsHelper.php
+++ b/web/modules/webform/src/Utility/WebformOptionsHelper.php
@@ -56,7 +56,7 @@ public static function hasOption($value, array $options) {
           return $has_value;
         }
       }
-      elseif ($value === $option_value) {
+      elseif ((string) $value === (string) $option_value) {
         return TRUE;
       }
     }
diff --git a/web/modules/webform/src/Utility/WebformYaml.php b/web/modules/webform/src/Utility/WebformYaml.php
index d76769bcfb..cf04717ca8 100644
--- a/web/modules/webform/src/Utility/WebformYaml.php
+++ b/web/modules/webform/src/Utility/WebformYaml.php
@@ -18,7 +18,14 @@ class WebformYaml implements SerializationInterface {
   public static function encode($data) {
     // Convert \r\n to \n so that multiline strings are properly formatted.
     // @see \Symfony\Component\Yaml\Dumper::dump
-    static::normalize($data);
+    if (is_array($data)) {
+      static::normalize($data);
+    }
+
+    // If empty array then return an empty string instead of '{ }'.
+    if (is_array($data) && empty($data)) {
+      return '';
+    }
 
     $dumper = new Dumper(2);
     $yaml = $dumper->dump($data, PHP_INT_MAX, 0, SymfonyYaml::DUMP_EXCEPTION_ON_INVALID_TYPE | SymfonyYaml::DUMP_MULTI_LINE_LITERAL_BLOCK);
diff --git a/web/modules/webform/src/WebformAddonsManager.php b/web/modules/webform/src/WebformAddonsManager.php
index f94c6bd81a..d201e61ecc 100644
--- a/web/modules/webform/src/WebformAddonsManager.php
+++ b/web/modules/webform/src/WebformAddonsManager.php
@@ -150,6 +150,14 @@ protected function initProjects() {
       'category' => 'element',
     ];
 
+    // Element: Webform Attachment Gated Download.
+    $projects['webform_attachment_gated_download'] = [
+      'title' => $this->t('Webform Attachment Gated Download'),
+      'description' => $this->t('Provides a field formatter for file, image, and media types which links to a webform.'),
+      'url' => Url::fromUri('https://www.drupal.org/project/webform_attachment_gated_download'),
+      'category' => 'element',
+    ];
+
     // Element: Webform Belgian National Insurance Number.
     $projects['webform_rrn_nrn'] = [
       'title' => $this->t('Webform Belgian National Insurance Number'),
@@ -190,11 +198,11 @@ protected function initProjects() {
       'category' => 'element',
     ];
 
-    // Element: Webform Attachment Gated Download.
-    $projects['webform_attachment_gated_download'] = [
-      'title' => $this->t('Webform Attachment Gated Download'),
-      'description' => $this->t('Provides a field formatter for file, image, and media types which links to a webform.'),
-      'url' => Url::fromUri('https://www.drupal.org/project/webform_attachment_gated_download'),
+    // Element: Webform Dynamic Autocomplete.
+    $projects['webform_dynamic_autocomplete'] = [
+      'title' => $this->t('Webform Dynamic Autocomplete'),
+      'description' => $this->t('Provides a new element field in webform for Dynamically handling Autocomplete API request.'),
+      'url' => Url::fromUri('https://www.drupal.org/project/webform_dynamic_autocomplete'),
       'category' => 'element',
     ];
 
@@ -238,6 +246,14 @@ protected function initProjects() {
       'category' => 'element',
     ];
 
+    // Element: Webform noUiSlider Element.
+    $projects['webform_nouislider'] = [
+      'title' => $this->t('Webform noUiSlider Element'),
+      'description' => $this->t('A lightweight range slider with multi-touch support and a ton of features.'),
+      'url' => Url::fromUri('https://www.drupal.org/project/webform_nouislider'),
+      'category' => 'element',
+    ];
+
     // Element: Webform Promotion Code.
     $projects['webform_promotion_code'] = [
       'title' => $this->t('Webform Promotion Code'),
@@ -306,6 +322,14 @@ protected function initProjects() {
       'category' => 'enhancement',
     ];
 
+    // Enhancement: Webform Bulk Emails.
+    $projects['webform_bulk_email'] = [
+      'title' => $this->t('Webform Bulk Emails'),
+      'description' => $this->t('Provides a webform handler to send webform submission in bulk on a given time schedule.'),
+      'url' => Url::fromUri('https://www.drupal.org/project/webform_bulk_email'),
+      'category' => 'enhancement',
+    ];
+
     // Enhancement: Webform Calculation.
     $projects['webform_calculation'] = [
       'title' => $this->t('Webform Calculation'),
@@ -338,6 +362,14 @@ protected function initProjects() {
       'category' => 'enhancement',
     ];
 
+    // Enhancement: Webform Discount.
+    $projects['webform_discount'] = [
+      'title' => $this->t('Webform Discount'),
+      'description' => $this->t('Provides the ability to create Discount Codes that can be applied to alter the value of fields in Webform submissions.'),
+      'url' => Url::fromUri('https://www.drupal.org/project/webform_discount'),
+      'category' => 'enhancement',
+    ];
+
     // Enhancement: Webform Email Reply.
     $projects['webform_email_reply_d8'] = [
       'title' => $this->t('Webform Email Reply'),
@@ -406,7 +438,7 @@ protected function initProjects() {
     $projects['webform_protected_downloads'] = [
       'title' => $this->t('Webform Protected Downloads'),
       'description' => $this->t('Provides protected file downloads using webforms.'),
-      'url' => Url::fromUri('https://github.com/timlovrecic/Webform-Protected-Downloads'),
+      'url' => Url::fromUri('https://www.drupal.org/project/webform_protected_downloads'),
       'category' => 'enhancement',
     ];
 
@@ -660,6 +692,15 @@ protected function initProjects() {
       'category' => 'integration',
     ];
 
+    // Integration: Webform File Upload and Campaign as Salesforce Lead Attachment.
+    $projects['wsla'] = [
+      'title' => $this->t('Webform File Upload and Campaign as Salesforce Lead Attachment'),
+      'description' => $this->t('This module uses webform properties as setting and allow the file uploaded as lead attachment. Campaign can also be attached with lead using this module.'),
+      'url' => Url::fromUri('https://www.drupal.org/project/wsla'),
+      'experimental' => TRUE,
+      'category' => 'integration',
+    ];
+
     // Integration: Webform iContact.
     $projects['webform_icontact'] = [
       'title' => $this->t('Webform iContact'),
@@ -709,7 +750,7 @@ protected function initProjects() {
       'category' => 'integration',
     ];
 
-    // Integrations: Webform Hubspot Integration
+    // Integrations: Webform Hubspot Integration.
     $projects['hubspot_api_integration'] = [
       'title' => $this->t('Webform Hubspot Integration'),
       'description' => $this->t('Provides a Webform handler that integrates with Hubspot.'),
@@ -725,6 +766,14 @@ protected function initProjects() {
       'category' => 'integration',
     ];
 
+    // Integrations: Lightweight Webform Mailchimp.
+    $projects['ldbase_handlers'] = [
+      'title' => $this->t('LDbase Webform Handlers'),
+      'description' => $this->t('Webform handlers to create and update LDbase content nodes.'),
+      'url' => Url::fromUri('https://github.com/ldbase/ldbase_handlers'),
+      'category' => 'integration',
+    ];
+
     // Integrations: Lightweight Webform Mailchimp.
     $projects['lwm'] = [
       'title' => $this->t('Lightweight Webform Mailchimp'),
@@ -1056,6 +1105,14 @@ protected function initProjects() {
       'category' => 'spam',
     ];
 
+    // Spam: Recaptcha Element.
+    $projects['recaptcha_element'] = [
+      'title' => $this->t('Recaptcha Element'),
+      'description' => $this->t('Provides a Webform Handler that allows you to enable reCAPTCHA protection on a webform using the webform UI.'),
+      'url' => Url::fromUri('https://www.drupal.org/project/recaptcha_element'),
+      'category' => 'spam',
+    ];
+
     /**************************************************************************/
     // Submissions.
     /**************************************************************************/
@@ -1234,6 +1291,15 @@ protected function initProjects() {
       'recommended' => TRUE,
     ];
 
+    // Enhancement: Webform Media Type.
+    $projects['webform_media'] = [
+      'title' => $this->t('Webform Media Type'),
+      'description' => $this->t("Easily embed webforms into CKEditor with a webform media type that integrates with core's media library."),
+      'url' => Url::fromUri('https://www.drupal.org/project/webform_media'),
+      'category' => 'utility',
+      'recommended' => TRUE,
+    ];
+
     /**************************************************************************/
 
     // Utility: Googalytics Webform.
@@ -1350,6 +1416,14 @@ protected function initProjects() {
       'category' => 'web_services',
     ];
 
+    // Web services: Webform JSON:API.
+    $projects['webform_jsonapi'] = [
+      'title' => $this->t('Webform JSON:API'),
+      'description' => $this->t('Provides a webform integration with JSON:API to expose webform elements.'),
+      'url' => Url::fromUri('https://www.drupal.org/project/webform_jsonapi'),
+      'category' => 'web_services',
+    ];
+
     // Web services: Webform JSON Schema.
     $projects['webform_jsonschema'] = [
       'title' => $this->t('Webform JSON Schema'),
diff --git a/web/modules/webform/src/WebformEntityConditionsManager.php b/web/modules/webform/src/WebformEntityConditionsManager.php
new file mode 100644
index 0000000000..acd9443a8f
--- /dev/null
+++ b/web/modules/webform/src/WebformEntityConditionsManager.php
@@ -0,0 +1,281 @@
+<?php
+
+namespace Drupal\webform;
+
+use Drupal\Core\Form\OptGroup;
+use Drupal\Core\StringTranslation\StringTranslationTrait;
+use Drupal\webform\Plugin\WebformElement\WebformElement;
+use Drupal\webform\Plugin\WebformElementManagerInterface;
+use Drupal\webform\Utility\WebformArrayHelper;
+use Drupal\webform\Utility\WebformOptionsHelper;
+
+/**
+ * Webform submission conditions (#states) validator.
+ *
+ * @see \Drupal\webform\Element\WebformElementStates
+ * @see \Drupal\Core\Form\FormHelper::processStates
+ */
+class WebformEntityConditionsManager implements WebformEntityConditionsManagerInterface {
+
+  use StringTranslationTrait;
+
+  /**
+   * The webform element manager.
+   *
+   * @var \Drupal\webform\Plugin\WebformElementManagerInterface
+   */
+  protected $elementManager;
+
+  /**
+   * Constructs a WebformEntityConditionsManager object.
+   *
+   * @param \Drupal\webform\Plugin\WebformElementManagerInterface $element_manager
+   *   The webform element manager.
+   */
+  public function __construct(WebformElementManagerInterface $element_manager) {
+    $this->elementManager = $element_manager;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function toText(WebformInterface $webform, array $states, array $options = []) {
+    // Set default options.
+    $options += [
+      'name' => $this->t('element'),
+      'states' => [],
+      'triggers' => [],
+      'logic' => [],
+    ];
+    $options['states'] += [
+      'visible' => $this->t('visible'),
+      'invisible' => $this->t('hidden'),
+      'visible-slide' => $this->t('visible'),
+      'invisible-slide' => $this->t('hidden'),
+      'enabled' => $this->t('enabled'),
+      'disabled' => $this->t('disabled'),
+      'readwrite' => $this->t('read/write'),
+      'readonly' => $this->t('read-only'),
+      'expanded' => $this->t('expanded'),
+      'collapsed' => $this->t('collapsed'),
+      'required' => $this->t('required'),
+      'optional' => $this->t('optional'),
+      'checked' => $this->t('checked'),
+      'unchecked' => $this->t('unchecked'),
+    ];
+    $options['triggers'] += [
+      'empty' => $this->t('is empty'),
+      'filled' => $this->t('is filled'),
+      'checked' => $this->t('is checked'),
+      'unchecked' => $this->t('is unchecked'),
+      'value' => '=',
+      '!value' => '!=',
+      'pattern' => $this->t('matches'),
+      '!pattern' => $this->t('does not match'),
+      'less' => '<',
+      'less_equal' => '<=',
+      'greater' => '>',
+      'greater_equal' => '>=',
+      'between' => $this->t('is between'),
+      '!between' => $this->t('is not between'),
+    ];
+    $options['logic'] += [
+      'and' => $this->t('all'),
+      'or' => $this->t('any'),
+      'xor' => $this->t('one'),
+    ];
+
+    $build = [];
+    foreach ($states as $state => $conditions) {
+      $t_args = [
+        '@name' => $options['name'],
+        '@state' => (isset($options['states'][$state])) ? $options['states'][$state] : $state,
+      ];
+      $build[$state] = [
+        'state' => [
+          '#markup' => $this->t('This @name is <strong>@state</strong>', $t_args),
+          '#suffix' => ' ',
+        ],
+        'conditions' => $this->buildConditions($webform, $conditions, $options),
+      ];
+    }
+    return $build;
+  }
+
+  /**
+   * Convert a webform's conditions into a human read-able format.
+   *
+   * @param \Drupal\webform\WebformInterface $webform
+   *   A webform.
+   * @param array $conditions
+   *   A webform's state conditions.
+   * @param array $options
+   *   An associative array of configuration options.
+   *
+   * @return array
+   *   A renderable array containing the webform's conditions in
+   *   a human read-able format.
+   */
+  protected function buildConditions(WebformInterface $webform, array $conditions, array $options) {
+    // Determine condition logic.
+    // @see Drupal.states.Dependent.verifyConstraints
+    if (WebformArrayHelper::isSequential($conditions)) {
+      $logic = (in_array('xor', $conditions)) ? 'xor' : 'or';
+    }
+    else {
+      $logic = 'and';
+    }
+
+    $condition_items = [];
+    foreach ($conditions as $index => $value) {
+      // Skip and, or, and xor.
+      if (is_string($value) && in_array($value, ['and', 'or', 'xor'])) {
+        continue;
+      }
+
+      if (is_int($index) && is_array($value) && (WebformArrayHelper::isSequential($value) || count($value) > 1)) {
+        $condition_items[] = $this->buildConditions($webform, $value, $options + ['nested' => TRUE]);
+      }
+      else {
+        if (is_int($index)) {
+          $selector = key($value);
+          $condition = $value[$selector];
+        }
+        else {
+          $selector = $index;
+          $condition = $value;
+        }
+
+        $condition_items[] = $this->buildConditionItem($webform, $selector, $condition, $options + ['nested' => TRUE]);
+      }
+    }
+
+    $t_args = [
+      '@logic' => $options['logic'][$logic],
+    ];
+    $build = [];
+    $build['logic'] = [
+      '#markup' => (empty($options['nested']))
+        ? $this->t('when <strong>@logic</strong> of the following conditions are met:', $t_args)
+        : $this->t('When <strong>@logic</strong> of the following (nested) conditions are met:', $t_args),
+    ];
+    $build['condition'] = [
+      '#theme' => 'item_list',
+      '#items' => $condition_items,
+    ];
+    return $build;
+  }
+
+  /**
+   * Convert a condition's select, trigger, and value into a human read-able format.
+   *
+   * @param \Drupal\webform\WebformInterface $webform
+   *   A webform.
+   * @param string $selector
+   *   The condition's selector (i.e. :input[name="{element_key}").
+   * @param array $condition
+   *   The condition's trigger and value.
+   * @param array $options
+   *   An associative array of configuration options.
+   *
+   * @return array
+   *   A renderable array containing a condition's select, trigger, and value in
+   *   a human read-able format.
+   */
+  protected function buildConditionItem(WebformInterface $webform, $selector, array $condition, array $options) {
+    if (WebformArrayHelper::isSequential($condition)) {
+      $sub_condition_items = [];
+      foreach ($condition as $sub_condition) {
+        $sub_condition_items[] = $this->buildConditionItem($webform, $selector, $sub_condition, $options);
+      }
+      return $sub_condition_items;
+    }
+
+    // Ignore invalid selector and return an empty render array.
+    $input_name = WebformSubmissionConditionsValidator::getSelectorInputName($selector);
+    if (!$input_name) {
+      return [];
+    }
+
+    $element_key = WebformSubmissionConditionsValidator::getInputNameAsArray($input_name, 0);
+    $element_option_key = WebformSubmissionConditionsValidator::getInputNameAsArray($input_name, 1);
+    $element = $webform->getElement($element_key);
+
+    // If no element is found try checking file uploads which use
+    // :input[name="files[ELEMENT_KEY].
+    // @see \Drupal\webform\Plugin\WebformElement\WebformManagedFileBase::getElementSelectorOptions
+    if (!$element && strpos($selector, ':input[name="files[') === 0) {
+      $element_key = WebformSubmissionConditionsValidator::getInputNameAsArray($input_name, 1);
+      $element = $webform->getWebform()->getElement($element_key);
+    }
+
+    // Ignore missing dependee element and return an empty render array.
+    if (!$element) {
+      return [];
+    }
+
+    $trigger_state = key($condition);
+    $trigger_value = $condition[$trigger_state];
+
+    $element_plugin = $this->elementManager->getElementInstance($element);
+
+    // Ignored conditions for generic webform elements.
+    if ($element_plugin instanceof WebformElement) {
+      return [];
+    }
+
+    // Process trigger sub state used for custom #states API validation.
+    // @see Drupal.behaviors.webformStatesComparisons
+    // @see http://drupalsun.com/julia-evans/2012/03/09/extending-form-api-states-regular-expressions
+    if ($trigger_state === 'value' && is_array($trigger_value)) {
+      $trigger_substate = key($trigger_value);
+      if (in_array($trigger_substate, ['pattern', '!pattern', 'less', 'less_equal', 'greater', 'greater_equal', 'between', '!between'])) {
+        $trigger_state = $trigger_substate;
+        $trigger_value = reset($trigger_value);
+      }
+    }
+
+    // Get element options.
+    $element_options = (isset($element['#options'])) ? OptGroup::flattenOptions($element['#options']) : [];
+
+    // Set element title.
+    $element_title = $element['#admin_title'];
+
+    // Set trigger value and suffix element title with the trigger's option value.
+    if ($element_option_key) {
+      $element_title .= ': ' . WebformOptionsHelper::getOptionText($element_option_key, $element_options, TRUE);
+    }
+
+    // Build the condition.
+    $t_args = [
+      '@name' => $element_title,
+      '@trigger' => $options['triggers'][$trigger_state],
+    ];
+
+    // Do not return the value boolean value for empty or checked states.
+    switch ($trigger_state) {
+      case 'empty':
+      case 'filled':
+      case 'checked':
+      case 'unchecked':
+        return [
+          '#markup' => $this->t('<strong>@name</strong> @trigger.', $t_args),
+        ];
+
+      case 'between':
+        $range = explode(':', $trigger_value);
+        $t_args['@min'] = $range[0];
+        $t_args['@max'] = $range[1];
+        return [
+          '#markup' => $this->t('<strong>@name</strong> @trigger <strong>@min</strong> and <strong>@max</strong>.', $t_args),
+        ];
+
+      default:
+        $t_args['@value'] = isset($element_options[$trigger_value]) ? $element_options[$trigger_value] : $trigger_value;
+        return [
+          '#markup' => $this->t('<strong>@name</strong> @trigger <strong>@value</strong>.', $t_args),
+        ];
+    }
+  }
+
+}
diff --git a/web/modules/webform/src/WebformEntityConditionsManagerInterface.php b/web/modules/webform/src/WebformEntityConditionsManagerInterface.php
new file mode 100644
index 0000000000..c604caf483
--- /dev/null
+++ b/web/modules/webform/src/WebformEntityConditionsManagerInterface.php
@@ -0,0 +1,26 @@
+<?php
+
+namespace Drupal\webform;
+
+/**
+ * Provides an interface defining a webform conditions (#states) manager.
+ */
+interface WebformEntityConditionsManagerInterface {
+
+  /**
+   * Convert a webform's #states to a human read-able format.
+   *
+   * @param \Drupal\webform\WebformInterface $webform
+   *   A webform.
+   * @param array $states
+   *   An element's #states array.
+   * @param array $options
+   *   An associative array of configuration options.
+   *
+   * @return array
+   *   A renderable array containing the webform's #states displayed in
+   *   a human read-able format.
+   */
+  public function toText(WebformInterface $webform, array $states, array $options = []);
+
+}
diff --git a/web/modules/webform/src/WebformEntityHandlersForm.php b/web/modules/webform/src/WebformEntityHandlersForm.php
index ca362bbd4b..730dff8dfa 100644
--- a/web/modules/webform/src/WebformEntityHandlersForm.php
+++ b/web/modules/webform/src/WebformEntityHandlersForm.php
@@ -78,6 +78,8 @@ public function form(array $form, FormStateInterface $form_state) {
     $handlers = $this->entity->getHandlers();
     $rows = [];
     foreach ($handlers as $handler_id => $handler) {
+      $offcanvas_dialog_attributes = WebformDialogHelper::getOffCanvasDialogAttributes($handler->getOffCanvasWidth());
+
       $row['#attributes']['class'][] = 'draggable';
       $row['#attributes']['data-webform-key'] = $handler_id;
 
@@ -93,11 +95,11 @@ public function form(array $form, FormStateInterface $form_state) {
               'webform' => $this->entity->id(),
               'webform_handler' => $handler_id,
             ]),
-            '#attributes' => WebformDialogHelper::getOffCanvasDialogAttributes(),
+            '#attributes' => $offcanvas_dialog_attributes,
           ],
           'description' => [
             '#prefix' => '<br/>',
-            '#markup' => $handler->description(),
+            '#markup' => $handler->getNotes() ?: $handler->description(),
           ],
         ],
       ];
@@ -136,7 +138,7 @@ public function form(array $form, FormStateInterface $form_state) {
           'webform' => $this->entity->id(),
           'webform_handler' => $handler_id,
         ]),
-        'attributes' => WebformDialogHelper::getOffCanvasDialogAttributes(),
+        'attributes' => $offcanvas_dialog_attributes,
       ];
       // Duplicate.
       if ($handler->cardinality() === WebformHandlerInterface::CARDINALITY_UNLIMITED) {
@@ -146,7 +148,7 @@ public function form(array $form, FormStateInterface $form_state) {
             'webform' => $this->entity->id(),
             'webform_handler' => $handler_id,
           ]),
-          'attributes' => WebformDialogHelper::getOffCanvasDialogAttributes(),
+          'attributes' => $offcanvas_dialog_attributes,
         ];
       }
       // Test individual handler.
diff --git a/web/modules/webform/src/WebformEntityReferenceManagerInterface.php b/web/modules/webform/src/WebformEntityReferenceManagerInterface.php
index 3e7490238c..f1231f19c2 100644
--- a/web/modules/webform/src/WebformEntityReferenceManagerInterface.php
+++ b/web/modules/webform/src/WebformEntityReferenceManagerInterface.php
@@ -14,14 +14,14 @@ interface WebformEntityReferenceManagerInterface {
   /****************************************************************************/
 
   /**
-   * Is the current request a webform croute where the user can specific a webform.
+   * Is the current request a webform route where the user can specify a webform.
    *
    * @param \Drupal\Core\Entity\EntityInterface $entity
    *   A fieldable content entity.
    *
    * @return bool
-   *   TRUE if the current request a webform croute where the user can
-   *   specific a webform.
+   *   TRUE if the current request a webform route where the user can
+   *   specify a webform.
    */
   public function isUserWebformRoute(EntityInterface $entity);
 
diff --git a/web/modules/webform/src/WebformEntityVariantsForm.php b/web/modules/webform/src/WebformEntityVariantsForm.php
index 474e40b984..b77dbdd6f3 100644
--- a/web/modules/webform/src/WebformEntityVariantsForm.php
+++ b/web/modules/webform/src/WebformEntityVariantsForm.php
@@ -93,6 +93,8 @@ public function form(array $form, FormStateInterface $form_state) {
     $variants = $webform->getVariants();
     $rows = [];
     foreach ($variants as $variant_id => $variant) {
+      $offcanvas_dialog_attributes = WebformDialogHelper::getOffCanvasDialogAttributes($variant->getOffCanvasWidth());
+
       $row['#attributes']['class'][] = 'draggable';
       $row['#attributes']['data-webform-key'] = $variant_id;
 
@@ -108,7 +110,7 @@ public function form(array $form, FormStateInterface $form_state) {
               'webform' => $webform->id(),
               'webform_variant' => $variant_id,
             ]),
-            '#attributes' => WebformDialogHelper::getOffCanvasDialogAttributes(),
+            '#attributes' => $offcanvas_dialog_attributes,
           ],
           'notes' => [
             '#prefix' => '<br/>',
@@ -165,7 +167,7 @@ public function form(array $form, FormStateInterface $form_state) {
           'webform' => $webform->id(),
           'webform_variant' => $variant_id,
         ]),
-        'attributes' => WebformDialogHelper::getOffCanvasDialogAttributes(),
+        'attributes' => $offcanvas_dialog_attributes,
       ];
       // Duplicate.
       $operations['duplicate'] = [
@@ -174,7 +176,7 @@ public function form(array $form, FormStateInterface $form_state) {
           'webform' => $webform->id(),
           'webform_variant' => $variant_id,
         ]),
-        'attributes' => WebformDialogHelper::getOffCanvasDialogAttributes(),
+        'attributes' => $offcanvas_dialog_attributes,
       ];
       if ($variant_element && $variant->isEnabled()) {
         // If #prepopulate is disabled use '_webform_variant'
@@ -209,7 +211,7 @@ public function form(array $form, FormStateInterface $form_state) {
           && $webform->access('update')
           && $webform->getSetting('share', TRUE)) {
           $operations['share'] = [
-            'title' => t('Share'),
+            'title' => $this->t('Share'),
             'url' => Url::fromRoute(
               'entity.webform.share_embed',
               ['webform' => $webform->id()],
diff --git a/web/modules/webform/src/WebformHelpManager.php b/web/modules/webform/src/WebformHelpManager.php
index 5802ffe9e6..af3e5b8f23 100644
--- a/web/modules/webform/src/WebformHelpManager.php
+++ b/web/modules/webform/src/WebformHelpManager.php
@@ -1789,7 +1789,7 @@ protected function initHelp() {
         '<li>' . $this->t('Generate a *.make.yml or composer.json file using <code>drush @webform-libraries-make</code> or <code>drush @webform-libraries-composer</code>.', $t_args) . '</li>' .
         '<li>' . $this->t('Execute <code>drush @webform-libraries-download</code>, to download third-party libraries required by the Webform module. (OSX/Linux)', $t_args) . '</li>' .
         '<li>' . $this->t("Execute <code>drush @webform-composer-update</code>, to update your Drupal installation's composer.json to include the Webform module's selected libraries as repositories.", $t_args) . '</li>' .
-        '<li>' . $this->t('Download and extract a <a href=":href">zipped archive containing all webform libraries</a> and extract the directories and files to /libraries or /web/libraries', [':href' => 'https://git.drupalcode.org/sandbox/jrockowitz-2941983/raw/8.x-1.x/libraries.zip']) . '</li>' .
+        '<li>' . $this->t('Download and extract a <a href=":href">zipped archive containing all webform libraries</a> and extract the directories and files to /libraries or /web/libraries', [':href' => 'https://git.drupalcode.org/sandbox/jrockowitz-2941983/raw/8.x-5.x/libraries.zip']) . '</li>' .
         '</ul>',
       'message_type' => 'info',
       'message_close' => TRUE,
@@ -2110,9 +2110,9 @@ protected function initHelp() {
       'content' => $this->t("The <strong>View</strong> page displays a submission's general information and data."),
       'video_id' => 'submission',
       'routes' => [
-        // @see /admin/structure/webform/manage/{webform}/submission/{webform_submisssion}
+        // @see /admin/structure/webform/manage/{webform}/submission/{webform_submission}
         'entity.webform_submission.canonical',
-        // @see /node/{node}/webform/submission/{webform_submisssion}
+        // @see /node/{node}/webform/submission/{webform_submission}
         'entity.node.webform_submission.canonical',
       ],
     ];
@@ -2123,9 +2123,9 @@ protected function initHelp() {
       'content' => $this->t("The <strong>Table</strong> page displays a submission's general information and data using tabular layout."),
       'video_id' => 'submission',
       'routes' => [
-        // @see /admin/structure/webform/manage/{webform}/submission/{webform_submisssion}/table
+        // @see /admin/structure/webform/manage/{webform}/submission/{webform_submission}/table
         'entity.webform_submission.table',
-        // @see /node/{node}/webform/submission/{webform_submisssion}/table
+        // @see /node/{node}/webform/submission/{webform_submission}/table
         'entity.node.webform_submission.table',
       ],
     ];
@@ -2136,9 +2136,9 @@ protected function initHelp() {
       'content' => $this->t("The <strong>Plain text</strong> page displays a submission's general information and data as plain text."),
       'video_id' => 'submission',
       'routes' => [
-        // @see /admin/structure/webform/manage/{webform}/submission/{webform_submisssion}/text
+        // @see /admin/structure/webform/manage/{webform}/submission/{webform_submission}/text
         'entity.webform_submission.text',
-        // @see /node/{node}/webform/submission/{webform_submisssion}/text
+        // @see /node/{node}/webform/submission/{webform_submission}/text
         'entity.node.webform_submission.text',
       ],
     ];
@@ -2149,9 +2149,9 @@ protected function initHelp() {
       'content' => $this->t("The <strong>Data (YAML)</strong> page displays a submission's raw data as YAML."),
       'video_id' => 'submission',
       'routes' => [
-        // @see /admin/structure/webform/manage/{webform}/submission/{webform_submisssion}/yaml
+        // @see /admin/structure/webform/manage/{webform}/submission/{webform_submission}/yaml
         'entity.webform_submission.yaml',
-        // @see /node/{node}/webform/submission/{webform_submisssion}/yaml
+        // @see /node/{node}/webform/submission/{webform_submission}/yaml
         'entity.node.webform_submission.yaml',
       ],
     ];
@@ -2162,9 +2162,9 @@ protected function initHelp() {
       'content' => $this->t("The <strong>Edit</strong> form allows the administrator to update a submission."),
       'video_id' => 'submission',
       'routes' => [
-        // @see /admin/structure/webform/manage/{webform}/submission/{webform_submisssion}/edit
+        // @see /admin/structure/webform/manage/{webform}/submission/{webform_submission}/edit
         'entity.webform_submission.edit_form',
-        // @see /node/{node}/webform/submission/{webform_submisssion}/edit
+        // @see /node/{node}/webform/submission/{webform_submission}/edit
         'entity.node.webform_submission.edit_form',
       ],
     ];
@@ -2175,9 +2175,9 @@ protected function initHelp() {
       'content' => $this->t("The <strong>Edit all</strong> form allows administrator to update all values for submission create from a multi-step form."),
       'video_id' => 'submission',
       'routes' => [
-        // @see /admin/structure/webform/manage/{webform}/submission/{webform_submisssion}/edit_all
+        // @see /admin/structure/webform/manage/{webform}/submission/{webform_submission}/edit_all
         'entity.webform_submission.edit_all',
-        // @see /node/{node}/webform/submission/{webform_submisssion}/edit_all
+        // @see /node/{node}/webform/submission/{webform_submission}/edit_all
         'entity.node.webform_submission.edit_all',
       ],
     ];
@@ -2188,9 +2188,9 @@ protected function initHelp() {
       'content' => $this->t("The <strong>Resend</strong> form allows administrator to preview and resend emails and messages."),
       'video_id' => 'submission',
       'routes' => [
-        // @see /admin/structure/webform/manage/{webform}/submission/{webform_submisssion}/resend
+        // @see /admin/structure/webform/manage/{webform}/submission/{webform_submission}/resend
         'entity.webform_submission.resend_form',
-        // @see /node/{node}/webform/submission/{webform_submisssion}/resend
+        // @see /node/{node}/webform/submission/{webform_submission}/resend
         'entity.node.webform_submission.resend_form',
       ],
     ];
@@ -2200,9 +2200,9 @@ protected function initHelp() {
       'title' => $this->t('Submission: Notes'),
       'content' => $this->t("The <strong>Notes</strong> form allows administrator to flag and annotate a submission."),
       'routes' => [
-        // @see /admin/structure/webform/manage/{webform}/submission/{webform_submisssion}/notes
+        // @see /admin/structure/webform/manage/{webform}/submission/{webform_submission}/notes
         'entity.webform_submission.notes_form',
-        // @see /node/{node}/webform/submission/{webform_submisssion}/notes
+        // @see /node/{node}/webform/submission/{webform_submission}/notes
         'entity.node.webform_submission.notes_form',
       ],
     ];
diff --git a/web/modules/webform/src/WebformInterface.php b/web/modules/webform/src/WebformInterface.php
index 45b887e695..be9c43779b 100644
--- a/web/modules/webform/src/WebformInterface.php
+++ b/web/modules/webform/src/WebformInterface.php
@@ -1212,4 +1212,16 @@ public function deleteUserData($key);
    */
   public function hasUserData($key);
 
+  /****************************************************************************/
+  // Third party settings.
+  /****************************************************************************/
+
+  /**
+   * Unsets all third-party settings of a given module.
+   *
+   * @param string $module
+   *   The module providing the third-party settings.
+   */
+  public function unsetThirdPartySettings($module);
+
 }
diff --git a/web/modules/webform/src/WebformLibrariesManager.php b/web/modules/webform/src/WebformLibrariesManager.php
index da94477835..3253b9a755 100644
--- a/web/modules/webform/src/WebformLibrariesManager.php
+++ b/web/modules/webform/src/WebformLibrariesManager.php
@@ -281,7 +281,7 @@ protected function initLibraries() {
       'homepage_url' => Url::fromUri('https://ckeditor.com/addon/autogrow'),
       'download_url' => Url::fromUri("https://download.ckeditor.com/autogrow/releases/autogrow_$ckeditor_version.zip"),
       'plugin_path' => 'libraries/ckeditor.autogrow/',
-      'plugin_url' => "https://cdn.rawgit.com/ckeditor/ckeditor-dev/$ckeditor_version/plugins/autogrow/",
+      'plugin_url' => "https://cdn.jsdelivr.net/gh/ckeditor/ckeditor-dev@$ckeditor_version/plugins/autogrow/",
       'version' => $ckeditor_version,
     ];
     $libraries['ckeditor.fakeobjects'] = [
@@ -291,7 +291,7 @@ protected function initLibraries() {
       'homepage_url' => Url::fromUri('https://ckeditor.com/addon/fakeobjects'),
       'download_url' => Url::fromUri("https://download.ckeditor.com/fakeobjects/releases/fakeobjects_$ckeditor_version.zip"),
       'plugin_path' => 'libraries/ckeditor.fakeobjects/',
-      'plugin_url' => "https://cdn.rawgit.com/ckeditor/ckeditor-dev/$ckeditor_version/plugins/fakeobjects/",
+      'plugin_url' => "https://cdn.jsdelivr.net/gh/ckeditor/ckeditor-dev@$ckeditor_version/plugins/fakeobjects/",
       'version' => $ckeditor_version,
     ];
     $libraries['ckeditor.image'] = [
@@ -301,7 +301,7 @@ protected function initLibraries() {
       'homepage_url' => Url::fromUri('https://ckeditor.com/addon/image'),
       'download_url' => Url::fromUri("https://download.ckeditor.com/image/releases/image_$ckeditor_version.zip"),
       'plugin_path' => 'libraries/ckeditor.image/',
-      'plugin_url' => "https://cdn.rawgit.com/ckeditor/ckeditor-dev/$ckeditor_version/plugins/image/",
+      'plugin_url' => "https://cdn.jsdelivr.net/gh/ckeditor/ckeditor-dev@$ckeditor_version/plugins/image/",
       'version' => $ckeditor_version,
     ];
     $libraries['ckeditor.link'] = [
@@ -311,7 +311,7 @@ protected function initLibraries() {
       'homepage_url' => Url::fromUri('https://ckeditor.com/addon/link'),
       'download_url' => Url::fromUri("https://download.ckeditor.com/link/releases/link_$ckeditor_version.zip"),
       'plugin_path' => 'libraries/ckeditor.link/',
-      'plugin_url' => "https://cdn.rawgit.com/ckeditor/ckeditor-dev/$ckeditor_version/plugins/link/",
+      'plugin_url' => "https://cdn.jsdelivr.net/gh/ckeditor/ckeditor-dev@$ckeditor_version/plugins/link/",
       'version' => $ckeditor_version,
     ];
     $libraries['ckeditor.codemirror'] = [
@@ -321,7 +321,7 @@ protected function initLibraries() {
       'homepage_url' => Url::fromUri('https://github.com/w8tcha/CKEditor-CodeMirror-Plugin'),
       'download_url' => Url::fromUri('https://github.com/w8tcha/CKEditor-CodeMirror-Plugin/releases/download/v1.17.12/CKEditor-CodeMirror-Plugin.zip'),
       'plugin_path' => 'libraries/ckeditor.codemirror/codemirror/',
-      'plugin_url' => "https://cdn.rawgit.com/w8tcha/CKEditor-CodeMirror-Plugin/v1.17.12/codemirror/",
+      'plugin_url' => "https://cdn.jsdelivr.net/gh/w8tcha/CKEditor-CodeMirror-Plugin@v1.17.12/codemirror/",
       'version' => 'v1.17.12',
     ];
     $libraries['codemirror'] = [
@@ -329,9 +329,9 @@ protected function initLibraries() {
       'description' => $this->t('Code Mirror is a versatile text editor implemented in JavaScript for the browser.'),
       'notes' => $this->t('Code Mirror is used to provide a text editor for YAML, HTML, CSS, and JavaScript configuration settings and messages.'),
       'homepage_url' => Url::fromUri('http://codemirror.net/'),
-      'download_url' => Url::fromUri('https://github.com/components/codemirror/archive/5.53.2.zip'),
+      'download_url' => Url::fromUri('https://github.com/components/codemirror/archive/5.57.0.zip'),
       'issues_url' => Url::fromUri('https://github.com/codemirror/codemirror/issues'),
-      'version' => '5.53.2',
+      'version' => '5.57.0',
     ];
     $libraries['algolia.places'] = [
       'title' => $this->t('Algolia Places'),
@@ -342,8 +342,8 @@ protected function initLibraries() {
       // NOTE: Using NPM/JsDelivr because it contains the '/dist/cdn/' directory.
       // @see https://asset-packagist.org/package/detail?fullname=npm-asset/places.js
       // @see https://www.jsdelivr.com/package/npm/places.js
-      'download_url' => Url::fromUri('https://registry.npmjs.org/places.js/-/places.js-1.18.2.tgz'),
-      'version' => '1.18.2',
+      'download_url' => Url::fromUri('https://registry.npmjs.org/places.js/-/places.js-1.19.0.tgz'),
+      'version' => '1.19.0',
       'elements' => ['webform_location_places'],
     ];
     $libraries['jquery.inputmask'] = [
@@ -351,8 +351,8 @@ protected function initLibraries() {
       'description' => $this->t('Input masks ensures a predefined format is entered. This can be useful for dates, numerics, phone numbers, etc…'),
       'notes' => $this->t('Input masks are used to ensure predefined and custom formats for text fields.'),
       'homepage_url' => Url::fromUri('https://robinherbots.github.io/Inputmask/'),
-      'download_url' => Url::fromUri('https://github.com/RobinHerbots/jquery.inputmask/archive/5.0.3.zip'),
-      'version' => '5.0.3',
+      'download_url' => Url::fromUri('https://github.com/RobinHerbots/jquery.inputmask/archive/5.0.5.zip'),
+      'version' => '5.0.5',
     ];
     $libraries['jquery.intl-tel-input'] = [
       'title' => $this->t('jQuery: International Telephone Input'),
@@ -380,12 +380,12 @@ protected function initLibraries() {
       'version' => '0.9.0',
     ];
     $libraries['jquery.timepicker'] = [
-      'title' => $this->t('jQuery: Timepicker 1.13.10'),
+      'title' => $this->t('jQuery: Timepicker'),
       'description' => $this->t('A lightweight, customizable javascript timepicker plugin for jQuery, inspired by Google Calendar.'),
       'notes' => $this->t('Timepicker is used to provide a polyfill for HTML 5 time elements.'),
       'homepage_url' => Url::fromUri('https://github.com/jonthornton/jquery-timepicker'),
-      'download_url' => Url::fromUri('https://github.com/jonthornton/jquery-timepicker/archive/1.13.10.zip'),
-      'version' => '1.13.10',
+      'download_url' => Url::fromUri('https://github.com/jonthornton/jquery-timepicker/archive/1.13.14.zip'),
+      'version' => '1.13.14',
     ];
     $libraries['progress-tracker'] = [
       'title' => $this->t('Progress Tracker'),
@@ -454,6 +454,17 @@ protected function initLibraries() {
     // Sort libraries by key.
     ksort($libraries);
 
+    // Support CKEditor plugins without the ckeditor.* prefix.
+    // @see https://www.drupal.org/project/fakeobjects
+    // @see https://www.drupal.org/project/anchor_link
+    foreach ($libraries as $library_name => $library) {
+      if (strpos($library_name, 'ckeditor.') === 0
+        && !file_exists($library['plugin_path'])
+        && file_exists(str_replace('ckeditor.', '', $library['plugin_path']))) {
+        $libraries[$library_name]['plugin_path'] = str_replace('ckeditor.', '', $library['plugin_path']);
+      }
+    }
+
     // Move deprecated libraries last.
     foreach ($libraries as $library_name => $library) {
       if (!empty($library['deprecated'])) {
diff --git a/web/modules/webform/src/WebformSubmissionConditionsValidator.php b/web/modules/webform/src/WebformSubmissionConditionsValidator.php
index 87947fd368..2f5fd0119a 100644
--- a/web/modules/webform/src/WebformSubmissionConditionsValidator.php
+++ b/web/modules/webform/src/WebformSubmissionConditionsValidator.php
@@ -4,6 +4,7 @@
 
 use Drupal\Component\Utility\Crypt;
 use Drupal\Core\Form\FormStateInterface;
+use Drupal\Core\Render\Element;
 use Drupal\Core\StringTranslation\StringTranslationTrait;
 use Drupal\webform\Plugin\WebformElement\TextBase;
 use Drupal\webform\Plugin\WebformElement\WebformCompositeBase;
@@ -118,7 +119,7 @@ public function buildForm(array &$form, FormStateInterface $form_state) {
           $element['#after_build'][] = [get_class($this), 'elementAfterBuild'];
         }
 
-        $targets = $this->getConditionTargetsVisiblity($conditions, $visible_elements);
+        $targets = $this->getConditionTargetsVisibility($conditions, $visible_elements);
 
         // Determine if targets are visible or cross page.
         $all_targets_visible = (array_sum($targets) === count($targets));
@@ -301,16 +302,11 @@ public function validateForm(array &$form, FormStateInterface $form_state) {
    */
   protected function validateFormRecursive(array $form, FormStateInterface $form_state) {
     foreach ($form as $key => $element) {
-      if (!WebformElementHelper::isElement($element, $key)) {
-        continue;
-      }
-
-      if (isset($element['#access']) && $element['#access'] === FALSE) {
+      if (!WebformElementHelper::isElement($element, $key)
+        || !Element::isVisibleElement($element)) {
         continue;
       }
-
       $this->validateFormElement($element, $form_state);
-
       $this->validateFormRecursive($element, $form_state);
     }
   }
@@ -386,12 +382,17 @@ public function submitForm(array &$form, FormStateInterface $form_state) {
     /** @var \Drupal\webform\WebformSubmissionInterface $webform_submission */
     $webform_submission = $form_state->getFormObject()->getEntity();
 
+    // Check if we are in the middle of multiple wizard form and determine
+    // if element access should be checked.
+    $current_page = $form_state->get('current_page');
+    $check_access = (!$current_page || $current_page === WebformInterface::PAGE_CONFIRMATION) ? FALSE : TRUE;
+
     // Get submission data.
     $data = $webform_submission->getData();
 
     // Recursive through the form and unset unset submission data for
     // form elements that are hidden.
-    $this->submitFormRecursive($form, $webform_submission, $data);
+    $this->submitFormRecursive($form, $webform_submission, $data, $check_access);
 
     // Set submission data.
     $webform_submission->setData($data);
@@ -406,10 +407,13 @@ public function submitForm(array &$form, FormStateInterface $form_state) {
    *   A webform submission.
    * @param array $data
    *   A webform submission's data.
+   * @param bool $check_access
+   *   Flag that determine if the currrent form element's access
+   *   should be checked.
    * @param bool $visible
    *   Flag that determine if the currrent form elements are visible.
    */
-  protected function submitFormRecursive(array $elements, WebformSubmissionInterface $webform_submission, array &$data, $visible = TRUE) {
+  protected function submitFormRecursive(array $elements, WebformSubmissionInterface $webform_submission, array &$data, $check_access, $visible = TRUE) {
     foreach ($elements as $key => &$element) {
       if (!WebformElementHelper::isElement($element, $key)) {
         continue;
@@ -420,7 +424,9 @@ protected function submitFormRecursive(array $elements, WebformSubmissionInterfa
         continue;
       }
 
-      if (isset($element['#_webform_access']) && $element['#_webform_access'] === FALSE) {
+      // Skip if element #_webform_access should be checked to
+      // preserve default values.
+      if ($check_access && isset($element['#_webform_access']) && $element['#_webform_access'] === FALSE) {
         continue;
       }
 
@@ -432,7 +438,7 @@ protected function submitFormRecursive(array $elements, WebformSubmissionInterfa
         $data[$key] = (is_array($data[$key])) ? [] : '';
       }
 
-      $this->submitFormRecursive($element, $webform_submission, $data, $element_visible);
+      $this->submitFormRecursive($element, $webform_submission, $data, $check_access, $element_visible);
     }
   }
 
@@ -573,6 +579,10 @@ public function validateState($state, array $conditions, WebformSubmissionInterf
    * {@inheritdoc}
    */
   public function validateConditions(array $conditions, WebformSubmissionInterface $webform_submission) {
+    if (empty($conditions)) {
+      return TRUE;
+    }
+
     // Determine condition logic.
     // @see Drupal.states.Dependent.verifyConstraints
     if (WebformArrayHelper::isSequential($conditions)) {
@@ -706,8 +716,8 @@ protected function validateCondition($selector, array $condition, WebformSubmiss
    *   TRUE if condition is validated. NULL if the condition can't be evaluated.
    */
   protected function checkCondition(array $element, $selector, array $condition, WebformSubmissionInterface $webform_submission) {
-    $trigger_state = key($condition);
-    $trigger_value = $condition[$trigger_state];
+    $trigger = key($condition);
+    $trigger_value = $condition[$trigger];
 
     $element_plugin = $this->elementManager->getElementInstance($element);
 
@@ -716,83 +726,111 @@ protected function checkCondition(array $element, $selector, array $condition, W
       return TRUE;
     }
 
-    $element_value = $element_plugin->getElementSelectorInputValue($selector, $trigger_state, $element, $webform_submission);
+    $element_value = $element_plugin->getElementSelectorInputValue($selector, $trigger, $element, $webform_submission);
 
     // Process trigger sub state used for custom #states API validation.
-    // @see Drupal.behaviors.webformStatesComparisions
+    // @see Drupal.behaviors.webformStatesComparisons
     // @see http://drupalsun.com/julia-evans/2012/03/09/extending-form-api-states-regular-expressions
-    if ($trigger_state === 'value' && is_array($trigger_value)) {
+    if ($trigger === 'value' && is_array($trigger_value)) {
       $trigger_substate = key($trigger_value);
-      if (in_array($trigger_substate, ['pattern', '!pattern', 'less', 'greater', 'between'])) {
-        $trigger_state = $trigger_substate;
+      if (in_array($trigger_substate, ['pattern', '!pattern', 'less', 'less_equal', 'greater', 'greater_equal', 'between', '!between'])) {
+        $trigger = $trigger_substate;
         $trigger_value = reset($trigger_value);
       }
     }
 
     // Process trigger state/negate.
-    list($trigger_state, $trigger_negate) = $this->processState($trigger_state);
+    list($trigger, $trigger_negate) = $this->processState($trigger);
 
     // Process triggers (aka remote conditions).
     // @see \Drupal\webform\Element\WebformElementStates::processWebformStates
-    switch ($trigger_state) {
+    if ($element_plugin->hasMultipleValues($element) && $trigger !== 'empty') {
+      $result = FALSE;
+      $element_values = (array) $element_value;
+      foreach ($element_values as $element_value) {
+        $trigger_result = $this->checkConditionTrigger($trigger, $trigger_value, $element_value);
+        if ($trigger_result !== FALSE) {
+          $result = $trigger_result;
+        }
+      }
+    }
+    else {
+      $result = $this->checkConditionTrigger($trigger, $trigger_value, $element_value);
+    }
+
+    if ($result === NULL) {
+      return FALSE;
+    }
+
+    return ($trigger_negate) ? !$result : $result;
+  }
+
+  /**
+   * Process condition trigger.
+   *
+   * @param string $trigger
+   *   The trigger.
+   * @param string $trigger_value
+   *   The trigger value.
+   * @param string|array $element_value
+   *   The element value.
+   *
+   * @return bool|null
+   *   The result.
+   */
+  protected function checkConditionTrigger($trigger, $trigger_value, $element_value) {
+    // Process triggers (aka remote conditions).
+    // @see \Drupal\webform\Element\WebformElementStates::processWebformStates
+    switch ($trigger) {
       case 'empty':
         $empty = (empty($element_value) && $element_value !== '0');
-        $result = ($empty === (boolean) $trigger_value);
-        break;
+        return ($empty === (boolean) $trigger_value);
 
       case 'checked':
-        $result = ((boolean) $element_value === (boolean) $trigger_value);
-        break;
+        return ((boolean) $element_value === (boolean) $trigger_value);
 
       case 'value':
-        if ($element_plugin->hasMultipleValues($element)) {
-          $trigger_values = (array) $trigger_value;
-          $element_values = (array) $element_value;
-          $result = (array_intersect($trigger_values, $element_values)) ? TRUE : FALSE;
-        }
-        else {
-          $result = ((string) $element_value === (string) $trigger_value);
-        }
-        break;
+        return ((string) $element_value === (string) $trigger_value);
 
       case 'pattern':
         // PHP: Convert JavaScript-escaped Unicode characters to PCRE
         // escape sequence format.
         // @see \Drupal\webform\Plugin\WebformElement\TextBase::validatePattern
         $pcre_pattern = preg_replace('/\\\\u([a-fA-F0-9]{4})/', '\\x{\\1}', $trigger_value);
-        $result = preg_match('{' . $pcre_pattern . '}u', $element_value);
-        break;
+        return preg_match('{' . $pcre_pattern . '}u', $element_value);
 
       case 'less':
-        $result = ($element_value !== '' && floatval($trigger_value) > floatval($element_value));
-        break;
+        return ($element_value !== '' && floatval($trigger_value) > floatval($element_value));
+
+      case 'less_equal':
+        return ($element_value !== '' && floatval($trigger_value) >= floatval($element_value));
 
       case 'greater':
-        $result = ($element_value !== '' && floatval($trigger_value) < floatval($element_value));
-        break;
+        return ($element_value !== '' && floatval($trigger_value) < floatval($element_value));
+
+      case 'greater_equal':
+        return ($element_value !== '' && floatval($trigger_value) <= floatval($element_value));
 
       case 'between':
-        $result = FALSE;
-        if ($element_value !== '') {
-          $greater = NULL;
-          $less = NULL;
-          if (strpos($trigger_value, ':') === FALSE) {
-            $greater = $trigger_value;
-          }
-          else {
-            list($greater, $less) = explode(':', $trigger_value);
-          }
-          $is_greater_than = ($greater === NULL || $greater === '' || floatval($element_value) >= floatval($greater));
-          $is_less_than = ($less === NULL || $less === '' || floatval($element_value) <= floatval($less));
-          $result = ($is_greater_than && $is_less_than);
+        if ($element_value === '') {
+          return NULL;
+        }
+
+        $greater = NULL;
+        $less = NULL;
+        if (strpos($trigger_value, ':') === FALSE) {
+          $greater = $trigger_value;
+        }
+        else {
+          list($greater, $less) = explode(':', $trigger_value);
         }
-        break;
+        $is_greater_than = ($greater === NULL || $greater === '' || floatval($element_value) >= floatval($greater));
+        $is_less_than = ($less === NULL || $less === '' || floatval($element_value) <= floatval($less));
+        return ($is_greater_than && $is_less_than);
 
       default:
         return NULL;
     }
-
-    return ($trigger_negate) ? !$result : $result;
   }
 
   /****************************************************************************/
@@ -839,7 +877,7 @@ protected function processState($state) {
    */
   protected function &getBuildElements(array &$form) {
     $elements = [];
-    $this->getBuildElementsRecusive($elements, $form);
+    $this->getBuildElementsRecursive($elements, $form);
     return $elements;
   }
 
@@ -854,7 +892,7 @@ protected function &getBuildElements(array &$form) {
    *   An associative array containing 'required'/'optional' states from parent
    *   container to be set on the element.
    */
-  protected function getBuildElementsRecusive(array &$elements, array &$form, array $parent_states = []) {
+  protected function getBuildElementsRecursive(array &$elements, array &$form, array $parent_states = []) {
     foreach ($form as $key => &$element) {
       if (!WebformElementHelper::isElement($element, $key)) {
         continue;
@@ -923,13 +961,13 @@ protected function getBuildElementsRecusive(array &$elements, array &$form, arra
       }
 
       // Skip if element is not visible.
-      if (isset($element['#access']) && $element['#access'] === FALSE) {
+      if (!Element::isVisibleElement($element)) {
         continue;
       }
 
       $elements[$key] = &$element;
 
-      $this->getBuildElementsRecusive($elements, $element, $subelement_states);
+      $this->getBuildElementsRecursive($elements, $element, $subelement_states);
 
       $element_plugin = $this->elementManager->getElementInstance($element);
       if ($element_plugin instanceof WebformCompositeBase && !$element_plugin->hasMultipleValues($element)) {
@@ -962,7 +1000,7 @@ protected function getBuildElementsRecusive(array &$elements, array &$form, arra
         // @see \Drupal\webform_composite\Plugin\WebformElement\WebformComposite::initializeCompositeElements
         //
         // Recurse through a composite's sub elements.
-        $this->getBuildElementsRecusive($elements, $element['#element'], $subelement_states);
+        $this->getBuildElementsRecursive($elements, $element['#element'], $subelement_states);
       }
     }
   }
@@ -978,9 +1016,9 @@ protected function getBuildElementsRecusive(array &$elements, array &$form, arra
    * @return array
    *   An associative array keyed by target selectors with a boolean state.
    */
-  protected function getConditionTargetsVisiblity(array $conditions, array $elements) {
+  protected function getConditionTargetsVisibility(array $conditions, array $elements) {
     $targets = [];
-    $this->getConditionTargetsVisiblityRecursive($conditions, $targets);
+    $this->getConditionTargetsVisibilityRecursive($conditions, $targets);
     foreach ($targets as $selector) {
       // Ignore invalid selector and return FALSE.
       $input_name = static::getSelectorInputName($selector);
@@ -1009,12 +1047,12 @@ protected function getConditionTargetsVisiblity(array $conditions, array $elemen
    * @param array $targets
    *   An associative array keyed by target selectors with a boolean state.
    */
-  protected function getConditionTargetsVisiblityRecursive(array $conditions, array &$targets = []) {
+  protected function getConditionTargetsVisibilityRecursive(array $conditions, array &$targets = []) {
     foreach ($conditions as $index => $value) {
       if (is_int($index) && is_array($value) && WebformArrayHelper::isSequential($value)) {
         // Recurse downward and get nested target element.
         // NOTE: Nested conditions is not supported via the UI.
-        $this->getConditionTargetsVisiblityRecursive($value, $targets);
+        $this->getConditionTargetsVisibilityRecursive($value, $targets);
       }
       elseif (is_string($value) && in_array($value, ['and', 'or', 'xor'])) {
         // Skip AND, OR, or XOR operators.
diff --git a/web/modules/webform/src/WebformSubmissionExporter.php b/web/modules/webform/src/WebformSubmissionExporter.php
index 949be78d11..bc89df2329 100644
--- a/web/modules/webform/src/WebformSubmissionExporter.php
+++ b/web/modules/webform/src/WebformSubmissionExporter.php
@@ -308,14 +308,18 @@ public function buildExportOptionsForm(array &$form, FormStateInterface $form_st
     // Get exporter plugins.
     $exporter_plugins = $this->exporterManager->getInstances($export_options);
 
+    // Determine if the file can be downloaded or displayed in the file browser.
+    $total = $this->entityStorage->getTotal($this->getWebform(), $this->getSourceEntity());
+    $default_batch_limit = $this->configFactory->get('webform.settings')->get('batch.default_batch_export_size') ?: 500;
+    $download_access = ($total > $default_batch_limit) ? FALSE : TRUE;
+
     // Build #states.
     $states_archive = ['invisible' => []];
     $states_options = ['invisible' => []];
-    $states_files = [
-      'invisible' => [
-        [':input[name="download"]' => ['checked' => FALSE]],
-      ],
-    ];
+    $states_files = ['invisible' => []];
+    if ($webform && $download_access) {
+      $states_files['invisible'][] = [':input[name="download"]' => ['checked' => FALSE]];
+    }
     $states_archive_type = ['visible' => []];
     if ($webform && $webform->hasManagedFile()) {
       $states_archive_type['visible'][] = [':input[name="files"]' => ['checked' => TRUE]];
@@ -499,7 +503,7 @@ public function buildExportOptionsForm(array &$form, FormStateInterface $form_st
         '#description' => $this->t('If checked, the export file will be automatically download to your local machine. If unchecked, the export file will be displayed as plain text within your browser.'),
         '#return_value' => TRUE,
         '#default_value' => $export_options['download'],
-        '#access' => !$this->requiresBatch(),
+        '#access' => $download_access,
         '#states' => $states_archive,
       ];
       $form['export']['download']['files'] = [
diff --git a/web/modules/webform/src/WebformSubmissionForm.php b/web/modules/webform/src/WebformSubmissionForm.php
index b84b474a23..672ff09744 100644
--- a/web/modules/webform/src/WebformSubmissionForm.php
+++ b/web/modules/webform/src/WebformSubmissionForm.php
@@ -8,10 +8,12 @@
 use Drupal\Component\Utility\NestedArray;
 use Drupal\Core\Cache\Cache;
 use Drupal\Core\Config\ConfigFactoryInterface;
+use Drupal\Core\Entity\EntityFieldManagerInterface;
 use Drupal\Core\Entity\EntityInterface;
 use Drupal\Core\Entity\EntityReferenceSelection\SelectionPluginManagerInterface;
 use Drupal\Core\Entity\EntityRepositoryInterface;
 use Drupal\Core\Entity\ContentEntityForm;
+use Drupal\Core\Form\FormBuilderInterface;
 use Drupal\Core\Form\FormState;
 use Drupal\Core\Form\FormStateInterface;
 use Drupal\Core\Messenger\MessengerInterface;
@@ -62,6 +64,13 @@ class WebformSubmissionForm extends ContentEntityForm {
    */
   protected $renderer;
 
+  /**
+   * The form builder.
+   *
+   * @var \Drupal\Core\Form\FormBuilderInterface
+   */
+  protected $formBuilder;
+
   /**
    * The path alias manager.
    *
@@ -76,6 +85,13 @@ class WebformSubmissionForm extends ContentEntityForm {
    */
   protected $pathValidator;
 
+  /**
+   * The entity field manager.
+   *
+   * @var \Drupal\Core\Entity\EntityFieldManagerInterface
+   */
+  protected $entityFieldManager;
+
   /**
    * The webform element plugin manager.
    *
@@ -161,7 +177,7 @@ class WebformSubmissionForm extends ContentEntityForm {
   protected $killSwitch;
 
   /**
-   * Selection Plugin Manager service.
+   * The selection plugin manager.
    *
    * @var \Drupal\Core\Entity\EntityReferenceSelection\SelectionPluginManagerInterface
    */
@@ -209,6 +225,10 @@ class WebformSubmissionForm extends ContentEntityForm {
    *   The page cache kill switch service.
    * @param \Drupal\Core\Entity\EntityReferenceSelection\SelectionPluginManagerInterface $selection_manager
    *   The selection plugin manager.
+   * @param \Drupal\Core\Entity\EntityFieldManagerInterface $entity_field_manager
+   *   The entity field manager.
+   * @param \Drupal\Core\Form\FormBuilderInterface
+   *   The form builder.
    */
   public function __construct(
     EntityRepositoryInterface $entity_repository,
@@ -225,7 +245,9 @@ public function __construct(
     WebformEntityReferenceManagerInterface $webform_entity_reference_manager,
     WebformSubmissionGenerateInterface $submission_generate,
     KillSwitch $killSwitch,
-    SelectionPluginManagerInterface $selection_manager
+    SelectionPluginManagerInterface $selection_manager,
+    EntityFieldManagerInterface $entity_field_manager,
+    FormBuilderInterface $form_builder
   ) {
     parent::__construct($entity_repository);
     $this->configFactory = $config_factory;
@@ -242,7 +264,8 @@ public function __construct(
     $this->generate = $submission_generate;
     $this->killSwitch = $killSwitch;
     $this->selectionManager = $selection_manager;
-
+    $this->entityFieldManager = $entity_field_manager;
+    $this->formBuilder = $form_builder;
   }
 
   /**
@@ -264,7 +287,9 @@ public static function create(ContainerInterface $container) {
       $container->get('webform.entity_reference_manager'),
       $container->get('webform_submission.generate'),
       $container->get('page_cache_kill_switch'),
-      $container->get('plugin.manager.entity_reference_selection')
+      $container->get('plugin.manager.entity_reference_selection'),
+      $container->get('entity_field.manager'),
+      $container->get('form_builder')
     );
   }
 
@@ -352,11 +377,11 @@ public function setEntity(EntityInterface $entity) {
 
     // Get the source entity and allow webform submission to be used as a source
     // entity.
-    $source_entity = $entity->getSourceEntity() ?: $this->requestHandler->getCurrentSourceEntity(['webform']);
+    $source_entity = $entity->getSourceEntity(TRUE) ?: $this->requestHandler->getCurrentSourceEntity(['webform']);
     if ($source_entity === $entity) {
       $source_entity = $this->requestHandler->getCurrentSourceEntity(['webform', 'webform_submission']);
     }
-    // Handle paragraph sourc entity.
+    // Handle paragraph source entity.
     if ($source_entity && $source_entity->getEntityTypeId() === 'paragraph') {
       // Disable :clear suffix to prevent webform tokens from being removed.
       $data = $this->tokenManager->replace($data, $source_entity, [], ['suffixes' => ['clear' => FALSE]]);
@@ -388,6 +413,13 @@ public function setEntity(EntityInterface $entity) {
             $entity = $webform_submission_token;
             $data = $entity->getRawData();
           }
+          elseif (isset($_POST['webform_submission_token'])) {
+            $webform_submission_token = $this->getStorage()->loadFromToken($_POST['webform_submission_token'], $webform, $source_entity, $account);
+            if ($webform_submission_token && $webform_submission_token->isDraft()) {
+              $entity = $webform_submission_token;
+              $data = $entity->getRawData();
+            }
+          }
         }
         elseif ($webform_submission_draft = $this->getStorage()->loadDraft($webform, $source_entity, $account)) {
           // Else load the most recent draft.
@@ -516,14 +548,24 @@ public function copyFormValuesToEntity(EntityInterface $entity, array $form, For
     $webform_submission = $entity;
     $webform = $webform_submission->getWebform();
 
-    // Get elements values from webform submission.
-    $values = array_intersect_key(
+    // Get elements values from webform submission and merge existing data.
+    $element_values = array_intersect_key(
       $form_state->getValues(),
       $webform->getElementsInitializedFlattenedAndHasValue()
     );
+    $webform_submission->setData($element_values + $webform_submission->getData());
 
-    // Serialize the values as YAML and merge existing data.
-    $webform_submission->setData($values + $webform_submission->getData());
+    // Get field values.
+    // This used to support the Workflows Field module.
+    // @see https://www.drupal.org/project/webform/issues/3002547
+    // @see https://www.drupal.org/project/workflows_field
+    $base_field_definitions = $this->entityFieldManager->getBaseFieldDefinitions($entity->getEntityTypeId());
+    $all_fields = $webform_submission->getFields(FALSE);
+    $bundle_fields = array_diff_key($all_fields, $base_field_definitions);
+    $field_values = array_intersect_key($form_state->getValues(), $bundle_fields);
+    foreach ($field_values as $name => $field_value) {
+      $webform_submission->set($name, $field_value);
+    }
 
     // Set current page.
     if ($current_page = $this->getCurrentPage($form, $form_state)) {
@@ -545,6 +587,18 @@ public function buildForm(array $form, FormStateInterface $form_state) {
     $webform_submission = $this->getEntity();
     $webform = $this->getWebform();
 
+    // Track the 'webform_submission_token' form multiple draft submissions.
+    // The 'webform_submission_token' value is set after the form is cached
+    // and built.
+    // @see \Drupal\webform\WebformSubmissionForm::afterBuild
+    if ($webform->getSetting('draft_multiple')
+      && ($webform_submission->isNew() || $webform_submission->isDraft())) {
+      $form['webform_submission_token'] = [
+        '#type' => 'hidden',
+        '#value' => $webform_submission->getToken(),
+      ];
+    }
+
     // Only prepopulate data when a webform is initially loaded.
     if (!$form_state->isRebuilding()) {
       $data = $webform_submission->getData();
@@ -779,10 +833,7 @@ public function form(array $form, FormStateInterface $form_state) {
     }
 
     // Append elements to the webform.
-    $form['elements'] = [
-      '#type' => 'container',
-      '#attributes' => ['class' => ['webform-elements']],
-    ] + $elements;
+    $form['elements'] = $elements;
 
     // Pages: Set current wizard or preview page.
     $this->displayCurrentPage($form, $form_state);
@@ -848,7 +899,7 @@ protected function getCustomForm(array &$form, FormStateInterface $form_state) {
       $form['confirmation'] = [
         '#theme' => 'webform_confirmation',
         '#webform' => $webform,
-        '#source_entity' => $webform_submission->getSourceEntity(),
+        '#source_entity' => $webform_submission->getSourceEntity(TRUE),
         '#webform_submission' => $webform_submission,
       ];
       // Add hidden back (aka reset) button used by the Ajaxified back to link.
@@ -983,7 +1034,7 @@ protected function displayMessages(array $form, FormStateInterface $form_state)
           '#type' => 'link',
           '#title' => $this->t('Generate %title submissions', ['%title' => $webform->label()]),
           '#url' => Url::fromRoute('devel_generate.webform_submission', [], ['query' => $query]),
-          '#attributes' => ($offcanvas) ? WebformDialogHelper::getOffCanvasDialogAttributes(400) : [],
+          '#attributes' => ($offcanvas) ? WebformDialogHelper::getOffCanvasDialogAttributes(400) : ['class' => ['button']],
         ];
         if ($offcanvas) {
           WebformDialogHelper::attachLibraries($form);
@@ -1304,9 +1355,6 @@ protected function actions(array $form, FormStateInterface $form_state) {
     /* @var \Drupal\webform\WebformSubmissionInterface $webform_submission */
     $preview_mode = $this->getWebformSetting('preview');
 
-    // Remove the delete button from the webform submission webform.
-    unset($element['delete']);
-
     // Mark the submit action as the primary action, when it appears.
     $element['submit']['#button_type'] = 'primary';
     $element['submit']['#attributes']['class'][] = 'webform-button--submit';
@@ -1325,6 +1373,17 @@ protected function actions(array $form, FormStateInterface $form_state) {
     // Add confirm(ation) handler to submit button.
     $element['submit']['#submit'][] = '::confirmForm';
 
+    // Hide the delete button and move it last.
+    if (isset($element['delete'])) {
+      $element['delete']['#access'] = FALSE;
+      $element['delete']['#title'] = $this->config('webform.settings')->get('settings.default_delete_button_label');
+      // Redirect to the 'add' submission form when this submission is deleted.
+      if ($this->operation === 'add') {
+        $element['delete']['#url']->mergeOptions(['query' => $this->getRedirectDestination()->getAsArray()]);
+      }
+      $element['delete']['#weight'] = 20;
+    }
+
     $pages = $this->getPages($form, $form_state);
     $current_page = $this->getCurrentPage($form, $form_state);
     if ($pages) {
@@ -1645,9 +1704,18 @@ public function autosave(array &$form, FormStateInterface $form_state) {
       if ($this->draftEnabled() && $this->getWebformSetting('draft_auto_save') && !$this->entity->isCompleted()) {
         $form_state->set('in_draft', TRUE);
 
+        $was_new = $this->entity->isNew();
+
         $this->submitForm($form, $form_state);
         $this->save($form, $form_state);
         $this->rebuild($form, $form_state);
+
+        if ($was_new && $form_state->hasAnyErrors()) {
+          // Prevent the previously-cached form object, which is stored in
+          // $form['build_info']['callback_object'] from being used because it
+          // refers to the original new (unsaved) entity.
+          $this->formBuilder->deleteCache($form['#build_id']);
+        }
       }
     }
   }
@@ -2228,7 +2296,7 @@ protected function displayCurrentPage(array &$form, FormStateInterface $form_sta
           $page_element =& $form['elements'][$page_key];
           $page_element_plugin = $this->elementManager->getElementInstance($page_element);
           if ($page_element_plugin instanceof WebformElementWizardPageInterface) {
-            if ($page_key !== $current_page) {
+            if ($page_key != $current_page) {
               $page_element_plugin->hidePage($page_element);
             }
             else {
diff --git a/web/modules/webform/src/WebformSubmissionInterface.php b/web/modules/webform/src/WebformSubmissionInterface.php
index 899e56afe6..131357179d 100644
--- a/web/modules/webform/src/WebformSubmissionInterface.php
+++ b/web/modules/webform/src/WebformSubmissionInterface.php
@@ -375,6 +375,14 @@ public function setOriginalData(array $data);
    */
   public function getElementOriginalData($key);
 
+  /**
+   * Get a webform submission data as a hash view.
+   *
+   * @return string
+   *   Webform submission data as a hash view.
+   */
+  public function getDataHash();
+
   /**
    * Gets the webform submission's token.
    *
diff --git a/web/modules/webform/src/WebformSubmissionListBuilder.php b/web/modules/webform/src/WebformSubmissionListBuilder.php
index c9a40fa870..75e7c02aa5 100644
--- a/web/modules/webform/src/WebformSubmissionListBuilder.php
+++ b/web/modules/webform/src/WebformSubmissionListBuilder.php
@@ -871,7 +871,7 @@ public function buildRowColumn(array $column, EntityInterface $entity) {
         );
 
       case 'entity':
-        $source_entity = $entity->getSourceEntity();
+        $source_entity = $entity->getSourceEntity(TRUE);
         if (!$source_entity) {
           return '';
         }
@@ -891,7 +891,7 @@ public function buildRowColumn(array $column, EntityInterface $entity) {
         }
 
       case 'notes':
-        $notes_url = $this->ensureDestination($this->requestHandler->getUrl($entity, $entity->getSourceEntity(), 'webform_submission.notes_form'));
+        $notes_url = $this->ensureDestination($this->requestHandler->getUrl($entity, $entity->getSourceEntity(TRUE), 'webform_submission.notes_form'));
         $state = $entity->get('notes')->value ? 'on' : 'off';
         $t_args = ['@label' => $entity->label()];
         $label = $entity->get('notes')->value ? $this->t('Edit @label notes', $t_args) : $this->t('Add notes to @label', $t_args);
@@ -923,7 +923,7 @@ public function buildRowColumn(array $column, EntityInterface $entity) {
           $link_url = $entity->getTokenUrl();
         }
         else {
-          $link_url = $this->requestHandler->getUrl($entity, $entity->getSourceEntity(), $this->getSubmissionRouteName());
+          $link_url = $this->requestHandler->getUrl($entity, $entity->getSourceEntity(TRUE), $this->getSubmissionRouteName());
         }
         if ($name === 'serial') {
           $link_text = $entity->serial();
diff --git a/web/modules/webform/src/WebformSubmissionStorage.php b/web/modules/webform/src/WebformSubmissionStorage.php
index aae49aa3ff..8f58dcc29d 100644
--- a/web/modules/webform/src/WebformSubmissionStorage.php
+++ b/web/modules/webform/src/WebformSubmissionStorage.php
@@ -572,7 +572,7 @@ protected function getTerminusSubmission(WebformInterface $webform, EntityInterf
    * @param array $options
    *   (optional) Additional options and query conditions.
    * @param string $direction
-   *   Direction of the sibliing.
+   *   Direction of the sibling.
    *
    * @return \Drupal\webform\WebformSubmissionInterface|null
    *   The webform submission's sibling.
@@ -985,7 +985,8 @@ protected function doSave($id, EntityInterface $entity) {
 
     $is_new = $entity->isNew();
 
-    if (!$entity->serial()) {
+    // Set serial number using the webform table.
+    if (!$entity->serial() && !$entity->getWebform()->getSetting('serial_disabled')) {
       $next_serial = $this->entityManager->getStorage('webform')->getSerial($entity->getWebform());
       $entity->set('serial', $next_serial);
     }
@@ -995,6 +996,15 @@ protected function doSave($id, EntityInterface $entity) {
     // Save data.
     $this->saveData($entity, !$is_new);
 
+    // Set serial number to the submission id.
+    if (!$entity->serial() && $entity->getWebform()->getSetting('serial_disabled')) {
+      $this->database->update('webform_submission')
+        ->fields(['serial' => $entity->id()])
+        ->condition('sid', $entity->id())
+        ->execute();
+      $entity->set('serial', $entity->id());
+    }
+
     // Set anonymous draft token.
     // This only needs to be called for new anonymous submissions.
     if ($is_new) {
@@ -1566,7 +1576,7 @@ public function getAnonymousSubmissionIds(AccountInterface $account) {
    */
   protected function setAnonymousSubmission(WebformSubmissionInterface $webform_submission) {
     // Make sure the account and current user are identical.
-    if ((int)$webform_submission->getOwnerId() !== (int) $this->currentUser->id()) {
+    if ((int) $webform_submission->getOwnerId() !== (int) $this->currentUser->id()) {
       return;
     }
 
diff --git a/web/modules/webform/src/WebformSubmissionStorageInterface.php b/web/modules/webform/src/WebformSubmissionStorageInterface.php
index 23a5ff5657..34cc6cd0f3 100644
--- a/web/modules/webform/src/WebformSubmissionStorageInterface.php
+++ b/web/modules/webform/src/WebformSubmissionStorageInterface.php
@@ -209,7 +209,7 @@ public function getSourceEntities(WebformInterface $webform);
    *   A webform.
    *
    * @return array
-   *   An associative array contain ource entities as options for
+   *   An associative array contain source entities as options for
    *   a specified webform.
    */
   public function getSourceEntitiesAsOptions(WebformInterface $webform);
diff --git a/web/modules/webform/src/WebformSubmissionViewBuilder.php b/web/modules/webform/src/WebformSubmissionViewBuilder.php
index 080050bd3c..744d3632a0 100644
--- a/web/modules/webform/src/WebformSubmissionViewBuilder.php
+++ b/web/modules/webform/src/WebformSubmissionViewBuilder.php
@@ -10,6 +10,7 @@
 use Drupal\Core\Routing\RouteMatchInterface;
 use Drupal\Core\Language\LanguageManagerInterface;
 use Drupal\webform\Plugin\WebformElementAttachmentInterface;
+use Drupal\webform\Plugin\WebformElementCompositeInterface;
 use Drupal\webform\Plugin\WebformElementManagerInterface;
 use Drupal\webform\Twig\WebformTwigExtension;
 use Drupal\webform\Utility\WebformElementHelper;
@@ -303,11 +304,13 @@ protected function isElementVisible(array $element, WebformSubmissionInterface $
       return FALSE;
     }
 
-    // Checked excluded attachments.
+    // Checked excluded attachments, except from composite elements.
+    // @see \Drupal\webform\Plugin\WebformElement\WebformCompositeBase::formatComposite
     if (!empty($options['exclude_attachments'])) {
       /** @var \Drupal\webform\Plugin\WebformElementInterface $webform_element */
       $webform_element = $this->elementManager->getElementInstance($element, $webform_submission);
-      if ($webform_element instanceof WebformElementAttachmentInterface) {
+      if ($webform_element instanceof WebformElementAttachmentInterface
+        && !$webform_element instanceof WebformElementCompositeInterface) {
         return FALSE;
       }
     }
diff --git a/web/modules/webform/templates/webform-composite-address.html.twig b/web/modules/webform/templates/webform-composite-address.html.twig
index e6ddb7db4b..4dca7fb464 100644
--- a/web/modules/webform/templates/webform-composite-address.html.twig
+++ b/web/modules/webform/templates/webform-composite-address.html.twig
@@ -14,37 +14,39 @@
  */
 #}
 {% if flexbox %}
-
+<div class="webform-address">
   {% if content.address %}
-    <div class="webform-flexbox">
-      <div class="webform-flex webform-flex--1"><div class="webform-flex--container">{{ content.address }}</div></div>
+    <div class="webform-flexbox webform-address__row-1">
+      <div class="webform-flex webform-flex--1 webform-address__address"><div class="webform-flex--container">{{ content.address }}</div></div>
     </div>
   {% endif %}
 
   {% if content.address_2 %}
-    <div class="webform-flexbox">
-      <div class="webform-flex webform-flex--1"><div class="webform-flex--container">{{ content.address_2 }}</div></div>
+    <div class="webform-flexbox webform-address__row-2">
+      <div class="webform-flex webform-flex--1 webform-address__address-2"><div class="webform-flex--container">{{ content.address_2 }}</div></div>
     </div>
   {% endif %}
 
-  <div class="webform-flexbox">
-    {% if content.city %}
-      <div class="webform-flex webform-flex--1"><div class="webform-flex--container">{{ content.city }}</div></div>
-    {% endif %}
-    {% if content.state_province %}
-      <div class="webform-flex webform-flex--1"><div class="webform-flex--container">{{ content.state_province }}</div></div>
-    {% endif %}
-    {% if content.postal_code %}
-      <div class="webform-flex webform-flex--1"><div class="webform-flex--container">{{ content.postal_code }}</div></div>
-    {% endif %}
-  </div>
+  {% if content.city or content.state_province or content.postal_code %}
+    <div class="webform-flexbox webform-address__row-3">
+      {% if content.city %}
+        <div class="webform-flex webform-flex--1 webform-address__city"><div class="webform-flex--container">{{ content.city }}</div></div>
+      {% endif %}
+      {% if content.state_province %}
+        <div class="webform-flex webform-flex--1 webform-address__province"><div class="webform-flex--container">{{ content.state_province }}</div></div>
+      {% endif %}
+      {% if content.postal_code %}
+        <div class="webform-flex webform-flex--1 webform-address__postal-code"><div class="webform-flex--container">{{ content.postal_code }}</div></div>
+      {% endif %}
+    </div>
+  {% endif %}
 
   {% if content.country %}
-    <div class="webform-flexbox">
-      <div class="webform-flex webform-flex--1"><div class="webform-flex--container">{{ content.country }}</div></div>
+    <div class="webform-flexbox webform-address__row-4">
+      <div class="webform-flex webform-flex--1 webform-address__country"><div class="webform-flex--container">{{ content.country }}</div></div>
     </div>
   {% endif %}
-
+</div>
 {% else %}
   {{ content }}
 {% endif %}
diff --git a/web/modules/webform/templates/webform-composite-contact.html.twig b/web/modules/webform/templates/webform-composite-contact.html.twig
index 15bd443fae..5fca29b351 100644
--- a/web/modules/webform/templates/webform-composite-contact.html.twig
+++ b/web/modules/webform/templates/webform-composite-contact.html.twig
@@ -14,59 +14,61 @@
  */
 #}
 {% if flexbox %}
-
+<div class="webform-contact">
   {% if content.name or content.company %}
-    <div class="webform-flexbox">
+    <div class="webform-flexbox webform-contact__row-1">
       {% if content.name %}
-        <div class="webform-flex webform-flex--1"><div class="webform-flex--container">{{ content.name }}</div></div>
+        <div class="webform-flex webform-flex--1 webform-address__name"><div class="webform-flex--container">{{ content.name }}</div></div>
       {% endif %}
       {% if content.company %}
-        <div class="webform-flex webform-flex--1"><div class="webform-flex--container">{{ content.company }}</div></div>
+        <div class="webform-flex webform-flex--1 webform-address__company"><div class="webform-flex--container">{{ content.company }}</div></div>
       {% endif %}
     </div>
   {% endif %}
 
   {% if content.email or content.phone %}
-    <div class="webform-flexbox">
+    <div class="webform-flexbox webform-contact__row-2">
       {% if content.email %}
-        <div class="webform-flex webform-flex--1"><div class="webform-flex--container">{{ content.email }}</div></div>
+        <div class="webform-flex webform-flex--1 webform-address__email"><div class="webform-flex--container">{{ content.email }}</div></div>
       {% endif %}
       {% if content.phone %}
-        <div class="webform-flex webform-flex--1"><div class="webform-flex--container">{{ content.phone }}</div></div>
+        <div class="webform-flex webform-flex--1 webform-address__phone"><div class="webform-flex--container">{{ content.phone }}</div></div>
       {% endif %}
     </div>
   {% endif %}
 
   {% if content.address %}
-    <div class="webform-flexbox">
-      <div class="webform-flex webform-flex--1"><div class="webform-flex--container">{{ content.address }}</div></div>
+    <div class="webform-flexbox webform-contact__row-3">
+      <div class="webform-flex webform-flex--1 webform-address__address"><div class="webform-flex--container">{{ content.address }}</div></div>
     </div>
   {% endif %}
 
   {% if content.address_2 %}
-    <div class="webform-flexbox">
-      <div class="webform-flex webform-flex--1"><div class="webform-flex--container">{{ content.address_2 }}</div></div>
+    <div class="webform-flexbox webform-contact__row-4">
+      <div class="webform-flex webform-flex--1 webform-address__address-2"><div class="webform-flex--container">{{ content.address_2 }}</div></div>
     </div>
   {% endif %}
 
-  <div class="webform-flexbox">
-    {% if content.city %}
-      <div class="webform-flex webform-flex--1"><div class="webform-flex--container">{{ content.city }}</div></div>
-    {% endif %}
-    {% if content.state_province %}
-      <div class="webform-flex webform-flex--1"><div class="webform-flex--container">{{ content.state_province }}</div></div>
-    {% endif %}
-    {% if content.postal_code %}
-      <div class="webform-flex webform-flex--1"><div class="webform-flex--container">{{ content.postal_code }}</div></div>
-    {% endif %}
-  </div>
+  {% if content.city or content.state_province or content.postal_code %}
+    <div class="webform-flexbox webform-contact__row-5">
+      {% if content.city %}
+        <div class="webform-flex webform-flex--1 webform-address__city"><div class="webform-flex--container">{{ content.city }}</div></div>
+      {% endif %}
+      {% if content.state_province %}
+        <div class="webform-flex webform-flex--1 webform-address__province"><div class="webform-flex--container">{{ content.state_province }}</div></div>
+      {% endif %}
+      {% if content.postal_code %}
+        <div class="webform-flex webform-flex--1 webform-address__postal-code"><div class="webform-flex--container">{{ content.postal_code }}</div></div>
+      {% endif %}
+    </div>
+  {% endif %}
 
   {% if content.country %}
-    <div class="webform-flexbox">
-      <div class="webform-flex webform-flex--1"><div class="webform-flex--container">{{ content.country }}</div></div>
+    <div class="webform-flexbox webform-contact__row-6">
+      <div class="webform-flex webform-flex--1 webform-address__country"><div class="webform-flex--container">{{ content.country }}</div></div>
     </div>
   {% endif %}
-
+</div>
 {% else %}
   {{ content }}
 {% endif %}
diff --git a/web/modules/webform/templates/webform-composite-name.html.twig b/web/modules/webform/templates/webform-composite-name.html.twig
index 6a55d243a9..15d6457113 100644
--- a/web/modules/webform/templates/webform-composite-name.html.twig
+++ b/web/modules/webform/templates/webform-composite-name.html.twig
@@ -14,26 +14,28 @@
  */
 #}
 {% if flexbox %}
+<div class="webform-name">
   <div class="webform-flexbox">
     {% if content.title %}
-      <div class="webform-flex webform-flex--2"><div class="webform-flex--container">{{ content.title }}</div></div>
+      <div class="webform-flex webform-flex--2 webform-name__title"><div class="webform-flex--container">{{ content.title }}</div></div>
     {% endif %}
     {% if content.first %}
-      <div class="webform-flex webform-flex--3"><div class="webform-flex--container">{{ content.first }}</div></div>
+      <div class="webform-flex webform-flex--3 webform-name__first"><div class="webform-flex--container">{{ content.first }}</div></div>
     {% endif %}
     {% if content.middle %}
-      <div class="webform-flex webform-flex--2"><div class="webform-flex--container">{{ content.middle }}</div></div>
+      <div class="webform-flex webform-flex--2 webform-name__middle"><div class="webform-flex--container">{{ content.middle }}</div></div>
     {% endif %}
     {% if content.last %}
-      <div class="webform-flex webform-flex--3"><div class="webform-flex--container">{{ content.last }}</div></div>
+      <div class="webform-flex webform-flex--3 webform-name__last"><div class="webform-flex--container">{{ content.last }}</div></div>
     {% endif %}
     {% if content.suffix %}
-      <div class="webform-flex webform-flex--1"><div class="webform-flex--container">{{ content.suffix }}</div></div>
+      <div class="webform-flex webform-flex--1 webform-name__suffix"><div class="webform-flex--container">{{ content.suffix }}</div></div>
     {% endif %}
     {% if content.degree %}
-      <div class="webform-flex webform-flex--1"><div class="webform-flex--container">{{ content.degree }}</div></div>
+      <div class="webform-flex webform-flex--1 webform-name__degree"><div class="webform-flex--container">{{ content.degree }}</div></div>
     {% endif %}
   </div>
+</div>
 {% else %}
   {{ content }}
 {% endif %}
diff --git a/web/modules/webform/templates/webform-confirmation.html.twig b/web/modules/webform/templates/webform-confirmation.html.twig
index c5db7adfb6..95499ba352 100644
--- a/web/modules/webform/templates/webform-confirmation.html.twig
+++ b/web/modules/webform/templates/webform-confirmation.html.twig
@@ -27,7 +27,7 @@
 
   {% if back %}
   <div class="webform-confirmation__back">
-    <a href="{{ back_url }}" rel="prev" title="{{ back_label }}"{{ back_attributes }}>{{ back_label }}</a>
+    <a href="{{ back_url }}" rel="prev"{{ back_attributes }}>{{ back_label }}</a>
   </div>
   {% endif %}
 
diff --git a/web/modules/webform/templates/webform-handler-action-summary.html.twig b/web/modules/webform/templates/webform-handler-action-summary.html.twig
index 8acd2d68ba..47cdf0622d 100644
--- a/web/modules/webform/templates/webform-handler-action-summary.html.twig
+++ b/web/modules/webform/templates/webform-handler-action-summary.html.twig
@@ -10,7 +10,7 @@
  * @ingroup themeable
  */
 #}
-{% if settings.debug %}<b class="color-error">{{ 'Debugging is enabled'|t }}</b><br />{% endif %}
+{% if settings.debug %}<strong class="color-error">{{ 'Debugging is enabled'|t }}</strong><br />{% endif %}
 {% if settings.sticky is not null %}<b>{{ 'Status:'|t }}</b> {{ settings.sticky ? 'Flag/Star'|t : 'Unflag/Unstar'|t }}<br />{% endif %}
 {% if settings.locked is not null %}<b>{{ 'Lock:'|t }}</b> {{ settings.locked ? 'Locked'|t : 'Unlocked'|t }}<br />{% endif %}
 {% if settings.notes %}<b>{{ 'Notes:'|t }}</b> {{ settings.notes }}<br />{% endif %}
diff --git a/web/modules/webform/templates/webform-handler-debug-summary.html.twig b/web/modules/webform/templates/webform-handler-debug-summary.html.twig
index 66db74df3e..12d1d05329 100644
--- a/web/modules/webform/templates/webform-handler-debug-summary.html.twig
+++ b/web/modules/webform/templates/webform-handler-debug-summary.html.twig
@@ -10,4 +10,6 @@
  * @ingroup themeable
  */
 #}
-{{ 'Submission values will be displayed onscreen.'|t }}
+<strong class="color-error">{{ 'Submission values will be displayed onscreen.'|t }}</strong><br/>
+<b>{{ 'Data format:'|t }}</b> {{ settings.format }}<br />
+<b>{{ 'Include submission properties:'|t }}</b> {{ settings.submission ? 'Yes'|t : 'No'|t }}<br />
diff --git a/web/modules/webform/templates/webform-handler-email-summary.html.twig b/web/modules/webform/templates/webform-handler-email-summary.html.twig
index 7042bfb5c6..c398f95acc 100644
--- a/web/modules/webform/templates/webform-handler-email-summary.html.twig
+++ b/web/modules/webform/templates/webform-handler-email-summary.html.twig
@@ -11,7 +11,7 @@
  */
 #}
 
-{% if settings.debug %}<b class="color-error">{{ 'Debugging is enabled'|t }}</b><br />{% endif %}
+{% if settings.debug %}<strong class="color-error">{{ 'Debugging is enabled'|t }}</strong><br />{% endif %}
 <b>{{ 'To:'|t }}</b> {{ settings.to_mail|replace({',': ', '}) }}<br />
 {% if settings.cc_mail %}<b>{{ 'CC:'|t }}</b> {{ settings.cc_mail|replace({',': ', '}) }}<br />{% endif %}
 {% if settings.bcc_mail %}<b>{{ 'BCC:'|t }}</b> {{ settings.bcc_mail|replace({',': ', '}) }}<br />{% endif %}
diff --git a/web/modules/webform/templates/webform-handler-remote-post-summary.html.twig b/web/modules/webform/templates/webform-handler-remote-post-summary.html.twig
index a99f6d1355..398dc3e912 100644
--- a/web/modules/webform/templates/webform-handler-remote-post-summary.html.twig
+++ b/web/modules/webform/templates/webform-handler-remote-post-summary.html.twig
@@ -10,7 +10,7 @@
  * @ingroup themeable
  */
 #}
-{% if settings.debug %}<b class="color-error">{{ 'Debugging is enabled'|t }}</b><br />{% endif %}
+{% if settings.debug %}<strong class="color-error">{{ 'Debugging is enabled'|t }}</strong><br />{% endif %}
 <b>{{ 'Completed URL:'|t }}</b> {{ settings.completed_url }}<br />
 {% if settings.updated_url %}<b>{{ 'Updated URL:'|t }}</b> {{ settings.updated_url }}<br />{% endif %}
 {% if settings.deleted_url %}<b>{{ 'Deleted URL:'|t }}</b> {{ settings.deleted_url }}<br />{% endif %}
diff --git a/web/modules/webform/templates/webform-handler-settings-summary.html.twig b/web/modules/webform/templates/webform-handler-settings-summary.html.twig
index cf760cc2b5..39a2ec5a52 100644
--- a/web/modules/webform/templates/webform-handler-settings-summary.html.twig
+++ b/web/modules/webform/templates/webform-handler-settings-summary.html.twig
@@ -10,7 +10,7 @@
  * @ingroup themeable
  */
 #}
-{% if settings.debug %}<b class="color-error">{{ 'Debugging is enabled'|t }}</b><br />{% endif %}
+{% if settings.debug %}<strong class="color-error">{{ 'Debugging is enabled'|t }}</strong><br />{% endif %}
 {% for setting in settings.settings %}
   <b>{{ setting.title }}:</b> {{ setting.value }}<br />
 {% endfor %}
diff --git a/web/modules/webform/templates/webform-progress-bar.html.twig b/web/modules/webform/templates/webform-progress-bar.html.twig
index 8fed60ca2b..47014851fb 100644
--- a/web/modules/webform/templates/webform-progress-bar.html.twig
+++ b/web/modules/webform/templates/webform-progress-bar.html.twig
@@ -5,7 +5,7 @@
  *
  * Available variables:
  * - webform: A webform.
- * - pages: Associatve array of wizard pages.
+ * - pages: Associative array of wizard pages.
  * - progress: Array of wizard progress containing page titles.
  * - current_page: Current wizard page key.
  * - current_index: The current wizard page index.
diff --git a/web/modules/webform/templates/webform-progress-tracker.html.twig b/web/modules/webform/templates/webform-progress-tracker.html.twig
index 688e6e2782..8abc26d669 100644
--- a/web/modules/webform/templates/webform-progress-tracker.html.twig
+++ b/web/modules/webform/templates/webform-progress-tracker.html.twig
@@ -5,7 +5,7 @@
  *
  * Available variables:
  * - webform: A webform.
- * - pages: Associatve array of wizard pages.
+ * - pages: Associative array of wizard pages.
  * - progress: Array of wizard progress containing page titles.
  * - current_page: Current wizard page key.
  * - current_index: The current wizard page index.
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_ajax.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_ajax.yml
index 0104106e63..e5687d99be 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_ajax.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_ajax.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -19,7 +20,7 @@ elements: |
     '#title': textfield
     '#type': textfield
     '#required': true
-
+  
 css: ''
 javascript: ''
 settings:
@@ -92,6 +93,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -147,6 +150,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_ajax_confirmation_inline.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_ajax_confirmation_inline.yml
index c23b153cd0..230568fd56 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_ajax_confirmation_inline.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_ajax_confirmation_inline.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -20,7 +21,7 @@ elements: |
   test:
     '#type': textfield
     '#title': test
-
+  
 css: ''
 javascript: ''
 settings:
@@ -93,6 +94,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -148,6 +151,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_ajax_confirmation_message.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_ajax_confirmation_message.yml
index 14ee81a004..ea755acc84 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_ajax_confirmation_message.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_ajax_confirmation_message.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -20,7 +21,7 @@ elements: |
   test:
     '#type': textfield
     '#title': test
-
+  
 css: ''
 javascript: ''
 settings:
@@ -93,6 +94,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -148,6 +151,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_ajax_confirmation_modal.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_ajax_confirmation_modal.yml
index e3bbf0bf21..87016a5225 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_ajax_confirmation_modal.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_ajax_confirmation_modal.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -20,7 +21,7 @@ elements: |
   test:
     '#type': textfield
     '#title': test
-
+  
 css: ''
 javascript: ''
 settings:
@@ -93,6 +94,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -148,6 +151,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_ajax_confirmation_page.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_ajax_confirmation_page.yml
index 99cd6023d2..796a213813 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_ajax_confirmation_page.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_ajax_confirmation_page.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -20,7 +21,7 @@ elements: |
   test:
     '#type': textfield
     '#title': test
-
+  
 css: ''
 javascript: ''
 settings:
@@ -93,6 +94,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -148,6 +151,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_ajax_confirmation_url.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_ajax_confirmation_url.yml
index 351b71a348..0a0f9692e6 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_ajax_confirmation_url.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_ajax_confirmation_url.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -17,7 +18,7 @@ category: 'Test: Ajax'
 elements: |
   description:
     '#markup': 'This webform will redirect to the homepage when submitted.'
-
+  
 css: ''
 javascript: ''
 settings:
@@ -90,6 +91,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -145,6 +148,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_ajax_confirmation_url_msg.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_ajax_confirmation_url_msg.yml
index 196fef8b80..5b03021bc4 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_ajax_confirmation_url_msg.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_ajax_confirmation_url_msg.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -20,7 +21,7 @@ elements: |
   test:
     '#type': textfield
     '#title': test
-
+  
 css: ''
 javascript: ''
 settings:
@@ -93,6 +94,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -148,6 +151,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_composite.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_composite.yml
index 9482bb625b..dc591ace21 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_composite.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_composite.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -176,6 +177,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -231,6 +234,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
@@ -282,6 +286,7 @@ handlers:
   debug:
     id: debug
     label: Debug
+    notes: ''
     handler_id: debug
     status: true
     conditions: {  }
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_composite_custom.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_composite_custom.yml
index 4350225b69..27029ffab6 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_composite_custom.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_composite_custom.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -138,6 +139,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -193,6 +196,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
@@ -244,6 +248,7 @@ handlers:
   debug:
     id: debug
     label: Debug
+    notes: ''
     handler_id: debug
     status: true
     conditions: {  }
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_composite_custom_file.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_composite_custom_file.yml
index 179e6e8f7c..0a20ecfdfa 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_composite_custom_file.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_composite_custom_file.yml
@@ -1,3 +1,4 @@
+uuid: b754b5b4-0b50-4a42-a23c-30f95cd9870e
 langcode: en
 status: open
 dependencies:
@@ -109,6 +110,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -164,6 +167,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
@@ -215,6 +219,7 @@ handlers:
   debug:
     id: debug
     label: Debug
+    notes: ''
     handler_id: debug
     status: true
     conditions: {  }
@@ -223,6 +228,7 @@ handlers:
   email:
     id: email
     label: Email
+    notes: ''
     handler_id: email
     status: true
     conditions: {  }
@@ -257,6 +263,5 @@ handlers:
       theme_name: ''
       parameters: {  }
 variants: {  }
-uuid: b754b5b4-0b50-4a42-a23c-30f95cd9870e
 _core:
   default_config_hash: l67ofWFfSw0nP4K6ZBRppS9Dv_uBzGiAeEUKwW7-IwA
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_composite_format.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_composite_format.yml
index a24cf9aee7..ce25ad13f9 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_composite_format.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_composite_format.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -528,6 +529,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -583,6 +586,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
@@ -634,6 +638,7 @@ handlers:
   email_text:
     id: email
     label: 'Email (Text)'
+    notes: ''
     handler_id: email_text
     status: true
     conditions: {  }
@@ -670,6 +675,7 @@ handlers:
   email_html:
     id: email
     label: 'Email (HTML)'
+    notes: ''
     handler_id: email_html
     status: true
     conditions: {  }
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_composite_format_multiple.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_composite_format_multiple.yml
index 8c1d4ad49a..e6182a6418 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_composite_format_multiple.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_composite_format_multiple.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -784,6 +785,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -839,6 +842,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
@@ -890,6 +894,7 @@ handlers:
   email_text:
     id: email
     label: 'Email (Text)'
+    notes: ''
     handler_id: email_text
     status: true
     conditions: {  }
@@ -926,6 +931,7 @@ handlers:
   email_html:
     id: email
     label: 'Email (HTML)'
+    notes: ''
     handler_id: email_html
     status: true
     conditions: {  }
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_confirmation_inline.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_confirmation_inline.yml
index fb1919da6f..ddf330bcfa 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_confirmation_inline.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_confirmation_inline.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -20,7 +21,7 @@ elements: |
   test:
     '#type': textfield
     '#title': test
-
+  
 css: ''
 javascript: ''
 settings:
@@ -93,6 +94,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -148,6 +151,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_confirmation_message.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_confirmation_message.yml
index a55d446a09..66f64247a8 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_confirmation_message.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_confirmation_message.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -20,7 +21,7 @@ elements: |
   test:
     '#type': textfield
     '#title': test
-
+  
 css: ''
 javascript: ''
 settings:
@@ -93,6 +94,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -148,6 +151,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_confirmation_modal.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_confirmation_modal.yml
index 8e4f398103..3c6c20fde1 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_confirmation_modal.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_confirmation_modal.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -20,7 +21,7 @@ elements: |
   test:
     '#type': textfield
     '#title': test
-
+  
 css: ''
 javascript: ''
 settings:
@@ -93,6 +94,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -148,6 +151,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_confirmation_none.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_confirmation_none.yml
index 87e022c380..f24152614a 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_confirmation_none.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_confirmation_none.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -20,7 +21,7 @@ elements: |
   test:
     '#type': textfield
     '#title': test
-
+  
 css: ''
 javascript: ''
 settings:
@@ -93,6 +94,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -148,6 +151,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_confirmation_page.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_confirmation_page.yml
index 34ada3cc5c..3e78b695fd 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_confirmation_page.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_confirmation_page.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -20,7 +21,7 @@ elements: |
   test:
     '#type': textfield
     '#title': test
-
+  
 css: ''
 javascript: ''
 settings:
@@ -93,6 +94,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -148,6 +151,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_confirmation_page_custom.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_confirmation_page_custom.yml
index 10910648eb..8ff8342a45 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_confirmation_page_custom.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_confirmation_page_custom.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -20,7 +21,7 @@ elements: |
   test:
     '#type': textfield
     '#title': test
-
+  
 css: ''
 javascript: ''
 settings:
@@ -93,6 +94,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -151,6 +154,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_confirmation_url.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_confirmation_url.yml
index 12ec1647bf..824510b58d 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_confirmation_url.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_confirmation_url.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -17,7 +18,7 @@ category: 'Test: Confirmation'
 elements: |
   description:
     '#markup': 'This webform will redirect to the homepage when submitted.'
-
+  
 css: ''
 javascript: ''
 settings:
@@ -90,6 +91,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -145,6 +148,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_confirmation_url_message.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_confirmation_url_message.yml
index da57b041f0..ef3e025db5 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_confirmation_url_message.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_confirmation_url_message.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -20,7 +21,7 @@ elements: |
   test:
     '#type': textfield
     '#title': test
-
+  
 css: ''
 javascript: ''
 settings:
@@ -93,6 +94,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -148,6 +151,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element.yml
index ac11bf0428..f7c4ccf76b 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -63,7 +64,7 @@ elements: |
       '#default_value': |
         {textarea line 1}
         {textarea line 2}
-
+  
     textfield:
       '#type': textfield
       '#title': textfield
@@ -237,7 +238,7 @@ elements: |
       '#default_value':
         - 1
         - 2
-
+  
 css: ''
 javascript: ''
 settings:
@@ -310,6 +311,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -365,6 +368,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_access.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_access.yml
index c3ce82714a..0765765093 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_access.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_access.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -105,7 +106,21 @@ elements: |
       '#access_view_roles': {  }
       '#access_view_permissions':
         - 'access user profiles'
-
+  access_property:
+    '#type': details
+    '#title': access_property
+    textfield_access_property:
+      '#type': textfield
+      '#title': textfield_access_property
+      '#access': false
+    fieldset_access_property:
+      '#type': fieldset
+      '#title': fieldset_access_property
+      '#access': false
+      fieldset_textfield_access:
+        '#type': textfield
+        '#title': fieldset_textfield_access
+  
 css: ''
 javascript: ''
 settings:
@@ -178,6 +193,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -233,6 +250,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: true
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_actions.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_actions.yml
index e853ee7300..a22209ce8b 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_actions.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_actions.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -43,10 +44,17 @@ elements: |
         - custom-submit
       style: 'font-weight: bold'
       data-custom-submit: true
+    '#delete_hide': false
+    '#delete__label': '{Custom delete}'
+    '#delete__attributes':
+      class:
+        - custom-delete
+      style: 'font-weight: bold'
+      data-custom-delete: true
     '#reset__label': '{Custom reset}'
     '#reset__attributes':
       class:
-        - custom-reet
+        - custom-reset
       style: 'font-weight: bold'
       data-custom-reset: true
     '#draft__label': '{Custom draft}'
@@ -103,6 +111,18 @@ elements: |
     '#wizard_next_hide': true
     '#preview_prev_hide': true
     '#preview_next_hide': true
+  actions_delete:
+    '#type': webform_actions
+    '#title': 'Delete button'
+    '#submit_hide': true
+    '#reset_hide': true
+    '#delete_hide': false
+    '#delete__dialog': true
+    '#draft_hide': true
+    '#wizard_prev_hide': true
+    '#wizard_next_hide': true
+    '#preview_prev_hide': true
+    '#preview_next_hide': true
   actions_draft:
     '#type': webform_actions
     '#title': 'Draft button'
@@ -138,7 +158,7 @@ elements: |
     '#draft_hide': true
     '#wizard_prev_hide': true
     '#wizard_next_hide': true
-
+  
 css: ''
 javascript: ''
 settings:
@@ -211,6 +231,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -266,6 +288,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_actions_buttons.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_actions_buttons.yml
index 28c0128409..3b230bfb37 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_actions_buttons.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_actions_buttons.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -58,7 +59,7 @@ elements: |
       class:
         - preview_next_button_attributes
       style: 'color: orange'
-
+  
 css: ''
 javascript: ''
 settings:
@@ -131,6 +132,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -186,6 +189,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_address.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_address.yml
index f6354b36f9..0f69da9f37 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_address.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_address.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -143,6 +144,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -198,6 +201,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
@@ -249,6 +253,7 @@ handlers:
   debug:
     id: debug
     label: Debug
+    notes: ''
     handler_id: debug
     status: true
     conditions: {  }
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_allowed_tags.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_allowed_tags.yml
index 9f56f64659..b78e0ff96d 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_allowed_tags.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_allowed_tags.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -19,7 +20,7 @@ elements: |
     '#type': item
     '#title': 'Below markup contains HTML tags'
     '#markup': 'Hello <ignored></tag><b>…Goodbye</b>'
-
+  
 css: ''
 javascript: ''
 settings:
@@ -92,6 +93,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -147,6 +150,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_attributes.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_attributes.yml
index 7ee29fce5e..20c2c78308 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_attributes.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_attributes.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -106,6 +107,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -161,6 +164,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
@@ -212,6 +216,7 @@ handlers:
   debug:
     id: debug
     label: Debug
+    notes: ''
     handler_id: debug
     status: true
     conditions: {  }
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_autocomplete.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_autocomplete.yml
index 505554da23..a0828246cd 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_autocomplete.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_autocomplete.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -37,7 +38,7 @@ elements: |
     '#autocomplete_existing': true
     '#autocomplete_limit': 5
     '#autocomplete_match': 1
-
+  
 css: ''
 javascript: ''
 settings:
@@ -110,6 +111,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -165,6 +168,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_captcha.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_captcha.yml
index 2724d1c802..93c6830d31 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_captcha.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_captcha.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -113,6 +114,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -168,6 +171,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
@@ -219,6 +223,7 @@ handlers:
   debug:
     id: debug
     label: Debug
+    notes: ''
     handler_id: debug
     status: true
     conditions: {  }
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_checkbox.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_checkbox.yml
index eb96ebcdbe..938120c4b5 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_checkbox.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_checkbox.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -104,6 +105,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -159,6 +162,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
@@ -210,6 +214,7 @@ handlers:
   debug:
     id: debug
     label: Debug
+    notes: ''
     handler_id: debug
     status: true
     conditions: {  }
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_checkbox_value.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_checkbox_value.yml
index 8fa88538ab..8c3f43bcf9 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_checkbox_value.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_checkbox_value.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -107,6 +108,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -162,6 +165,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
@@ -213,6 +217,7 @@ handlers:
   debug:
     id: debug
     label: Debug
+    notes: ''
     handler_id: debug
     status: true
     conditions: {  }
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_checkboxes.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_checkboxes.yml
index 2d1605d863..ef64337e0e 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_checkboxes.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_checkboxes.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -281,6 +282,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -336,6 +339,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
@@ -387,6 +391,7 @@ handlers:
   debug:
     id: debug
     label: Debug
+    notes: ''
     handler_id: debug
     status: true
     conditions: {  }
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_checkboxes_all_none.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_checkboxes_all_none.yml
index 0e253ede09..8ee696edf0 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_checkboxes_all_none.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_checkboxes_all_none.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -68,6 +69,7 @@ elements: |
       include_anonymous: true
     '#default_value':
       - 1
+
 css: ''
 javascript: ''
 settings:
@@ -140,6 +142,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -195,6 +199,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
@@ -246,6 +251,7 @@ handlers:
   debug:
     id: debug
     label: Debug
+    notes: ''
     handler_id: debug
     status: true
     conditions: {  }
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_codemirror.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_codemirror.yml
index fdc5102ec5..49c5607c0e 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_codemirror.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_codemirror.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -174,6 +175,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -229,6 +232,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
@@ -280,6 +284,7 @@ handlers:
   debug:
     id: debug
     label: Debug
+    notes: ''
     handler_id: debug
     status: true
     conditions: {  }
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_composite.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_composite.yml
index 3101d6d490..cd82c82732 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_composite.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_composite.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -130,6 +131,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -185,6 +188,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
@@ -236,6 +240,7 @@ handlers:
   debug:
     id: debug
     label: Debug
+    notes: ''
     handler_id: debug
     status: true
     conditions: {  }
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_composite_wrapper.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_composite_wrapper.yml
index f8aecbddc9..eb209c4337 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_composite_wrapper.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_composite_wrapper.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -206,6 +207,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -261,6 +264,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
@@ -312,6 +316,7 @@ handlers:
   debug:
     id: debug
     label: Debug
+    notes: ''
     handler_id: debug
     status: true
     conditions: {  }
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_computed_ajax.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_computed_ajax.yml
index 5032b0d532..7b1d8ad61b 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_computed_ajax.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_computed_ajax.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -163,6 +164,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -218,6 +221,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
@@ -269,6 +273,7 @@ handlers:
   debug:
     id: debug
     label: Debug
+    notes: ''
     handler_id: debug
     status: true
     conditions: {  }
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_computed_debug.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_computed_debug.yml
index a61bd347bd..6cefb9352e 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_computed_debug.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_computed_debug.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -150,7 +151,7 @@ elements: |
         {# data.datelist_03 #}
         <pre>{{ webform_debug(data|without('computed_twig_data_01', 'computed_twig_data_ajax_01', 'computed_twig_data_02', 'computed_twig_data_ajax_02', 'computed_twig_data_03', 'computed_twig_data_ajax_03') ) }}</pre>
       '#ajax': true
-
+  
 css: ''
 javascript: ''
 settings:
@@ -223,6 +224,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -278,6 +281,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_computed_token.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_computed_token.yml
index ed317c6d8c..0341e1d987 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_computed_token.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_computed_token.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -143,6 +144,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -198,6 +201,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
@@ -249,6 +253,7 @@ handlers:
   debug:
     id: debug
     label: Debug
+    notes: ''
     handler_id: debug
     status: true
     conditions: {  }
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_computed_twig.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_computed_twig.yml
index 56cbda80fd..27ce710ec3 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_computed_twig.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_computed_twig.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -33,7 +34,7 @@ elements: |
     '#default_value': |
       <p>This is a <strong>text format</strong> string.</p>
       <p>It contains &quot;double&quot; and 'single' quotes with special characters like &lt;, &gt;, &lt;&gt;, and &gt;&lt;.</p>
-
+  
   xss:
     '#type': textfield
     '#title': xss
@@ -47,7 +48,7 @@ elements: |
       <b class="webform_computed_twig_auto">complex string:</b> {{ webform_token('[webform_submission:values:complex_string]', webform_submission) }}<br />
       <b class="webform_computed_twig_auto">text_format:</b> {{ webform_token('[webform_submission:values:text_format]', webform_submission) }}<br />
       <b class="webform_computed_twig_auto">xss:</b> {{ webform_token('[webform_submission:values:xss]', webform_submission) }}<br />
-
+  
   webform_computed_twig_html:
     '#type': webform_computed_twig
     '#title': webform_computed_twig_html
@@ -58,7 +59,7 @@ elements: |
       <b class="webform_computed_twig_html">complex string:</b> {{ webform_token('[webform_submission:values:complex_string]', webform_submission) }}<br />
       <b class="webform_computed_twig_html">text_format:</b> {{ webform_token('[webform_submission:values:text_format]', webform_submission) }}<br />
       <b class="webform_computed_twig_html">xss:</b> {{ webform_token('[webform_submission:values:xss]', webform_submission) }}<br />
-
+  
   webform_computed_twig_text:
     '#type': webform_computed_twig
     '#title': webform_computed_twig_text
@@ -69,7 +70,7 @@ elements: |
       complex string: {{ webform_token('[webform_submission:values:complex_string]', webform_submission) }}
       text_format: {{ webform_token('[webform_submission:values:text_format]', webform_submission) }}
       xss: {{ webform_token('[webform_submission:values:xss]', webform_submission) }}
-
+  
   webform_computed_twig_data:
     '#type': webform_computed_twig
     '#title': webform_computed_twig_data
@@ -79,7 +80,7 @@ elements: |
       <b class="webform_computed_twig_data">complex string:</b> {{ data.complex_string }}<br />
       <b class="webform_computed_twig_data">text_format:</b> {{ data.text_format.value }}<br />
       <b class="webform_computed_twig_data">xss:</b> {{ data.xss }}<br />
-
+  
   webform_computed_twig_store:
     '#type': webform_computed_twig
     '#title': webform_computed_twig_store
@@ -97,7 +98,7 @@ elements: |
     '#title': webform_computed_twig_spaceless
     '#whitespace': spaceless
     '#template': ' <em>This is spaceless</em>  <br/> '
-
+  
 css: ''
 javascript: ''
 settings:
@@ -170,6 +171,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -225,6 +228,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_container.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_container.yml
index 1e81e42bae..778c630d70 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_container.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_container.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -74,7 +75,7 @@ elements: |
     fieldset_title_display_invisible_textfield:
       '#type': textfield
       '#title': fieldset_title_display_invisible_textfield
-
+  
 css: ''
 javascript: ''
 settings:
@@ -147,6 +148,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -202,6 +205,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_counter.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_counter.yml
index 6d6594fb87..6cdefd7b4f 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_counter.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_counter.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -161,6 +162,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -216,6 +219,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
@@ -267,6 +271,7 @@ handlers:
   debug:
     id: debug
     label: Debug
+    notes: ''
     handler_id: debug
     status: true
     conditions: {  }
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_date.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_date.yml
index f173128d2f..24088a9791 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_date.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_date.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -155,6 +156,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -210,6 +213,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
@@ -261,6 +265,7 @@ handlers:
   debug:
     id: debug
     label: Debug
+    notes: ''
     handler_id: debug
     status: true
     conditions: {  }
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_datelist.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_datelist.yml
index e7cf52eb18..f66561eac0 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_datelist.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_datelist.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -168,6 +169,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -223,6 +226,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
@@ -274,6 +278,7 @@ handlers:
   debug:
     id: debug
     label: Debug
+    notes: ''
     handler_id: debug
     status: true
     conditions: {  }
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_datetime.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_datetime.yml
index e468ba8fdc..cb380283fe 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_datetime.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_datetime.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -226,6 +227,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -281,6 +284,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
@@ -332,6 +336,7 @@ handlers:
   debug:
     id: debug
     label: Debug
+    notes: ''
     handler_id: debug
     status: true
     conditions: {  }
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_description_tooltip.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_description_tooltip.yml
index fb141eff78..4809ca22bb 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_description_tooltip.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_description_tooltip.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -466,7 +467,7 @@ elements: |
       '#title': 'Machine name'
       '#description': 'This is a description for the ''machine_name'' element.'
       '#description_display': tooltip
-
+  
 css: ''
 javascript: ''
 settings:
@@ -539,6 +540,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -594,6 +597,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_details.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_details.yml
index 6e299456b4..744d7a7343 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_details.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_details.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -46,7 +47,7 @@ elements: |
     '#open': true
     details_help_markup:
       '#markup': '<p>This is some markup</p>'
-
+  
 css: ''
 javascript: ''
 settings:
@@ -119,6 +120,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -174,6 +177,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_disabled.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_disabled.yml
index 62fb11d0c8..a0554cb63e 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_disabled.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_disabled.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -363,7 +364,7 @@ elements: |
     '#type': webform_video_file
     '#title': 'Video file'
     '#disabled': true
-
+  
 css: ''
 javascript: ''
 settings:
@@ -436,6 +437,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -491,6 +494,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_email_confirm.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_email_confirm.yml
index 4efec14d1f..2985a935cc 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_email_confirm.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_email_confirm.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -115,6 +116,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -170,6 +173,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
@@ -221,6 +225,7 @@ handlers:
   debug:
     id: debug
     label: Debug
+    notes: ''
     handler_id: debug
     status: true
     conditions: {  }
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_email_multiple.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_email_multiple.yml
index a7ce66cc07..47a3fe89dd 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_email_multiple.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_email_multiple.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -100,6 +101,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -155,6 +158,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
@@ -206,6 +210,7 @@ handlers:
   debug:
     id: debug
     label: Debug
+    notes: ''
     handler_id: debug
     status: true
     conditions: {  }
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_entity_autocomplete.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_entity_autocomplete.yml
index f9d5059e25..c2a06e5cb3 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_entity_autocomplete.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_entity_autocomplete.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -54,16 +55,36 @@ elements: |
       sort:
         field: title
         direction: ASC
-  entity_autocomplete_node_view:
+    '#default_value': 1
+  entity_autocomplete_term_tags_autocreate:
     '#type': entity_autocomplete
-    '#title': 'entity_autocomplete (node view)'
-    '#target_type': node
-    '#selection_handler': views
+    '#title': entity_autocomplete_term_tags_autocreate
+    '#tags': true
+    '#target_type': taxonomy_term
+    '#selection_handler': 'default:taxonomy_term'
     '#selection_settings':
-      view:
-        view_name: webform_test_entity_reference
-        display_name: entity_reference
-        arguments: ''
+      target_bundles:
+        tags: tags
+      sort:
+        field: name
+        direction: ASC
+      auto_create: true
+      auto_create_bundle: tags
+    '#default_value': 1
+  entity_autocomplete_term_multiple_autocreate:
+    '#type': entity_autocomplete
+    '#title': entity_autocomplete_term_multiple_autocreate
+    '#multiple': true
+    '#target_type': taxonomy_term
+    '#selection_handler': 'default:taxonomy_term'
+    '#selection_settings':
+      target_bundles:
+        tags: tags
+      sort:
+        field: name
+        direction: ASC
+      auto_create: true
+      auto_create_bundle: tags
     '#default_value': 1
 
 css: ''
@@ -138,6 +159,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -193,6 +216,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
@@ -244,6 +268,7 @@ handlers:
   debug:
     id: debug
     label: Debug
+    notes: ''
     handler_id: debug
     status: true
     conditions: {  }
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_entity_reference.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_entity_reference.yml
index 2a68afa6fe..7d439e9bd2 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_entity_reference.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_entity_reference.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -135,6 +136,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -190,6 +193,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
@@ -241,6 +245,7 @@ handlers:
   debug:
     id: debug
     label: Debug
+    notes: ''
     handler_id: debug
     status: true
     conditions: {  }
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_excluded_columns.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_excluded_columns.yml
index 9417200623..706cd96f32 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_excluded_columns.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_excluded_columns.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -102,6 +103,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -157,6 +160,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
@@ -208,6 +212,7 @@ handlers:
   debug:
     id: debug
     label: Debug
+    notes: ''
     handler_id: debug
     status: true
     conditions: {  }
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_excluded_elements.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_excluded_elements.yml
index 1db4a10838..31b819a273 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_excluded_elements.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_excluded_elements.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -110,6 +111,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -165,6 +168,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
@@ -216,6 +220,7 @@ handlers:
   debug:
     id: debug
     label: Debug
+    notes: ''
     handler_id: debug
     status: true
     conditions: {  }
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_fieldset.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_fieldset.yml
index 214d4d1579..da19294345 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_fieldset.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_fieldset.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -60,7 +61,7 @@ elements: |
     '#field_suffix': suffix
     fieldset_markup:
       '#markup': '<p>This is some markup</p>'
-
+  
 css: ''
 javascript: ''
 settings:
@@ -133,6 +134,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -188,6 +191,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_flexbox.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_flexbox.yml
index c0d9c375ec..cb9767a125 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_flexbox.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_flexbox.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -936,7 +937,7 @@ elements: |
     toggle_rating:
       '#type': rating
       '#title': rating
-
+  
 css: ''
 javascript: ''
 settings:
@@ -1009,6 +1010,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -1064,6 +1067,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_flexbox_flex.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_flexbox_flex.yml
index 63eb5a34d4..26c9fe3bb8 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_flexbox_flex.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_flexbox_flex.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -805,7 +806,7 @@ elements: |
         style: 'padding: 30px; background: #ccc; text-align: center'
       flex:
         '#markup': 1
-
+  
 css: ''
 javascript: ''
 settings:
@@ -878,6 +879,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -933,6 +936,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_format.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_format.yml
index 7e75b0bfad..51a4f82a2e 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_format.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_format.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -1377,6 +1378,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -1432,6 +1435,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
@@ -1483,6 +1487,7 @@ handlers:
   email_text:
     id: email
     label: 'Email (Text)'
+    notes: ''
     handler_id: email_text
     status: true
     conditions: {  }
@@ -1519,6 +1524,7 @@ handlers:
   email_html:
     id: email
     label: 'Email (HTML)'
+    notes: ''
     handler_id: email_html
     status: true
     conditions: {  }
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_format_custom.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_format_custom.yml
index 5153083db1..2ec190b320 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_format_custom.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_format_custom.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -21,10 +22,10 @@ elements: |
     '#format': custom
     '#format_html': |
       <em>{{ value }}</em>
-
+  
     '#format_text': |
       /{{ value }}/
-
+  
     '#default_value': '{textfield_custom}'
   textfield_custom_token:
     '#type': textfield
@@ -32,10 +33,10 @@ elements: |
     '#format': custom
     '#format_html': |
       <em>[webform_submission:values:textfield_custom_token:raw]</em>
-
+  
     '#format_text': |
       /[webform_submission:values:textfield_custom_token:raw]/
-
+  
     '#default_value': '{textfield_custom_token}'
   textfield_custom_token_exception:
     '#type': textfield
@@ -43,10 +44,10 @@ elements: |
     '#format': custom
     '#format_html': |
       <em>EXCEPTION[webform_submission:values:textfield_custom_token_exception]</em>
-
+  
     '#format_text': |
       /EXCEPTION[webform_submission:values:textfield_custom_token_exception]/
-
+  
     '#default_value': '{textfield_custom_token_exception}'
   textfield_custom_value_multiple:
     '#type': textfield
@@ -55,10 +56,10 @@ elements: |
     '#format': custom
     '#format_html': |
       <em>{{ value }}</em>
-
+  
     '#format_text': |
       /{{ value }}/
-
+  
     '#format_items': custom
     '#format_items_html': |
       <table>
@@ -66,12 +67,12 @@ elements: |
         <tr {% if loop.index is divisible by(2) %}style="background-color: #ffc"{% endif %}><td>{{ item }}</td></tr>
       {% endfor %}
       </table>
-
+  
     '#format_items_text': |
       {% for item in items %}
       ⦿ {{ item }}
       {% endfor %}
-
+  
     '#default_value':
       - One
       - Two
@@ -92,7 +93,7 @@ elements: |
       item['original:image']: <div style="width: 100px">{{ item['original:image'] }}</div>
       item['original:link']: <div style="width: 100px">{{ item['original:link'] }}</div>
       item['original:modal']: <div style="width: 100px">{{ item['original:modal'] }}</div>
-
+  
     '#format_text': |
       value: {{ value }}
       item['value']: {{ item['value'] }}
@@ -100,7 +101,7 @@ elements: |
       item['link']: {{ item['link'] }}
       item['id']: {{ item['id'] }}
       item['url']: {{ item['url'] }}
-
+  
   address_custom:
     '#type': webform_address
     '#title': address_custom
@@ -112,7 +113,7 @@ elements: |
       element.state_province: {{ element.state_province }}<br/>
       element.postal_code: {{ element.postal_code }}<br/>
       element.country: {{ element.country }}<br/>
-
+  
     '#format_text': |
       element.address: {{ element.address }}
       element.address_2: {{ element.address_2 }}
@@ -120,7 +121,7 @@ elements: |
       element.state_province: {{ element.state_province }}
       element.postal_code: {{ element.postal_code }}
       element.country: {{ element.country }}
-
+  
     '#state_province__type': webform_select_other
     '#country__type': webform_select_other
     '#default_value':
@@ -155,7 +156,7 @@ elements: |
       element.state_province: {{ element.state_province }}<br/>
       element.postal_code: {{ element.postal_code }}<br/>
       element.country: {{ element.country }}<br/>
-
+  
     '#format_text': |
       element.address: {{ element.address }}
       element.address_2: {{ element.address_2 }}
@@ -163,7 +164,7 @@ elements: |
       element.state_province: {{ element.state_province }}
       element.postal_code: {{ element.postal_code }}
       element.country: {{ element.country }}
-
+  
     '#format_items': custom
     '#format_items_html': |
       {% for item in items %}
@@ -171,14 +172,14 @@ elements: |
       {{ item }}
       <div>*****</div>
       {% endfor %}
-
+  
     '#format_items_text': |
       {% for item in items %}
       *****
       {{ item }}
       *****
       {% endfor %}
-
+  
     '#state_province__type': webform_select_other
     '#country__type': webform_select_other
   fieldset_custom:
@@ -187,10 +188,10 @@ elements: |
     '#format': custom
     '#format_html': |
       {{ item.details }}
-
+  
     '#format_text': |
       {{ item.details }}
-
+  
     fieldset_custom_textfield:
       '#type': textfield
       '#title': fieldset_custom_textfield
@@ -203,17 +204,17 @@ elements: |
       <h3>fieldset_custom_children</h3>
       <hr />
       {{ children }}
-
+  
     '#format_text': |
       fieldset_custom_children
       ------------------------
       {{ children }}
-
+  
     fieldset_custom_children_textfield:
       '#type': textfield
       '#title': fieldset_custom_children_textfield
       '#default_value': '{fieldset_custom_children_textfield}'
-
+  
 css: ''
 javascript: ''
 settings:
@@ -286,6 +287,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -341,6 +344,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_format_multiple.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_format_multiple.yml
index 86752b16a0..8dc9f62a2e 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_format_multiple.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_format_multiple.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -1639,6 +1640,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -1694,6 +1697,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
@@ -1745,6 +1749,7 @@ handlers:
   email_text:
     id: email
     label: 'Email (Text)'
+    notes: ''
     handler_id: email_text
     status: true
     conditions: {  }
@@ -1781,6 +1786,7 @@ handlers:
   email_html:
     id: email
     label: 'Email (HTML)'
+    notes: ''
     handler_id: email_html
     status: true
     conditions: {  }
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_format_token.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_format_token.yml
index f39380aa88..c30a8bb551 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_format_token.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_format_token.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -99,6 +100,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -154,6 +157,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
@@ -205,6 +209,7 @@ handlers:
   email_html:
     id: email
     label: 'Email (HTML)'
+    notes: ''
     handler_id: email_html
     status: false
     conditions: {  }
@@ -249,6 +254,7 @@ handlers:
   email_text:
     id: email
     label: 'Email (Text)'
+    notes: ''
     handler_id: email_text
     status: false
     conditions: {  }
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_height.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_height.yml
new file mode 100644
index 0000000000..e4439d88ab
--- /dev/null
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_height.yml
@@ -0,0 +1,282 @@
+uuid: null
+langcode: en
+status: open
+dependencies:
+  enforced:
+    module:
+      - webform_test
+open: null
+close: null
+weight: 0
+uid: null
+template: false
+archive: false
+id: test_element_height
+title: 'Test: Element: Height'
+description: 'Tests height elements.'
+category: 'Test: Element'
+elements: |
+  height_number_text:
+    '#type': webform_height
+    '#title': height_number_text
+    '#default_value': 60
+  height_number_symbol_required:
+    '#type': webform_height
+    '#title': height_number_symbol_required
+    '#height_format': symbol
+    '#required': true
+    '#default_value': 50
+  height_select_text:
+    '#type': webform_height
+    '#title': height_select_text
+    '#height_type': select
+    '#default_value': 40
+  height_select_text_abbreviate:
+    '#type': webform_height
+    '#title': height_select_text_abbreviate
+    '#height_type': select
+    '#height_format': abbreviate
+    '#default_value': 30
+  height_select_symbol_required:
+    '#type': webform_height
+    '#title': height_select_symbol_required
+    '#height_type': select
+    '#height_format': symbol
+    '#required': true
+    '#default_value': 20
+  height_select_suffix_symbol_required:
+    '#type': webform_height
+    '#title': height_select_suffix_symbol_required
+    '#height_type': select_suffix
+    '#height_format': symbol
+    '#required': true
+    '#default_value': 10
+  height_select_suffix_text:
+    '#type': webform_height
+    '#title': height_select_suffix_text
+    '#height_type': select_suffix
+    '#default_value': 0
+  height_select_min_max:
+    '#type': webform_height
+    '#title': height_select_min_max
+    '#height_type': select
+    '#feet__min': 3
+    '#feet__max': 10
+    '#default_value': 120
+  height_select_min_max:
+    '#type': webform_height
+    '#title': height_select_min_max
+    '#height_type': select
+    '#feet__min': 3
+    '#feet__max': 10
+    '#default_value': 120
+  height_number_step:
+    '#type': webform_height
+    '#title': height_number_step
+    '#height_type': select
+    '#inches__step': .5
+    '#default_value': 60.5
+  height_number_empty:
+    '#type': webform_height
+    '#title': height_number_empty
+  height_select_empty:
+    '#type': webform_height
+    '#title': height_select_empty
+    '#height_type': select
+  height_number_empty_required:
+    '#type': webform_height
+    '#title': height_number_empty_required
+    '#required': true
+  height_select_empty_required:
+    '#type': webform_height
+    '#title': height_select_empty_required
+    '#height_type': select
+    '#required': true
+css: ''
+javascript: ''
+settings:
+  ajax: false
+  ajax_scroll_top: form
+  ajax_progress_type: ''
+  ajax_effect: ''
+  ajax_speed: null
+  page: true
+  page_submit_path: ''
+  page_confirm_path: ''
+  page_theme_name: ''
+  form_title: source_entity_webform
+  form_submit_once: false
+  form_exception_message: ''
+  form_open_message: ''
+  form_close_message: ''
+  form_previous_submissions: true
+  form_confidential: false
+  form_confidential_message: ''
+  form_remote_addr: true
+  form_convert_anonymous: false
+  form_prepopulate: false
+  form_prepopulate_source_entity: false
+  form_prepopulate_source_entity_required: false
+  form_prepopulate_source_entity_type: ''
+  form_reset: false
+  form_disable_autocomplete: false
+  form_novalidate: false
+  form_disable_inline_errors: false
+  form_required: false
+  form_unsaved: false
+  form_disable_back: false
+  form_submit_back: false
+  form_autofocus: false
+  form_details_toggle: false
+  form_access_denied: default
+  form_access_denied_title: ''
+  form_access_denied_message: ''
+  form_access_denied_attributes: {  }
+  form_file_limit: ''
+  form_elements_attributes: {  }
+  share: false
+  share_node: false
+  share_theme_name: ''
+  share_title: true
+  share_page_body_attributes: {  }
+  submission_label: ''
+  submission_log: false
+  submission_views: {  }
+  submission_views_replace: {  }
+  submission_user_columns: {  }
+  submission_user_duplicate: false
+  submission_access_denied: default
+  submission_access_denied_title: ''
+  submission_access_denied_message: ''
+  submission_access_denied_attributes: {  }
+  submission_exception_message: ''
+  submission_locked_message: ''
+  submission_excluded_elements: {  }
+  submission_exclude_empty: false
+  submission_exclude_empty_checkbox: false
+  previous_submission_message: ''
+  previous_submissions_message: ''
+  autofill: false
+  autofill_message: ''
+  autofill_excluded_elements: {  }
+  wizard_progress_bar: true
+  wizard_progress_pages: false
+  wizard_progress_percentage: false
+  wizard_progress_link: false
+  wizard_progress_states: false
+  wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
+  wizard_start_label: ''
+  wizard_preview_link: false
+  wizard_confirmation: true
+  wizard_confirmation_label: ''
+  wizard_track: ''
+  wizard_prev_button_label: ''
+  wizard_next_button_label: ''
+  wizard_toggle: false
+  wizard_toggle_show_label: ''
+  wizard_toggle_hide_label: ''
+  preview: 0
+  preview_label: ''
+  preview_title: ''
+  preview_message: ''
+  preview_attributes: {  }
+  preview_excluded_elements: {  }
+  preview_exclude_empty: true
+  preview_exclude_empty_checkbox: false
+  draft: none
+  draft_multiple: false
+  draft_auto_save: false
+  draft_saved_message: ''
+  draft_loaded_message: ''
+  draft_pending_single_message: ''
+  draft_pending_multiple_message: ''
+  confirmation_type: page
+  confirmation_title: ''
+  confirmation_message: '[webform_submission:values:html]'
+  confirmation_url: ''
+  confirmation_attributes: {  }
+  confirmation_back: true
+  confirmation_back_label: ''
+  confirmation_back_attributes: {  }
+  confirmation_exclude_query: false
+  confirmation_exclude_token: false
+  confirmation_update: false
+  limit_total: null
+  limit_total_interval: null
+  limit_total_message: ''
+  limit_total_unique: false
+  limit_user: null
+  limit_user_interval: null
+  limit_user_message: ''
+  limit_user_unique: false
+  entity_limit_total: null
+  entity_limit_total_interval: null
+  entity_limit_user: null
+  entity_limit_user_interval: null
+  purge: none
+  purge_days: null
+  results_disabled: false
+  results_disabled_ignore: false
+  results_customize: false
+  token_view: false
+  token_update: false
+  serial_disabled: false
+access:
+  create:
+    roles:
+      - anonymous
+      - authenticated
+    users: {  }
+    permissions: {  }
+  view_any:
+    roles: {  }
+    users: {  }
+    permissions: {  }
+  update_any:
+    roles: {  }
+    users: {  }
+    permissions: {  }
+  delete_any:
+    roles: {  }
+    users: {  }
+    permissions: {  }
+  purge_any:
+    roles: {  }
+    users: {  }
+    permissions: {  }
+  view_own:
+    roles: {  }
+    users: {  }
+    permissions: {  }
+  update_own:
+    roles: {  }
+    users: {  }
+    permissions: {  }
+  delete_own:
+    roles: {  }
+    users: {  }
+    permissions: {  }
+  administer:
+    roles: {  }
+    users: {  }
+    permissions: {  }
+  test:
+    roles: {  }
+    users: {  }
+    permissions: {  }
+  configuration:
+    roles: {  }
+    users: {  }
+    permissions: {  }
+handlers:
+  debug:
+    id: debug
+    label: Debug
+    handler_id: debug
+    status: true
+    conditions: {  }
+    weight: 1
+    settings: {  }
+variants: {  }
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_help.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_help.yml
index 46a83e514d..3f5227384d 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_help.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_help.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -132,7 +133,7 @@ elements: |
     '#help_display': element_after
     'help_after_details':
       '#markup': '{This is markup}'
-
+  
 css: ''
 javascript: ''
 settings:
@@ -205,6 +206,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -260,6 +263,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_help_display.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_help_display.yml
index c9dda5fcef..8fddd867d8 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_help_display.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_help_display.yml
@@ -1,3 +1,4 @@
+uuid: 28d4e7be-efdb-4a88-bc0d-16ed5e8a1767
 langcode: en
 status: open
 dependencies:
@@ -1909,7 +1910,7 @@ elements: |
       '#help_display': element_after
     machine_name_hr:
       '#type': webform_horizontal_rule
-
+  
 css: ''
 javascript: ''
 settings:
@@ -1982,6 +1983,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -2037,6 +2040,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
@@ -2086,6 +2090,5 @@ access:
     permissions: {  }
 handlers: {  }
 variants: {  }
-uuid: 28d4e7be-efdb-4a88-bc0d-16ed5e8a1767
 _core:
   default_config_hash: n-o0dubYyFAYHV9OGOrntyVrFt0L6owQM3jhd_cjuIc
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_horizontal_rule.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_horizontal_rule.yml
index 0c2cbfe73e..4145cb0634 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_horizontal_rule.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_horizontal_rule.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -174,6 +175,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -229,6 +232,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
@@ -280,6 +284,7 @@ handlers:
   debug:
     id: debug
     label: Debug
+    notes: ''
     handler_id: debug
     status: true
     conditions: {  }
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_html_editor.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_html_editor.yml
index 472ca8def4..18d5b1766e 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_html_editor.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_html_editor.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -114,6 +115,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -169,6 +172,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
@@ -220,6 +224,7 @@ handlers:
   debug:
     id: debug
     label: Debug
+    notes: ''
     handler_id: debug
     status: true
     conditions: {  }
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_html_escape.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_html_escape.yml
index 382dc01386..3eca0bcd0f 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_html_escape.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_html_escape.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -524,7 +525,7 @@ elements: |
     table:
       '#type': table
       '#title': 'Table | <script>alert(''This markup is not escaped properly!!!'') </script>'
-
+  
 css: ''
 javascript: ''
 settings:
@@ -597,6 +598,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -652,6 +655,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_html_markup.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_html_markup.yml
index dddb200dfa..8beda5c967 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_html_markup.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_html_markup.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -524,7 +525,7 @@ elements: |
     table:
       '#type': table
       '#title': '<u>Table</u>'
-
+  
 css: ''
 javascript: ''
 settings:
@@ -597,6 +598,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -652,6 +655,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_ignored_properties.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_ignored_properties.yml
index 757df8111b..ccb1f38000 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_ignored_properties.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_ignored_properties.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -69,7 +70,7 @@ elements: |
         '#title': custom_composite_textfield
         '#pre_render':
           - 'webform_test_ignored_element_callback'
-
+  
 css: ''
 javascript: ''
 settings:
@@ -142,6 +143,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -197,6 +200,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_image_file.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_image_file.yml
index 2960151367..6c3c116fa0 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_image_file.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_image_file.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -95,6 +96,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -150,6 +153,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
@@ -201,6 +205,7 @@ handlers:
   debug:
     id: debug
     label: Debug
+    notes: ''
     handler_id: debug
     status: true
     conditions: {  }
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_image_file_attach.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_image_file_attach.yml
index f812b59fd7..f8bc76ca3e 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_image_file_attach.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_image_file_attach.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -93,6 +94,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -148,6 +151,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
@@ -199,6 +203,7 @@ handlers:
   email:
     id: email
     label: Email
+    notes: ''
     handler_id: email
     status: true
     conditions: {  }
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_image_resolution.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_image_resolution.yml
index e685e9e42e..964be246d1 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_image_resolution.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_image_resolution.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -98,6 +99,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -153,6 +156,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
@@ -204,6 +208,7 @@ handlers:
   debug:
     id: debug
     label: Debug
+    notes: ''
     handler_id: debug
     status: true
     conditions: {  }
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_input_mask.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_input_mask.yml
index c682f30017..4dc1a62f3f 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_input_mask.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_input_mask.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -154,6 +155,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -209,6 +212,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
@@ -260,6 +264,7 @@ handlers:
   debug:
     id: debug
     label: Debug
+    notes: ''
     handler_id: debug
     status: true
     conditions: {  }
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_invalid.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_invalid.yml
index ca7a7eb990..226e1b648a 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_invalid.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_invalid.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -87,6 +88,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -142,6 +145,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_likert.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_likert.yml
index 2aaac015b3..d0ea3f040e 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_likert.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_likert.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -151,6 +152,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -206,6 +209,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
@@ -257,6 +261,7 @@ handlers:
   debug:
     id: debug
     label: Debug
+    notes: ''
     handler_id: debug
     status: true
     conditions: {  }
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_loc_places.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_loc_places.yml
index d4f49943f2..17793be056 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_loc_places.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_loc_places.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -142,6 +143,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -197,6 +200,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
@@ -248,6 +252,7 @@ handlers:
   debug:
     id: debug
     label: Debug
+    notes: ''
     handler_id: debug
     status: true
     conditions: {  }
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_managed_file.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_managed_file.yml
index ec8bf83384..ddc240445c 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_managed_file.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_managed_file.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -68,7 +69,7 @@ elements: |
     '#type': managed_file
     '#title': managed_file_extensions
     '#file_extensions': 'txt, text'
-
+  
 css: ''
 javascript: ''
 settings:
@@ -141,6 +142,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -196,6 +199,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_managed_file_dis.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_managed_file_dis.yml
index c45457f0a3..3759bc787a 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_managed_file_dis.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_managed_file_dis.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -19,7 +20,7 @@ elements: |
     '#type': managed_file
     '#title': managed_file
     '#file_extensions': txt
-
+  
 css: ''
 javascript: ''
 settings:
@@ -92,6 +93,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -147,6 +150,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_managed_file_help.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_managed_file_help.yml
index 54ed35cb5b..cab1d36750 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_managed_file_help.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_managed_file_help.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -137,6 +138,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -192,6 +195,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
@@ -243,6 +247,7 @@ handlers:
   debug:
     id: debug
     label: Debug
+    notes: ''
     handler_id: debug
     status: true
     conditions: {  }
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_managed_file_limit.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_managed_file_limit.yml
index 1891d9629f..75df5694fa 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_managed_file_limit.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_managed_file_limit.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -34,7 +35,7 @@ elements: |
       managed_file:
         '#type': managed_file
         '#title': managed_file
-
+  
 css: ''
 javascript: ''
 settings:
@@ -107,6 +108,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -162,6 +165,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_managed_file_name.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_managed_file_name.yml
index 59e222fef5..171d774f3d 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_managed_file_name.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_managed_file_name.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -104,6 +105,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -159,6 +162,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
@@ -210,6 +214,7 @@ handlers:
   debug:
     id: debug
     label: Debug
+    notes: ''
     handler_id: debug
     status: true
     conditions: {  }
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_managed_file_prev.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_managed_file_prev.yml
index 0c1b9b0a16..8e2cfbdb6f 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_managed_file_prev.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_managed_file_prev.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -59,7 +60,7 @@ elements: |
     '#file_preview': url
     '#file_extensions': txt
     '#multiple': true
-
+  
 css: ''
 javascript: ''
 settings:
@@ -132,6 +133,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -187,6 +190,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_mapping.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_mapping.yml
index d9cd259edf..ab9c1d5bbf 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_mapping.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_mapping.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -203,6 +204,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -258,6 +261,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
@@ -309,6 +313,7 @@ handlers:
   debug:
     id: debug
     label: Debug
+    notes: ''
     handler_id: debug
     status: true
     conditions: {  }
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_markup.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_markup.yml
index 7430a11a58..c78703f712 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_markup.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_markup.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -33,7 +34,7 @@ elements: |
     '#type': webform_markup
     '#markup': '<p>Alter this markup.</p>'
     '#display_on': both
-
+  
 css: ''
 javascript: ''
 settings:
@@ -106,6 +107,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -161,6 +164,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_media_file.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_media_file.yml
index e6f87de55d..c6e01957d9 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_media_file.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_media_file.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -71,7 +72,7 @@ elements: |
       '#type': webform_video_file
       '#title': 'video_file (mp4)'
       '#file_extensions': mp4
-
+  
 css: ''
 javascript: ''
 settings:
@@ -144,6 +145,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -199,6 +202,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_message.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_message.yml
index 3cb142b42e..3929988cea 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_message.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_message.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -91,7 +92,7 @@ elements: |
       '#message_close': true
       '#message_id': webform_test_message_custom
       '#message_storage': custom
-
+  
 css: ''
 javascript: ''
 settings:
@@ -164,6 +165,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -219,6 +222,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_more.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_more.yml
index f5c8e1c772..55cafdaeb2 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_more.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_more.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -64,7 +65,7 @@ elements: |
     '#more': '{This is an example of more}'
     '#description': '{This is a description}'
     '#description_display': tooltip
-
+  
 css: ''
 javascript: ''
 settings:
@@ -137,6 +138,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -192,6 +195,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_multiple.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_multiple.yml
index 534c6bcd36..69b82f011d 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_multiple.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_multiple.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -351,6 +352,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -406,6 +409,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
@@ -457,6 +461,7 @@ handlers:
   debug:
     id: debug
     label: Debug
+    notes: ''
     handler_id: debug
     status: true
     conditions: {  }
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_multiple_date.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_multiple_date.yml
index 2a35350d5b..db38e2cb32 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_multiple_date.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_multiple_date.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -112,6 +113,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -167,6 +170,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
@@ -218,6 +222,7 @@ handlers:
   debug:
     id: debug
     label: Debug
+    notes: ''
     handler_id: debug
     status: true
     conditions: {  }
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_multiple_property.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_multiple_property.yml
index cfaa38a3bc..b6c2a7e96c 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_multiple_property.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_multiple_property.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -123,6 +124,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -178,6 +181,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
@@ -229,6 +233,7 @@ handlers:
   debug:
     id: debug
     label: Debug
+    notes: ''
     handler_id: debug
     status: true
     conditions: {  }
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_multiple_text.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_multiple_text.yml
index 1f1f080513..ab836c7d29 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_multiple_text.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_multiple_text.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -155,6 +156,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -210,6 +213,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
@@ -261,6 +265,7 @@ handlers:
   debug:
     id: debug
     label: Debug
+    notes: ''
     handler_id: debug
     status: true
     conditions: {  }
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_options.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_options.yml
index 5e4b62750c..a0f3a460b7 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_options.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_options.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -148,6 +149,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -203,6 +206,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
@@ -254,6 +258,7 @@ handlers:
   debug:
     id: debug
     label: Debug
+    notes: ''
     handler_id: debug
     status: true
     conditions: {  }
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_other.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_other.yml
index 33177610ce..86f9f3fae7 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_other.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_other.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -221,6 +222,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -276,6 +279,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
@@ -327,6 +331,7 @@ handlers:
   debug:
     id: debug
     label: Debug
+    notes: ''
     handler_id: debug
     status: true
     conditions: {  }
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_prepopulate.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_prepopulate.yml
index 6c38584e7c..d9c20db617 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_prepopulate.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_prepopulate.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -47,7 +48,7 @@ elements: |
       '#type': managed_file
       '#title': managed_file_prepopulate_02
       '#prepopulate': true
-
+  
 css: ''
 javascript: ''
 settings:
@@ -120,6 +121,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -175,6 +178,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_private.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_private.yml
index 33e44db777..0b336aa589 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_private.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_private.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -23,7 +24,7 @@ elements: |
       '#type': textfield
       '#title': private
       '#private': true
-
+  
 css: ''
 javascript: ''
 settings:
@@ -102,6 +103,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -157,6 +160,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: true
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_radios.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_radios.yml
index b990884542..7c3e81d587 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_radios.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_radios.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -296,6 +297,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -351,6 +354,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
@@ -402,6 +406,7 @@ handlers:
   debug:
     id: debug
     label: Debug
+    notes: ''
     handler_id: debug
     status: true
     conditions: {  }
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_range.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_range.yml
index 189ba100fc..ae43c5b73b 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_range.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_range.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -143,6 +144,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -198,6 +201,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
@@ -249,6 +253,7 @@ handlers:
   debug:
     id: debug
     label: Debug
+    notes: ''
     handler_id: debug
     status: true
     conditions: {  }
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_rating.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_rating.yml
index 6225993d0d..646e6a6608 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_rating.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_rating.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -106,6 +107,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -161,6 +164,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
@@ -212,6 +216,7 @@ handlers:
   debug:
     id: debug
     label: Debug
+    notes: ''
     handler_id: debug
     status: true
     conditions: {  }
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_readonly.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_readonly.yml
index b4c6ba5bf7..f99a061f97 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_readonly.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_readonly.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -96,6 +97,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -151,6 +154,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
@@ -202,6 +206,7 @@ handlers:
   debug:
     id: debug
     label: Debug
+    notes: ''
     handler_id: debug
     status: true
     conditions: {  }
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_same.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_same.yml
index f897bfdc77..c86b13e1b9 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_same.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_same.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -161,6 +162,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -216,6 +219,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
@@ -267,6 +271,7 @@ handlers:
   debug:
     id: debug
     label: Debug
+    notes: ''
     handler_id: debug
     status: true
     conditions: {  }
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_scale.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_scale.yml
index de70f856e8..3b8196b067 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_scale.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_scale.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -128,6 +129,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -183,6 +186,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
@@ -234,6 +238,7 @@ handlers:
   debug:
     id: debug
     label: Debug
+    notes: ''
     handler_id: debug
     status: true
     conditions: {  }
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_section.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_section.yml
index 101a1ab793..9368aedbc3 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_section.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_section.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -34,7 +35,7 @@ elements: |
     '#title_tag': h5
     '#title_attributes':
       style: 'color: red'
-
+  
 css: ''
 javascript: ''
 settings:
@@ -107,6 +108,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -162,6 +165,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_select.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_select.yml
index e518543c86..3c6bf607da 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_select.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_select.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -445,6 +446,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -500,6 +503,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
@@ -551,6 +555,7 @@ handlers:
   debug:
     id: debug
     label: Debug
+    notes: ''
     handler_id: debug
     status: true
     conditions: {  }
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_signature.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_signature.yml
index 0f25116026..b8ef325900 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_signature.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_signature.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -114,6 +115,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -169,6 +172,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
@@ -220,6 +224,7 @@ handlers:
   debug:
     id: debug
     label: Debug
+    notes: ''
     handler_id: debug
     status: true
     conditions: {  }
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_states.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_states.yml
index b81266ae62..4865df81c6 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_states.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_states.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -196,6 +197,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -251,6 +254,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
@@ -302,6 +306,7 @@ handlers:
   debug:
     id: debug
     label: Debug
+    notes: ''
     handler_id: debug
     status: true
     conditions: {  }
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_submission_views.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_submission_views.yml
index 132be2365f..10c44d4e41 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_submission_views.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_submission_views.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -119,6 +120,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -174,6 +177,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
@@ -225,6 +229,7 @@ handlers:
   debug:
     id: debug
     label: Debug
+    notes: ''
     handler_id: debug
     status: true
     conditions: {  }
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_submission_views_r.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_submission_views_r.yml
index c763774bcb..337ad0d879 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_submission_views_r.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_submission_views_r.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -113,6 +114,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -168,6 +171,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
@@ -219,6 +223,7 @@ handlers:
   debug:
     id: debug
     label: Debug
+    notes: ''
     handler_id: debug
     status: true
     conditions: {  }
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_submitted_value.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_submitted_value.yml
index 15f306b9ce..71ddd4006a 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_submitted_value.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_submitted_value.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -127,6 +128,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -182,6 +185,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
@@ -233,6 +237,7 @@ handlers:
   debug:
     id: debug
     label: Debug
+    notes: ''
     handler_id: debug
     status: true
     conditions: {  }
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_table.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_table.yml
index d5ddbbcc23..32ba985abb 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_table.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_table.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -265,6 +266,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -320,6 +323,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
@@ -371,6 +375,7 @@ handlers:
   debug:
     id: debug
     label: Debug
+    notes: ''
     handler_id: debug
     status: true
     conditions: {  }
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_table_select_sort.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_table_select_sort.yml
index 85a7b3b1f5..748b1f8b97 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_table_select_sort.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_table_select_sort.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -229,6 +230,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -284,6 +287,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
@@ -335,6 +339,7 @@ handlers:
   debug:
     id: debug
     label: Debug
+    notes: ''
     handler_id: debug
     status: true
     conditions: {  }
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_telephone.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_telephone.yml
index 8c54c9d5ae..49be668259 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_telephone.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_telephone.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -117,6 +118,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -172,6 +175,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
@@ -223,6 +227,7 @@ handlers:
   debug:
     id: debug
     label: Debug
+    notes: ''
     handler_id: debug
     status: true
     conditions: {  }
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_term_reference.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_term_reference.yml
index 11457fc922..d8fc87efc0 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_term_reference.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_term_reference.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -96,7 +97,7 @@ elements: |
         '#breadcrumb_delimiter': ' » '
         '#format': breadcrumb
         '#format_items': ul
-
+  
 css: ''
 javascript: ''
 settings:
@@ -169,6 +170,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -224,6 +227,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_terms_of_service.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_terms_of_service.yml
index 83158c7b08..eb2021ca73 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_terms_of_service.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_terms_of_service.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -33,7 +34,7 @@ elements: |
     '#terms_type': slideout
     '#terms_title': terms_of_service_slideout
     '#terms_content': 'These are the terms of service.'
-
+  
 css: ''
 javascript: ''
 settings:
@@ -106,6 +107,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -161,6 +164,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_text_format.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_text_format.yml
index 8fd3301f0e..e27bd56b27 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_text_format.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_text_format.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -30,7 +31,7 @@ elements: |
     '#title': text_format_description_more
     '#description': 'This is a description'
     '#more': 'This is more'
-
+  
 css: ''
 javascript: ''
 settings:
@@ -103,6 +104,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -158,6 +161,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_time.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_time.yml
index 5cbc8639de..7e1a7f2673 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_time.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_time.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -140,6 +141,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -195,6 +198,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
@@ -246,6 +250,7 @@ handlers:
   debug:
     id: debug
     label: Debug
+    notes: ''
     handler_id: debug
     status: true
     conditions: {  }
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_title_display.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_title_display.yml
index fd4dac49c1..41ae2b7462 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_title_display.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_title_display.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -1586,6 +1587,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -1641,6 +1644,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
@@ -1692,6 +1696,7 @@ handlers:
   debug:
     id: debug
     label: Debug
+    notes: ''
     handler_id: debug
     status: true
     conditions: {  }
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_users_roles.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_users_roles.yml
index 147d374729..7dc5a5c1fa 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_users_roles.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_users_roles.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -105,6 +106,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -160,6 +163,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
@@ -211,6 +215,7 @@ handlers:
   debug:
     id: debug
     label: Debug
+    notes: ''
     handler_id: debug
     status: true
     conditions: {  }
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_validate_minlength.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_validate_minlength.yml
index e5600a2367..dbf46e07e9 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_validate_minlength.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_validate_minlength.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -26,7 +27,7 @@ elements: |
     '#minlength': 5
     '#required': true
     '#default_value': value
-
+  
 css: ''
 javascript: ''
 settings:
@@ -99,6 +100,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -154,6 +157,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_validate_multiple.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_validate_multiple.yml
index 673149498d..fb37aec765 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_validate_multiple.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_validate_multiple.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -151,6 +152,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -206,6 +209,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
@@ -257,6 +261,7 @@ handlers:
   debug:
     id: debug
     label: Debug
+    notes: ''
     handler_id: debug
     status: true
     conditions: {  }
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_validate_pattern.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_validate_pattern.yml
index 317e4185cf..c586b4522d 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_validate_pattern.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_validate_pattern.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -110,6 +111,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -165,6 +168,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
@@ -216,6 +220,7 @@ handlers:
   debug:
     id: debug
     label: Debug
+    notes: ''
     handler_id: debug
     status: true
     conditions: {  }
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_validate_required.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_validate_required.yml
index e453f37c8a..d194ca5f7a 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_validate_required.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_validate_required.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -34,7 +35,7 @@ elements: |
       three: Three
     '#required': true
     '#required_error': 'This is a custom required message'
-
+  
 css: ''
 javascript: ''
 settings:
@@ -107,6 +108,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -162,6 +165,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_validate_unique.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_validate_unique.yml
index a316747cdd..8570469fd0 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_validate_unique.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_validate_unique.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -55,7 +56,7 @@ elements: |
     '#options':
       1: one
       2: two
-
+  
 css: ''
 javascript: ''
 settings:
@@ -128,6 +129,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -183,6 +186,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_view.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_view.yml
index 7fe1bd1405..d258c43571 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_view.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_element_view.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -97,6 +98,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -152,6 +155,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
@@ -203,6 +207,7 @@ handlers:
   debug:
     id: debug
     label: Debug
+    notes: ''
     handler_id: debug
     status: true
     conditions: {  }
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_example_elements.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_example_elements.yml
index 22399c6633..49ddc4f5c8 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_example_elements.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_example_elements.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -510,7 +511,7 @@ elements: |
     table:
       '#type': table
       '#title': Table
-
+  
 css: ''
 javascript: ''
 settings:
@@ -583,6 +584,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -638,6 +641,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_example_elements_composite.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_example_elements_composite.yml
index bd466ac56a..25bf5f6362 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_example_elements_composite.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_example_elements_composite.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -170,7 +171,7 @@ elements: |
       '#type': text_format
       '#title': 'Text format'
       '#description': '<b>Known Issues:</b><br /><a href="https://www.drupal.org/node/997826">Issue #997826: #states doesn''t work correctly with type text_format</a><br /><a href="https://www.drupal.org/node/2625128">Issue #2625128: Text format selection stays visible when using editor and a hidden webform state</a><br /><a href="https://www.drupal.org/node/1954968">Issue #1954968: Required CKEditor fields always fail HTML5 validation</a>'
-
+  
 css: ''
 javascript: ''
 settings:
@@ -243,6 +244,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -298,6 +301,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_exporter_entity_reference.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_exporter_entity_reference.yml
index 8a35448d6a..66ed2b2ab1 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_exporter_entity_reference.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_exporter_entity_reference.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -33,7 +34,7 @@ elements: |
     '#selection_handler': 'default:user'
     '#selection_settings':
       include_anonymous: true
-
+  
 css: ''
 javascript: ''
 settings:
@@ -106,6 +107,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -161,6 +164,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_exporter_options.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_exporter_options.yml
index 7633a29dc1..b17204a529 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_exporter_options.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_exporter_options.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -43,7 +44,7 @@ elements: |
       one: One
       two: Two
       three: Three
-
+  
 css: ''
 javascript: ''
 settings:
@@ -116,6 +117,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -171,6 +174,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_access_denied.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_access_denied.yml
index c57974f68d..1d5a057f1f 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_access_denied.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_access_denied.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -18,7 +19,7 @@ elements: |
   textfield:
     '#type': textfield
     '#title': textfield
-
+  
 css: ''
 javascript: ''
 settings:
@@ -91,6 +92,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -146,6 +149,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_api.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_api.yml
index d7ceca8262..5a37d705b7 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_api.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_api.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -118,7 +119,7 @@ elements: |
     '#options':
       1: Administrator
       0: Anonymous
-
+  
 css: ''
 javascript: ''
 settings:
@@ -191,6 +192,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -246,6 +249,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_archived.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_archived.yml
index 11a3644db0..325774c86b 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_archived.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_archived.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -17,7 +18,7 @@ category: 'Test: Webform'
 elements: |
   description:
     '#markup': 'This webform is archived.'
-
+  
 css: ''
 javascript: ''
 settings:
@@ -90,6 +91,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -145,6 +148,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_assets.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_assets.yml
index ec562b350c..46862386af 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_assets.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_assets.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -18,21 +19,21 @@ elements: |
   test:
     '#type': textfield
     '#title': 'Text field'
-
+  
 css: |
   .webform-submission-form {
     background-color: #cccccc;
     display: none;
     padding: 20px;
   }
-
+  
 javascript: |
   (function ($) {
     $(function() {
       $('.webform-submission-form').fadeIn(3000);
     });
   })(jQuery);
-
+  
 settings:
   ajax: false
   ajax_scroll_top: form
@@ -103,6 +104,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -158,6 +161,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_autofill.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_autofill.yml
index 7a0111961f..0d3b9f408b 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_autofill.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_autofill.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -21,7 +22,7 @@ elements: |
   textfield_excluded:
     '#type': textfield
     '#title': textfield_excluded
-
+  
 css: ''
 javascript: ''
 settings:
@@ -95,6 +96,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -150,6 +153,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_autofocus.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_autofocus.yml
index 5e178b82b8..0b68ca980a 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_autofocus.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_autofocus.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -18,7 +19,7 @@ elements: |
   test:
     '#type': textfield
     '#title': 'First input'
-
+  
 css: ''
 javascript: ''
 settings:
@@ -91,6 +92,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -146,6 +149,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_closed.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_closed.yml
index 42e2d0d15f..1bd7f4ad5b 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_closed.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_closed.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: closed
 dependencies:
@@ -17,7 +18,7 @@ category: 'Test: Webform'
 elements: |
   description:
     '#markup': 'This message should not be displayed'
-
+  
 css: ''
 javascript: ''
 settings:
@@ -90,6 +91,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -145,6 +148,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_confidential.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_confidential.yml
index 5f08dac5c8..07aa2950b3 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_confidential.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_confidential.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -18,7 +19,7 @@ elements: |
   name:
     '#type': textfield
     '#title': Name
-
+  
 css: ''
 javascript: ''
 settings:
@@ -91,6 +92,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -146,6 +149,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_details_toggle.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_details_toggle.yml
index 94f0333d80..8fbf020dc7 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_details_toggle.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_details_toggle.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -25,7 +26,7 @@ elements: |
     '#title': 'Details 02'
     details_02:
       '#markup': 'Detail 02 Markup'
-
+  
 css: ''
 javascript: ''
 settings:
@@ -98,6 +99,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -153,6 +156,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_disable_autocomplete.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_disable_autocomplete.yml
index 6013e95fab..92ad1b99bf 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_disable_autocomplete.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_disable_autocomplete.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -20,7 +21,7 @@ elements: |
   test:
     '#type': email
     '#title': 'Test autocompletion is disabled.'
-
+  
 css: ''
 javascript: ''
 settings:
@@ -93,6 +94,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -148,6 +151,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_disable_back.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_disable_back.yml
index 4cc2e610db..4bed3fbfee 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_disable_back.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_disable_back.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -345,7 +346,7 @@ elements: |
     element_100:
       '#type': textfield
       '#title': 'Element #100'
-
+  
 css: ''
 javascript: ''
 settings:
@@ -418,6 +419,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -473,6 +476,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_disable_inline_errors.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_disable_inline_errors.yml
index 7ba3a3a28e..402417aad2 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_disable_inline_errors.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_disable_inline_errors.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -19,7 +20,7 @@ elements: |
     '#type': textfield
     '#title': textfield
     '#required': true
-
+  
 css: ''
 javascript: ''
 settings:
@@ -92,6 +93,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -147,6 +150,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_draft_anonymous.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_draft_anonymous.yml
index 886125db37..009c159666 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_draft_anonymous.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_draft_anonymous.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -22,7 +23,7 @@ elements: |
   comment:
     '#type': textarea
     '#title': Comment
-
+  
 css: ''
 javascript: ''
 settings:
@@ -95,6 +96,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -150,6 +153,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_draft_authenticated.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_draft_authenticated.yml
index ee8299814a..5ebf576bb5 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_draft_authenticated.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_draft_authenticated.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -22,7 +23,7 @@ elements: |
   comment:
     '#type': textarea
     '#title': Comment
-
+  
 css: ''
 javascript: ''
 settings:
@@ -95,6 +96,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -150,6 +153,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_draft_multiple.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_draft_multiple.yml
index 2fa04891e9..13930ed7eb 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_draft_multiple.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_draft_multiple.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -22,7 +23,7 @@ elements: |
   comment:
     '#type': textarea
     '#title': Comment
-
+  
 css: ''
 javascript: ''
 settings:
@@ -51,7 +52,7 @@ settings:
   form_prepopulate_source_entity_type: ''
   form_reset: true
   form_disable_autocomplete: false
-  form_novalidate: false
+  form_novalidate: true
   form_disable_inline_errors: false
   form_required: false
   form_unsaved: false
@@ -95,6 +96,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -150,6 +153,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_inline_errors.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_inline_errors.yml
index f6f9a2927a..9cada602bc 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_inline_errors.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_inline_errors.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -126,7 +127,7 @@ elements: |
         1: 'Option 1'
         2: 'Option 2'
         3: 'Option 3'
-
+  
 css: ''
 javascript: ''
 settings:
@@ -199,6 +200,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -254,6 +257,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_limit.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_limit.yml
index 6ab358430c..e18bad2bb5 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_limit.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_limit.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -38,7 +39,7 @@ elements: |
   name:
     '#type': textfield
     '#title': Name
-
+  
 css: ''
 javascript: ''
 settings:
@@ -111,6 +112,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -166,6 +169,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_limit_total_unique.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_limit_total_unique.yml
index 6ecc87f7d7..6e32134803 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_limit_total_unique.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_limit_total_unique.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -18,7 +19,7 @@ elements: |
   name:
     '#type': textfield
     '#title': Name
-
+  
 css: ''
 javascript: ''
 settings:
@@ -91,6 +92,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -146,6 +149,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_limit_user_unique.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_limit_user_unique.yml
index ccb7c38811..cdabfdfee8 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_limit_user_unique.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_limit_user_unique.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -18,7 +19,7 @@ elements: |
   name:
     '#type': textfield
     '#title': Name
-
+  
 css: ''
 javascript: ''
 settings:
@@ -91,6 +92,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -146,6 +149,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_limit_wait.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_limit_wait.yml
index 9949341eec..e34518fa55 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_limit_wait.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_limit_wait.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -18,7 +19,7 @@ elements: |
   name:
     '#type': textfield
     '#title': Name
-
+  
 css: ''
 javascript: ''
 settings:
@@ -93,6 +94,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -134,7 +137,7 @@ settings:
   limit_total_message: |
     webform_submission:interval:webform:wait =&gt; [webform_submission:interval:webform:wait]<br />
     webform_submission:interval:webform:source_entity:wait =&gt; [webform_submission:interval:webform:source_entity:wait]
-
+    
   limit_total_unique: false
   limit_user: 1
   limit_user_interval: 15
@@ -142,7 +145,7 @@ settings:
     <pre>
     webform_submission:interval:user:wait =&gt; [webform_submission:interval:user:wait]
     webform_submission:interval:user:source_entity:wait =&gt; [webform_submission:interval:user:source_entity:wait]</pre>
-
+    
   limit_user_unique: false
   entity_limit_total: 2
   entity_limit_total_interval: 30
@@ -155,6 +158,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_long_100.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_long_100.yml
index d9e8e3c833..69f5cb1365 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_long_100.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_long_100.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -315,7 +316,7 @@ elements: |
   element_100:
     '#type': textfield
     '#title': 'Element #100'
-
+  
 css: ''
 javascript: ''
 settings:
@@ -388,6 +389,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -443,6 +446,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_long_200.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_long_200.yml
index c665db0d8c..91e32608ab 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_long_200.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_long_200.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -615,7 +616,7 @@ elements: |
   element_200:
     '#type': textfield
     '#title': 'Element #200'
-
+  
 css: ''
 javascript: ''
 settings:
@@ -688,6 +689,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -743,6 +746,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_long_300.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_long_300.yml
index 47cb7f339d..1aecfecfff 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_long_300.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_long_300.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -915,7 +916,7 @@ elements: |
   element_300:
     '#type': textfield
     '#title': 'Element #300'
-
+  
 css: ''
 javascript: ''
 settings:
@@ -988,6 +989,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -1043,6 +1046,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_novalidate.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_novalidate.yml
index 3ea0741922..5c19359f44 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_novalidate.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_novalidate.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -22,7 +23,7 @@ elements: |
     '#title': 'Test required element with a custom error message.'
     '#required': true
     '#required_error': 'A custom error message'
-
+  
 css: ''
 javascript: ''
 settings:
@@ -95,6 +96,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -150,6 +153,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_opening.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_opening.yml
index fa89f0c785..bae32c2e6e 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_opening.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_opening.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: scheduled
 dependencies:
@@ -17,7 +18,7 @@ category: 'Test: Webform'
 elements: |
   description:
     '#markup': 'This message should not be displayed'
-
+  
 css: ''
 javascript: ''
 settings:
@@ -90,6 +91,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -145,6 +148,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_prepopulate.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_prepopulate.yml
index a1dadd5702..2a41a8b057 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_prepopulate.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_prepopulate.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -38,7 +39,7 @@ elements: |
         type: _none
   prepopulate_name:
     '#markup': '<a href="?source_entity_type=user&source_entity_id=1&name=John+Smith&colors[]=red&colors[]=white&users[]=1">Prepopulate elements and source entity using query string parameter ?source_entity_type=user&source_entity_id=1&name=John+Smith&colors[]=red&colors[]=white&users[]=1</a>'
-
+  
 css: ''
 javascript: ''
 settings:
@@ -111,6 +112,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -166,6 +169,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_preview.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_preview.yml
index aceabb2d9c..ee92ac36f9 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_preview.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_preview.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -51,13 +52,13 @@ elements: |
       '#format_attributes':
         class:
           - format-attributes-class
-
+  
 css: |
   .format-attributes-class {
     border: 1px dashed #ccc;
     padding: 10px;
   }
-
+  
 javascript: ''
 settings:
   ajax: false
@@ -129,6 +130,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -184,6 +187,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_properties.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_properties.yml
index 4d6cba24d4..67373b1a03 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_properties.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_properties.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -30,7 +31,7 @@ elements: |
   q:
     '#type': search
     '#title': 'Search Google'
-
+  
 css: ''
 javascript: ''
 settings:
@@ -103,6 +104,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -158,6 +161,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_remote_addr.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_remote_addr.yml
index 6673bffb90..181bbed6bc 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_remote_addr.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_remote_addr.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -18,7 +19,7 @@ elements: |
   name:
     '#type': textfield
     '#title': Name
-
+  
 css: ''
 javascript: ''
 settings:
@@ -91,6 +92,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -146,6 +149,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_required.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_required.yml
index ff832b65e2..f74bbb441c 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_required.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_required.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -19,7 +20,7 @@ elements: |
     '#type': textfield
     '#title': textfield
     '#required': true
-
+  
 css: ''
 javascript: ''
 settings:
@@ -92,6 +93,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -147,6 +150,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_reset.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_reset.yml
index c58271b2c3..b970ee695c 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_reset.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_reset.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -19,7 +20,7 @@ elements: |
     '#type': textfield
     '#title': 'Text field'
     '#required': true
-
+  
 css: ''
 javascript: ''
 settings:
@@ -92,6 +93,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -147,6 +150,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_results_disabled.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_results_disabled.yml
index 947838f84b..e8144b3efc 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_results_disabled.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_results_disabled.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -17,7 +18,7 @@ category: 'Test: Form'
 elements: |
   description:
     '#markup': 'This webform will not save any submissions.'
-
+  
 css: ''
 javascript: ''
 settings:
@@ -90,6 +91,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -145,6 +148,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_submit_back.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_submit_back.yml
index 2c52e4d186..98030e0634 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_submit_back.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_submit_back.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -29,7 +30,7 @@ elements: |
       '#title': 'Element 2'
       '#type': textfield
       '#default_value': '{element_2}'
-
+  
 css: ''
 javascript: ''
 settings:
@@ -102,6 +103,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -157,6 +160,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_submit_once.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_submit_once.yml
index fb03eaf8ea..35f28dd5f7 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_submit_once.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_submit_once.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -26,7 +27,7 @@ elements: |
   wizard_3:
     '#type': webform_wizard_page
     '#title': 'Wizard page #3'
-
+  
 css: ''
 javascript: ''
 settings:
@@ -99,6 +100,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -154,6 +157,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_submit_text.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_submit_text.yml
index 94d05ca814..f0f6299b39 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_submit_text.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_submit_text.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -19,7 +20,7 @@ elements: |
     '#type': webform_actions
     '#title': 'Submit button(s)'
     '#submit__label': 'Custom submit text'
-
+  
 css: ''
 javascript: ''
 settings:
@@ -92,6 +93,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -147,6 +150,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_template.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_template.yml
index cd5767c6c9..bf506282a4 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_template.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_template.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: closed
 dependencies:
@@ -17,7 +18,7 @@ category: 'Test: Webform'
 elements: |
   description:
     '#markup': 'This webform is a template'
-
+  
 css: ''
 javascript: ''
 settings:
@@ -90,6 +91,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -145,6 +148,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_unsaved.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_unsaved.yml
index e89a0bfc7f..31223aa43e 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_unsaved.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_unsaved.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -23,7 +24,7 @@ elements: |
   text_format:
     '#type': text_format
     '#title': text_format
-
+  
 css: ''
 javascript: ''
 settings:
@@ -96,6 +97,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -151,6 +154,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_unsaved_wizard.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_unsaved_wizard.yml
index ea0119ecc9..19a4869ca8 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_unsaved_wizard.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_unsaved_wizard.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -27,7 +28,7 @@ elements: |
     testfield_1:
       '#type': textfield
       '#title': textfield_2
-
+  
 css: ''
 javascript: ''
 settings:
@@ -100,6 +101,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -155,6 +158,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_validate.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_validate.yml
index e5cf4e9670..208b0f9da1 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_validate.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_validate.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -18,7 +19,7 @@ elements: |
   custom:
     '#title': 'Custom Field'
     '#type': textfield
-
+  
 css: ''
 javascript: ''
 settings:
@@ -91,6 +92,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -146,6 +149,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_wizard_access.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_wizard_access.yml
index 7ddfbcf036..6d06b793f1 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_wizard_access.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_wizard_access.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -56,7 +57,7 @@ elements: |
       '#type': textfield
       '#title': textfield_private
       '#default_value': '{textfield_private}'
-
+  
 css: ''
 javascript: ''
 settings:
@@ -129,6 +130,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -184,6 +187,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_wizard_advanced.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_wizard_advanced.yml
index 3e91a545fc..fb0837d662 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_wizard_advanced.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_wizard_advanced.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -60,7 +61,7 @@ elements: |
       '#type': textarea
       '#required': true
       '#default_value': 'Here is some feedback'
-
+  
 css: ''
 javascript: ''
 settings:
@@ -133,6 +134,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -188,6 +191,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_wizard_basic.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_wizard_basic.yml
index 3feb044d13..1873a93868 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_wizard_basic.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_wizard_basic.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -29,7 +30,7 @@ elements: |
       '#title': 'Element 2'
       '#type': textfield
       '#default_value': '{element_2}'
-
+  
 css: ''
 javascript: ''
 settings:
@@ -102,6 +103,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -157,6 +160,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_wizard_conditional.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_wizard_conditional.yml
index 001dbe124c..eb1c4a0372 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_wizard_conditional.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_wizard_conditional.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -98,7 +99,7 @@ elements: |
           unchecked: true
     page_5_markup:
       '#markup': 'This is page 5.'
-
+  
 css: ''
 javascript: ''
 settings:
@@ -171,6 +172,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -226,6 +229,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_wizard_custom.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_wizard_custom.yml
index feafdf17af..b6e5ee1c6f 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_wizard_custom.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_wizard_custom.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -61,7 +62,7 @@ elements: |
     '#type': webform_actions
     '#title': 'Submit button(s)'
     '#submit__label': Apply
-
+  
 css: ''
 javascript: ''
 settings:
@@ -134,6 +135,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -189,6 +192,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_wizard_links.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_wizard_links.yml
index f62d8fd759..eb13895a33 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_wizard_links.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_wizard_links.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -29,7 +30,7 @@ elements: |
       '#title': 'Element 2'
       '#type': textfield
       '#default_value': '{element_2}'
-
+  
 css: ''
 javascript: ''
 settings:
@@ -102,6 +103,8 @@ settings:
   wizard_progress_link: true
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: true
   wizard_confirmation: true
@@ -157,6 +160,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_wizard_long_100.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_wizard_long_100.yml
index f0d24f1f82..352f48af60 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_wizard_long_100.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_wizard_long_100.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -345,7 +346,7 @@ elements: |
     element_100:
       '#type': textfield
       '#title': 'Element #100'
-
+  
 css: ''
 javascript: ''
 settings:
@@ -418,6 +419,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -473,6 +476,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_wizard_long_200.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_wizard_long_200.yml
index fe2f3378b9..a8532c3a09 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_wizard_long_200.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_wizard_long_200.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -675,7 +676,7 @@ elements: |
     element_200:
       '#type': textfield
       '#title': 'Element #200'
-
+  
 css: ''
 javascript: ''
 settings:
@@ -748,6 +749,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -803,6 +806,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_wizard_long_300.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_wizard_long_300.yml
index aac4834401..3d2a6996ca 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_wizard_long_300.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_wizard_long_300.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -1005,7 +1006,7 @@ elements: |
     element_300:
       '#type': textfield
       '#title': 'Element #300'
-
+  
 css: ''
 javascript: ''
 settings:
@@ -1078,6 +1079,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -1133,6 +1136,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_wizard_validate.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_wizard_validate.yml
index 6142aed2a4..372aa75f42 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_wizard_validate.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_wizard_validate.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -131,6 +132,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -186,6 +189,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
@@ -237,6 +241,7 @@ handlers:
   debug:
     id: debug
     label: Debug
+    notes: ''
     handler_id: debug
     status: true
     conditions: {  }
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_wizard_validate_comp.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_wizard_validate_comp.yml
index a496868e0f..0a73222946 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_wizard_validate_comp.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_form_wizard_validate_comp.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -179,6 +180,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -234,6 +237,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
@@ -285,6 +289,7 @@ handlers:
   debug:
     id: debug
     label: Debug
+    notes: ''
     handler_id: debug
     status: true
     conditions: {  }
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_handler_action.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_handler_action.yml
index 99a2b75c7c..cac6e5b404 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_handler_action.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_handler_action.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -120,6 +121,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -175,6 +178,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
@@ -226,6 +230,7 @@ handlers:
   notes:
     id: action
     label: Notes
+    notes: ''
     handler_id: notes
     status: true
     conditions:
@@ -252,6 +257,7 @@ handlers:
   flag:
     id: action
     label: Flag
+    notes: ''
     handler_id: flag
     status: true
     conditions:
@@ -276,6 +282,7 @@ handlers:
   unflag:
     id: action
     label: Unflag
+    notes: ''
     handler_id: unflag
     status: true
     conditions:
@@ -300,6 +307,7 @@ handlers:
   locked:
     id: action
     label: Locked
+    notes: ''
     handler_id: locked
     status: true
     conditions:
@@ -324,6 +332,7 @@ handlers:
   unlocked:
     id: action
     label: Unlocked
+    notes: ''
     handler_id: unlocked
     status: true
     conditions:
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_handler_email.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_handler_email.yml
index 858fb5f315..2dbcd9f934 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_handler_email.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_handler_email.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -113,6 +114,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -168,6 +171,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
@@ -219,6 +223,7 @@ handlers:
   email:
     id: email
     label: Email
+    notes: ''
     handler_id: email
     status: true
     conditions: {  }
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_handler_email_advanced.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_handler_email_advanced.yml
index 2d6da39c18..ce65851fb7 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_handler_email_advanced.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_handler_email_advanced.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -128,6 +129,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -183,6 +186,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
@@ -234,6 +238,7 @@ handlers:
   email:
     id: email
     label: Email
+    notes: ''
     handler_id: email
     status: true
     conditions: {  }
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_handler_email_mapping.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_handler_email_mapping.yml
index 74a2203414..c4547158bd 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_handler_email_mapping.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_handler_email_mapping.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -103,6 +104,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -158,6 +161,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
@@ -209,6 +213,7 @@ handlers:
   select:
     id: email
     label: 'Select yes option'
+    notes: ''
     handler_id: select
     status: true
     conditions: {  }
@@ -247,6 +252,7 @@ handlers:
   empty:
     id: email
     label: 'Select empty'
+    notes: ''
     handler_id: empty
     status: true
     conditions: {  }
@@ -285,6 +291,7 @@ handlers:
   default:
     id: email
     label: 'Select default'
+    notes: ''
     handler_id: empty
     status: true
     conditions: {  }
@@ -323,6 +330,7 @@ handlers:
   checkboxes:
     id: email
     label: Checkboxes
+    notes: ''
     handler_id: checkboxes
     status: true
     conditions: {  }
@@ -363,6 +371,7 @@ handlers:
   radios_other:
     id: email
     label: 'Radios other'
+    notes: ''
     handler_id: radios_other
     status: true
     conditions: {  }
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_handler_email_roles.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_handler_email_roles.yml
index a3986b7422..a01230c938 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_handler_email_roles.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_handler_email_roles.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -95,6 +96,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -150,6 +153,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
@@ -201,6 +205,7 @@ handlers:
   email:
     id: email
     label: Email
+    notes: ''
     handler_id: email
     status: true
     conditions: {  }
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_handler_email_states.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_handler_email_states.yml
index 38133f85c2..5e650fba29 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_handler_email_states.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_handler_email_states.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -90,6 +91,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -145,6 +148,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
@@ -196,6 +200,7 @@ handlers:
   email_draft:
     id: email
     label: 'Draft saved'
+    notes: ''
     handler_id: email_draft
     status: true
     conditions: {  }
@@ -233,6 +238,7 @@ handlers:
   email_converted:
     id: email
     label: 'Submission converted'
+    notes: ''
     handler_id: email_converted
     status: true
     conditions: {  }
@@ -269,6 +275,7 @@ handlers:
   email_completed:
     id: email
     label: 'Submission completed'
+    notes: ''
     handler_id: email_completed
     status: true
     conditions: {  }
@@ -305,6 +312,7 @@ handlers:
   email_updated:
     id: email
     label: 'Submission updated'
+    notes: ''
     handler_id: email_updated
     status: true
     conditions: {  }
@@ -341,6 +349,7 @@ handlers:
   email_locked:
     id: email
     label: 'Submission locked'
+    notes: ''
     handler_id: email_locked
     status: true
     conditions: {  }
@@ -377,6 +386,7 @@ handlers:
   email_deleted:
     id: email
     label: 'Submission deleted'
+    notes: ''
     handler_id: email_deleted
     status: true
     conditions: {  }
@@ -413,6 +423,7 @@ handlers:
   email_custom:
     id: email
     label: 'Submission custom'
+    notes: ''
     handler_id: email_custom
     status: true
     conditions: {  }
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_handler_email_twig.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_handler_email_twig.yml
index 0ff5d6839b..e88029bb85 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_handler_email_twig.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_handler_email_twig.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -113,6 +114,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -168,6 +171,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
@@ -219,6 +223,7 @@ handlers:
   email:
     id: email
     label: Email
+    notes: ''
     handler_id: email
     status: true
     conditions: {  }
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_handler_settings.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_handler_settings.yml
index 467eebda3c..50228e7d82 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_handler_settings.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_handler_settings.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -133,6 +134,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -188,6 +191,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
@@ -239,6 +243,7 @@ handlers:
   preview:
     id: settings
     label: 'Preview settings'
+    notes: ''
     handler_id: preview
     status: true
     conditions:
@@ -256,6 +261,7 @@ handlers:
   confirmation:
     id: settings
     label: 'Confirmation Settings'
+    notes: ''
     handler_id: confirmation
     status: true
     conditions:
@@ -273,6 +279,7 @@ handlers:
   custom:
     id: settings
     label: 'Custom settings'
+    notes: ''
     handler_id: custom
     status: true
     conditions:
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_libraries_optional.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_libraries_optional.yml
index 71453f7d90..797d77dbc0 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_libraries_optional.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_libraries_optional.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -84,7 +85,7 @@ elements: |
     signature:
       '#type': webform_signature
       '#title': Signature
-
+  
 css: ''
 javascript: ''
 settings:
@@ -157,6 +158,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -212,6 +215,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_rendering.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_rendering.yml
index 54aea7af46..dc1282b35a 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_rendering.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_rendering.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -122,6 +123,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -177,6 +180,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: true
+  serial_disabled: false
 access:
   create:
     roles:
@@ -228,6 +232,7 @@ handlers:
   email_html:
     id: email
     label: 'Email html'
+    notes: ''
     handler_id: email_html
     status: true
     conditions: {  }
@@ -264,6 +269,7 @@ handlers:
   email_text:
     id: email
     label: 'Email text'
+    notes: ''
     handler_id: email_text
     status: true
     conditions: {  }
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_states.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_states.yml
deleted file mode 100644
index eaee5050e2..0000000000
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_states.yml
+++ /dev/null
@@ -1,2732 +0,0 @@
-langcode: en
-status: open
-dependencies:
-  enforced:
-    module:
-      - webform_test
-open: null
-close: null
-weight: 0
-uid: null
-template: false
-archive: false
-id: test_states
-title: 'Test: Form API #states'
-description: 'Test Drupal''s #states API states (visible, required, disabled, checked, and expanded).'
-category: 'Test: Form API #states'
-elements: |
-  visible:
-    '#type': details
-    '#title': 'Test State: Visible and Required'
-    visible_trigger:
-      '#type': checkbox
-      '#title': 'Displays and require elements'
-    visible_container:
-      '#type': container
-      '#title': Container
-      '#states':
-        visible:
-          ':input[name="visible_trigger"]':
-            checked: true
-        required:
-          ':input[name="visible_trigger"]':
-            checked: true
-    visible_details:
-      '#type': details
-      '#title': Details
-      '#description': '<b>Known Issues:</b><br /><a href="https://www.drupal.org/node/2348851">Issue #2348851: Regression: Allow HTML tags inside detail summary</a>'
-      '#states':
-        visible:
-          ':input[name="visible_trigger"]':
-            checked: true
-        required:
-          ':input[name="visible_trigger"]':
-            checked: true
-    visible_fieldset:
-      '#type': fieldset
-      '#title': Fieldset
-      '#states':
-        visible:
-          ':input[name="visible_trigger"]':
-            checked: true
-        required:
-          ':input[name="visible_trigger"]':
-            checked: true
-    visible_webform_section:
-      '#type': webform_section
-      '#title': Section
-      '#states':
-        visible:
-          ':input[name="visible_trigger"]':
-            checked: true
-        required:
-          ':input[name="visible_trigger"]':
-            checked: true
-    visible_table:
-      '#type': table
-      '#title': Table
-      '#states':
-        visible:
-          ':input[name="visible_trigger"]':
-            checked: true
-        required:
-          ':input[name="visible_trigger"]':
-            checked: true
-    visible_address:
-      '#type': address
-      '#title': 'Advanced address'
-      '#default_value':
-        given_name: John
-        family_name: Smith
-        organization: 'Google Inc.'
-        address_line1: '1098 Alta Ave'
-        postal_code: '94043'
-        locality: 'Mountain View'
-        administrative_area: CA
-        country_code: US
-        langcode: en
-      '#states':
-        visible:
-          ':input[name="visible_trigger"]':
-            checked: true
-        required:
-          ':input[name="visible_trigger"]':
-            checked: true
-    visible_processed_text:
-      '#type': processed_text
-      '#title': 'Advanced HTML/Text'
-      '#states':
-        visible:
-          ':input[name="visible_trigger"]':
-            checked: true
-        required:
-          ':input[name="visible_trigger"]':
-            checked: true
-    visible_webform_audio_file:
-      '#type': webform_audio_file
-      '#title': 'Audio file'
-      '#states':
-        visible:
-          ':input[name="visible_trigger"]':
-            checked: true
-        required:
-          ':input[name="visible_trigger"]':
-            checked: true
-    visible_webform_autocomplete:
-      '#type': webform_autocomplete
-      '#title': Autocomplete
-      '#default_value': Loremipsum
-      '#states':
-        visible:
-          ':input[name="visible_trigger"]':
-            checked: true
-        required:
-          ':input[name="visible_trigger"]':
-            checked: true
-    visible_webform_address:
-      '#type': webform_address
-      '#title': 'Basic address'
-      '#default_value':
-        address: '10 Main Street'
-        address_2: '10 Main Street'
-        city: Springfield
-        state_province: Alabama
-        postal_code: '11111'
-        country: Afghanistan
-      '#states':
-        visible:
-          ':input[name="visible_trigger"]':
-            checked: true
-        required:
-          ':input[name="visible_trigger"]':
-            checked: true
-    visible_webform_markup:
-      '#type': webform_markup
-      '#title': 'Basic HTML'
-      '#description': '<b>Known Issues:</b><br /><a href="https://www.drupal.org/node/2700667">Issue #2700667: Notice: Undefined index: #type in drupal_process_states()</a>'
-      '#states':
-        visible:
-          ':input[name="visible_trigger"]':
-            checked: true
-        required:
-          ':input[name="visible_trigger"]':
-            checked: true
-    visible_captcha:
-      '#type': captcha
-      '#title': CAPTCHA
-      '#captcha_admin_mode': true
-      '#captcha_type': image_captcha/Image
-      '#states':
-        visible:
-          ':input[name="visible_trigger"]':
-            checked: true
-        required:
-          ':input[name="visible_trigger"]':
-            checked: true
-    visible_checkbox:
-      '#type': checkbox
-      '#title': Checkbox
-      '#default_value': true
-      '#states':
-        visible:
-          ':input[name="visible_trigger"]':
-            checked: true
-        required:
-          ':input[name="visible_trigger"]':
-            checked: true
-    visible_checkboxes:
-      '#type': checkboxes
-      '#title': Checkboxes
-      '#options':
-        one: One
-        two: Two
-        three: Three
-      '#options_display': side_by_side
-      '#description': '<b>Known Issues:</b><br /><a href="https://www.drupal.org/node/994360">Issue #994360: #states cannot disable/enable radios and checkboxes</a><br /><a href="https://www.drupal.org/node/2836364">Issue #2836364: Wrapper attributes are not supported by composite elements, this includes radios, checkboxes, and buttons.</a>'
-      '#default_value':
-        - one
-        - two
-        - three
-      '#states':
-        visible:
-          ':input[name="visible_trigger"]':
-            checked: true
-        required:
-          ':input[name="visible_trigger"]':
-            checked: true
-    visible_webform_checkboxes_other:
-      '#type': webform_checkboxes_other
-      '#title': 'Checkboxes other'
-      '#options':
-        one: One
-        two: Two
-        three: Three
-      '#options_display': side_by_side
-      '#default_value':
-        - one
-        - two
-        - three
-      '#states':
-        visible:
-          ':input[name="visible_trigger"]':
-            checked: true
-        required:
-          ':input[name="visible_trigger"]':
-            checked: true
-    visible_webform_codemirror:
-      '#type': webform_codemirror
-      '#title': CodeMirror
-      '#mode': yaml
-      '#default_value': 'message: ''Hello World'''
-      '#states':
-        visible:
-          ':input[name="visible_trigger"]':
-            checked: true
-        required:
-          ':input[name="visible_trigger"]':
-            checked: true
-    visible_color:
-      '#type': color
-      '#title': Color
-      '#default_value': '#ffffcc'
-      '#states':
-        visible:
-          ':input[name="visible_trigger"]':
-            checked: true
-        required:
-          ':input[name="visible_trigger"]':
-            checked: true
-    visible_webform_computed_token:
-      '#type': webform_computed_token
-      '#title': 'Computed token'
-      '#states':
-        visible:
-          ':input[name="visible_trigger"]':
-            checked: true
-        required:
-          ':input[name="visible_trigger"]':
-            checked: true
-      '#template': 'This is a Computed token value.'
-    visible_webform_computed_twig:
-      '#type': webform_computed_twig
-      '#title': 'Computed Twig'
-      '#states':
-        visible:
-          ':input[name="visible_trigger"]':
-            checked: true
-        required:
-          ':input[name="visible_trigger"]':
-            checked: true
-      '#template': 'This is a Computed Twig value.'
-    visible_webform_contact:
-      '#type': webform_contact
-      '#title': Contact
-      '#default_value':
-        name: Loremipsum
-        company: Loremipsum
-        email: example@example.com
-        phone: 123-456-7890
-        address: '10 Main Street'
-        address_2: '10 Main Street'
-        city: Springfield
-        state_province: Alabama
-        postal_code: '11111'
-        country: Afghanistan
-      '#states':
-        visible:
-          ':input[name="visible_trigger"]':
-            checked: true
-        required:
-          ':input[name="visible_trigger"]':
-            checked: true
-    visible_webform_custom_composite:
-      '#type': webform_custom_composite
-      '#title': 'Custom composite'
-      '#element':
-        name:
-          '#type': textfield
-          '#title': Name
-          '#title_display': invisible
-        gender:
-          '#type': select
-          '#title': Gender
-          '#title_display': invisible
-          '#options':
-            Male: Male
-            Female: Female
-      '#default_value':
-        - name: Loremipsum
-          gender: Male
-        - name: Loremipsum
-          gender: Male
-        - name: Loremipsum
-          gender: Male
-      '#states':
-        visible:
-          ':input[name="visible_trigger"]':
-            checked: true
-        required:
-          ':input[name="visible_trigger"]':
-            checked: true
-    visible_date:
-      '#type': date
-      '#title': Date
-      '#default_value': '2025-12-07T23:03:39-0500'
-      '#states':
-        visible:
-          ':input[name="visible_trigger"]':
-            checked: true
-        required:
-          ':input[name="visible_trigger"]':
-            checked: true
-    visible_datetime:
-      '#type': datetime
-      '#title': Date/time
-      '#description': '<b>Known Issues:</b><br /><a href="https://www.drupal.org/node/2419131">Issue #2419131: #states attribute does not work on #type datetime</a>'
-      '#default_value': '2031-05-08T00:29:17-0400'
-      '#states':
-        visible:
-          ':input[name="visible_trigger"]':
-            checked: true
-        required:
-          ':input[name="visible_trigger"]':
-            checked: true
-    visible_datelist:
-      '#type': datelist
-      '#title': 'Date list'
-      '#default_value': '2036-12-05T02:05:53-0500'
-      '#states':
-        visible:
-          ':input[name="visible_trigger"]':
-            checked: true
-        required:
-          ':input[name="visible_trigger"]':
-            checked: true
-    visible_webform_document_file:
-      '#type': webform_document_file
-      '#title': 'Document file'
-      '#states':
-        visible:
-          ':input[name="visible_trigger"]':
-            checked: true
-        required:
-          ':input[name="visible_trigger"]':
-            checked: true
-    visible_email:
-      '#type': email
-      '#title': Email
-      '#default_value': example@example.com
-      '#states':
-        visible:
-          ':input[name="visible_trigger"]':
-            checked: true
-        required:
-          ':input[name="visible_trigger"]':
-            checked: true
-    visible_webform_email_confirm:
-      '#type': webform_email_confirm
-      '#title': 'Email confirm'
-      '#default_value': example@example.com
-      '#states':
-        visible:
-          ':input[name="visible_trigger"]':
-            checked: true
-        required:
-          ':input[name="visible_trigger"]':
-            checked: true
-    visible_webform_email_multiple:
-      '#type': webform_email_multiple
-      '#title': 'Email multiple'
-      '#default_value': 'example@example.com, test@test.com, random@random.com'
-      '#states':
-        visible:
-          ':input[name="visible_trigger"]':
-            checked: true
-        required:
-          ':input[name="visible_trigger"]':
-            checked: true
-    visible_entity_autocomplete:
-      '#type': entity_autocomplete
-      '#title': 'Entity autocomplete'
-      '#target_type': user
-      '#selection_handler': 'default:user'
-      '#selection_settings':
-        include_anonymous: true
-      '#description': '<b>Known Issues:</b><br /><a href="https://www.drupal.org/node/2826451">Issue #2826451: TermSelection returning HTML characters in select list</a>'
-      '#default_value': 1
-      '#states':
-        visible:
-          ':input[name="visible_trigger"]':
-            checked: true
-        required:
-          ':input[name="visible_trigger"]':
-            checked: true
-    visible_webform_entity_checkboxes:
-      '#type': webform_entity_checkboxes
-      '#title': 'Entity checkboxes'
-      '#options_display': side_by_side
-      '#target_type': user
-      '#selection_handler': 'default:user'
-      '#selection_settings':
-        include_anonymous: true
-      '#options':
-        1: Administrator
-        0: Anonymous
-      '#default_value':
-        - 1
-      '#states':
-        visible:
-          ':input[name="visible_trigger"]':
-            checked: true
-        required:
-          ':input[name="visible_trigger"]':
-            checked: true
-    visible_webform_entity_radios:
-      '#type': webform_entity_radios
-      '#title': 'Entity radios'
-      '#options_display': side_by_side
-      '#target_type': user
-      '#selection_handler': 'default:user'
-      '#selection_settings':
-        include_anonymous: true
-      '#options':
-        1: Administrator
-        0: Anonymous
-      '#default_value': 1
-      '#states':
-        visible:
-          ':input[name="visible_trigger"]':
-            checked: true
-        required:
-          ':input[name="visible_trigger"]':
-            checked: true
-    visible_webform_entity_select:
-      '#type': webform_entity_select
-      '#title': 'Entity select'
-      '#target_type': user
-      '#selection_handler': 'default:user'
-      '#selection_settings':
-        include_anonymous: true
-      '#options':
-        1: Administrator
-        0: Anonymous
-      '#default_value': 1
-      '#states':
-        visible:
-          ':input[name="visible_trigger"]':
-            checked: true
-        required:
-          ':input[name="visible_trigger"]':
-            checked: true
-    visible_managed_file:
-      '#type': managed_file
-      '#title': File
-      '#description': '<b>Known Issues:</b><br /><a href="https://www.drupal.org/node/2705471">Issue #2705471: Webform states managed file fields</a><br /><a href="https://www.drupal.org/node/2113931">Issue #2113931: File Field design update</a><br /><a href="https://www.drupal.org/node/2346893">Issue #2346893: Duplicate Ajax wrapper around a file field</a><br /><a href="https://www.drupal.org/node/2482783">Issue #2482783: File upload errors not set or shown correctly</a>'
-      '#states':
-        visible:
-          ':input[name="visible_trigger"]':
-            checked: true
-        required:
-          ':input[name="visible_trigger"]':
-            checked: true
-    visible_webform_horizontal_rule:
-      '#type': webform_horizontal_rule
-      '#attributes':
-        class:
-          - webform-horizontal-rule--dotted
-          - webform-horizontal-rule--thick
-      '#states':
-        visible:
-          ':input[name="visible_trigger"]':
-            checked: true
-        required:
-          ':input[name="visible_trigger"]':
-            checked: true
-    visible_webform_image_file:
-      '#type': webform_image_file
-      '#title': 'Image file'
-      '#states':
-        visible:
-          ':input[name="visible_trigger"]':
-            checked: true
-        required:
-          ':input[name="visible_trigger"]':
-            checked: true
-    visible_webform_image_select:
-      '#type': webform_image_select
-      '#title': 'Image select'
-      '#show_label': true
-      '#images':
-        bear_1:
-          text: 'Bear 1'
-          src: 'https://www.placebear.com/80/100'
-        bear_2:
-          text: 'Bear 2'
-          src: 'https://www.placebear.com/100/100'
-        bear_3:
-          text: 'Bear 3'
-          src: 'https://www.placebear.com/120/100'
-      '#default_value': Loremipsum
-      '#states':
-        visible:
-          ':input[name="visible_trigger"]':
-            checked: true
-        required:
-          ':input[name="visible_trigger"]':
-            checked: true
-    visible_item:
-      '#type': item
-      '#title': Item
-      '#markup': '{markup}'
-      '#field_prefix': '{field_prefix}'
-      '#field_suffix': '{field_suffix}'
-      '#description': '<b>Known Issues:</b><br /><a href="https://www.drupal.org/node/783438">Issue #783438: #states doesn''t work for #type item</a>'
-      '#states':
-        visible:
-          ':input[name="visible_trigger"]':
-            checked: true
-        required:
-          ':input[name="visible_trigger"]':
-            checked: true
-    visible_label:
-      '#type': label
-      '#title': Label
-      '#states':
-        visible:
-          ':input[name="visible_trigger"]':
-            checked: true
-        required:
-          ':input[name="visible_trigger"]':
-            checked: true
-    visible_language_select:
-      '#type': language_select
-      '#title': 'Language select'
-      '#default_value': en
-      '#states':
-        visible:
-          ':input[name="visible_trigger"]':
-            checked: true
-        required:
-          ':input[name="visible_trigger"]':
-            checked: true
-    visible_webform_likert:
-      '#type': webform_likert
-      '#title': Likert
-      '#questions':
-        q1: 'Please answer question 1?'
-        q2: 'How about now answering question 2?'
-        q3: 'Finally, here is question 3?'
-      '#answers':
-        1: '1'
-        2: '2'
-        3: '3'
-      '#default_value':
-        q1: 1
-        q2: 1
-        q3: 1
-      '#states':
-        visible:
-          ':input[name="visible_trigger"]':
-            checked: true
-        required:
-          ':input[name="visible_trigger"]':
-            checked: true
-    visible_webform_link:
-      '#type': webform_link
-      '#title': Link
-      '#default_value':
-        title: Loremipsum
-        url: 'http://example.com'
-      '#states':
-        visible:
-          ':input[name="visible_trigger"]':
-            checked: true
-        required:
-          ':input[name="visible_trigger"]':
-            checked: true
-    visible_webform_location_places:
-      '#type': webform_location_places
-      '#title': Location
-      '#map': true
-      '#geolocation': true
-      '#format': map
-      '#default_value':
-        value: 'The White House, 1600 Pennsylvania Ave NW, Washington, DC 20500, USA'
-      '#states':
-        visible:
-          ':input[name="visible_trigger"]':
-            checked: true
-        required:
-          ':input[name="visible_trigger"]':
-            checked: true
-    visible_machine_name:
-      '#type': machine_name
-      '#title': 'Machine name'
-      '#default_value': loremipsum
-      '#states':
-        visible:
-          ':input[name="visible_trigger"]':
-            checked: true
-        required:
-          ':input[name="visible_trigger"]':
-            checked: true
-    visible_webform_mapping:
-      '#type': webform_mapping
-      '#title': Mapping
-      '#source':
-        one: One
-        two: Two
-        three: Three
-      '#destination':
-        four: Four
-        five: Five
-        six: Six
-      '#default_value':
-        one: four
-        two: four
-        three: four
-      '#states':
-        visible:
-          ':input[name="visible_trigger"]':
-            checked: true
-        required:
-          ':input[name="visible_trigger"]':
-            checked: true
-    visible_webform_message:
-      '#type': webform_message
-      '#title': Message
-      '#message_type': warning
-      '#message_message': 'This is a <strong>warning</strong> message.'
-      '#description': '<b>Known Issues:</b><br /><a href="https://www.drupal.org/node/77245">Issue #77245: A place for JavaScript status messages</a>'
-      '#states':
-        visible:
-          ':input[name="visible_trigger"]':
-            checked: true
-        required:
-          ':input[name="visible_trigger"]':
-            checked: true
-    visible_webform_name:
-      '#type': webform_name
-      '#title': Name
-      '#default_value':
-        title: Miss
-        first: Loremipsum
-        middle: Loremipsum
-        last: Loremipsum
-        suffix: Loremipsum
-        degree: Loremipsum
-      '#states':
-        visible:
-          ':input[name="visible_trigger"]':
-            checked: true
-        required:
-          ':input[name="visible_trigger"]':
-            checked: true
-    visible_number:
-      '#type': number
-      '#title': Number
-      '#min': 0
-      '#max': 10
-      '#step': 1
-      '#states':
-        visible:
-          ':input[name="visible_trigger"]':
-            checked: true
-        required:
-          ':input[name="visible_trigger"]':
-            checked: true
-    visible_password:
-      '#type': password
-      '#title': Password
-      '#default_value': Loremipsum
-      '#states':
-        visible:
-          ':input[name="visible_trigger"]':
-            checked: true
-        required:
-          ':input[name="visible_trigger"]':
-            checked: true
-    visible_password_confirm:
-      '#type': password_confirm
-      '#title': 'Password confirm'
-      '#description': '<b>Known Issues:</b><br /><a href="https://www.drupal.org/node/1427838">Issue #1427838: password and password_confirm children do not pick up #states or #attributes</a>'
-      '#default_value': Loremipsum
-      '#states':
-        visible:
-          ':input[name="visible_trigger"]':
-            checked: true
-        required:
-          ':input[name="visible_trigger"]':
-            checked: true
-    visible_radios:
-      '#type': radios
-      '#title': Radios
-      '#options':
-        one: One
-        two: Two
-        three: Three
-      '#options_display': side_by_side
-      '#description': '<b>Known Issues:</b><br /><a href="https://www.drupal.org/node/2731991">Issue #2731991: Setting required on radios marks all options required</a><br /><a href="https://www.drupal.org/node/994360">Issue #994360: #states cannot disable/enable radios and checkboxes</a><br /><a href="https://www.drupal.org/node/2836364">Issue #2836364: Wrapper attributes are not supported by composite elements, this includes radios, checkboxes, and buttons.</a>'
-      '#default_value': one
-      '#states':
-        visible:
-          ':input[name="visible_trigger"]':
-            checked: true
-        required:
-          ':input[name="visible_trigger"]':
-            checked: true
-    visible_webform_radios_other:
-      '#type': webform_radios_other
-      '#title': 'Radios other'
-      '#options':
-        one: One
-        two: Two
-        three: Three
-      '#options_display': side_by_side
-      '#default_value': one
-      '#states':
-        visible:
-          ':input[name="visible_trigger"]':
-            checked: true
-        required:
-          ':input[name="visible_trigger"]':
-            checked: true
-    visible_range:
-      '#type': range
-      '#title': Range
-      '#min': 0
-      '#max': 100
-      '#step': 1
-      '#output': below
-      '#output__field_prefix': $
-      '#output__field_suffix': '.00'
-      '#states':
-        visible:
-          ':input[name="visible_trigger"]':
-            checked: true
-        required:
-          ':input[name="visible_trigger"]':
-            checked: true
-    visible_webform_rating:
-      '#type': webform_rating
-      '#title': Rating
-      '#states':
-        visible:
-          ':input[name="visible_trigger"]':
-            checked: true
-        required:
-          ':input[name="visible_trigger"]':
-            checked: true
-    visible_search:
-      '#type': search
-      '#title': Search
-      '#default_value': Loremipsum
-      '#states':
-        visible:
-          ':input[name="visible_trigger"]':
-            checked: true
-        required:
-          ':input[name="visible_trigger"]':
-            checked: true
-    visible_select:
-      '#type': select
-      '#title': Select
-      '#options':
-        one: One
-        two: Two
-        three: Three
-      '#description': '<b>Known Issues:</b><br /><a href="https://www.drupal.org/node/1426646">Issue #1426646: "-Select-" option is lost when webform elements uses ''#states''</a><br /><a href="https://www.drupal.org/node/1149078">Issue #1149078: States API doesn''t work with multiple select fields</a><br /><a href="https://www.drupal.org/node/2791741">Issue #2791741: FAPI states: fields aren''t hidden initially when depending on multi-value selection</a>'
-      '#default_value': one
-      '#states':
-        visible:
-          ':input[name="visible_trigger"]':
-            checked: true
-        required:
-          ':input[name="visible_trigger"]':
-            checked: true
-    visible_webform_select_other:
-      '#type': webform_select_other
-      '#title': 'Select other'
-      '#options':
-        one: One
-        two: Two
-        three: Three
-      '#default_value': one
-      '#states':
-        visible:
-          ':input[name="visible_trigger"]':
-            checked: true
-        required:
-          ':input[name="visible_trigger"]':
-            checked: true
-    visible_webform_signature:
-      '#type': webform_signature
-      '#title': Signature
-      '#states':
-        visible:
-          ':input[name="visible_trigger"]':
-            checked: true
-        required:
-          ':input[name="visible_trigger"]':
-            checked: true
-    visible_tableselect:
-      '#type': tableselect
-      '#title': 'Table select'
-      '#options':
-        one: One
-        two: Two
-        three: Three
-      '#default_value':
-        - one
-        - two
-        - three
-      '#states':
-        visible:
-          ':input[name="visible_trigger"]':
-            checked: true
-        required:
-          ':input[name="visible_trigger"]':
-            checked: true
-    visible_webform_tableselect_sort:
-      '#type': webform_tableselect_sort
-      '#title': 'Tableselect sort'
-      '#options':
-        one: One
-        two: Two
-        three: Three
-      '#default_value':
-        - one
-        - two
-        - three
-      '#states':
-        visible:
-          ':input[name="visible_trigger"]':
-            checked: true
-        required:
-          ':input[name="visible_trigger"]':
-            checked: true
-    visible_webform_table_sort:
-      '#type': webform_table_sort
-      '#title': 'Table sort'
-      '#options':
-        one: One
-        two: Two
-        three: Three
-      '#default_value':
-        - one
-        - two
-        - three
-      '#states':
-        visible:
-          ':input[name="visible_trigger"]':
-            checked: true
-        required:
-          ':input[name="visible_trigger"]':
-            checked: true
-    visible_tel:
-      '#type': tel
-      '#title': Telephone
-      '#international': true
-      '#default_value': '+1 212-333-4444'
-      '#states':
-        visible:
-          ':input[name="visible_trigger"]':
-            checked: true
-        required:
-          ':input[name="visible_trigger"]':
-            checked: true
-    visible_webform_telephone:
-      '#type': webform_telephone
-      '#title': 'Telephone advanced'
-      '#default_value':
-        type: Home
-        phone: '+1 212-333-4444'
-        ext: 0
-      '#states':
-        visible:
-          ':input[name="visible_trigger"]':
-            checked: true
-        required:
-          ':input[name="visible_trigger"]':
-            checked: true
-    visible_webform_term_checkboxes:
-      '#type': webform_term_checkboxes
-      '#title': 'Term checkboxes'
-      '#vocabulary': tags
-      '#default_value':
-        - Loremipsum
-        - Oratione
-        - Dixisset
-      '#states':
-        visible:
-          ':input[name="visible_trigger"]':
-            checked: true
-        required:
-          ':input[name="visible_trigger"]':
-            checked: true
-    visible_webform_term_select:
-      '#type': webform_term_select
-      '#title': 'Term select'
-      '#vocabulary': tags
-      '#default_value': Loremipsum
-      '#states':
-        visible:
-          ':input[name="visible_trigger"]':
-            checked: true
-        required:
-          ':input[name="visible_trigger"]':
-            checked: true
-    visible_webform_terms_of_service:
-      '#type': webform_terms_of_service
-      '#title': 'I agree to the {terms of service}.'
-      '#required': true
-      '#terms_type': slideout
-      '#terms_content': '<em>These are the terms of service.</em>'
-      '#default_value': true
-      '#states':
-        visible:
-          ':input[name="visible_trigger"]':
-            checked: true
-        required:
-          ':input[name="visible_trigger"]':
-            checked: true
-    visible_textarea:
-      '#type': textarea
-      '#title': Textarea
-      '#rows': 2
-      '#default_value': 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Negat esse eam, inquit, propter se expetendam. Primum Theophrasti, Strato, physicum se voluit; Id mihi magnum videtur. Itaque mihi non satis videmini considerare quod iter sit naturae quaeque progressio. Quare hoc videndum est, possitne nobis hoc ratio philosophorum dare. Est enim tanti philosophi tamque nobilis audacter sua decreta defendere.'
-      '#states':
-        visible:
-          ':input[name="visible_trigger"]':
-            checked: true
-        required:
-          ':input[name="visible_trigger"]':
-            checked: true
-    visible_textfield:
-      '#type': textfield
-      '#title': 'Text field'
-      '#default_value': Loremipsum
-      '#states':
-        visible:
-          ':input[name="visible_trigger"]':
-            checked: true
-        required:
-          ':input[name="visible_trigger"]':
-            checked: true
-    visible_text_format:
-      '#type': text_format
-      '#title': 'Text format'
-      '#description': '<b>Known Issues:</b><br /><a href="https://www.drupal.org/node/997826">Issue #997826: #states doesn''t work correctly with type text_format</a><br /><a href="https://www.drupal.org/node/2625128">Issue #2625128: Text format selection stays visible when using editor and a hidden webform state</a><br /><a href="https://www.drupal.org/node/1954968">Issue #1954968: Required CKEditor fields always fail HTML5 validation</a>'
-      '#default_value':
-        value: '<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Negat esse eam, inquit, propter se expetendam. Primum Theophrasti, Strato, physicum se voluit; Id mihi magnum videtur. Itaque mihi non satis videmini considerare quod iter sit naturae quaeque progressio. Quare hoc videndum est, possitne nobis hoc ratio philosophorum dare. Est enim tanti philosophi tamque nobilis audacter sua decreta defendere.</p>'
-      '#states':
-        visible:
-          ':input[name="visible_trigger"]':
-            checked: true
-        required:
-          ':input[name="visible_trigger"]':
-            checked: true
-    visible_webform_time:
-      '#type': webform_time
-      '#title': Time
-      '#description': '<b>Known Issues:</b><br /><a href="https://www.drupal.org/node/1838234">Issue #1838234: Add jQuery Timepicker for the Time element of the datetime field</a>'
-      '#default_value': '09:00'
-      '#states':
-        visible:
-          ':input[name="visible_trigger"]':
-            checked: true
-        required:
-          ':input[name="visible_trigger"]':
-            checked: true
-    visible_url:
-      '#type': url
-      '#title': URL
-      '#default_value': 'http://example.com'
-      '#states':
-        visible:
-          ':input[name="visible_trigger"]':
-            checked: true
-        required:
-          ':input[name="visible_trigger"]':
-            checked: true
-    visible_webform_video_file:
-      '#type': webform_video_file
-      '#title': 'Video file'
-      '#states':
-        visible:
-          ':input[name="visible_trigger"]':
-            checked: true
-        required:
-          ':input[name="visible_trigger"]':
-            checked: true
-  invisible:
-    '#type': details
-    '#title': 'Test State: Invisible (Hidden) and Empty'
-    invisible_trigger:
-      '#type': checkbox
-      '#title': 'Hide and empty elements'
-    invisible_container:
-      '#type': container
-      '#title': Container
-      '#states':
-        invisible:
-          ':input[name="invisible_trigger"]':
-            checked: true
-    invisible_details:
-      '#type': details
-      '#title': Details
-      '#description': '<b>Known Issues:</b><br /><a href="https://www.drupal.org/node/2348851">Issue #2348851: Regression: Allow HTML tags inside detail summary</a>'
-      '#states':
-        invisible:
-          ':input[name="invisible_trigger"]':
-            checked: true
-    invisible_fieldset:
-      '#type': fieldset
-      '#title': Fieldset
-      '#states':
-        invisible:
-          ':input[name="invisible_trigger"]':
-            checked: true
-    invisible_webform_section:
-      '#type': webform_section
-      '#title': Section
-      '#states':
-        invisible:
-          ':input[name="invisible_trigger"]':
-            checked: true
-    invisible_table:
-      '#type': table
-      '#title': Table
-      '#states':
-        invisible:
-          ':input[name="invisible_trigger"]':
-            checked: true
-    invisible_address:
-      '#type': address
-      '#title': 'Advanced address'
-      '#default_value':
-        given_name: John
-        family_name: Smith
-        organization: 'Google Inc.'
-        address_line1: '1098 Alta Ave'
-        postal_code: '94043'
-        locality: 'Mountain View'
-        administrative_area: CA
-        country_code: US
-        langcode: en
-      '#states':
-        invisible:
-          ':input[name="invisible_trigger"]':
-            checked: true
-    invisible_processed_text:
-      '#type': processed_text
-      '#title': 'Advanced HTML/Text'
-      '#states':
-        invisible:
-          ':input[name="invisible_trigger"]':
-            checked: true
-    invisible_webform_audio_file:
-      '#type': webform_audio_file
-      '#title': 'Audio file'
-      '#states':
-        invisible:
-          ':input[name="invisible_trigger"]':
-            checked: true
-    invisible_webform_autocomplete:
-      '#type': webform_autocomplete
-      '#title': Autocomplete
-      '#default_value': Loremipsum
-      '#states':
-        invisible:
-          ':input[name="invisible_trigger"]':
-            checked: true
-    invisible_webform_address:
-      '#type': webform_address
-      '#title': 'Basic address'
-      '#default_value':
-        address: '10 Main Street'
-        address_2: '10 Main Street'
-        city: Springfield
-        state_province: Alabama
-        postal_code: '11111'
-        country: Afghanistan
-      '#states':
-        invisible:
-          ':input[name="invisible_trigger"]':
-            checked: true
-    invisible_webform_markup:
-      '#type': webform_markup
-      '#title': 'Basic HTML'
-      '#description': '<b>Known Issues:</b><br /><a href="https://www.drupal.org/node/2700667">Issue #2700667: Notice: Undefined index: #type in drupal_process_states()</a>'
-      '#states':
-        invisible:
-          ':input[name="invisible_trigger"]':
-            checked: true
-    invisible_webform_buttons:
-      '#type': webform_buttons
-      '#title': Buttons
-      '#options':
-        one: One
-        two: Two
-        three: Three
-      '#default_value': one
-      '#states':
-        invisible:
-          ':input[name="invisible_trigger"]':
-            checked: true
-    invisible_webform_buttons_other:
-      '#type': webform_buttons_other
-      '#title': 'Buttons other'
-      '#options':
-        one: One
-        two: Two
-        three: Three
-      '#default_value': one
-      '#states':
-        invisible:
-          ':input[name="invisible_trigger"]':
-            checked: true
-    invisible_captcha:
-      '#type': captcha
-      '#title': CAPTCHA
-      '#captcha_admin_mode': true
-      '#captcha_type': image_captcha/Image
-      '#states':
-        invisible:
-          ':input[name="invisible_trigger"]':
-            checked: true
-    invisible_checkbox:
-      '#type': checkbox
-      '#title': Checkbox
-      '#default_value': true
-      '#states':
-        invisible:
-          ':input[name="invisible_trigger"]':
-            checked: true
-    invisible_checkboxes:
-      '#type': checkboxes
-      '#title': Checkboxes
-      '#options':
-        one: One
-        two: Two
-        three: Three
-      '#options_display': side_by_side
-      '#description': '<b>Known Issues:</b><br /><a href="https://www.drupal.org/node/994360">Issue #994360: #states cannot disable/enable radios and checkboxes</a><br /><a href="https://www.drupal.org/node/2836364">Issue #2836364: Wrapper attributes are not supported by composite elements, this includes radios, checkboxes, and buttons.</a>'
-      '#default_value':
-        - one
-        - two
-        - three
-      '#states':
-        invisible:
-          ':input[name="invisible_trigger"]':
-            checked: true
-    invisible_webform_checkboxes_other:
-      '#type': webform_checkboxes_other
-      '#title': 'Checkboxes other'
-      '#options':
-        one: One
-        two: Two
-        three: Three
-      '#options_display': side_by_side
-      '#default_value':
-        - one
-        - two
-        - three
-      '#states':
-        invisible:
-          ':input[name="invisible_trigger"]':
-            checked: true
-    invisible_webform_codemirror:
-      '#type': webform_codemirror
-      '#title': CodeMirror
-      '#mode': yaml
-      '#default_value': 'message: ''Hello World'''
-      '#states':
-        invisible:
-          ':input[name="invisible_trigger"]':
-            checked: true
-    invisible_color:
-      '#type': color
-      '#title': Color
-      '#default_value': '#ffffcc'
-      '#states':
-        invisible:
-          ':input[name="invisible_trigger"]':
-            checked: true
-    invisible_webform_computed_token:
-      '#type': webform_computed_token
-      '#title': 'Computed token'
-      '#states':
-        invisible:
-          ':input[name="invisible_trigger"]':
-            checked: true
-      '#template': 'This is a Computed token value.'
-    invisible_webform_computed_twig:
-      '#type': webform_computed_twig
-      '#title': 'Computed Twig'
-      '#states':
-        invisible:
-          ':input[name="invisible_trigger"]':
-            checked: true
-      '#template': 'This is a Computed Twig value.'
-    invisible_webform_contact:
-      '#type': webform_contact
-      '#title': Contact
-      '#default_value':
-        name: Loremipsum
-        company: Loremipsum
-        email: example@example.com
-        phone: 123-456-7890
-        address: '10 Main Street'
-        address_2: '10 Main Street'
-        city: Springfield
-        state_province: Alabama
-        postal_code: '11111'
-        country: Afghanistan
-      '#states':
-        invisible:
-          ':input[name="invisible_trigger"]':
-            checked: true
-    invisible_webform_custom_composite:
-      '#type': webform_custom_composite
-      '#title': 'Custom composite'
-      '#element':
-        name:
-          '#type': textfield
-          '#title': Name
-          '#title_display': invisible
-        gender:
-          '#type': select
-          '#title': Gender
-          '#title_display': invisible
-          '#options':
-            Male: Male
-            Female: Female
-      '#default_value':
-        - name: Loremipsum
-          gender: Male
-        - name: Loremipsum
-          gender: Male
-        - name: Loremipsum
-          gender: Male
-      '#states':
-        invisible:
-          ':input[name="invisible_trigger"]':
-            checked: true
-    invisible_date:
-      '#type': date
-      '#title': Date
-      '#default_value': '2029-09-22T22:31:32-0400'
-      '#states':
-        invisible:
-          ':input[name="invisible_trigger"]':
-            checked: true
-    invisible_datetime:
-      '#type': datetime
-      '#title': Date/time
-      '#description': '<b>Known Issues:</b><br /><a href="https://www.drupal.org/node/2419131">Issue #2419131: #states attribute does not work on #type datetime</a>'
-      '#default_value': '2012-11-08T22:22:22-0500'
-      '#states':
-        invisible:
-          ':input[name="invisible_trigger"]':
-            checked: true
-    invisible_datelist:
-      '#type': datelist
-      '#title': 'Date list'
-      '#default_value': '2030-03-15T14:17:44-0400'
-      '#states':
-        invisible:
-          ':input[name="invisible_trigger"]':
-            checked: true
-    invisible_webform_document_file:
-      '#type': webform_document_file
-      '#title': 'Document file'
-      '#states':
-        invisible:
-          ':input[name="invisible_trigger"]':
-            checked: true
-    invisible_email:
-      '#type': email
-      '#title': Email
-      '#default_value': example@example.com
-      '#states':
-        invisible:
-          ':input[name="invisible_trigger"]':
-            checked: true
-    invisible_webform_email_confirm:
-      '#type': webform_email_confirm
-      '#title': 'Email confirm'
-      '#default_value': example@example.com
-      '#states':
-        invisible:
-          ':input[name="invisible_trigger"]':
-            checked: true
-    invisible_webform_email_multiple:
-      '#type': webform_email_multiple
-      '#title': 'Email multiple'
-      '#default_value': 'example@example.com, test@test.com, random@random.com'
-      '#states':
-        invisible:
-          ':input[name="invisible_trigger"]':
-            checked: true
-    invisible_entity_autocomplete:
-      '#type': entity_autocomplete
-      '#title': 'Entity autocomplete'
-      '#target_type': user
-      '#selection_handler': 'default:user'
-      '#selection_settings':
-        include_anonymous: true
-      '#description': '<b>Known Issues:</b><br /><a href="https://www.drupal.org/node/2826451">Issue #2826451: TermSelection returning HTML characters in select list</a>'
-      '#default_value': 1
-      '#states':
-        invisible:
-          ':input[name="invisible_trigger"]':
-            checked: true
-    invisible_webform_entity_checkboxes:
-      '#type': webform_entity_checkboxes
-      '#title': 'Entity checkboxes'
-      '#options_display': side_by_side
-      '#target_type': user
-      '#selection_handler': 'default:user'
-      '#selection_settings':
-        include_anonymous: true
-      '#options':
-        1: Administrator
-        0: Anonymous
-      '#default_value':
-        - 1
-      '#states':
-        invisible:
-          ':input[name="invisible_trigger"]':
-            checked: true
-    invisible_webform_entity_radios:
-      '#type': webform_entity_radios
-      '#title': 'Entity radios'
-      '#options_display': side_by_side
-      '#target_type': user
-      '#selection_handler': 'default:user'
-      '#selection_settings':
-        include_anonymous: true
-      '#options':
-        1: Administrator
-        0: Anonymous
-      '#default_value': 1
-      '#states':
-        invisible:
-          ':input[name="invisible_trigger"]':
-            checked: true
-    invisible_webform_entity_select:
-      '#type': webform_entity_select
-      '#title': 'Entity select'
-      '#target_type': user
-      '#selection_handler': 'default:user'
-      '#selection_settings':
-        include_anonymous: true
-      '#options':
-        1: Administrator
-        0: Anonymous
-      '#default_value': 1
-      '#states':
-        invisible:
-          ':input[name="invisible_trigger"]':
-            checked: true
-    invisible_managed_file:
-      '#type': managed_file
-      '#title': File
-      '#description': '<b>Known Issues:</b><br /><a href="https://www.drupal.org/node/2705471">Issue #2705471: Webform states managed file fields</a><br /><a href="https://www.drupal.org/node/2113931">Issue #2113931: File Field design update</a><br /><a href="https://www.drupal.org/node/2346893">Issue #2346893: Duplicate Ajax wrapper around a file field</a><br /><a href="https://www.drupal.org/node/2482783">Issue #2482783: File upload errors not set or shown correctly</a>'
-      '#states':
-        invisible:
-          ':input[name="invisible_trigger"]':
-            checked: true
-    invisible_webform_horizontal_rule:
-      '#type': webform_horizontal_rule
-      '#attributes':
-        class:
-          - webform-horizontal-rule--dotted
-          - webform-horizontal-rule--thick
-      '#states':
-        invisible:
-          ':input[name="invisible_trigger"]':
-            checked: true
-    invisible_webform_image_file:
-      '#type': webform_image_file
-      '#title': 'Image file'
-      '#states':
-        invisible:
-          ':input[name="invisible_trigger"]':
-            checked: true
-    invisible_webform_image_select:
-      '#type': webform_image_select
-      '#title': 'Image select'
-      '#show_label': true
-      '#images':
-        bear_1:
-          text: 'Bear 1'
-          src: 'https://www.placebear.com/80/100'
-        bear_2:
-          text: 'Bear 2'
-          src: 'https://www.placebear.com/100/100'
-        bear_3:
-          text: 'Bear 3'
-          src: 'https://www.placebear.com/120/100'
-      '#default_value': Loremipsum
-      '#states':
-        invisible:
-          ':input[name="invisible_trigger"]':
-            checked: true
-    invisible_item:
-      '#type': item
-      '#title': Item
-      '#markup': '{markup}'
-      '#field_prefix': '{field_prefix}'
-      '#field_suffix': '{field_suffix}'
-      '#description': '<b>Known Issues:</b><br /><a href="https://www.drupal.org/node/783438">Issue #783438: #states doesn''t work for #type item</a>'
-      '#states':
-        invisible:
-          ':input[name="invisible_trigger"]':
-            checked: true
-    invisible_label:
-      '#type': label
-      '#title': Label
-      '#states':
-        invisible:
-          ':input[name="invisible_trigger"]':
-            checked: true
-    invisible_language_select:
-      '#type': language_select
-      '#title': 'Language select'
-      '#default_value': en
-      '#states':
-        invisible:
-          ':input[name="invisible_trigger"]':
-            checked: true
-    invisible_webform_likert:
-      '#type': webform_likert
-      '#title': Likert
-      '#questions':
-        q1: 'Please answer question 1?'
-        q2: 'How about now answering question 2?'
-        q3: 'Finally, here is question 3?'
-      '#answers':
-        1: '1'
-        2: '2'
-        3: '3'
-      '#default_value':
-        q1: 1
-        q2: 1
-        q3: 1
-      '#states':
-        invisible:
-          ':input[name="invisible_trigger"]':
-            checked: true
-    invisible_webform_link:
-      '#type': webform_link
-      '#title': Link
-      '#default_value':
-        title: Loremipsum
-        url: 'http://example.com'
-      '#states':
-        invisible:
-          ':input[name="invisible_trigger"]':
-            checked: true
-    invisible_webform_location_places:
-      '#type': webform_location_places
-      '#title': Location
-      '#map': true
-      '#geolocation': true
-      '#format': map
-      '#default_value':
-        value: 'The White House, 1600 Pennsylvania Ave NW, Washington, DC 20500, USA'
-      '#states':
-        invisible:
-          ':input[name="invisible_trigger"]':
-            checked: true
-    invisible_machine_name:
-      '#type': machine_name
-      '#title': 'Machine name'
-      '#default_value': loremipsum
-      '#states':
-        invisible:
-          ':input[name="invisible_trigger"]':
-            checked: true
-    invisible_webform_mapping:
-      '#type': webform_mapping
-      '#title': Mapping
-      '#source':
-        one: One
-        two: Two
-        three: Three
-      '#destination':
-        four: Four
-        five: Five
-        six: Six
-      '#default_value':
-        one: four
-        two: four
-        three: four
-      '#states':
-        invisible:
-          ':input[name="invisible_trigger"]':
-            checked: true
-    invisible_webform_message:
-      '#type': webform_message
-      '#title': Message
-      '#message_type': warning
-      '#message_message': 'This is a <strong>warning</strong> message.'
-      '#description': '<b>Known Issues:</b><br /><a href="https://www.drupal.org/node/77245">Issue #77245: A place for JavaScript status messages</a>'
-      '#states':
-        invisible:
-          ':input[name="invisible_trigger"]':
-            checked: true
-    invisible_webform_name:
-      '#type': webform_name
-      '#title': Name
-      '#default_value':
-        title: Miss
-        first: Loremipsum
-        middle: Loremipsum
-        last: Loremipsum
-        suffix: Loremipsum
-        degree: Loremipsum
-      '#states':
-        invisible:
-          ':input[name="invisible_trigger"]':
-            checked: true
-    invisible_number:
-      '#type': number
-      '#title': Number
-      '#min': 0
-      '#max': 10
-      '#step': 1
-      '#states':
-        invisible:
-          ':input[name="invisible_trigger"]':
-            checked: true
-    invisible_password:
-      '#type': password
-      '#title': Password
-      '#default_value': Loremipsum
-      '#states':
-        invisible:
-          ':input[name="invisible_trigger"]':
-            checked: true
-    invisible_password_confirm:
-      '#type': password_confirm
-      '#title': 'Password confirm'
-      '#description': '<b>Known Issues:</b><br /><a href="https://www.drupal.org/node/1427838">Issue #1427838: password and password_confirm children do not pick up #states or #attributes</a>'
-      '#default_value': Loremipsum
-      '#states':
-        invisible:
-          ':input[name="invisible_trigger"]':
-            checked: true
-    invisible_radios:
-      '#type': radios
-      '#title': Radios
-      '#options':
-        one: One
-        two: Two
-        three: Three
-      '#options_display': side_by_side
-      '#description': '<b>Known Issues:</b><br /><a href="https://www.drupal.org/node/2731991">Issue #2731991: Setting required on radios marks all options required</a><br /><a href="https://www.drupal.org/node/994360">Issue #994360: #states cannot disable/enable radios and checkboxes</a><br /><a href="https://www.drupal.org/node/2836364">Issue #2836364: Wrapper attributes are not supported by composite elements, this includes radios, checkboxes, and buttons.</a>'
-      '#default_value': one
-      '#states':
-        invisible:
-          ':input[name="invisible_trigger"]':
-            checked: true
-    invisible_webform_radios_other:
-      '#type': webform_radios_other
-      '#title': 'Radios other'
-      '#options':
-        one: One
-        two: Two
-        three: Three
-      '#options_display': side_by_side
-      '#default_value': one
-      '#states':
-        invisible:
-          ':input[name="invisible_trigger"]':
-            checked: true
-    invisible_range:
-      '#type': range
-      '#title': Range
-      '#min': 0
-      '#max': 100
-      '#step': 1
-      '#output': below
-      '#output__field_prefix': $
-      '#output__field_suffix': '.00'
-      '#states':
-        invisible:
-          ':input[name="invisible_trigger"]':
-            checked: true
-    invisible_webform_rating:
-      '#type': webform_rating
-      '#title': Rating
-      '#states':
-        invisible:
-          ':input[name="invisible_trigger"]':
-            checked: true
-    invisible_search:
-      '#type': search
-      '#title': Search
-      '#default_value': Loremipsum
-      '#states':
-        invisible:
-          ':input[name="invisible_trigger"]':
-            checked: true
-    invisible_select:
-      '#type': select
-      '#title': Select
-      '#options':
-        one: One
-        two: Two
-        three: Three
-      '#description': '<b>Known Issues:</b><br /><a href="https://www.drupal.org/node/1426646">Issue #1426646: "-Select-" option is lost when webform elements uses ''#states''</a><br /><a href="https://www.drupal.org/node/1149078">Issue #1149078: States API doesn''t work with multiple select fields</a><br /><a href="https://www.drupal.org/node/2791741">Issue #2791741: FAPI states: fields aren''t hidden initially when depending on multi-value selection</a>'
-      '#default_value': one
-      '#states':
-        invisible:
-          ':input[name="invisible_trigger"]':
-            checked: true
-    invisible_webform_select_other:
-      '#type': webform_select_other
-      '#title': 'Select other'
-      '#options':
-        one: One
-        two: Two
-        three: Three
-      '#default_value': one
-      '#states':
-        invisible:
-          ':input[name="invisible_trigger"]':
-            checked: true
-    invisible_webform_signature:
-      '#type': webform_signature
-      '#title': Signature
-      '#states':
-        invisible:
-          ':input[name="invisible_trigger"]':
-            checked: true
-    invisible_tableselect:
-      '#type': tableselect
-      '#title': 'Table select'
-      '#options':
-        one: One
-        two: Two
-        three: Three
-      '#default_value':
-        - one
-        - two
-        - three
-      '#states':
-        invisible:
-          ':input[name="invisible_trigger"]':
-            checked: true
-    invisible_webform_tableselect_sort:
-      '#type': webform_tableselect_sort
-      '#title': 'Tableselect sort'
-      '#options':
-        one: One
-        two: Two
-        three: Three
-      '#default_value':
-        - one
-        - two
-        - three
-      '#states':
-        invisible:
-          ':input[name="invisible_trigger"]':
-            checked: true
-    invisible_webform_table_sort:
-      '#type': webform_table_sort
-      '#title': 'Table sort'
-      '#options':
-        one: One
-        two: Two
-        three: Three
-      '#default_value':
-        - one
-        - two
-        - three
-      '#states':
-        invisible:
-          ':input[name="invisible_trigger"]':
-            checked: true
-    invisible_tel:
-      '#type': tel
-      '#title': Telephone
-      '#international': true
-      '#default_value': '+1 212-333-4444'
-      '#states':
-        invisible:
-          ':input[name="invisible_trigger"]':
-            checked: true
-    invisible_webform_telephone:
-      '#type': webform_telephone
-      '#title': 'Telephone advanced'
-      '#default_value':
-        type: Home
-        phone: '+1 212-333-4444'
-        ext: 0
-      '#states':
-        invisible:
-          ':input[name="invisible_trigger"]':
-            checked: true
-    invisible_webform_term_checkboxes:
-      '#type': webform_term_checkboxes
-      '#title': 'Term checkboxes'
-      '#vocabulary': tags
-      '#default_value':
-        - Loremipsum
-        - Oratione
-        - Dixisset
-      '#states':
-        invisible:
-          ':input[name="invisible_trigger"]':
-            checked: true
-    invisible_webform_term_select:
-      '#type': webform_term_select
-      '#title': 'Term select'
-      '#vocabulary': tags
-      '#default_value': Loremipsum
-      '#states':
-        invisible:
-          ':input[name="invisible_trigger"]':
-            checked: true
-    invisible_webform_terms_of_service:
-      '#type': webform_terms_of_service
-      '#title': 'I agree to the {terms of service}.'
-      '#required': true
-      '#terms_type': slideout
-      '#terms_content': '<em>These are the terms of service.</em>'
-      '#default_value': true
-      '#states':
-        invisible:
-          ':input[name="invisible_trigger"]':
-            checked: true
-    invisible_textarea:
-      '#type': textarea
-      '#title': Textarea
-      '#rows': 2
-      '#default_value': 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Negat esse eam, inquit, propter se expetendam. Primum Theophrasti, Strato, physicum se voluit; Id mihi magnum videtur. Itaque mihi non satis videmini considerare quod iter sit naturae quaeque progressio. Quare hoc videndum est, possitne nobis hoc ratio philosophorum dare. Est enim tanti philosophi tamque nobilis audacter sua decreta defendere.'
-      '#states':
-        invisible:
-          ':input[name="invisible_trigger"]':
-            checked: true
-    invisible_textfield:
-      '#type': textfield
-      '#title': 'Text field'
-      '#default_value': Loremipsum
-      '#states':
-        invisible:
-          ':input[name="invisible_trigger"]':
-            checked: true
-    invisible_text_format:
-      '#type': text_format
-      '#title': 'Text format'
-      '#description': '<b>Known Issues:</b><br /><a href="https://www.drupal.org/node/997826">Issue #997826: #states doesn''t work correctly with type text_format</a><br /><a href="https://www.drupal.org/node/2625128">Issue #2625128: Text format selection stays visible when using editor and a hidden webform state</a><br /><a href="https://www.drupal.org/node/1954968">Issue #1954968: Required CKEditor fields always fail HTML5 validation</a>'
-      '#default_value':
-        value: '<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Negat esse eam, inquit, propter se expetendam. Primum Theophrasti, Strato, physicum se voluit; Id mihi magnum videtur. Itaque mihi non satis videmini considerare quod iter sit naturae quaeque progressio. Quare hoc videndum est, possitne nobis hoc ratio philosophorum dare. Est enim tanti philosophi tamque nobilis audacter sua decreta defendere.</p>'
-      '#states':
-        invisible:
-          ':input[name="invisible_trigger"]':
-            checked: true
-    invisible_webform_time:
-      '#type': webform_time
-      '#title': Time
-      '#description': '<b>Known Issues:</b><br /><a href="https://www.drupal.org/node/1838234">Issue #1838234: Add jQuery Timepicker for the Time element of the datetime field</a>'
-      '#default_value': '09:00'
-      '#states':
-        invisible:
-          ':input[name="invisible_trigger"]':
-            checked: true
-    invisible_url:
-      '#type': url
-      '#title': URL
-      '#default_value': 'http://example.com'
-      '#states':
-        invisible:
-          ':input[name="invisible_trigger"]':
-            checked: true
-    invisible_webform_video_file:
-      '#type': webform_video_file
-      '#title': 'Video file'
-      '#states':
-        invisible:
-          ':input[name="invisible_trigger"]':
-            checked: true
-  disabled:
-    '#type': details
-    '#title': 'Test State: Disabled'
-    disabled_trigger:
-      '#type': checkbox
-      '#title': 'Disable elements'
-    disabled_address:
-      '#type': address
-      '#title': 'Advanced address'
-      '#default_value':
-        given_name: John
-        family_name: Smith
-        organization: 'Google Inc.'
-        address_line1: '1098 Alta Ave'
-        postal_code: '94043'
-        locality: 'Mountain View'
-        administrative_area: CA
-        country_code: US
-        langcode: en
-      '#states':
-        disabled:
-          ':input[name="disabled_trigger"]':
-            checked: true
-    disabled_processed_text:
-      '#type': processed_text
-      '#title': 'Advanced HTML/Text'
-      '#states':
-        disabled:
-          ':input[name="disabled_trigger"]':
-            checked: true
-    disabled_webform_audio_file:
-      '#type': webform_audio_file
-      '#title': 'Audio file'
-      '#states':
-        disabled:
-          ':input[name="disabled_trigger"]':
-            checked: true
-    disabled_webform_autocomplete:
-      '#type': webform_autocomplete
-      '#title': Autocomplete
-      '#default_value': Loremipsum
-      '#states':
-        disabled:
-          ':input[name="disabled_trigger"]':
-            checked: true
-    disabled_webform_address:
-      '#type': webform_address
-      '#title': 'Basic address'
-      '#default_value':
-        address: '10 Main Street'
-        address_2: '10 Main Street'
-        city: Springfield
-        state_province: Alabama
-        postal_code: '11111'
-        country: Afghanistan
-      '#states':
-        disabled:
-          ':input[name="disabled_trigger"]':
-            checked: true
-    disabled_webform_markup:
-      '#type': webform_markup
-      '#title': 'Basic HTML'
-      '#description': '<b>Known Issues:</b><br /><a href="https://www.drupal.org/node/2700667">Issue #2700667: Notice: Undefined index: #type in drupal_process_states()</a>'
-      '#states':
-        disabled:
-          ':input[name="disabled_trigger"]':
-            checked: true
-    disabled_webform_buttons:
-      '#type': webform_buttons
-      '#title': Buttons
-      '#options':
-        one: One
-        two: Two
-        three: Three
-      '#default_value': one
-      '#states':
-        disabled:
-          ':input[name="disabled_trigger"]':
-            checked: true
-    disabled_webform_buttons_other:
-      '#type': webform_buttons_other
-      '#title': 'Buttons other'
-      '#options':
-        one: One
-        two: Two
-        three: Three
-      '#default_value': one
-      '#states':
-        disabled:
-          ':input[name="disabled_trigger"]':
-            checked: true
-    disabled_captcha:
-      '#type': captcha
-      '#title': CAPTCHA
-      '#captcha_admin_mode': true
-      '#captcha_type': image_captcha/Image
-      '#states':
-        disabled:
-          ':input[name="disabled_trigger"]':
-            checked: true
-    disabled_checkbox:
-      '#type': checkbox
-      '#title': Checkbox
-      '#default_value': true
-      '#states':
-        disabled:
-          ':input[name="disabled_trigger"]':
-            checked: true
-    disabled_checkboxes:
-      '#type': checkboxes
-      '#title': Checkboxes
-      '#options':
-        one: One
-        two: Two
-        three: Three
-      '#options_display': side_by_side
-      '#description': '<b>Known Issues:</b><br /><a href="https://www.drupal.org/node/994360">Issue #994360: #states cannot disable/enable radios and checkboxes</a><br /><a href="https://www.drupal.org/node/2836364">Issue #2836364: Wrapper attributes are not supported by composite elements, this includes radios, checkboxes, and buttons.</a>'
-      '#default_value':
-        - one
-        - two
-        - three
-      '#states':
-        disabled:
-          ':input[name="disabled_trigger"]':
-            checked: true
-    disabled_webform_checkboxes_other:
-      '#type': webform_checkboxes_other
-      '#title': 'Checkboxes other'
-      '#options':
-        one: One
-        two: Two
-        three: Three
-      '#options_display': side_by_side
-      '#default_value':
-        - one
-        - two
-        - three
-      '#states':
-        disabled:
-          ':input[name="disabled_trigger"]':
-            checked: true
-    disabled_webform_codemirror:
-      '#type': webform_codemirror
-      '#title': CodeMirror
-      '#mode': yaml
-      '#default_value': 'message: ''Hello World'''
-      '#states':
-        disabled:
-          ':input[name="disabled_trigger"]':
-            checked: true
-    disabled_color:
-      '#type': color
-      '#title': Color
-      '#default_value': '#ffffcc'
-      '#states':
-        disabled:
-          ':input[name="disabled_trigger"]':
-            checked: true
-    disabled_webform_computed_token:
-      '#type': webform_computed_token
-      '#title': 'Computed token'
-      '#states':
-        disabled:
-          ':input[name="disabled_trigger"]':
-            checked: true
-      '#template': 'This is a Computed token value.'
-    disabled_webform_computed_twig:
-      '#type': webform_computed_twig
-      '#title': 'Computed Twig'
-      '#states':
-        disabled:
-          ':input[name="disabled_trigger"]':
-            checked: true
-      '#template': 'This is a Computed Twig value.'
-    disabled_webform_contact:
-      '#type': webform_contact
-      '#title': Contact
-      '#default_value':
-        name: Loremipsum
-        company: Loremipsum
-        email: example@example.com
-        phone: 123-456-7890
-        address: '10 Main Street'
-        address_2: '10 Main Street'
-        city: Springfield
-        state_province: Alabama
-        postal_code: '11111'
-        country: Afghanistan
-      '#states':
-        disabled:
-          ':input[name="disabled_trigger"]':
-            checked: true
-    disabled_webform_custom_composite:
-      '#type': webform_custom_composite
-      '#title': 'Custom composite'
-      '#element':
-        name:
-          '#type': textfield
-          '#title': Name
-          '#title_display': invisible
-        gender:
-          '#type': select
-          '#title': Gender
-          '#title_display': invisible
-          '#options':
-            Male: Male
-            Female: Female
-      '#default_value':
-        - name: Loremipsum
-          gender: Male
-        - name: Loremipsum
-          gender: Male
-        - name: Loremipsum
-          gender: Male
-      '#states':
-        disabled:
-          ':input[name="disabled_trigger"]':
-            checked: true
-    disabled_date:
-      '#type': date
-      '#title': Date
-      '#default_value': '2015-04-28T17:21:41-0400'
-      '#states':
-        disabled:
-          ':input[name="disabled_trigger"]':
-            checked: true
-    disabled_datetime:
-      '#type': datetime
-      '#title': Date/time
-      '#description': '<b>Known Issues:</b><br /><a href="https://www.drupal.org/node/2419131">Issue #2419131: #states attribute does not work on #type datetime</a>'
-      '#default_value': '2009-06-05T06:32:08-0400'
-      '#states':
-        disabled:
-          ':input[name="disabled_trigger"]':
-            checked: true
-    disabled_datelist:
-      '#type': datelist
-      '#title': 'Date list'
-      '#default_value': '2012-04-05T08:52:12-0400'
-      '#states':
-        disabled:
-          ':input[name="disabled_trigger"]':
-            checked: true
-    disabled_webform_document_file:
-      '#type': webform_document_file
-      '#title': 'Document file'
-      '#states':
-        disabled:
-          ':input[name="disabled_trigger"]':
-            checked: true
-    disabled_email:
-      '#type': email
-      '#title': Email
-      '#default_value': example@example.com
-      '#states':
-        disabled:
-          ':input[name="disabled_trigger"]':
-            checked: true
-    disabled_webform_email_confirm:
-      '#type': webform_email_confirm
-      '#title': 'Email confirm'
-      '#default_value': example@example.com
-      '#states':
-        disabled:
-          ':input[name="disabled_trigger"]':
-            checked: true
-    disabled_webform_email_multiple:
-      '#type': webform_email_multiple
-      '#title': 'Email multiple'
-      '#default_value': 'example@example.com, test@test.com, random@random.com'
-      '#states':
-        disabled:
-          ':input[name="disabled_trigger"]':
-            checked: true
-    disabled_entity_autocomplete:
-      '#type': entity_autocomplete
-      '#title': 'Entity autocomplete'
-      '#target_type': user
-      '#selection_handler': 'default:user'
-      '#selection_settings':
-        include_anonymous: true
-      '#description': '<b>Known Issues:</b><br /><a href="https://www.drupal.org/node/2826451">Issue #2826451: TermSelection returning HTML characters in select list</a>'
-      '#default_value': 1
-      '#states':
-        disabled:
-          ':input[name="disabled_trigger"]':
-            checked: true
-    disabled_webform_entity_checkboxes:
-      '#type': webform_entity_checkboxes
-      '#title': 'Entity checkboxes'
-      '#options_display': side_by_side
-      '#target_type': user
-      '#selection_handler': 'default:user'
-      '#selection_settings':
-        include_anonymous: true
-      '#options':
-        1: Administrator
-        0: Anonymous
-      '#default_value':
-        - 1
-      '#states':
-        disabled:
-          ':input[name="disabled_trigger"]':
-            checked: true
-    disabled_webform_entity_radios:
-      '#type': webform_entity_radios
-      '#title': 'Entity radios'
-      '#options_display': side_by_side
-      '#target_type': user
-      '#selection_handler': 'default:user'
-      '#selection_settings':
-        include_anonymous: true
-      '#options':
-        1: Administrator
-        0: Anonymous
-      '#default_value': 1
-      '#states':
-        disabled:
-          ':input[name="disabled_trigger"]':
-            checked: true
-    disabled_webform_entity_select:
-      '#type': webform_entity_select
-      '#title': 'Entity select'
-      '#target_type': user
-      '#selection_handler': 'default:user'
-      '#selection_settings':
-        include_anonymous: true
-      '#options':
-        1: Administrator
-        0: Anonymous
-      '#default_value': 1
-      '#states':
-        disabled:
-          ':input[name="disabled_trigger"]':
-            checked: true
-    disabled_managed_file:
-      '#type': managed_file
-      '#title': File
-      '#description': '<b>Known Issues:</b><br /><a href="https://www.drupal.org/node/2705471">Issue #2705471: Webform states managed file fields</a><br /><a href="https://www.drupal.org/node/2113931">Issue #2113931: File Field design update</a><br /><a href="https://www.drupal.org/node/2346893">Issue #2346893: Duplicate Ajax wrapper around a file field</a><br /><a href="https://www.drupal.org/node/2482783">Issue #2482783: File upload errors not set or shown correctly</a>'
-      '#states':
-        disabled:
-          ':input[name="disabled_trigger"]':
-            checked: true
-    disabled_webform_horizontal_rule:
-      '#type': webform_horizontal_rule
-      '#attributes':
-        class:
-          - webform-horizontal-rule--dotted
-          - webform-horizontal-rule--thick
-      '#states':
-        disabled:
-          ':input[name="disabled_trigger"]':
-            checked: true
-    disabled_webform_image_file:
-      '#type': webform_image_file
-      '#title': 'Image file'
-      '#states':
-        disabled:
-          ':input[name="disabled_trigger"]':
-            checked: true
-    disabled_webform_image_select:
-      '#type': webform_image_select
-      '#title': 'Image select'
-      '#show_label': true
-      '#images':
-        bear_1:
-          text: 'Bear 1'
-          src: 'https://www.placebear.com/80/100'
-        bear_2:
-          text: 'Bear 2'
-          src: 'https://www.placebear.com/100/100'
-        bear_3:
-          text: 'Bear 3'
-          src: 'https://www.placebear.com/120/100'
-      '#default_value': Loremipsum
-      '#states':
-        disabled:
-          ':input[name="disabled_trigger"]':
-            checked: true
-    disabled_item:
-      '#type': item
-      '#title': Item
-      '#markup': '{markup}'
-      '#field_prefix': '{field_prefix}'
-      '#field_suffix': '{field_suffix}'
-      '#description': '<b>Known Issues:</b><br /><a href="https://www.drupal.org/node/783438">Issue #783438: #states doesn''t work for #type item</a>'
-      '#states':
-        disabled:
-          ':input[name="disabled_trigger"]':
-            checked: true
-    disabled_label:
-      '#type': label
-      '#title': Label
-      '#states':
-        disabled:
-          ':input[name="disabled_trigger"]':
-            checked: true
-    disabled_language_select:
-      '#type': language_select
-      '#title': 'Language select'
-      '#default_value': en
-      '#states':
-        disabled:
-          ':input[name="disabled_trigger"]':
-            checked: true
-    disabled_webform_likert:
-      '#type': webform_likert
-      '#title': Likert
-      '#questions':
-        q1: 'Please answer question 1?'
-        q2: 'How about now answering question 2?'
-        q3: 'Finally, here is question 3?'
-      '#answers':
-        1: '1'
-        2: '2'
-        3: '3'
-      '#default_value':
-        q1: 1
-        q2: 1
-        q3: 1
-      '#states':
-        disabled:
-          ':input[name="disabled_trigger"]':
-            checked: true
-    disabled_webform_link:
-      '#type': webform_link
-      '#title': Link
-      '#default_value':
-        title: Loremipsum
-        url: 'http://example.com'
-      '#states':
-        disabled:
-          ':input[name="disabled_trigger"]':
-            checked: true
-    disabled_webform_location_places:
-      '#type': webform_location_places
-      '#title': Location
-      '#map': true
-      '#geolocation': true
-      '#format': map
-      '#default_value':
-        value: 'The White House, 1600 Pennsylvania Ave NW, Washington, DC 20500, USA'
-      '#states':
-        disabled:
-          ':input[name="disabled_trigger"]':
-            checked: true
-    disabled_machine_name:
-      '#type': machine_name
-      '#title': 'Machine name'
-      '#default_value': loremipsum
-      '#states':
-        disabled:
-          ':input[name="disabled_trigger"]':
-            checked: true
-    disabled_webform_mapping:
-      '#type': webform_mapping
-      '#title': Mapping
-      '#source':
-        one: One
-        two: Two
-        three: Three
-      '#destination':
-        four: Four
-        five: Five
-        six: Six
-      '#default_value':
-        one: four
-        two: four
-        three: four
-      '#states':
-        disabled:
-          ':input[name="disabled_trigger"]':
-            checked: true
-    disabled_webform_message:
-      '#type': webform_message
-      '#title': Message
-      '#message_type': warning
-      '#message_message': 'This is a <strong>warning</strong> message.'
-      '#description': '<b>Known Issues:</b><br /><a href="https://www.drupal.org/node/77245">Issue #77245: A place for JavaScript status messages</a>'
-      '#states':
-        disabled:
-          ':input[name="disabled_trigger"]':
-            checked: true
-    disabled_webform_name:
-      '#type': webform_name
-      '#title': Name
-      '#default_value':
-        title: Miss
-        first: Loremipsum
-        middle: Loremipsum
-        last: Loremipsum
-        suffix: Loremipsum
-        degree: Loremipsum
-      '#states':
-        disabled:
-          ':input[name="disabled_trigger"]':
-            checked: true
-    disabled_number:
-      '#type': number
-      '#title': Number
-      '#min': 0
-      '#max': 10
-      '#step': 1
-      '#states':
-        disabled:
-          ':input[name="disabled_trigger"]':
-            checked: true
-    disabled_password:
-      '#type': password
-      '#title': Password
-      '#default_value': Loremipsum
-      '#states':
-        disabled:
-          ':input[name="disabled_trigger"]':
-            checked: true
-    disabled_password_confirm:
-      '#type': password_confirm
-      '#title': 'Password confirm'
-      '#description': '<b>Known Issues:</b><br /><a href="https://www.drupal.org/node/1427838">Issue #1427838: password and password_confirm children do not pick up #states or #attributes</a>'
-      '#default_value': Loremipsum
-      '#states':
-        disabled:
-          ':input[name="disabled_trigger"]':
-            checked: true
-    disabled_radios:
-      '#type': radios
-      '#title': Radios
-      '#options':
-        one: One
-        two: Two
-        three: Three
-      '#options_display': side_by_side
-      '#description': '<b>Known Issues:</b><br /><a href="https://www.drupal.org/node/2731991">Issue #2731991: Setting required on radios marks all options required</a><br /><a href="https://www.drupal.org/node/994360">Issue #994360: #states cannot disable/enable radios and checkboxes</a><br /><a href="https://www.drupal.org/node/2836364">Issue #2836364: Wrapper attributes are not supported by composite elements, this includes radios, checkboxes, and buttons.</a>'
-      '#default_value': one
-      '#states':
-        disabled:
-          ':input[name="disabled_trigger"]':
-            checked: true
-    disabled_webform_radios_other:
-      '#type': webform_radios_other
-      '#title': 'Radios other'
-      '#options':
-        one: One
-        two: Two
-        three: Three
-      '#options_display': side_by_side
-      '#default_value': one
-      '#states':
-        disabled:
-          ':input[name="disabled_trigger"]':
-            checked: true
-    disabled_range:
-      '#type': range
-      '#title': Range
-      '#min': 0
-      '#max': 100
-      '#step': 1
-      '#output': below
-      '#output__field_prefix': $
-      '#output__field_suffix': '.00'
-      '#states':
-        disabled:
-          ':input[name="disabled_trigger"]':
-            checked: true
-    disabled_webform_rating:
-      '#type': webform_rating
-      '#title': Rating
-      '#states':
-        disabled:
-          ':input[name="disabled_trigger"]':
-            checked: true
-    disabled_search:
-      '#type': search
-      '#title': Search
-      '#default_value': Loremipsum
-      '#states':
-        disabled:
-          ':input[name="disabled_trigger"]':
-            checked: true
-    disabled_select:
-      '#type': select
-      '#title': Select
-      '#options':
-        one: One
-        two: Two
-        three: Three
-      '#description': '<b>Known Issues:</b><br /><a href="https://www.drupal.org/node/1426646">Issue #1426646: "-Select-" option is lost when webform elements uses ''#states''</a><br /><a href="https://www.drupal.org/node/1149078">Issue #1149078: States API doesn''t work with multiple select fields</a><br /><a href="https://www.drupal.org/node/2791741">Issue #2791741: FAPI states: fields aren''t hidden initially when depending on multi-value selection</a>'
-      '#default_value': one
-      '#states':
-        disabled:
-          ':input[name="disabled_trigger"]':
-            checked: true
-    disabled_webform_select_other:
-      '#type': webform_select_other
-      '#title': 'Select other'
-      '#options':
-        one: One
-        two: Two
-        three: Three
-      '#default_value': one
-      '#states':
-        disabled:
-          ':input[name="disabled_trigger"]':
-            checked: true
-    disabled_webform_signature:
-      '#type': webform_signature
-      '#title': Signature
-      '#states':
-        disabled:
-          ':input[name="disabled_trigger"]':
-            checked: true
-    disabled_tableselect:
-      '#type': tableselect
-      '#title': 'Table select'
-      '#options':
-        one: One
-        two: Two
-        three: Three
-      '#default_value':
-        - one
-        - two
-        - three
-      '#states':
-        disabled:
-          ':input[name="disabled_trigger"]':
-            checked: true
-    disabled_webform_tableselect_sort:
-      '#type': webform_tableselect_sort
-      '#title': 'Tableselect sort'
-      '#options':
-        one: One
-        two: Two
-        three: Three
-      '#default_value':
-        - one
-        - two
-        - three
-      '#states':
-        disabled:
-          ':input[name="disabled_trigger"]':
-            checked: true
-    disabled_webform_table_sort:
-      '#type': webform_table_sort
-      '#title': 'Table sort'
-      '#options':
-        one: One
-        two: Two
-        three: Three
-      '#default_value':
-        - one
-        - two
-        - three
-      '#states':
-        disabled:
-          ':input[name="disabled_trigger"]':
-            checked: true
-    disabled_tel:
-      '#type': tel
-      '#title': Telephone
-      '#international': true
-      '#default_value': '+1 212-333-4444'
-      '#states':
-        disabled:
-          ':input[name="disabled_trigger"]':
-            checked: true
-    disabled_webform_telephone:
-      '#type': webform_telephone
-      '#title': 'Telephone advanced'
-      '#default_value':
-        type: Home
-        phone: '+1 212-333-4444'
-        ext: 0
-      '#states':
-        disabled:
-          ':input[name="disabled_trigger"]':
-            checked: true
-    disabled_webform_term_checkboxes:
-      '#type': webform_term_checkboxes
-      '#title': 'Term checkboxes'
-      '#vocabulary': tags
-      '#default_value':
-        - Loremipsum
-        - Oratione
-        - Dixisset
-      '#states':
-        disabled:
-          ':input[name="disabled_trigger"]':
-            checked: true
-    disabled_webform_term_select:
-      '#type': webform_term_select
-      '#title': 'Term select'
-      '#vocabulary': tags
-      '#default_value': Loremipsum
-      '#states':
-        disabled:
-          ':input[name="disabled_trigger"]':
-            checked: true
-    disabled_webform_terms_of_service:
-      '#type': webform_terms_of_service
-      '#title': 'I agree to the {terms of service}.'
-      '#required': true
-      '#terms_type': slideout
-      '#terms_content': '<em>These are the terms of service.</em>'
-      '#default_value': true
-      '#states':
-        disabled:
-          ':input[name="disabled_trigger"]':
-            checked: true
-    disabled_textarea:
-      '#type': textarea
-      '#title': Textarea
-      '#rows': 2
-      '#default_value': 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Negat esse eam, inquit, propter se expetendam. Primum Theophrasti, Strato, physicum se voluit; Id mihi magnum videtur. Itaque mihi non satis videmini considerare quod iter sit naturae quaeque progressio. Quare hoc videndum est, possitne nobis hoc ratio philosophorum dare. Est enim tanti philosophi tamque nobilis audacter sua decreta defendere.'
-      '#states':
-        disabled:
-          ':input[name="disabled_trigger"]':
-            checked: true
-    disabled_textfield:
-      '#type': textfield
-      '#title': 'Text field'
-      '#default_value': Loremipsum
-      '#states':
-        disabled:
-          ':input[name="disabled_trigger"]':
-            checked: true
-    disabled_text_format:
-      '#type': text_format
-      '#title': 'Text format'
-      '#description': '<b>Known Issues:</b><br /><a href="https://www.drupal.org/node/997826">Issue #997826: #states doesn''t work correctly with type text_format</a><br /><a href="https://www.drupal.org/node/2625128">Issue #2625128: Text format selection stays visible when using editor and a hidden webform state</a><br /><a href="https://www.drupal.org/node/1954968">Issue #1954968: Required CKEditor fields always fail HTML5 validation</a>'
-      '#default_value':
-        value: '<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Negat esse eam, inquit, propter se expetendam. Primum Theophrasti, Strato, physicum se voluit; Id mihi magnum videtur. Itaque mihi non satis videmini considerare quod iter sit naturae quaeque progressio. Quare hoc videndum est, possitne nobis hoc ratio philosophorum dare. Est enim tanti philosophi tamque nobilis audacter sua decreta defendere.</p>'
-      '#states':
-        disabled:
-          ':input[name="disabled_trigger"]':
-            checked: true
-    disabled_webform_time:
-      '#type': webform_time
-      '#title': Time
-      '#description': '<b>Known Issues:</b><br /><a href="https://www.drupal.org/node/1838234">Issue #1838234: Add jQuery Timepicker for the Time element of the datetime field</a>'
-      '#default_value': '09:00'
-      '#states':
-        disabled:
-          ':input[name="disabled_trigger"]':
-            checked: true
-    disabled_url:
-      '#type': url
-      '#title': URL
-      '#default_value': 'http://example.com'
-      '#states':
-        disabled:
-          ':input[name="disabled_trigger"]':
-            checked: true
-    disabled_webform_video_file:
-      '#type': webform_video_file
-      '#title': 'Video file'
-      '#states':
-        disabled:
-          ':input[name="disabled_trigger"]':
-            checked: true
-
-css: ''
-javascript: ''
-settings:
-  ajax: false
-  ajax_scroll_top: form
-  ajax_progress_type: ''
-  ajax_effect: ''
-  ajax_speed: null
-  page: true
-  page_submit_path: ''
-  page_confirm_path: ''
-  page_theme_name: ''
-  form_title: source_entity_webform
-  form_submit_once: false
-  form_exception_message: ''
-  form_open_message: ''
-  form_close_message: ''
-  form_previous_submissions: true
-  form_confidential: false
-  form_confidential_message: ''
-  form_remote_addr: true
-  form_convert_anonymous: false
-  form_prepopulate: false
-  form_prepopulate_source_entity: false
-  form_prepopulate_source_entity_required: false
-  form_prepopulate_source_entity_type: ''
-  form_reset: false
-  form_disable_autocomplete: false
-  form_novalidate: false
-  form_disable_inline_errors: false
-  form_required: false
-  form_unsaved: false
-  form_disable_back: false
-  form_submit_back: false
-  form_autofocus: false
-  form_details_toggle: false
-  form_access_denied: default
-  form_access_denied_title: ''
-  form_access_denied_message: ''
-  form_access_denied_attributes: {  }
-  form_file_limit: ''
-  share: false
-  share_node: false
-  share_theme_name: ''
-  share_title: true
-  share_page_body_attributes: {  }
-  submission_label: ''
-  submission_log: false
-  submission_views: {  }
-  submission_views_replace: {  }
-  submission_user_columns: {  }
-  submission_user_duplicate: false
-  submission_access_denied: default
-  submission_access_denied_title: ''
-  submission_access_denied_message: ''
-  submission_access_denied_attributes: {  }
-  submission_exception_message: ''
-  submission_locked_message: ''
-  submission_excluded_elements: {  }
-  submission_exclude_empty: false
-  submission_exclude_empty_checkbox: false
-  previous_submission_message: ''
-  previous_submissions_message: ''
-  autofill: false
-  autofill_message: ''
-  autofill_excluded_elements: {  }
-  wizard_progress_bar: true
-  wizard_progress_pages: false
-  wizard_progress_percentage: false
-  wizard_progress_link: false
-  wizard_progress_states: false
-  wizard_auto_forward: true
-  wizard_start_label: ''
-  wizard_preview_link: false
-  wizard_confirmation: true
-  wizard_confirmation_label: ''
-  wizard_track: ''
-  wizard_prev_button_label: ''
-  wizard_next_button_label: ''
-  wizard_toggle: false
-  wizard_toggle_show_label: ''
-  wizard_toggle_hide_label: ''
-  preview: 0
-  preview_label: ''
-  preview_title: ''
-  preview_message: ''
-  preview_attributes: {  }
-  preview_excluded_elements: {  }
-  preview_exclude_empty: true
-  preview_exclude_empty_checkbox: false
-  draft: none
-  draft_multiple: false
-  draft_auto_save: false
-  draft_saved_message: ''
-  draft_loaded_message: ''
-  draft_pending_single_message: ''
-  draft_pending_multiple_message: ''
-  confirmation_type: page
-  confirmation_title: ''
-  confirmation_message: ''
-  confirmation_url: ''
-  confirmation_attributes: {  }
-  confirmation_back: true
-  confirmation_back_label: ''
-  confirmation_back_attributes: {  }
-  confirmation_exclude_query: false
-  confirmation_exclude_token: false
-  confirmation_update: false
-  limit_total: null
-  limit_total_interval: null
-  limit_total_message: ''
-  limit_total_unique: false
-  limit_user: null
-  limit_user_interval: null
-  limit_user_message: ''
-  limit_user_unique: false
-  entity_limit_total: null
-  entity_limit_total_interval: null
-  entity_limit_user: null
-  entity_limit_user_interval: null
-  purge: none
-  purge_days: null
-  results_disabled: false
-  results_disabled_ignore: false
-  results_customize: false
-  token_view: false
-  token_update: false
-access:
-  create:
-    roles:
-      - anonymous
-      - authenticated
-    users: {  }
-    permissions: {  }
-  view_any:
-    roles: {  }
-    users: {  }
-    permissions: {  }
-  update_any:
-    roles: {  }
-    users: {  }
-    permissions: {  }
-  delete_any:
-    roles: {  }
-    users: {  }
-    permissions: {  }
-  purge_any:
-    roles: {  }
-    users: {  }
-    permissions: {  }
-  view_own:
-    roles: {  }
-    users: {  }
-    permissions: {  }
-  update_own:
-    roles: {  }
-    users: {  }
-    permissions: {  }
-  delete_own:
-    roles: {  }
-    users: {  }
-    permissions: {  }
-  administer:
-    roles: {  }
-    users: {  }
-    permissions: {  }
-  test:
-    roles: {  }
-    users: {  }
-    permissions: {  }
-  configuration:
-    roles: {  }
-    users: {  }
-    permissions: {  }
-handlers: {  }
-variants: {  }
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_states_autocomplete.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_states_autocomplete.yml
index 30f885aecd..8b95721f68 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_states_autocomplete.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_states_autocomplete.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -159,7 +160,7 @@ elements: |
       kitten_3:
         text: 'Cute Kitten 3'
         src: 'http://placekitten.com/130/200'
-
+  
 css: ''
 javascript: ''
 settings:
@@ -232,6 +233,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -287,6 +290,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_states_client_disabled.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_states_client_disabled.yml
new file mode 100644
index 0000000000..36215f7fbf
--- /dev/null
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_states_client_disabled.yml
@@ -0,0 +1,1207 @@
+uuid: null
+langcode: en
+status: open
+dependencies:
+  enforced:
+    module:
+      - webform_test
+open: null
+close: null
+weight: 0
+uid: null
+template: false
+archive: false
+id: test_states_client_disabled
+title: 'Test: Form API #states disabled'
+description: 'Test Drupal''s #states API disabled state.'
+category: 'Test: Form API #states'
+elements: |
+  trigger:
+    '#type': checkbox
+    '#title': 'Disable elements'
+  webform_address:
+    '#type': webform_address
+    '#title': 'Basic address'
+    '#default_value':
+      address: '10 Main Street'
+      address_2: '10 Main Street'
+      city: Springfield
+      state_province: Alabama
+      postal_code: '11111'
+      country: Afghanistan
+    '#states':
+      disabled:
+        ':input[name="trigger"]':
+          checked: true
+      required:
+        ':input[name="trigger"]':
+          checked: true
+  address:
+    '#type': address
+    '#title': 'Advanced address'
+    '#default_value':
+      given_name: John
+      family_name: Smith
+      organization: 'Google Inc.'
+      address_line1: '1098 Alta Ave'
+      postal_code: '94043'
+      locality: 'Mountain View'
+      administrative_area: CA
+      country_code: US
+      langcode: en
+    '#states':
+      disabled:
+        ':input[name="trigger"]':
+          checked: true
+      required:
+        ':input[name="trigger"]':
+          checked: true
+  processed_text:
+    '#type': processed_text
+    '#title': 'Advanced HTML/Text'
+    '#states':
+      disabled:
+        ':input[name="trigger"]':
+          checked: true
+      required:
+        ':input[name="trigger"]':
+          checked: true
+  'webform_entity_print_attachment:pdf':
+    '#type': webform_entity_print_attachment
+    '#title': 'Attachment PDF'
+    '#default_value': Loremipsum
+    '#states':
+      disabled:
+        ':input[name="trigger"]':
+          checked: true
+      required:
+        ':input[name="trigger"]':
+          checked: true
+  webform_attachment_token:
+    '#type': webform_attachment_token
+    '#title': 'Attachment token'
+    '#states':
+      disabled:
+        ':input[name="trigger"]':
+          checked: true
+      required:
+        ':input[name="trigger"]':
+          checked: true
+  webform_attachment_twig:
+    '#type': webform_attachment_twig
+    '#title': 'Attachment Twig'
+    '#states':
+      disabled:
+        ':input[name="trigger"]':
+          checked: true
+      required:
+        ':input[name="trigger"]':
+          checked: true
+  webform_attachment_url:
+    '#type': webform_attachment_url
+    '#title': 'Attachment URL'
+    '#states':
+      disabled:
+        ':input[name="trigger"]':
+          checked: true
+      required:
+        ':input[name="trigger"]':
+          checked: true
+  webform_audio_file:
+    '#type': webform_audio_file
+    '#title': 'Audio file'
+    '#states':
+      disabled:
+        ':input[name="trigger"]':
+          checked: true
+      required:
+        ':input[name="trigger"]':
+          checked: true
+  webform_autocomplete:
+    '#type': webform_autocomplete
+    '#title': Autocomplete
+    '#default_value': Loremipsum
+    '#states':
+      disabled:
+        ':input[name="trigger"]':
+          checked: true
+      required:
+        ':input[name="trigger"]':
+          checked: true
+  webform_markup:
+    '#type': webform_markup
+    '#title': 'Basic HTML'
+    '#description': '<b>Known Issues:</b><br /><a href="https://www.drupal.org/node/2700667">Issue #2700667: Notice: Undefined index: #type in drupal_process_states()</a>'
+    '#states':
+      disabled:
+        ':input[name="trigger"]':
+          checked: true
+      required:
+        ':input[name="trigger"]':
+          checked: true
+  checkbox:
+    '#type': checkbox
+    '#title': Checkbox
+    '#default_value': true
+    '#states':
+      disabled:
+        ':input[name="trigger"]':
+          checked: true
+      required:
+        ':input[name="trigger"]':
+          checked: true
+  checkboxes:
+    '#type': checkboxes
+    '#title': Checkboxes
+    '#options':
+      one: One
+      two: Two
+      three: Three
+    '#options_display': side_by_side
+    '#description': '<b>Known Issues:</b><br /><a href="https://www.drupal.org/node/994360">Issue #994360: #states cannot disable/enable radios and checkboxes</a><br /><a href="https://www.drupal.org/node/2836364">Issue #2836364: Wrapper attributes are not supported by composite elements, this includes radios, checkboxes, and buttons.</a>'
+    '#default_value':
+      - one
+      - two
+      - three
+    '#states':
+      disabled:
+        ':input[name="trigger"]':
+          checked: true
+      required:
+        ':input[name="trigger"]':
+          checked: true
+  webform_checkboxes_other:
+    '#type': webform_checkboxes_other
+    '#title': 'Checkboxes other'
+    '#options':
+      one: One
+      two: Two
+      three: Three
+    '#options_display': side_by_side
+    '#default_value':
+      - one
+      - two
+      - three
+    '#states':
+      disabled:
+        ':input[name="trigger"]':
+          checked: true
+      required:
+        ':input[name="trigger"]':
+          checked: true
+  webform_codemirror:
+    '#type': webform_codemirror
+    '#title': CodeMirror
+    '#mode': yaml
+    '#default_value': 'message: ''Hello World'''
+    '#states':
+      disabled:
+        ':input[name="trigger"]':
+          checked: true
+      required:
+        ':input[name="trigger"]':
+          checked: true
+  color:
+    '#type': color
+    '#title': Color
+    '#default_value': '#ffffcc'
+    '#states':
+      disabled:
+        ':input[name="trigger"]':
+          checked: true
+      required:
+        ':input[name="trigger"]':
+          checked: true
+  webform_computed_token:
+    '#type': webform_computed_token
+    '#title': 'Computed token'
+    '#template': 'This is a Computed token value.'
+    '#states':
+      disabled:
+        ':input[name="trigger"]':
+          checked: true
+      required:
+        ':input[name="trigger"]':
+          checked: true
+  webform_computed_twig:
+    '#type': webform_computed_twig
+    '#title': 'Computed Twig'
+    '#template': 'This is a Computed Twig value.'
+    '#states':
+      disabled:
+        ':input[name="trigger"]':
+          checked: true
+      required:
+        ':input[name="trigger"]':
+          checked: true
+  webform_contact:
+    '#type': webform_contact
+    '#title': Contact
+    '#default_value':
+      name: Loremipsum
+      company: Loremipsum
+      email: example@example.com
+      phone: 123-456-7890
+      address: '10 Main Street'
+      address_2: '10 Main Street'
+      city: Springfield
+      state_province: Alabama
+      postal_code: '11111'
+      country: Afghanistan
+    '#states':
+      disabled:
+        ':input[name="trigger"]':
+          checked: true
+      required:
+        ':input[name="trigger"]':
+          checked: true
+  webform_custom_composite:
+    '#type': webform_custom_composite
+    '#title': 'Custom composite'
+    '#element':
+      name:
+        '#type': textfield
+        '#title': Name
+        '#title_display': invisible
+      gender:
+        '#type': select
+        '#title': Gender
+        '#title_display': invisible
+        '#options':
+          Male: Male
+          Female: Female
+    '#default_value':
+      - name: Loremipsum
+        gender: Male
+      - name: Loremipsum
+        gender: Male
+      - name: Loremipsum
+        gender: Male
+    '#states':
+      disabled:
+        ':input[name="trigger"]':
+          checked: true
+      required:
+        ':input[name="trigger"]':
+          checked: true
+  date:
+    '#type': date
+    '#title': Date
+    '#default_value': '2022-01-23T21:13:17-0500'
+    '#states':
+      disabled:
+        ':input[name="trigger"]':
+          checked: true
+      required:
+        ':input[name="trigger"]':
+          checked: true
+  datetime:
+    '#type': datetime
+    '#title': Date/time
+    '#description': '<b>Known Issues:</b><br /><a href="https://www.drupal.org/node/2419131">Issue #2419131: #states attribute does not work on #type datetime</a>'
+    '#default_value': '2018-11-16T11:10:07-0500'
+    '#states':
+      disabled:
+        ':input[name="trigger"]':
+          checked: true
+      required:
+        ':input[name="trigger"]':
+          checked: true
+  datelist:
+    '#type': datelist
+    '#title': 'Date list'
+    '#default_value': '2011-05-20T14:49:30-0400'
+    '#states':
+      disabled:
+        ':input[name="trigger"]':
+          checked: true
+      required:
+        ':input[name="trigger"]':
+          checked: true
+  webform_document_file:
+    '#type': webform_document_file
+    '#title': 'Document file'
+    '#states':
+      disabled:
+        ':input[name="trigger"]':
+          checked: true
+      required:
+        ':input[name="trigger"]':
+          checked: true
+  email:
+    '#type': email
+    '#title': Email
+    '#default_value': example@example.com
+    '#states':
+      disabled:
+        ':input[name="trigger"]':
+          checked: true
+      required:
+        ':input[name="trigger"]':
+          checked: true
+  webform_email_confirm:
+    '#type': webform_email_confirm
+    '#title': 'Email confirm'
+    '#default_value': example@example.com
+    '#states':
+      disabled:
+        ':input[name="trigger"]':
+          checked: true
+      required:
+        ':input[name="trigger"]':
+          checked: true
+  webform_email_multiple:
+    '#type': webform_email_multiple
+    '#title': 'Email multiple'
+    '#default_value': 'example@example.com, test@test.com, random@random.com'
+    '#states':
+      disabled:
+        ':input[name="trigger"]':
+          checked: true
+      required:
+        ':input[name="trigger"]':
+          checked: true
+  entity_autocomplete:
+    '#type': entity_autocomplete
+    '#title': 'Entity autocomplete'
+    '#target_type': user
+    '#selection_handler': 'default:user'
+    '#selection_settings':
+      include_anonymous: true
+    '#description': '<b>Known Issues:</b><br /><a href="https://www.drupal.org/node/2826451">Issue #2826451: TermSelection returning HTML characters in select list</a>'
+    '#default_value': 10
+    '#states':
+      disabled:
+        ':input[name="trigger"]':
+          checked: true
+      required:
+        ':input[name="trigger"]':
+          checked: true
+  webform_entity_checkboxes:
+    '#type': webform_entity_checkboxes
+    '#title': 'Entity checkboxes'
+    '#options_display': side_by_side
+    '#target_type': user
+    '#selection_handler': 'default:user'
+    '#selection_settings':
+      include_anonymous: true
+    '#options':
+      1: Administrator
+      0: Anonymous
+    '#default_value':
+      - 1
+    '#states':
+      disabled:
+        ':input[name="trigger"]':
+          checked: true
+      required:
+        ':input[name="trigger"]':
+          checked: true
+  webform_entity_radios:
+    '#type': webform_entity_radios
+    '#title': 'Entity radios'
+    '#options_display': side_by_side
+    '#target_type': user
+    '#selection_handler': 'default:user'
+    '#selection_settings':
+      include_anonymous: true
+    '#options':
+      1: Administrator
+      0: Anonymous
+    '#default_value': 1
+    '#states':
+      disabled:
+        ':input[name="trigger"]':
+          checked: true
+      required:
+        ':input[name="trigger"]':
+          checked: true
+  webform_entity_select:
+    '#type': webform_entity_select
+    '#title': 'Entity select'
+    '#target_type': user
+    '#selection_handler': 'default:user'
+    '#selection_settings':
+      include_anonymous: true
+    '#options':
+      1: Administrator
+      0: Anonymous
+    '#default_value': 1
+    '#states':
+      disabled:
+        ':input[name="trigger"]':
+          checked: true
+      required:
+        ':input[name="trigger"]':
+          checked: true
+  managed_file:
+    '#type': managed_file
+    '#title': File
+    '#description': '<b>Known Issues:</b><br /><a href="https://www.drupal.org/node/2705471">Issue #2705471: Webform states managed file fields</a><br /><a href="https://www.drupal.org/node/2113931">Issue #2113931: File Field design update</a><br /><a href="https://www.drupal.org/node/2346893">Issue #2346893: Duplicate Ajax wrapper around a file field</a><br /><a href="https://www.drupal.org/node/2482783">Issue #2482783: File upload errors not set or shown correctly</a>'
+    '#states':
+      disabled:
+        ':input[name="trigger"]':
+          checked: true
+      required:
+        ':input[name="trigger"]':
+          checked: true
+  webform_horizontal_rule:
+    '#type': webform_horizontal_rule
+    '#attributes':
+      class:
+        - webform-horizontal-rule--dotted
+        - webform-horizontal-rule--thick
+    '#states':
+      disabled:
+        ':input[name="trigger"]':
+          checked: true
+      required:
+        ':input[name="trigger"]':
+          checked: true
+  webform_image_file:
+    '#type': webform_image_file
+    '#title': 'Image file'
+    '#states':
+      disabled:
+        ':input[name="trigger"]':
+          checked: true
+      required:
+        ':input[name="trigger"]':
+          checked: true
+  webform_image_select:
+    '#type': webform_image_select
+    '#title': 'Image select'
+    '#show_label': true
+    '#images':
+      bear_1:
+        text: 'Bear 1'
+        src: 'https://www.placebear.com/80/100'
+      bear_2:
+        text: 'Bear 2'
+        src: 'https://www.placebear.com/100/100'
+      bear_3:
+        text: 'Bear 3'
+        src: 'https://www.placebear.com/120/100'
+    '#default_value': Loremipsum
+    '#states':
+      disabled:
+        ':input[name="trigger"]':
+          checked: true
+      required:
+        ':input[name="trigger"]':
+          checked: true
+  item:
+    '#type': item
+    '#title': Item
+    '#markup': '{markup}'
+    '#field_prefix': '{field_prefix}'
+    '#field_suffix': '{field_suffix}'
+    '#description': '<b>Known Issues:</b><br /><a href="https://www.drupal.org/node/783438">Issue #783438: #states doesn''t work for #type item</a>'
+    '#states':
+      disabled:
+        ':input[name="trigger"]':
+          checked: true
+      required:
+        ':input[name="trigger"]':
+          checked: true
+  label:
+    '#type': label
+    '#title': Label
+    '#states':
+      disabled:
+        ':input[name="trigger"]':
+          checked: true
+      required:
+        ':input[name="trigger"]':
+          checked: true
+  language_select:
+    '#type': language_select
+    '#title': 'Language select'
+    '#default_value': en
+    '#states':
+      disabled:
+        ':input[name="trigger"]':
+          checked: true
+      required:
+        ':input[name="trigger"]':
+          checked: true
+  webform_likert:
+    '#type': webform_likert
+    '#title': Likert
+    '#questions':
+      q1: 'Please answer question 1?'
+      q2: 'How about now answering question 2?'
+      q3: 'Finally, here is question 3?'
+    '#answers':
+      1: '1'
+      2: '2'
+      3: '3'
+    '#default_value':
+      q1: 1
+      q2: 1
+      q3: 1
+    '#states':
+      disabled:
+        ':input[name="trigger"]':
+          checked: true
+      required:
+        ':input[name="trigger"]':
+          checked: true
+  webform_link:
+    '#type': webform_link
+    '#title': Link
+    '#default_value':
+      title: Loremipsum
+      url: 'http://example.com'
+    '#states':
+      disabled:
+        ':input[name="trigger"]':
+          checked: true
+      required:
+        ':input[name="trigger"]':
+          checked: true
+  webform_location_places:
+    '#type': webform_location_places
+    '#title': 'Location (Algolia Places)'
+    '#default_value':
+      value: '1600 Pennsylvania Avenue, Washington, District of Columbia, United States of America'
+      lat: '38.8635'
+      lng: '-76.946'
+      name: '1600 Pennsylvania Avenue'
+      city: Washington
+      country: 'United States of America'
+      country_code: us
+      administrative: 'District of Columbia'
+      county: 'Prince George''s County'
+      suburb: ''
+      postcode: '20020'
+    '#states':
+      disabled:
+        ':input[name="trigger"]':
+          checked: true
+      required:
+        ':input[name="trigger"]':
+          checked: true
+  webform_mapping:
+    '#type': webform_mapping
+    '#title': Mapping
+    '#source':
+      one: One
+      two: Two
+      three: Three
+    '#destination':
+      four: Four
+      five: Five
+      six: Six
+    '#default_value':
+      one: four
+      two: four
+      three: four
+    '#states':
+      disabled:
+        ':input[name="trigger"]':
+          checked: true
+      required:
+        ':input[name="trigger"]':
+          checked: true
+  webform_message:
+    '#type': webform_message
+    '#title': Message
+    '#message_type': warning
+    '#message_message': 'This is a <strong>warning</strong> message.'
+    '#description': '<b>Known Issues:</b><br /><a href="https://www.drupal.org/node/77245">Issue #77245: A place for JavaScript status messages</a>'
+    '#states':
+      disabled:
+        ':input[name="trigger"]':
+          checked: true
+      required:
+        ':input[name="trigger"]':
+          checked: true
+  webform_name:
+    '#type': webform_name
+    '#title': Name
+    '#default_value':
+      title: Miss
+      first: Loremipsum
+      middle: Loremipsum
+      last: Loremipsum
+      suffix: Loremipsum
+      degree: Loremipsum
+    '#states':
+      disabled:
+        ':input[name="trigger"]':
+          checked: true
+      required:
+        ':input[name="trigger"]':
+          checked: true
+  number:
+    '#type': number
+    '#title': Number
+    '#min': 0
+    '#max': 10
+    '#step': 1
+    '#states':
+      disabled:
+        ':input[name="trigger"]':
+          checked: true
+      required:
+        ':input[name="trigger"]':
+          checked: true
+  password:
+    '#type': password
+    '#title': Password
+    '#default_value': Loremipsum
+    '#states':
+      disabled:
+        ':input[name="trigger"]':
+          checked: true
+      required:
+        ':input[name="trigger"]':
+          checked: true
+  password_confirm:
+    '#type': password_confirm
+    '#title': 'Password confirm'
+    '#description': '<b>Known Issues:</b><br /><a href="https://www.drupal.org/node/1427838">Issue #1427838: password and password_confirm children do not pick up #states or #attributes</a>'
+    '#default_value': Loremipsum
+    '#states':
+      disabled:
+        ':input[name="trigger"]':
+          checked: true
+      required:
+        ':input[name="trigger"]':
+          checked: true
+  radios:
+    '#type': radios
+    '#title': Radios
+    '#options':
+      one: One
+      two: Two
+      three: Three
+    '#options_display': side_by_side
+    '#description': '<b>Known Issues:</b><br /><a href="https://www.drupal.org/node/2731991">Issue #2731991: Setting required on radios marks all options required</a><br /><a href="https://www.drupal.org/node/994360">Issue #994360: #states cannot disable/enable radios and checkboxes</a><br /><a href="https://www.drupal.org/node/2836364">Issue #2836364: Wrapper attributes are not supported by composite elements, this includes radios, checkboxes, and buttons.</a>'
+    '#default_value': one
+    '#states':
+      disabled:
+        ':input[name="trigger"]':
+          checked: true
+      required:
+        ':input[name="trigger"]':
+          checked: true
+  webform_radios_other:
+    '#type': webform_radios_other
+    '#title': 'Radios other'
+    '#options':
+      one: One
+      two: Two
+      three: Three
+    '#options_display': side_by_side
+    '#default_value': one
+    '#states':
+      disabled:
+        ':input[name="trigger"]':
+          checked: true
+      required:
+        ':input[name="trigger"]':
+          checked: true
+  range:
+    '#type': range
+    '#title': Range
+    '#min': 0
+    '#max': 100
+    '#step': 1
+    '#output': below
+    '#output__field_prefix': $
+    '#output__field_suffix': '.00'
+    '#states':
+      disabled:
+        ':input[name="trigger"]':
+          checked: true
+      required:
+        ':input[name="trigger"]':
+          checked: true
+  webform_rating:
+    '#type': webform_rating
+    '#title': Rating
+    '#states':
+      disabled:
+        ':input[name="trigger"]':
+          checked: true
+      required:
+        ':input[name="trigger"]':
+          checked: true
+  webform_same:
+    '#type': webform_same
+    '#title': 'Billing address is the same as the shipping address'
+    '#default_value': true
+    '#states':
+      disabled:
+        ':input[name="trigger"]':
+          checked: true
+      required:
+        ':input[name="trigger"]':
+          checked: true
+  webform_scale:
+    '#type': webform_scale
+    '#title': Scale
+    '#min': 1
+    '#max': 5
+    '#default_value': 1
+    '#states':
+      disabled:
+        ':input[name="trigger"]':
+          checked: true
+      required:
+        ':input[name="trigger"]':
+          checked: true
+  search:
+    '#type': search
+    '#title': Search
+    '#default_value': Loremipsum
+    '#states':
+      disabled:
+        ':input[name="trigger"]':
+          checked: true
+      required:
+        ':input[name="trigger"]':
+          checked: true
+  select:
+    '#type': select
+    '#title': Select
+    '#options':
+      one: One
+      two: Two
+      three: Three
+    '#description': '<b>Known Issues:</b><br /><a href="https://www.drupal.org/node/1426646">Issue #1426646: "-Select-" option is lost when webform elements uses ''#states''</a><br /><a href="https://www.drupal.org/node/1149078">Issue #1149078: States API doesn''t work with multiple select fields</a><br /><a href="https://www.drupal.org/node/2791741">Issue #2791741: FAPI states: fields aren''t hidden initially when depending on multi-value selection</a>'
+    '#default_value': one
+    '#states':
+      disabled:
+        ':input[name="trigger"]':
+          checked: true
+      required:
+        ':input[name="trigger"]':
+          checked: true
+  webform_select_other:
+    '#type': webform_select_other
+    '#title': 'Select other'
+    '#options':
+      one: One
+      two: Two
+      three: Three
+    '#default_value': one
+    '#states':
+      disabled:
+        ':input[name="trigger"]':
+          checked: true
+      required:
+        ':input[name="trigger"]':
+          checked: true
+  webform_signature:
+    '#type': webform_signature
+    '#title': Signature
+    '#states':
+      disabled:
+        ':input[name="trigger"]':
+          checked: true
+      required:
+        ':input[name="trigger"]':
+          checked: true
+  tableselect:
+    '#type': tableselect
+    '#title': 'Table select'
+    '#options':
+      one: One
+      two: Two
+      three: Three
+    '#default_value':
+      - one
+      - two
+      - three
+    '#states':
+      disabled:
+        ':input[name="trigger"]':
+          checked: true
+      required:
+        ':input[name="trigger"]':
+          checked: true
+  webform_tableselect_sort:
+    '#type': webform_tableselect_sort
+    '#title': 'Tableselect sort'
+    '#options':
+      one: One
+      two: Two
+      three: Three
+    '#default_value':
+      - one
+      - two
+      - three
+    '#states':
+      disabled:
+        ':input[name="trigger"]':
+          checked: true
+      required:
+        ':input[name="trigger"]':
+          checked: true
+  webform_table_sort:
+    '#type': webform_table_sort
+    '#title': 'Table sort'
+    '#options':
+      one: One
+      two: Two
+      three: Three
+    '#default_value':
+      - one
+      - two
+      - three
+    '#states':
+      disabled:
+        ':input[name="trigger"]':
+          checked: true
+      required:
+        ':input[name="trigger"]':
+          checked: true
+  tel:
+    '#type': tel
+    '#title': Telephone
+    '#international': true
+    '#default_value': '+1 212-333-4444'
+    '#states':
+      disabled:
+        ':input[name="trigger"]':
+          checked: true
+      required:
+        ':input[name="trigger"]':
+          checked: true
+  webform_telephone:
+    '#type': webform_telephone
+    '#title': 'Telephone advanced'
+    '#default_value':
+      type: Home
+      phone: '+1 212-333-4444'
+      ext: 0
+    '#states':
+      disabled:
+        ':input[name="trigger"]':
+          checked: true
+      required:
+        ':input[name="trigger"]':
+          checked: true
+  webform_term_checkboxes:
+    '#type': webform_term_checkboxes
+    '#title': 'Term checkboxes'
+    '#vocabulary': second
+    '#default_value':
+      - 161
+      - 101
+      - 177
+    '#states':
+      disabled:
+        ':input[name="trigger"]':
+          checked: true
+      required:
+        ':input[name="trigger"]':
+          checked: true
+  webform_term_select:
+    '#type': webform_term_select
+    '#title': 'Term select'
+    '#vocabulary': second
+    '#default_value': 161
+    '#states':
+      disabled:
+        ':input[name="trigger"]':
+          checked: true
+      required:
+        ':input[name="trigger"]':
+          checked: true
+  webform_terms_of_service:
+    '#type': webform_terms_of_service
+    '#title': 'I agree to the {terms of service}.'
+    '#required': true
+    '#terms_type': slideout
+    '#terms_content': '<em>These are the terms of service.</em>'
+    '#default_value': true
+    '#states':
+      disabled:
+        ':input[name="trigger"]':
+          checked: true
+      required:
+        ':input[name="trigger"]':
+          checked: true
+  textarea:
+    '#type': textarea
+    '#title': Textarea
+    '#rows': 2
+    '#default_value': 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Negat esse eam, inquit, propter se expetendam. Primum Theophrasti, Strato, physicum se voluit; Id mihi magnum videtur. Itaque mihi non satis videmini considerare quod iter sit naturae quaeque progressio. Quare hoc videndum est, possitne nobis hoc ratio philosophorum dare. Est enim tanti philosophi tamque nobilis audacter sua decreta defendere.'
+    '#states':
+      disabled:
+        ':input[name="trigger"]':
+          checked: true
+      required:
+        ':input[name="trigger"]':
+          checked: true
+  textfield:
+    '#type': textfield
+    '#title': 'Text field'
+    '#default_value': Loremipsum
+    '#states':
+      disabled:
+        ':input[name="trigger"]':
+          checked: true
+      required:
+        ':input[name="trigger"]':
+          checked: true
+  text_format:
+    '#type': text_format
+    '#title': 'Text format'
+    '#description': '<b>Known Issues:</b><br /><a href="https://www.drupal.org/node/997826">Issue #997826: #states doesn''t work correctly with type text_format</a><br /><a href="https://www.drupal.org/node/2625128">Issue #2625128: Text format selection stays visible when using editor and a hidden webform state</a><br /><a href="https://www.drupal.org/node/1954968">Issue #1954968: Required CKEditor fields always fail HTML5 validation</a>'
+    '#default_value':
+      value: '<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Negat esse eam, inquit, propter se expetendam. Primum Theophrasti, Strato, physicum se voluit; Id mihi magnum videtur. Itaque mihi non satis videmini considerare quod iter sit naturae quaeque progressio. Quare hoc videndum est, possitne nobis hoc ratio philosophorum dare. Est enim tanti philosophi tamque nobilis audacter sua decreta defendere.</p>'
+    '#states':
+      disabled:
+        ':input[name="trigger"]':
+          checked: true
+      required:
+        ':input[name="trigger"]':
+          checked: true
+  webform_time:
+    '#type': webform_time
+    '#title': Time
+    '#description': '<b>Known Issues:</b><br /><a href="https://www.drupal.org/node/1838234">Issue #1838234: Add jQuery Timepicker for the Time element of the datetime field</a>'
+    '#default_value': '09:00'
+    '#states':
+      disabled:
+        ':input[name="trigger"]':
+          checked: true
+      required:
+        ':input[name="trigger"]':
+          checked: true
+  url:
+    '#type': url
+    '#title': URL
+    '#default_value': 'http://example.com'
+    '#states':
+      disabled:
+        ':input[name="trigger"]':
+          checked: true
+      required:
+        ':input[name="trigger"]':
+          checked: true
+  value:
+    '#type': value
+    '#title': Value
+    '#value': preview
+    '#states':
+      disabled:
+        ':input[name="trigger"]':
+          checked: true
+      required:
+        ':input[name="trigger"]':
+          checked: true
+  webform_variant:
+    '#type': webform_variant
+    '#title': 'Variant [EXPERIMENTAL]'
+    '#states':
+      disabled:
+        ':input[name="trigger"]':
+          checked: true
+      required:
+        ':input[name="trigger"]':
+          checked: true
+  webform_video_file:
+    '#type': webform_video_file
+    '#title': 'Video file'
+    '#states':
+      disabled:
+        ':input[name="trigger"]':
+          checked: true
+      required:
+        ':input[name="trigger"]':
+          checked: true
+
+css: ''
+javascript: ''
+settings:
+  ajax: false
+  ajax_scroll_top: form
+  ajax_progress_type: ''
+  ajax_effect: ''
+  ajax_speed: null
+  page: true
+  page_submit_path: ''
+  page_confirm_path: ''
+  page_theme_name: ''
+  form_title: source_entity_webform
+  form_submit_once: false
+  form_exception_message: ''
+  form_open_message: ''
+  form_close_message: ''
+  form_previous_submissions: true
+  form_confidential: false
+  form_confidential_message: ''
+  form_remote_addr: true
+  form_convert_anonymous: false
+  form_prepopulate: false
+  form_prepopulate_source_entity: false
+  form_prepopulate_source_entity_required: false
+  form_prepopulate_source_entity_type: ''
+  form_reset: false
+  form_disable_autocomplete: false
+  form_novalidate: false
+  form_disable_inline_errors: false
+  form_required: false
+  form_unsaved: false
+  form_disable_back: false
+  form_submit_back: false
+  form_autofocus: false
+  form_details_toggle: false
+  form_access_denied: default
+  form_access_denied_title: ''
+  form_access_denied_message: ''
+  form_access_denied_attributes: {  }
+  form_file_limit: ''
+  share: false
+  share_node: false
+  share_theme_name: ''
+  share_title: true
+  share_page_body_attributes: {  }
+  submission_label: ''
+  submission_log: false
+  submission_views: {  }
+  submission_views_replace: {  }
+  submission_user_columns: {  }
+  submission_user_duplicate: false
+  submission_access_denied: default
+  submission_access_denied_title: ''
+  submission_access_denied_message: ''
+  submission_access_denied_attributes: {  }
+  submission_exception_message: ''
+  submission_locked_message: ''
+  submission_excluded_elements: {  }
+  submission_exclude_empty: false
+  submission_exclude_empty_checkbox: false
+  previous_submission_message: ''
+  previous_submissions_message: ''
+  autofill: false
+  autofill_message: ''
+  autofill_excluded_elements: {  }
+  wizard_progress_bar: true
+  wizard_progress_pages: false
+  wizard_progress_percentage: false
+  wizard_progress_link: false
+  wizard_progress_states: false
+  wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
+  wizard_start_label: ''
+  wizard_preview_link: false
+  wizard_confirmation: true
+  wizard_confirmation_label: ''
+  wizard_track: ''
+  wizard_prev_button_label: ''
+  wizard_next_button_label: ''
+  wizard_toggle: false
+  wizard_toggle_show_label: ''
+  wizard_toggle_hide_label: ''
+  preview: 0
+  preview_label: ''
+  preview_title: ''
+  preview_message: ''
+  preview_attributes: {  }
+  preview_excluded_elements: {  }
+  preview_exclude_empty: true
+  preview_exclude_empty_checkbox: false
+  draft: none
+  draft_multiple: false
+  draft_auto_save: false
+  draft_saved_message: ''
+  draft_loaded_message: ''
+  draft_pending_single_message: ''
+  draft_pending_multiple_message: ''
+  confirmation_type: page
+  confirmation_title: ''
+  confirmation_message: ''
+  confirmation_url: ''
+  confirmation_attributes: {  }
+  confirmation_back: true
+  confirmation_back_label: ''
+  confirmation_back_attributes: {  }
+  confirmation_exclude_query: false
+  confirmation_exclude_token: false
+  confirmation_update: false
+  limit_total: null
+  limit_total_interval: null
+  limit_total_message: ''
+  limit_total_unique: false
+  limit_user: null
+  limit_user_interval: null
+  limit_user_message: ''
+  limit_user_unique: false
+  entity_limit_total: null
+  entity_limit_total_interval: null
+  entity_limit_user: null
+  entity_limit_user_interval: null
+  purge: none
+  purge_days: null
+  results_disabled: true
+  results_disabled_ignore: true
+  results_customize: false
+  token_view: false
+  token_update: false
+  serial_disabled: false
+access:
+  create:
+    roles:
+      - anonymous
+      - authenticated
+    users: {  }
+    permissions: {  }
+  view_any:
+    roles: {  }
+    users: {  }
+    permissions: {  }
+  update_any:
+    roles: {  }
+    users: {  }
+    permissions: {  }
+  delete_any:
+    roles: {  }
+    users: {  }
+    permissions: {  }
+  purge_any:
+    roles: {  }
+    users: {  }
+    permissions: {  }
+  view_own:
+    roles: {  }
+    users: {  }
+    permissions: {  }
+  update_own:
+    roles: {  }
+    users: {  }
+    permissions: {  }
+  delete_own:
+    roles: {  }
+    users: {  }
+    permissions: {  }
+  administer:
+    roles: {  }
+    users: {  }
+    permissions: {  }
+  test:
+    roles: {  }
+    users: {  }
+    permissions: {  }
+  configuration:
+    roles: {  }
+    users: {  }
+    permissions: {  }
+handlers:
+  debug:
+    id: debug
+    label: Debug
+    notes: ''
+    handler_id: debug
+    status: true
+    conditions: {  }
+    weight: 0
+    settings: {  }
+variants: {  }
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_states_client_invisible.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_states_client_invisible.yml
new file mode 100644
index 0000000000..83b66118e9
--- /dev/null
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_states_client_invisible.yml
@@ -0,0 +1,1020 @@
+uuid: null
+langcode: en
+status: open
+dependencies:
+  enforced:
+    module:
+      - webform_test
+open: null
+close: null
+weight: 0
+uid: null
+template: false
+archive: false
+id: test_states_client_invisible
+title: 'Test: Form API #states invisible and not required'
+description: 'Test Drupal''s #states API invisible states.'
+category: 'Test: Form API #states'
+elements: |
+  trigger:
+    '#type': checkbox
+    '#title': 'Hide and empty elements'
+  container:
+    '#type': container
+    '#title': Container
+    '#states':
+      invisible:
+        ':input[name="trigger"]':
+          checked: true
+  details:
+    '#type': details
+    '#title': Details
+    '#description': '<b>Known Issues:</b><br /><a href="https://www.drupal.org/node/2348851">Issue #2348851: Regression: Allow HTML tags inside detail summary</a>'
+    '#states':
+      invisible:
+        ':input[name="trigger"]':
+          checked: true
+  fieldset:
+    '#type': fieldset
+    '#title': Fieldset
+    '#states':
+      invisible:
+        ':input[name="trigger"]':
+          checked: true
+  webform_section:
+    '#type': webform_section
+    '#title': Section
+    '#states':
+      invisible:
+        ':input[name="trigger"]':
+          checked: true
+  webform_address:
+    '#type': webform_address
+    '#title': 'Basic address'
+    '#default_value':
+      address: '10 Main Street'
+      address_2: '10 Main Street'
+      city: Springfield
+      state_province: Alabama
+      postal_code: '11111'
+      country: Afghanistan
+    '#states':
+      invisible:
+        ':input[name="trigger"]':
+          checked: true
+  address:
+    '#type': address
+    '#title': 'Advanced address'
+    '#default_value':
+      given_name: John
+      family_name: Smith
+      organization: 'Google Inc.'
+      address_line1: '1098 Alta Ave'
+      postal_code: '94043'
+      locality: 'Mountain View'
+      administrative_area: CA
+      country_code: US
+      langcode: en
+    '#states':
+      invisible:
+        ':input[name="trigger"]':
+          checked: true
+  processed_text:
+    '#type': processed_text
+    '#title': 'Advanced HTML/Text'
+    '#states':
+      invisible:
+        ':input[name="trigger"]':
+          checked: true
+  'webform_entity_print_attachment:pdf':
+    '#type': webform_entity_print_attachment
+    '#title': 'Attachment PDF'
+    '#default_value': Loremipsum
+    '#states':
+      invisible:
+        ':input[name="trigger"]':
+          checked: true
+  webform_attachment_token:
+    '#type': webform_attachment_token
+    '#title': 'Attachment token'
+    '#states':
+      invisible:
+        ':input[name="trigger"]':
+          checked: true
+  webform_attachment_twig:
+    '#type': webform_attachment_twig
+    '#title': 'Attachment Twig'
+    '#states':
+      invisible:
+        ':input[name="trigger"]':
+          checked: true
+  webform_attachment_url:
+    '#type': webform_attachment_url
+    '#title': 'Attachment URL'
+    '#states':
+      invisible:
+        ':input[name="trigger"]':
+          checked: true
+  webform_audio_file:
+    '#type': webform_audio_file
+    '#title': 'Audio file'
+    '#states':
+      invisible:
+        ':input[name="trigger"]':
+          checked: true
+  webform_autocomplete:
+    '#type': webform_autocomplete
+    '#title': Autocomplete
+    '#default_value': Loremipsum
+    '#states':
+      invisible:
+        ':input[name="trigger"]':
+          checked: true
+  webform_markup:
+    '#type': webform_markup
+    '#title': 'Basic HTML'
+    '#description': '<b>Known Issues:</b><br /><a href="https://www.drupal.org/node/2700667">Issue #2700667: Notice: Undefined index: #type in drupal_process_states()</a>'
+    '#states':
+      invisible:
+        ':input[name="trigger"]':
+          checked: true
+  checkbox:
+    '#type': checkbox
+    '#title': Checkbox
+    '#default_value': true
+    '#states':
+      invisible:
+        ':input[name="trigger"]':
+          checked: true
+  checkboxes:
+    '#type': checkboxes
+    '#title': Checkboxes
+    '#options':
+      one: One
+      two: Two
+      three: Three
+    '#options_display': side_by_side
+    '#description': '<b>Known Issues:</b><br /><a href="https://www.drupal.org/node/994360">Issue #994360: #states cannot disable/enable radios and checkboxes</a><br /><a href="https://www.drupal.org/node/2836364">Issue #2836364: Wrapper attributes are not supported by composite elements, this includes radios, checkboxes, and buttons.</a>'
+    '#default_value':
+      - one
+      - two
+      - three
+    '#states':
+      invisible:
+        ':input[name="trigger"]':
+          checked: true
+  webform_checkboxes_other:
+    '#type': webform_checkboxes_other
+    '#title': 'Checkboxes other'
+    '#options':
+      one: One
+      two: Two
+      three: Three
+    '#options_display': side_by_side
+    '#default_value':
+      - one
+      - two
+      - three
+    '#states':
+      invisible:
+        ':input[name="trigger"]':
+          checked: true
+  webform_codemirror:
+    '#type': webform_codemirror
+    '#title': CodeMirror
+    '#mode': yaml
+    '#default_value': 'message: ''Hello World'''
+    '#states':
+      invisible:
+        ':input[name="trigger"]':
+          checked: true
+  color:
+    '#type': color
+    '#title': Color
+    '#default_value': '#ffffcc'
+    '#states':
+      invisible:
+        ':input[name="trigger"]':
+          checked: true
+  webform_computed_token:
+    '#type': webform_computed_token
+    '#title': 'Computed token'
+    '#template': 'This is a Computed token value.'
+    '#states':
+      invisible:
+        ':input[name="trigger"]':
+          checked: true
+  webform_computed_twig:
+    '#type': webform_computed_twig
+    '#title': 'Computed Twig'
+    '#template': 'This is a Computed Twig value.'
+    '#states':
+      invisible:
+        ':input[name="trigger"]':
+          checked: true
+  webform_contact:
+    '#type': webform_contact
+    '#title': Contact
+    '#default_value':
+      name: Loremipsum
+      company: Loremipsum
+      email: example@example.com
+      phone: 123-456-7890
+      address: '10 Main Street'
+      address_2: '10 Main Street'
+      city: Springfield
+      state_province: Alabama
+      postal_code: '11111'
+      country: Afghanistan
+    '#states':
+      invisible:
+        ':input[name="trigger"]':
+          checked: true
+  webform_custom_composite:
+    '#type': webform_custom_composite
+    '#title': 'Custom composite'
+    '#element':
+      name:
+        '#type': textfield
+        '#title': Name
+        '#title_display': invisible
+      gender:
+        '#type': select
+        '#title': Gender
+        '#title_display': invisible
+        '#options':
+          Male: Male
+          Female: Female
+    '#default_value':
+      - name: Loremipsum
+        gender: Male
+      - name: Loremipsum
+        gender: Male
+      - name: Loremipsum
+        gender: Male
+    '#states':
+      invisible:
+        ':input[name="trigger"]':
+          checked: true
+  date:
+    '#type': date
+    '#title': Date
+    '#default_value': '2013-03-16T13:06:41-0400'
+    '#states':
+      invisible:
+        ':input[name="trigger"]':
+          checked: true
+  datetime:
+    '#type': datetime
+    '#title': Date/time
+    '#description': '<b>Known Issues:</b><br /><a href="https://www.drupal.org/node/2419131">Issue #2419131: #states attribute does not work on #type datetime</a>'
+    '#default_value': '2028-03-18T15:58:00-0400'
+    '#states':
+      invisible:
+        ':input[name="trigger"]':
+          checked: true
+  datelist:
+    '#type': datelist
+    '#title': 'Date list'
+    '#default_value': '2031-12-15T00:45:18-0500'
+    '#states':
+      invisible:
+        ':input[name="trigger"]':
+          checked: true
+  webform_document_file:
+    '#type': webform_document_file
+    '#title': 'Document file'
+    '#states':
+      invisible:
+        ':input[name="trigger"]':
+          checked: true
+  email:
+    '#type': email
+    '#title': Email
+    '#default_value': example@example.com
+    '#states':
+      invisible:
+        ':input[name="trigger"]':
+          checked: true
+  webform_email_confirm:
+    '#type': webform_email_confirm
+    '#title': 'Email confirm'
+    '#default_value': example@example.com
+    '#states':
+      invisible:
+        ':input[name="trigger"]':
+          checked: true
+  webform_email_multiple:
+    '#type': webform_email_multiple
+    '#title': 'Email multiple'
+    '#default_value': 'example@example.com, test@test.com, random@random.com'
+    '#states':
+      invisible:
+        ':input[name="trigger"]':
+          checked: true
+  entity_autocomplete:
+    '#type': entity_autocomplete
+    '#title': 'Entity autocomplete'
+    '#target_type': user
+    '#selection_handler': 'default:user'
+    '#selection_settings':
+      include_anonymous: true
+    '#description': '<b>Known Issues:</b><br /><a href="https://www.drupal.org/node/2826451">Issue #2826451: TermSelection returning HTML characters in select list</a>'
+    '#default_value': 6
+    '#states':
+      invisible:
+        ':input[name="trigger"]':
+          checked: true
+  webform_entity_checkboxes:
+    '#type': webform_entity_checkboxes
+    '#title': 'Entity checkboxes'
+    '#options_display': side_by_side
+    '#target_type': user
+    '#selection_handler': 'default:user'
+    '#selection_settings':
+      include_anonymous: true
+    '#options':
+      1: Administrator
+      0: Anonymous
+    '#default_value':
+      - 1
+    '#states':
+      invisible:
+        ':input[name="trigger"]':
+          checked: true
+  webform_entity_radios:
+    '#type': webform_entity_radios
+    '#title': 'Entity radios'
+    '#options_display': side_by_side
+    '#target_type': user
+    '#selection_handler': 'default:user'
+    '#selection_settings':
+      include_anonymous: true
+    '#options':
+      1: Administrator
+      0: Anonymous
+    '#default_value': 1
+    '#states':
+      invisible:
+        ':input[name="trigger"]':
+          checked: true
+  webform_entity_select:
+    '#type': webform_entity_select
+    '#title': 'Entity select'
+    '#target_type': user
+    '#selection_handler': 'default:user'
+    '#selection_settings':
+      include_anonymous: true
+    '#options':
+      1: Administrator
+      0: Anonymous
+    '#default_value': 1
+    '#states':
+      invisible:
+        ':input[name="trigger"]':
+          checked: true
+  managed_file:
+    '#type': managed_file
+    '#title': File
+    '#description': '<b>Known Issues:</b><br /><a href="https://www.drupal.org/node/2705471">Issue #2705471: Webform states managed file fields</a><br /><a href="https://www.drupal.org/node/2113931">Issue #2113931: File Field design update</a><br /><a href="https://www.drupal.org/node/2346893">Issue #2346893: Duplicate Ajax wrapper around a file field</a><br /><a href="https://www.drupal.org/node/2482783">Issue #2482783: File upload errors not set or shown correctly</a>'
+    '#states':
+      invisible:
+        ':input[name="trigger"]':
+          checked: true
+  webform_horizontal_rule:
+    '#type': webform_horizontal_rule
+    '#attributes':
+      class:
+        - webform-horizontal-rule--dotted
+        - webform-horizontal-rule--thick
+    '#states':
+      invisible:
+        ':input[name="trigger"]':
+          checked: true
+  webform_image_file:
+    '#type': webform_image_file
+    '#title': 'Image file'
+    '#states':
+      invisible:
+        ':input[name="trigger"]':
+          checked: true
+  webform_image_select:
+    '#type': webform_image_select
+    '#title': 'Image select'
+    '#show_label': true
+    '#images':
+      bear_1:
+        text: 'Bear 1'
+        src: 'https://www.placebear.com/80/100'
+      bear_2:
+        text: 'Bear 2'
+        src: 'https://www.placebear.com/100/100'
+      bear_3:
+        text: 'Bear 3'
+        src: 'https://www.placebear.com/120/100'
+    '#default_value': Loremipsum
+    '#states':
+      invisible:
+        ':input[name="trigger"]':
+          checked: true
+  item:
+    '#type': item
+    '#title': Item
+    '#markup': '{markup}'
+    '#field_prefix': '{field_prefix}'
+    '#field_suffix': '{field_suffix}'
+    '#description': '<b>Known Issues:</b><br /><a href="https://www.drupal.org/node/783438">Issue #783438: #states doesn''t work for #type item</a>'
+    '#states':
+      invisible:
+        ':input[name="trigger"]':
+          checked: true
+  label:
+    '#type': label
+    '#title': Label
+    '#states':
+      invisible:
+        ':input[name="trigger"]':
+          checked: true
+  language_select:
+    '#type': language_select
+    '#title': 'Language select'
+    '#default_value': en
+    '#states':
+      invisible:
+        ':input[name="trigger"]':
+          checked: true
+  webform_likert:
+    '#type': webform_likert
+    '#title': Likert
+    '#questions':
+      q1: 'Please answer question 1?'
+      q2: 'How about now answering question 2?'
+      q3: 'Finally, here is question 3?'
+    '#answers':
+      1: '1'
+      2: '2'
+      3: '3'
+    '#default_value':
+      q1: 1
+      q2: 1
+      q3: 1
+    '#states':
+      invisible:
+        ':input[name="trigger"]':
+          checked: true
+  webform_link:
+    '#type': webform_link
+    '#title': Link
+    '#default_value':
+      title: Loremipsum
+      url: 'http://example.com'
+    '#states':
+      invisible:
+        ':input[name="trigger"]':
+          checked: true
+  webform_location_places:
+    '#type': webform_location_places
+    '#title': 'Location (Algolia Places)'
+    '#default_value':
+      value: '1600 Pennsylvania Avenue, Washington, District of Columbia, United States of America'
+      lat: '38.8635'
+      lng: '-76.946'
+      name: '1600 Pennsylvania Avenue'
+      city: Washington
+      country: 'United States of America'
+      country_code: us
+      administrative: 'District of Columbia'
+      county: 'Prince George''s County'
+      suburb: ''
+      postcode: '20020'
+    '#states':
+      invisible:
+        ':input[name="trigger"]':
+          checked: true
+  webform_mapping:
+    '#type': webform_mapping
+    '#title': Mapping
+    '#source':
+      one: One
+      two: Two
+      three: Three
+    '#destination':
+      four: Four
+      five: Five
+      six: Six
+    '#default_value':
+      one: four
+      two: four
+      three: four
+    '#states':
+      invisible:
+        ':input[name="trigger"]':
+          checked: true
+  webform_message:
+    '#type': webform_message
+    '#title': Message
+    '#message_type': warning
+    '#message_message': 'This is a <strong>warning</strong> message.'
+    '#description': '<b>Known Issues:</b><br /><a href="https://www.drupal.org/node/77245">Issue #77245: A place for JavaScript status messages</a>'
+    '#states':
+      invisible:
+        ':input[name="trigger"]':
+          checked: true
+  webform_name:
+    '#type': webform_name
+    '#title': Name
+    '#default_value':
+      title: Miss
+      first: Loremipsum
+      middle: Loremipsum
+      last: Loremipsum
+      suffix: Loremipsum
+      degree: Loremipsum
+    '#states':
+      invisible:
+        ':input[name="trigger"]':
+          checked: true
+  number:
+    '#type': number
+    '#title': Number
+    '#min': 0
+    '#max': 10
+    '#step': 1
+    '#states':
+      invisible:
+        ':input[name="trigger"]':
+          checked: true
+  password:
+    '#type': password
+    '#title': Password
+    '#default_value': Loremipsum
+    '#states':
+      invisible:
+        ':input[name="trigger"]':
+          checked: true
+  password_confirm:
+    '#type': password_confirm
+    '#title': 'Password confirm'
+    '#description': '<b>Known Issues:</b><br /><a href="https://www.drupal.org/node/1427838">Issue #1427838: password and password_confirm children do not pick up #states or #attributes</a>'
+    '#default_value': Loremipsum
+    '#states':
+      invisible:
+        ':input[name="trigger"]':
+          checked: true
+  radios:
+    '#type': radios
+    '#title': Radios
+    '#options':
+      one: One
+      two: Two
+      three: Three
+    '#options_display': side_by_side
+    '#description': '<b>Known Issues:</b><br /><a href="https://www.drupal.org/node/2731991">Issue #2731991: Setting required on radios marks all options required</a><br /><a href="https://www.drupal.org/node/994360">Issue #994360: #states cannot disable/enable radios and checkboxes</a><br /><a href="https://www.drupal.org/node/2836364">Issue #2836364: Wrapper attributes are not supported by composite elements, this includes radios, checkboxes, and buttons.</a>'
+    '#default_value': one
+    '#states':
+      invisible:
+        ':input[name="trigger"]':
+          checked: true
+  webform_radios_other:
+    '#type': webform_radios_other
+    '#title': 'Radios other'
+    '#options':
+      one: One
+      two: Two
+      three: Three
+    '#options_display': side_by_side
+    '#default_value': one
+    '#states':
+      invisible:
+        ':input[name="trigger"]':
+          checked: true
+  range:
+    '#type': range
+    '#title': Range
+    '#min': 0
+    '#max': 100
+    '#step': 1
+    '#output': below
+    '#output__field_prefix': $
+    '#output__field_suffix': '.00'
+    '#states':
+      invisible:
+        ':input[name="trigger"]':
+          checked: true
+  webform_rating:
+    '#type': webform_rating
+    '#title': Rating
+    '#states':
+      invisible:
+        ':input[name="trigger"]':
+          checked: true
+  webform_same:
+    '#type': webform_same
+    '#title': 'Billing address is the same as the shipping address'
+    '#default_value': true
+    '#states':
+      invisible:
+        ':input[name="trigger"]':
+          checked: true
+  webform_scale:
+    '#type': webform_scale
+    '#title': Scale
+    '#min': 1
+    '#max': 5
+    '#default_value': 1
+    '#states':
+      invisible:
+        ':input[name="trigger"]':
+          checked: true
+  search:
+    '#type': search
+    '#title': Search
+    '#default_value': Loremipsum
+    '#states':
+      invisible:
+        ':input[name="trigger"]':
+          checked: true
+  select:
+    '#type': select
+    '#title': Select
+    '#options':
+      one: One
+      two: Two
+      three: Three
+    '#description': '<b>Known Issues:</b><br /><a href="https://www.drupal.org/node/1426646">Issue #1426646: "-Select-" option is lost when webform elements uses ''#states''</a><br /><a href="https://www.drupal.org/node/1149078">Issue #1149078: States API doesn''t work with multiple select fields</a><br /><a href="https://www.drupal.org/node/2791741">Issue #2791741: FAPI states: fields aren''t hidden initially when depending on multi-value selection</a>'
+    '#default_value': one
+    '#states':
+      invisible:
+        ':input[name="trigger"]':
+          checked: true
+  webform_select_other:
+    '#type': webform_select_other
+    '#title': 'Select other'
+    '#options':
+      one: One
+      two: Two
+      three: Three
+    '#default_value': one
+    '#states':
+      invisible:
+        ':input[name="trigger"]':
+          checked: true
+  webform_signature:
+    '#type': webform_signature
+    '#title': Signature
+    '#states':
+      invisible:
+        ':input[name="trigger"]':
+          checked: true
+  tableselect:
+    '#type': tableselect
+    '#title': 'Table select'
+    '#options':
+      one: One
+      two: Two
+      three: Three
+    '#default_value':
+      - one
+      - two
+      - three
+    '#states':
+      invisible:
+        ':input[name="trigger"]':
+          checked: true
+  webform_tableselect_sort:
+    '#type': webform_tableselect_sort
+    '#title': 'Tableselect sort'
+    '#options':
+      one: One
+      two: Two
+      three: Three
+    '#default_value':
+      - one
+      - two
+      - three
+    '#states':
+      invisible:
+        ':input[name="trigger"]':
+          checked: true
+  webform_table_sort:
+    '#type': webform_table_sort
+    '#title': 'Table sort'
+    '#options':
+      one: One
+      two: Two
+      three: Three
+    '#default_value':
+      - one
+      - two
+      - three
+    '#states':
+      invisible:
+        ':input[name="trigger"]':
+          checked: true
+  tel:
+    '#type': tel
+    '#title': Telephone
+    '#international': true
+    '#default_value': '+1 212-333-4444'
+    '#states':
+      invisible:
+        ':input[name="trigger"]':
+          checked: true
+  webform_telephone:
+    '#type': webform_telephone
+    '#title': 'Telephone advanced'
+    '#default_value':
+      type: Home
+      phone: '+1 212-333-4444'
+      ext: 0
+    '#states':
+      invisible:
+        ':input[name="trigger"]':
+          checked: true
+  webform_term_checkboxes:
+    '#type': webform_term_checkboxes
+    '#title': 'Term checkboxes'
+    '#vocabulary': second
+    '#default_value':
+      - 161
+      - 101
+      - 177
+    '#states':
+      invisible:
+        ':input[name="trigger"]':
+          checked: true
+  webform_term_select:
+    '#type': webform_term_select
+    '#title': 'Term select'
+    '#vocabulary': second
+    '#default_value': 161
+    '#states':
+      invisible:
+        ':input[name="trigger"]':
+          checked: true
+  webform_terms_of_service:
+    '#type': webform_terms_of_service
+    '#title': 'I agree to the {terms of service}.'
+    '#required': true
+    '#terms_type': slideout
+    '#terms_content': '<em>These are the terms of service.</em>'
+    '#default_value': true
+    '#states':
+      invisible:
+        ':input[name="trigger"]':
+          checked: true
+  textarea:
+    '#type': textarea
+    '#title': Textarea
+    '#rows': 2
+    '#default_value': 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Negat esse eam, inquit, propter se expetendam. Primum Theophrasti, Strato, physicum se voluit; Id mihi magnum videtur. Itaque mihi non satis videmini considerare quod iter sit naturae quaeque progressio. Quare hoc videndum est, possitne nobis hoc ratio philosophorum dare. Est enim tanti philosophi tamque nobilis audacter sua decreta defendere.'
+    '#states':
+      invisible:
+        ':input[name="trigger"]':
+          checked: true
+  textfield:
+    '#type': textfield
+    '#title': 'Text field'
+    '#default_value': Loremipsum
+    '#states':
+      invisible:
+        ':input[name="trigger"]':
+          checked: true
+  text_format:
+    '#type': text_format
+    '#title': 'Text format'
+    '#description': '<b>Known Issues:</b><br /><a href="https://www.drupal.org/node/997826">Issue #997826: #states doesn''t work correctly with type text_format</a><br /><a href="https://www.drupal.org/node/2625128">Issue #2625128: Text format selection stays visible when using editor and a hidden webform state</a><br /><a href="https://www.drupal.org/node/1954968">Issue #1954968: Required CKEditor fields always fail HTML5 validation</a>'
+    '#default_value':
+      value: '<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Negat esse eam, inquit, propter se expetendam. Primum Theophrasti, Strato, physicum se voluit; Id mihi magnum videtur. Itaque mihi non satis videmini considerare quod iter sit naturae quaeque progressio. Quare hoc videndum est, possitne nobis hoc ratio philosophorum dare. Est enim tanti philosophi tamque nobilis audacter sua decreta defendere.</p>'
+    '#states':
+      invisible:
+        ':input[name="trigger"]':
+          checked: true
+  webform_time:
+    '#type': webform_time
+    '#title': Time
+    '#description': '<b>Known Issues:</b><br /><a href="https://www.drupal.org/node/1838234">Issue #1838234: Add jQuery Timepicker for the Time element of the datetime field</a>'
+    '#default_value': '09:00'
+    '#states':
+      invisible:
+        ':input[name="trigger"]':
+          checked: true
+  url:
+    '#type': url
+    '#title': URL
+    '#default_value': 'http://example.com'
+    '#states':
+      invisible:
+        ':input[name="trigger"]':
+          checked: true
+  value:
+    '#type': value
+    '#title': Value
+    '#value': preview
+    '#states':
+      invisible:
+        ':input[name="trigger"]':
+          checked: true
+  webform_variant:
+    '#type': webform_variant
+    '#title': 'Variant [EXPERIMENTAL]'
+    '#states':
+      invisible:
+        ':input[name="trigger"]':
+          checked: true
+  webform_video_file:
+    '#type': webform_video_file
+    '#title': 'Video file'
+    '#states':
+      invisible:
+        ':input[name="trigger"]':
+          checked: true
+
+css: ''
+javascript: ''
+settings:
+  ajax: false
+  ajax_scroll_top: form
+  ajax_progress_type: ''
+  ajax_effect: ''
+  ajax_speed: null
+  page: true
+  page_submit_path: ''
+  page_confirm_path: ''
+  page_theme_name: ''
+  form_title: source_entity_webform
+  form_submit_once: false
+  form_exception_message: ''
+  form_open_message: ''
+  form_close_message: ''
+  form_previous_submissions: true
+  form_confidential: false
+  form_confidential_message: ''
+  form_remote_addr: true
+  form_convert_anonymous: false
+  form_prepopulate: false
+  form_prepopulate_source_entity: false
+  form_prepopulate_source_entity_required: false
+  form_prepopulate_source_entity_type: ''
+  form_reset: false
+  form_disable_autocomplete: false
+  form_novalidate: false
+  form_disable_inline_errors: false
+  form_required: false
+  form_unsaved: false
+  form_disable_back: false
+  form_submit_back: false
+  form_autofocus: false
+  form_details_toggle: false
+  form_access_denied: default
+  form_access_denied_title: ''
+  form_access_denied_message: ''
+  form_access_denied_attributes: {  }
+  form_file_limit: ''
+  share: false
+  share_node: false
+  share_theme_name: ''
+  share_title: true
+  share_page_body_attributes: {  }
+  submission_label: ''
+  submission_log: false
+  submission_views: {  }
+  submission_views_replace: {  }
+  submission_user_columns: {  }
+  submission_user_duplicate: false
+  submission_access_denied: default
+  submission_access_denied_title: ''
+  submission_access_denied_message: ''
+  submission_access_denied_attributes: {  }
+  submission_exception_message: ''
+  submission_locked_message: ''
+  submission_excluded_elements: {  }
+  submission_exclude_empty: false
+  submission_exclude_empty_checkbox: false
+  previous_submission_message: ''
+  previous_submissions_message: ''
+  autofill: false
+  autofill_message: ''
+  autofill_excluded_elements: {  }
+  wizard_progress_bar: true
+  wizard_progress_pages: false
+  wizard_progress_percentage: false
+  wizard_progress_link: false
+  wizard_progress_states: false
+  wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
+  wizard_start_label: ''
+  wizard_preview_link: false
+  wizard_confirmation: true
+  wizard_confirmation_label: ''
+  wizard_track: ''
+  wizard_prev_button_label: ''
+  wizard_next_button_label: ''
+  wizard_toggle: false
+  wizard_toggle_show_label: ''
+  wizard_toggle_hide_label: ''
+  preview: 0
+  preview_label: ''
+  preview_title: ''
+  preview_message: ''
+  preview_attributes: {  }
+  preview_excluded_elements: {  }
+  preview_exclude_empty: true
+  preview_exclude_empty_checkbox: false
+  draft: none
+  draft_multiple: false
+  draft_auto_save: false
+  draft_saved_message: ''
+  draft_loaded_message: ''
+  draft_pending_single_message: ''
+  draft_pending_multiple_message: ''
+  confirmation_type: page
+  confirmation_title: ''
+  confirmation_message: ''
+  confirmation_url: ''
+  confirmation_attributes: {  }
+  confirmation_back: true
+  confirmation_back_label: ''
+  confirmation_back_attributes: {  }
+  confirmation_exclude_query: false
+  confirmation_exclude_token: false
+  confirmation_update: false
+  limit_total: null
+  limit_total_interval: null
+  limit_total_message: ''
+  limit_total_unique: false
+  limit_user: null
+  limit_user_interval: null
+  limit_user_message: ''
+  limit_user_unique: false
+  entity_limit_total: null
+  entity_limit_total_interval: null
+  entity_limit_user: null
+  entity_limit_user_interval: null
+  purge: none
+  purge_days: null
+  results_disabled: true
+  results_disabled_ignore: true
+  results_customize: false
+  token_view: false
+  token_update: false
+  serial_disabled: false
+access:
+  create:
+    roles:
+      - anonymous
+      - authenticated
+    users: {  }
+    permissions: {  }
+  view_any:
+    roles: {  }
+    users: {  }
+    permissions: {  }
+  update_any:
+    roles: {  }
+    users: {  }
+    permissions: {  }
+  delete_any:
+    roles: {  }
+    users: {  }
+    permissions: {  }
+  purge_any:
+    roles: {  }
+    users: {  }
+    permissions: {  }
+  view_own:
+    roles: {  }
+    users: {  }
+    permissions: {  }
+  update_own:
+    roles: {  }
+    users: {  }
+    permissions: {  }
+  delete_own:
+    roles: {  }
+    users: {  }
+    permissions: {  }
+  administer:
+    roles: {  }
+    users: {  }
+    permissions: {  }
+  test:
+    roles: {  }
+    users: {  }
+    permissions: {  }
+  configuration:
+    roles: {  }
+    users: {  }
+    permissions: {  }
+handlers:
+  debug:
+    id: debug
+    label: Debug
+    notes: ''
+    handler_id: debug
+    status: true
+    conditions: {  }
+    weight: 0
+    settings: {  }
+variants: {  }
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_states_client_required.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_states_client_required.yml
new file mode 100644
index 0000000000..53283bbe3a
--- /dev/null
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_states_client_required.yml
@@ -0,0 +1,338 @@
+uuid: null
+langcode: en
+status: open
+dependencies:
+  enforced:
+    module:
+      - webform_test
+open: null
+close: null
+weight: 0
+uid: null
+template: false
+archive: false
+id: test_states_client_required
+title: 'Test: Form API #states required'
+description: 'Test Drupal''s #states API disabled state.'
+category: 'Test: Form API #states'
+elements: |
+  fieldset_states:
+    '#type': fieldset
+    '#title': fieldset_states
+    trigger:
+      '#type': checkbox
+      '#title': trigger
+    managed_file:
+      '#type': managed_file
+      '#title': managed_file
+      '#states':
+        required:
+          ':input[name="trigger"]':
+            checked: true
+    radios:
+      '#type': radios
+      '#title': radios
+      '#options':
+        one: One
+        two: Two
+        three: Three
+      '#states':
+        required:
+          ':input[name="trigger"]':
+            checked: true
+    radios_other:
+      '#type': webform_radios_other
+      '#title': radios_other
+      '#options':
+        one: One
+        two: Two
+        three: Three
+      '#states':
+        required:
+          ':input[name="trigger"]':
+            checked: true
+    checkboxes:
+      '#type': checkboxes
+      '#title': checkboxes
+      '#options':
+        one: One
+        two: Two
+        three: Three
+      '#states':
+        required:
+          ':input[name="trigger"]':
+            checked: true
+    checkboxes_other:
+      '#type': webform_checkboxes_other
+      '#title': checkboxes_other
+      '#options':
+        one: One
+        two: Two
+        three: Three
+      '#states':
+        required:
+          ':input[name="trigger"]':
+            checked: true
+    select_other:
+      '#type': webform_select_other
+      '#title': select_other
+      '#options':
+        one: One
+        two: Two
+        three: Three
+      '#states':
+        required:
+          ':input[name="trigger"]':
+            checked: true
+    select_other_form_element:
+      '#type': webform_select_other
+      '#title': select_other_form_element
+      '#options':
+        one: One
+        two: Two
+        three: Three
+      '#states':
+        required:
+          ':input[name="trigger"]':
+            checked: true
+      '#wrapper_type': form_element
+    fieldset:
+      '#type': fieldset
+      '#title': fieldset
+      '#description': 'This is a fieldset'
+      '#states':
+        required:
+          ':input[name="trigger"]':
+            checked: true
+  fieldset_static:
+    '#type': fieldset
+    '#title': fieldset_static
+    radios_static:
+      '#type': radios
+      '#title': radios_static
+      '#options':
+        one: One
+        two: Two
+        three: Three
+      '#required': true
+    radios_other_static:
+      '#type': webform_radios_other
+      '#title': radios_other_static
+      '#options':
+        one: One
+        two: Two
+        three: Three
+      '#required': true
+    checkboxes_static:
+      '#type': checkboxes
+      '#title': checkboxes_static
+      '#options':
+        one: One
+        two: Two
+        three: Three
+      '#required': true
+    checkboxes_other_static:
+      '#type': webform_checkboxes_other
+      '#title': checkboxes_other_static
+      '#options':
+        one: One
+        two: Two
+        three: Three
+      '#required': true
+    select_other_static:
+      '#type': webform_select_other
+      '#title': select_other_static
+      '#options':
+        one: One
+        two: Two
+        three: Three
+      '#required': true
+
+css: ''
+javascript: ''
+settings:
+  ajax: false
+  ajax_scroll_top: form
+  ajax_progress_type: ''
+  ajax_effect: ''
+  ajax_speed: null
+  page: true
+  page_submit_path: ''
+  page_confirm_path: ''
+  page_theme_name: ''
+  form_title: source_entity_webform
+  form_submit_once: false
+  form_exception_message: ''
+  form_open_message: ''
+  form_close_message: ''
+  form_previous_submissions: true
+  form_confidential: false
+  form_confidential_message: ''
+  form_remote_addr: true
+  form_convert_anonymous: false
+  form_prepopulate: false
+  form_prepopulate_source_entity: false
+  form_prepopulate_source_entity_required: false
+  form_prepopulate_source_entity_type: ''
+  form_reset: false
+  form_disable_autocomplete: false
+  form_novalidate: false
+  form_disable_inline_errors: false
+  form_required: false
+  form_unsaved: false
+  form_disable_back: false
+  form_submit_back: false
+  form_autofocus: false
+  form_details_toggle: false
+  form_access_denied: default
+  form_access_denied_title: ''
+  form_access_denied_message: ''
+  form_access_denied_attributes: {  }
+  form_file_limit: ''
+  share: false
+  share_node: false
+  share_theme_name: ''
+  share_title: true
+  share_page_body_attributes: {  }
+  submission_label: ''
+  submission_log: false
+  submission_views: {  }
+  submission_views_replace: {  }
+  submission_user_columns: {  }
+  submission_user_duplicate: false
+  submission_access_denied: default
+  submission_access_denied_title: ''
+  submission_access_denied_message: ''
+  submission_access_denied_attributes: {  }
+  submission_exception_message: ''
+  submission_locked_message: ''
+  submission_excluded_elements: {  }
+  submission_exclude_empty: false
+  submission_exclude_empty_checkbox: false
+  previous_submission_message: ''
+  previous_submissions_message: ''
+  autofill: false
+  autofill_message: ''
+  autofill_excluded_elements: {  }
+  wizard_progress_bar: true
+  wizard_progress_pages: false
+  wizard_progress_percentage: false
+  wizard_progress_link: false
+  wizard_progress_states: false
+  wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
+  wizard_start_label: ''
+  wizard_preview_link: false
+  wizard_confirmation: true
+  wizard_confirmation_label: ''
+  wizard_track: ''
+  wizard_prev_button_label: ''
+  wizard_next_button_label: ''
+  wizard_toggle: false
+  wizard_toggle_show_label: ''
+  wizard_toggle_hide_label: ''
+  preview: 0
+  preview_label: ''
+  preview_title: ''
+  preview_message: ''
+  preview_attributes: {  }
+  preview_excluded_elements: {  }
+  preview_exclude_empty: true
+  preview_exclude_empty_checkbox: false
+  draft: none
+  draft_multiple: false
+  draft_auto_save: false
+  draft_saved_message: ''
+  draft_loaded_message: ''
+  draft_pending_single_message: ''
+  draft_pending_multiple_message: ''
+  confirmation_type: page
+  confirmation_title: ''
+  confirmation_message: ''
+  confirmation_url: ''
+  confirmation_attributes: {  }
+  confirmation_back: true
+  confirmation_back_label: ''
+  confirmation_back_attributes: {  }
+  confirmation_exclude_query: false
+  confirmation_exclude_token: false
+  confirmation_update: false
+  limit_total: null
+  limit_total_interval: null
+  limit_total_message: ''
+  limit_total_unique: false
+  limit_user: null
+  limit_user_interval: null
+  limit_user_message: ''
+  limit_user_unique: false
+  entity_limit_total: null
+  entity_limit_total_interval: null
+  entity_limit_user: null
+  entity_limit_user_interval: null
+  purge: none
+  purge_days: null
+  results_disabled: true
+  results_disabled_ignore: true
+  results_customize: false
+  token_view: false
+  token_update: false
+  serial_disabled: false
+access:
+  create:
+    roles:
+      - anonymous
+      - authenticated
+    users: {  }
+    permissions: {  }
+  view_any:
+    roles: {  }
+    users: {  }
+    permissions: {  }
+  update_any:
+    roles: {  }
+    users: {  }
+    permissions: {  }
+  delete_any:
+    roles: {  }
+    users: {  }
+    permissions: {  }
+  purge_any:
+    roles: {  }
+    users: {  }
+    permissions: {  }
+  view_own:
+    roles: {  }
+    users: {  }
+    permissions: {  }
+  update_own:
+    roles: {  }
+    users: {  }
+    permissions: {  }
+  delete_own:
+    roles: {  }
+    users: {  }
+    permissions: {  }
+  administer:
+    roles: {  }
+    users: {  }
+    permissions: {  }
+  test:
+    roles: {  }
+    users: {  }
+    permissions: {  }
+  configuration:
+    roles: {  }
+    users: {  }
+    permissions: {  }
+handlers:
+  debug:
+    id: debug
+    label: Debug
+    notes: ''
+    handler_id: debug
+    status: true
+    conditions: {  }
+    weight: 0
+    settings: {  }
+variants: {  }
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_states_client_visible.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_states_client_visible.yml
new file mode 100644
index 0000000000..99a0776074
--- /dev/null
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_states_client_visible.yml
@@ -0,0 +1,1248 @@
+uuid: null
+langcode: en
+status: open
+dependencies:
+  enforced:
+    module:
+      - webform_test
+open: null
+close: null
+weight: 0
+uid: null
+template: false
+archive: false
+id: test_states_client_visible
+title: 'Test: Form API #states visible and required'
+description: 'Test Drupal''s #states API visible states.'
+category: 'Test: Form API #states'
+elements: |
+  trigger:
+    '#type': checkbox
+    '#title': 'Displays and require elements'
+  container:
+    '#type': container
+    '#title': Container
+    '#states':
+      visible:
+        ':input[name="trigger"]':
+          checked: true
+      required:
+        ':input[name="trigger"]':
+          checked: true
+  details:
+    '#type': details
+    '#title': Details
+    '#description': '<b>Known Issues:</b><br /><a href="https://www.drupal.org/node/2348851">Issue #2348851: Regression: Allow HTML tags inside detail summary</a>'
+    '#states':
+      visible:
+        ':input[name="trigger"]':
+          checked: true
+      required:
+        ':input[name="trigger"]':
+          checked: true
+  fieldset:
+    '#type': fieldset
+    '#title': Fieldset
+    '#states':
+      visible:
+        ':input[name="trigger"]':
+          checked: true
+      required:
+        ':input[name="trigger"]':
+          checked: true
+  webform_section:
+    '#type': webform_section
+    '#title': Section
+    '#states':
+      visible:
+        ':input[name="trigger"]':
+          checked: true
+      required:
+        ':input[name="trigger"]':
+          checked: true
+  webform_address:
+    '#type': webform_address
+    '#title': 'Basic address'
+    '#default_value':
+      address: '10 Main Street'
+      address_2: '10 Main Street'
+      city: Springfield
+      state_province: Alabama
+      postal_code: '11111'
+      country: Afghanistan
+    '#states':
+      visible:
+        ':input[name="trigger"]':
+          checked: true
+      required:
+        ':input[name="trigger"]':
+          checked: true
+  address:
+    '#type': address
+    '#title': 'Advanced address'
+    '#default_value':
+      given_name: John
+      family_name: Smith
+      organization: 'Google Inc.'
+      address_line1: '1098 Alta Ave'
+      postal_code: '94043'
+      locality: 'Mountain View'
+      administrative_area: CA
+      country_code: US
+      langcode: en
+    '#states':
+      visible:
+        ':input[name="trigger"]':
+          checked: true
+      required:
+        ':input[name="trigger"]':
+          checked: true
+  processed_text:
+    '#type': processed_text
+    '#title': 'Advanced HTML/Text'
+    '#states':
+      visible:
+        ':input[name="trigger"]':
+          checked: true
+      required:
+        ':input[name="trigger"]':
+          checked: true
+  'webform_entity_print_attachment:pdf':
+    '#type': webform_entity_print_attachment
+    '#title': 'Attachment PDF'
+    '#default_value': Loremipsum
+    '#states':
+      visible:
+        ':input[name="trigger"]':
+          checked: true
+      required:
+        ':input[name="trigger"]':
+          checked: true
+  webform_attachment_token:
+    '#type': webform_attachment_token
+    '#title': 'Attachment token'
+    '#states':
+      visible:
+        ':input[name="trigger"]':
+          checked: true
+      required:
+        ':input[name="trigger"]':
+          checked: true
+  webform_attachment_twig:
+    '#type': webform_attachment_twig
+    '#title': 'Attachment Twig'
+    '#states':
+      visible:
+        ':input[name="trigger"]':
+          checked: true
+      required:
+        ':input[name="trigger"]':
+          checked: true
+  webform_attachment_url:
+    '#type': webform_attachment_url
+    '#title': 'Attachment URL'
+    '#states':
+      visible:
+        ':input[name="trigger"]':
+          checked: true
+      required:
+        ':input[name="trigger"]':
+          checked: true
+  webform_audio_file:
+    '#type': webform_audio_file
+    '#title': 'Audio file'
+    '#states':
+      visible:
+        ':input[name="trigger"]':
+          checked: true
+      required:
+        ':input[name="trigger"]':
+          checked: true
+  webform_autocomplete:
+    '#type': webform_autocomplete
+    '#title': Autocomplete
+    '#default_value': Loremipsum
+    '#states':
+      visible:
+        ':input[name="trigger"]':
+          checked: true
+      required:
+        ':input[name="trigger"]':
+          checked: true
+  webform_markup:
+    '#type': webform_markup
+    '#title': 'Basic HTML'
+    '#description': '<b>Known Issues:</b><br /><a href="https://www.drupal.org/node/2700667">Issue #2700667: Notice: Undefined index: #type in drupal_process_states()</a>'
+    '#states':
+      visible:
+        ':input[name="trigger"]':
+          checked: true
+      required:
+        ':input[name="trigger"]':
+          checked: true
+  checkbox:
+    '#type': checkbox
+    '#title': Checkbox
+    '#default_value': true
+    '#states':
+      visible:
+        ':input[name="trigger"]':
+          checked: true
+      required:
+        ':input[name="trigger"]':
+          checked: true
+  checkboxes:
+    '#type': checkboxes
+    '#title': Checkboxes
+    '#options':
+      one: One
+      two: Two
+      three: Three
+    '#options_display': side_by_side
+    '#description': '<b>Known Issues:</b><br /><a href="https://www.drupal.org/node/994360">Issue #994360: #states cannot disable/enable radios and checkboxes</a><br /><a href="https://www.drupal.org/node/2836364">Issue #2836364: Wrapper attributes are not supported by composite elements, this includes radios, checkboxes, and buttons.</a>'
+    '#default_value':
+      - one
+      - two
+      - three
+    '#states':
+      visible:
+        ':input[name="trigger"]':
+          checked: true
+      required:
+        ':input[name="trigger"]':
+          checked: true
+  webform_checkboxes_other:
+    '#type': webform_checkboxes_other
+    '#title': 'Checkboxes other'
+    '#options':
+      one: One
+      two: Two
+      three: Three
+    '#options_display': side_by_side
+    '#default_value':
+      - one
+      - two
+      - three
+    '#states':
+      visible:
+        ':input[name="trigger"]':
+          checked: true
+      required:
+        ':input[name="trigger"]':
+          checked: true
+  webform_codemirror:
+    '#type': webform_codemirror
+    '#title': CodeMirror
+    '#mode': yaml
+    '#default_value': 'message: ''Hello World'''
+    '#states':
+      visible:
+        ':input[name="trigger"]':
+          checked: true
+      required:
+        ':input[name="trigger"]':
+          checked: true
+  color:
+    '#type': color
+    '#title': Color
+    '#default_value': '#ffffcc'
+    '#states':
+      visible:
+        ':input[name="trigger"]':
+          checked: true
+      required:
+        ':input[name="trigger"]':
+          checked: true
+  webform_computed_token:
+    '#type': webform_computed_token
+    '#title': 'Computed token'
+    '#template': 'This is a Computed token value.'
+    '#states':
+      visible:
+        ':input[name="trigger"]':
+          checked: true
+      required:
+        ':input[name="trigger"]':
+          checked: true
+  webform_computed_twig:
+    '#type': webform_computed_twig
+    '#title': 'Computed Twig'
+    '#template': 'This is a Computed Twig value.'
+    '#states':
+      visible:
+        ':input[name="trigger"]':
+          checked: true
+      required:
+        ':input[name="trigger"]':
+          checked: true
+  webform_contact:
+    '#type': webform_contact
+    '#title': Contact
+    '#default_value':
+      name: Loremipsum
+      company: Loremipsum
+      email: example@example.com
+      phone: 123-456-7890
+      address: '10 Main Street'
+      address_2: '10 Main Street'
+      city: Springfield
+      state_province: Alabama
+      postal_code: '11111'
+      country: Afghanistan
+    '#states':
+      visible:
+        ':input[name="trigger"]':
+          checked: true
+      required:
+        ':input[name="trigger"]':
+          checked: true
+  webform_custom_composite:
+    '#type': webform_custom_composite
+    '#title': 'Custom composite'
+    '#element':
+      name:
+        '#type': textfield
+        '#title': Name
+        '#title_display': invisible
+      gender:
+        '#type': select
+        '#title': Gender
+        '#title_display': invisible
+        '#options':
+          Male: Male
+          Female: Female
+    '#default_value':
+      - name: Loremipsum
+        gender: Male
+      - name: Loremipsum
+        gender: Male
+      - name: Loremipsum
+        gender: Male
+    '#states':
+      visible:
+        ':input[name="trigger"]':
+          checked: true
+      required:
+        ':input[name="trigger"]':
+          checked: true
+  date:
+    '#type': date
+    '#title': Date
+    '#default_value': '2037-02-02T21:33:13-0500'
+    '#states':
+      visible:
+        ':input[name="trigger"]':
+          checked: true
+      required:
+        ':input[name="trigger"]':
+          checked: true
+  datetime:
+    '#type': datetime
+    '#title': Date/time
+    '#description': '<b>Known Issues:</b><br /><a href="https://www.drupal.org/node/2419131">Issue #2419131: #states attribute does not work on #type datetime</a>'
+    '#default_value': '2032-02-12T16:45:54-0500'
+    '#states':
+      visible:
+        ':input[name="trigger"]':
+          checked: true
+      required:
+        ':input[name="trigger"]':
+          checked: true
+  datelist:
+    '#type': datelist
+    '#title': 'Date list'
+    '#default_value': '2020-02-27T14:56:48-0500'
+    '#states':
+      visible:
+        ':input[name="trigger"]':
+          checked: true
+      required:
+        ':input[name="trigger"]':
+          checked: true
+  webform_document_file:
+    '#type': webform_document_file
+    '#title': 'Document file'
+    '#states':
+      visible:
+        ':input[name="trigger"]':
+          checked: true
+      required:
+        ':input[name="trigger"]':
+          checked: true
+  email:
+    '#type': email
+    '#title': Email
+    '#default_value': example@example.com
+    '#states':
+      visible:
+        ':input[name="trigger"]':
+          checked: true
+      required:
+        ':input[name="trigger"]':
+          checked: true
+  webform_email_confirm:
+    '#type': webform_email_confirm
+    '#title': 'Email confirm'
+    '#default_value': example@example.com
+    '#states':
+      visible:
+        ':input[name="trigger"]':
+          checked: true
+      required:
+        ':input[name="trigger"]':
+          checked: true
+  webform_email_multiple:
+    '#type': webform_email_multiple
+    '#title': 'Email multiple'
+    '#default_value': 'example@example.com, test@test.com, random@random.com'
+    '#states':
+      visible:
+        ':input[name="trigger"]':
+          checked: true
+      required:
+        ':input[name="trigger"]':
+          checked: true
+  entity_autocomplete:
+    '#type': entity_autocomplete
+    '#title': 'Entity autocomplete'
+    '#target_type': user
+    '#selection_handler': 'default:user'
+    '#selection_settings':
+      include_anonymous: true
+    '#description': '<b>Known Issues:</b><br /><a href="https://www.drupal.org/node/2826451">Issue #2826451: TermSelection returning HTML characters in select list</a>'
+    '#default_value': 10
+    '#states':
+      visible:
+        ':input[name="trigger"]':
+          checked: true
+      required:
+        ':input[name="trigger"]':
+          checked: true
+  webform_entity_checkboxes:
+    '#type': webform_entity_checkboxes
+    '#title': 'Entity checkboxes'
+    '#options_display': side_by_side
+    '#target_type': user
+    '#selection_handler': 'default:user'
+    '#selection_settings':
+      include_anonymous: true
+    '#options':
+      1: Administrator
+      0: Anonymous
+    '#default_value':
+      - 1
+    '#states':
+      visible:
+        ':input[name="trigger"]':
+          checked: true
+      required:
+        ':input[name="trigger"]':
+          checked: true
+  webform_entity_radios:
+    '#type': webform_entity_radios
+    '#title': 'Entity radios'
+    '#options_display': side_by_side
+    '#target_type': user
+    '#selection_handler': 'default:user'
+    '#selection_settings':
+      include_anonymous: true
+    '#options':
+      1: Administrator
+      0: Anonymous
+    '#default_value': 1
+    '#states':
+      visible:
+        ':input[name="trigger"]':
+          checked: true
+      required:
+        ':input[name="trigger"]':
+          checked: true
+  webform_entity_select:
+    '#type': webform_entity_select
+    '#title': 'Entity select'
+    '#target_type': user
+    '#selection_handler': 'default:user'
+    '#selection_settings':
+      include_anonymous: true
+    '#options':
+      1: Administrator
+      0: Anonymous
+    '#default_value': 1
+    '#states':
+      visible:
+        ':input[name="trigger"]':
+          checked: true
+      required:
+        ':input[name="trigger"]':
+          checked: true
+  managed_file:
+    '#type': managed_file
+    '#title': File
+    '#description': '<b>Known Issues:</b><br /><a href="https://www.drupal.org/node/2705471">Issue #2705471: Webform states managed file fields</a><br /><a href="https://www.drupal.org/node/2113931">Issue #2113931: File Field design update</a><br /><a href="https://www.drupal.org/node/2346893">Issue #2346893: Duplicate Ajax wrapper around a file field</a><br /><a href="https://www.drupal.org/node/2482783">Issue #2482783: File upload errors not set or shown correctly</a>'
+    '#states':
+      visible:
+        ':input[name="trigger"]':
+          checked: true
+      required:
+        ':input[name="trigger"]':
+          checked: true
+  webform_horizontal_rule:
+    '#type': webform_horizontal_rule
+    '#attributes':
+      class:
+        - webform-horizontal-rule--dotted
+        - webform-horizontal-rule--thick
+    '#states':
+      visible:
+        ':input[name="trigger"]':
+          checked: true
+      required:
+        ':input[name="trigger"]':
+          checked: true
+  webform_image_file:
+    '#type': webform_image_file
+    '#title': 'Image file'
+    '#states':
+      visible:
+        ':input[name="trigger"]':
+          checked: true
+      required:
+        ':input[name="trigger"]':
+          checked: true
+  webform_image_select:
+    '#type': webform_image_select
+    '#title': 'Image select'
+    '#show_label': true
+    '#images':
+      bear_1:
+        text: 'Bear 1'
+        src: 'https://www.placebear.com/80/100'
+      bear_2:
+        text: 'Bear 2'
+        src: 'https://www.placebear.com/100/100'
+      bear_3:
+        text: 'Bear 3'
+        src: 'https://www.placebear.com/120/100'
+    '#default_value': Loremipsum
+    '#states':
+      visible:
+        ':input[name="trigger"]':
+          checked: true
+      required:
+        ':input[name="trigger"]':
+          checked: true
+  item:
+    '#type': item
+    '#title': Item
+    '#markup': '{markup}'
+    '#field_prefix': '{field_prefix}'
+    '#field_suffix': '{field_suffix}'
+    '#description': '<b>Known Issues:</b><br /><a href="https://www.drupal.org/node/783438">Issue #783438: #states doesn''t work for #type item</a>'
+    '#states':
+      visible:
+        ':input[name="trigger"]':
+          checked: true
+      required:
+        ':input[name="trigger"]':
+          checked: true
+  label:
+    '#type': label
+    '#title': Label
+    '#states':
+      visible:
+        ':input[name="trigger"]':
+          checked: true
+      required:
+        ':input[name="trigger"]':
+          checked: true
+  language_select:
+    '#type': language_select
+    '#title': 'Language select'
+    '#default_value': en
+    '#states':
+      visible:
+        ':input[name="trigger"]':
+          checked: true
+      required:
+        ':input[name="trigger"]':
+          checked: true
+  webform_likert:
+    '#type': webform_likert
+    '#title': Likert
+    '#questions':
+      q1: 'Please answer question 1?'
+      q2: 'How about now answering question 2?'
+      q3: 'Finally, here is question 3?'
+    '#answers':
+      1: '1'
+      2: '2'
+      3: '3'
+    '#default_value':
+      q1: 1
+      q2: 1
+      q3: 1
+    '#states':
+      visible:
+        ':input[name="trigger"]':
+          checked: true
+      required:
+        ':input[name="trigger"]':
+          checked: true
+  webform_link:
+    '#type': webform_link
+    '#title': Link
+    '#default_value':
+      title: Loremipsum
+      url: 'http://example.com'
+    '#states':
+      visible:
+        ':input[name="trigger"]':
+          checked: true
+      required:
+        ':input[name="trigger"]':
+          checked: true
+  webform_location_places:
+    '#type': webform_location_places
+    '#title': 'Location (Algolia Places)'
+    '#default_value':
+      value: '1600 Pennsylvania Avenue, Washington, District of Columbia, United States of America'
+      lat: '38.8635'
+      lng: '-76.946'
+      name: '1600 Pennsylvania Avenue'
+      city: Washington
+      country: 'United States of America'
+      country_code: us
+      administrative: 'District of Columbia'
+      county: 'Prince George''s County'
+      suburb: ''
+      postcode: '20020'
+    '#states':
+      visible:
+        ':input[name="trigger"]':
+          checked: true
+      required:
+        ':input[name="trigger"]':
+          checked: true
+  webform_mapping:
+    '#type': webform_mapping
+    '#title': Mapping
+    '#source':
+      one: One
+      two: Two
+      three: Three
+    '#destination':
+      four: Four
+      five: Five
+      six: Six
+    '#default_value':
+      one: four
+      two: four
+      three: four
+    '#states':
+      visible:
+        ':input[name="trigger"]':
+          checked: true
+      required:
+        ':input[name="trigger"]':
+          checked: true
+  webform_message:
+    '#type': webform_message
+    '#title': Message
+    '#message_type': warning
+    '#message_message': 'This is a <strong>warning</strong> message.'
+    '#description': '<b>Known Issues:</b><br /><a href="https://www.drupal.org/node/77245">Issue #77245: A place for JavaScript status messages</a>'
+    '#states':
+      visible:
+        ':input[name="trigger"]':
+          checked: true
+      required:
+        ':input[name="trigger"]':
+          checked: true
+  webform_name:
+    '#type': webform_name
+    '#title': Name
+    '#default_value':
+      title: Miss
+      first: Loremipsum
+      middle: Loremipsum
+      last: Loremipsum
+      suffix: Loremipsum
+      degree: Loremipsum
+    '#states':
+      visible:
+        ':input[name="trigger"]':
+          checked: true
+      required:
+        ':input[name="trigger"]':
+          checked: true
+  number:
+    '#type': number
+    '#title': Number
+    '#min': 0
+    '#max': 10
+    '#step': 1
+    '#states':
+      visible:
+        ':input[name="trigger"]':
+          checked: true
+      required:
+        ':input[name="trigger"]':
+          checked: true
+  password:
+    '#type': password
+    '#title': Password
+    '#default_value': Loremipsum
+    '#states':
+      visible:
+        ':input[name="trigger"]':
+          checked: true
+      required:
+        ':input[name="trigger"]':
+          checked: true
+  password_confirm:
+    '#type': password_confirm
+    '#title': 'Password confirm'
+    '#description': '<b>Known Issues:</b><br /><a href="https://www.drupal.org/node/1427838">Issue #1427838: password and password_confirm children do not pick up #states or #attributes</a>'
+    '#default_value': Loremipsum
+    '#states':
+      visible:
+        ':input[name="trigger"]':
+          checked: true
+      required:
+        ':input[name="trigger"]':
+          checked: true
+  radios:
+    '#type': radios
+    '#title': Radios
+    '#options':
+      one: One
+      two: Two
+      three: Three
+    '#options_display': side_by_side
+    '#description': '<b>Known Issues:</b><br /><a href="https://www.drupal.org/node/2731991">Issue #2731991: Setting required on radios marks all options required</a><br /><a href="https://www.drupal.org/node/994360">Issue #994360: #states cannot disable/enable radios and checkboxes</a><br /><a href="https://www.drupal.org/node/2836364">Issue #2836364: Wrapper attributes are not supported by composite elements, this includes radios, checkboxes, and buttons.</a>'
+    '#default_value': one
+    '#states':
+      visible:
+        ':input[name="trigger"]':
+          checked: true
+      required:
+        ':input[name="trigger"]':
+          checked: true
+  webform_radios_other:
+    '#type': webform_radios_other
+    '#title': 'Radios other'
+    '#options':
+      one: One
+      two: Two
+      three: Three
+    '#options_display': side_by_side
+    '#default_value': one
+    '#states':
+      visible:
+        ':input[name="trigger"]':
+          checked: true
+      required:
+        ':input[name="trigger"]':
+          checked: true
+  range:
+    '#type': range
+    '#title': Range
+    '#min': 0
+    '#max': 100
+    '#step': 1
+    '#output': below
+    '#output__field_prefix': $
+    '#output__field_suffix': '.00'
+    '#states':
+      visible:
+        ':input[name="trigger"]':
+          checked: true
+      required:
+        ':input[name="trigger"]':
+          checked: true
+  webform_rating:
+    '#type': webform_rating
+    '#title': Rating
+    '#states':
+      visible:
+        ':input[name="trigger"]':
+          checked: true
+      required:
+        ':input[name="trigger"]':
+          checked: true
+  webform_same:
+    '#type': webform_same
+    '#title': 'Billing address is the same as the shipping address'
+    '#default_value': true
+    '#states':
+      visible:
+        ':input[name="trigger"]':
+          checked: true
+      required:
+        ':input[name="trigger"]':
+          checked: true
+  webform_scale:
+    '#type': webform_scale
+    '#title': Scale
+    '#min': 1
+    '#max': 5
+    '#default_value': 1
+    '#states':
+      visible:
+        ':input[name="trigger"]':
+          checked: true
+      required:
+        ':input[name="trigger"]':
+          checked: true
+  search:
+    '#type': search
+    '#title': Search
+    '#default_value': Loremipsum
+    '#states':
+      visible:
+        ':input[name="trigger"]':
+          checked: true
+      required:
+        ':input[name="trigger"]':
+          checked: true
+  select:
+    '#type': select
+    '#title': Select
+    '#options':
+      one: One
+      two: Two
+      three: Three
+    '#description': '<b>Known Issues:</b><br /><a href="https://www.drupal.org/node/1426646">Issue #1426646: "-Select-" option is lost when webform elements uses ''#states''</a><br /><a href="https://www.drupal.org/node/1149078">Issue #1149078: States API doesn''t work with multiple select fields</a><br /><a href="https://www.drupal.org/node/2791741">Issue #2791741: FAPI states: fields aren''t hidden initially when depending on multi-value selection</a>'
+    '#default_value': one
+    '#states':
+      visible:
+        ':input[name="trigger"]':
+          checked: true
+      required:
+        ':input[name="trigger"]':
+          checked: true
+  webform_select_other:
+    '#type': webform_select_other
+    '#title': 'Select other'
+    '#options':
+      one: One
+      two: Two
+      three: Three
+    '#default_value': one
+    '#states':
+      visible:
+        ':input[name="trigger"]':
+          checked: true
+      required:
+        ':input[name="trigger"]':
+          checked: true
+  webform_signature:
+    '#type': webform_signature
+    '#title': Signature
+    '#states':
+      visible:
+        ':input[name="trigger"]':
+          checked: true
+      required:
+        ':input[name="trigger"]':
+          checked: true
+  tableselect:
+    '#type': tableselect
+    '#title': 'Table select'
+    '#options':
+      one: One
+      two: Two
+      three: Three
+    '#default_value':
+      - one
+      - two
+      - three
+    '#states':
+      visible:
+        ':input[name="trigger"]':
+          checked: true
+      required:
+        ':input[name="trigger"]':
+          checked: true
+  webform_tableselect_sort:
+    '#type': webform_tableselect_sort
+    '#title': 'Tableselect sort'
+    '#options':
+      one: One
+      two: Two
+      three: Three
+    '#default_value':
+      - one
+      - two
+      - three
+    '#states':
+      visible:
+        ':input[name="trigger"]':
+          checked: true
+      required:
+        ':input[name="trigger"]':
+          checked: true
+  webform_table_sort:
+    '#type': webform_table_sort
+    '#title': 'Table sort'
+    '#options':
+      one: One
+      two: Two
+      three: Three
+    '#default_value':
+      - one
+      - two
+      - three
+    '#states':
+      visible:
+        ':input[name="trigger"]':
+          checked: true
+      required:
+        ':input[name="trigger"]':
+          checked: true
+  tel:
+    '#type': tel
+    '#title': Telephone
+    '#international': true
+    '#default_value': '+1 212-333-4444'
+    '#states':
+      visible:
+        ':input[name="trigger"]':
+          checked: true
+      required:
+        ':input[name="trigger"]':
+          checked: true
+  webform_telephone:
+    '#type': webform_telephone
+    '#title': 'Telephone advanced'
+    '#default_value':
+      type: Home
+      phone: '+1 212-333-4444'
+      ext: 0
+    '#states':
+      visible:
+        ':input[name="trigger"]':
+          checked: true
+      required:
+        ':input[name="trigger"]':
+          checked: true
+  webform_term_checkboxes:
+    '#type': webform_term_checkboxes
+    '#title': 'Term checkboxes'
+    '#vocabulary': second
+    '#default_value':
+      - 161
+      - 101
+      - 177
+    '#states':
+      visible:
+        ':input[name="trigger"]':
+          checked: true
+      required:
+        ':input[name="trigger"]':
+          checked: true
+  webform_term_select:
+    '#type': webform_term_select
+    '#title': 'Term select'
+    '#vocabulary': second
+    '#default_value': 161
+    '#states':
+      visible:
+        ':input[name="trigger"]':
+          checked: true
+      required:
+        ':input[name="trigger"]':
+          checked: true
+  webform_terms_of_service:
+    '#type': webform_terms_of_service
+    '#title': 'I agree to the {terms of service}.'
+    '#required': true
+    '#terms_type': slideout
+    '#terms_content': '<em>These are the terms of service.</em>'
+    '#default_value': true
+    '#states':
+      visible:
+        ':input[name="trigger"]':
+          checked: true
+      required:
+        ':input[name="trigger"]':
+          checked: true
+  textarea:
+    '#type': textarea
+    '#title': Textarea
+    '#rows': 2
+    '#default_value': 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Negat esse eam, inquit, propter se expetendam. Primum Theophrasti, Strato, physicum se voluit; Id mihi magnum videtur. Itaque mihi non satis videmini considerare quod iter sit naturae quaeque progressio. Quare hoc videndum est, possitne nobis hoc ratio philosophorum dare. Est enim tanti philosophi tamque nobilis audacter sua decreta defendere.'
+    '#states':
+      visible:
+        ':input[name="trigger"]':
+          checked: true
+      required:
+        ':input[name="trigger"]':
+          checked: true
+  textfield:
+    '#type': textfield
+    '#title': 'Text field'
+    '#default_value': Loremipsum
+    '#states':
+      visible:
+        ':input[name="trigger"]':
+          checked: true
+      required:
+        ':input[name="trigger"]':
+          checked: true
+  text_format:
+    '#type': text_format
+    '#title': 'Text format'
+    '#description': '<b>Known Issues:</b><br /><a href="https://www.drupal.org/node/997826">Issue #997826: #states doesn''t work correctly with type text_format</a><br /><a href="https://www.drupal.org/node/2625128">Issue #2625128: Text format selection stays visible when using editor and a hidden webform state</a><br /><a href="https://www.drupal.org/node/1954968">Issue #1954968: Required CKEditor fields always fail HTML5 validation</a>'
+    '#default_value':
+      value: '<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Negat esse eam, inquit, propter se expetendam. Primum Theophrasti, Strato, physicum se voluit; Id mihi magnum videtur. Itaque mihi non satis videmini considerare quod iter sit naturae quaeque progressio. Quare hoc videndum est, possitne nobis hoc ratio philosophorum dare. Est enim tanti philosophi tamque nobilis audacter sua decreta defendere.</p>'
+    '#states':
+      visible:
+        ':input[name="trigger"]':
+          checked: true
+      required:
+        ':input[name="trigger"]':
+          checked: true
+  webform_time:
+    '#type': webform_time
+    '#title': Time
+    '#description': '<b>Known Issues:</b><br /><a href="https://www.drupal.org/node/1838234">Issue #1838234: Add jQuery Timepicker for the Time element of the datetime field</a>'
+    '#default_value': '09:00'
+    '#states':
+      visible:
+        ':input[name="trigger"]':
+          checked: true
+      required:
+        ':input[name="trigger"]':
+          checked: true
+  url:
+    '#type': url
+    '#title': URL
+    '#default_value': 'http://example.com'
+    '#states':
+      visible:
+        ':input[name="trigger"]':
+          checked: true
+      required:
+        ':input[name="trigger"]':
+          checked: true
+  value:
+    '#type': value
+    '#title': Value
+    '#value': preview
+    '#states':
+      visible:
+        ':input[name="trigger"]':
+          checked: true
+      required:
+        ':input[name="trigger"]':
+          checked: true
+  webform_variant:
+    '#type': webform_variant
+    '#title': 'Variant [EXPERIMENTAL]'
+    '#states':
+      visible:
+        ':input[name="trigger"]':
+          checked: true
+      required:
+        ':input[name="trigger"]':
+          checked: true
+  webform_video_file:
+    '#type': webform_video_file
+    '#title': 'Video file'
+    '#states':
+      visible:
+        ':input[name="trigger"]':
+          checked: true
+      required:
+        ':input[name="trigger"]':
+          checked: true
+
+css: ''
+javascript: ''
+settings:
+  ajax: false
+  ajax_scroll_top: form
+  ajax_progress_type: ''
+  ajax_effect: ''
+  ajax_speed: null
+  page: true
+  page_submit_path: ''
+  page_confirm_path: ''
+  page_theme_name: ''
+  form_title: source_entity_webform
+  form_submit_once: false
+  form_exception_message: ''
+  form_open_message: ''
+  form_close_message: ''
+  form_previous_submissions: true
+  form_confidential: false
+  form_confidential_message: ''
+  form_remote_addr: true
+  form_convert_anonymous: false
+  form_prepopulate: false
+  form_prepopulate_source_entity: false
+  form_prepopulate_source_entity_required: false
+  form_prepopulate_source_entity_type: ''
+  form_reset: false
+  form_disable_autocomplete: false
+  form_novalidate: false
+  form_disable_inline_errors: false
+  form_required: false
+  form_unsaved: false
+  form_disable_back: false
+  form_submit_back: false
+  form_autofocus: false
+  form_details_toggle: false
+  form_access_denied: default
+  form_access_denied_title: ''
+  form_access_denied_message: ''
+  form_access_denied_attributes: {  }
+  form_file_limit: ''
+  share: false
+  share_node: false
+  share_theme_name: ''
+  share_title: true
+  share_page_body_attributes: {  }
+  submission_label: ''
+  submission_log: false
+  submission_views: {  }
+  submission_views_replace: {  }
+  submission_user_columns: {  }
+  submission_user_duplicate: false
+  submission_access_denied: default
+  submission_access_denied_title: ''
+  submission_access_denied_message: ''
+  submission_access_denied_attributes: {  }
+  submission_exception_message: ''
+  submission_locked_message: ''
+  submission_excluded_elements: {  }
+  submission_exclude_empty: false
+  submission_exclude_empty_checkbox: false
+  previous_submission_message: ''
+  previous_submissions_message: ''
+  autofill: false
+  autofill_message: ''
+  autofill_excluded_elements: {  }
+  wizard_progress_bar: true
+  wizard_progress_pages: false
+  wizard_progress_percentage: false
+  wizard_progress_link: false
+  wizard_progress_states: false
+  wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
+  wizard_start_label: ''
+  wizard_preview_link: false
+  wizard_confirmation: true
+  wizard_confirmation_label: ''
+  wizard_track: ''
+  wizard_prev_button_label: ''
+  wizard_next_button_label: ''
+  wizard_toggle: false
+  wizard_toggle_show_label: ''
+  wizard_toggle_hide_label: ''
+  preview: 0
+  preview_label: ''
+  preview_title: ''
+  preview_message: ''
+  preview_attributes: {  }
+  preview_excluded_elements: {  }
+  preview_exclude_empty: true
+  preview_exclude_empty_checkbox: false
+  draft: none
+  draft_multiple: false
+  draft_auto_save: false
+  draft_saved_message: ''
+  draft_loaded_message: ''
+  draft_pending_single_message: ''
+  draft_pending_multiple_message: ''
+  confirmation_type: page
+  confirmation_title: ''
+  confirmation_message: ''
+  confirmation_url: ''
+  confirmation_attributes: {  }
+  confirmation_back: true
+  confirmation_back_label: ''
+  confirmation_back_attributes: {  }
+  confirmation_exclude_query: false
+  confirmation_exclude_token: false
+  confirmation_update: false
+  limit_total: null
+  limit_total_interval: null
+  limit_total_message: ''
+  limit_total_unique: false
+  limit_user: null
+  limit_user_interval: null
+  limit_user_message: ''
+  limit_user_unique: false
+  entity_limit_total: null
+  entity_limit_total_interval: null
+  entity_limit_user: null
+  entity_limit_user_interval: null
+  purge: none
+  purge_days: null
+  results_disabled: true
+  results_disabled_ignore: true
+  results_customize: false
+  token_view: false
+  token_update: false
+  serial_disabled: false
+access:
+  create:
+    roles:
+      - anonymous
+      - authenticated
+    users: {  }
+    permissions: {  }
+  view_any:
+    roles: {  }
+    users: {  }
+    permissions: {  }
+  update_any:
+    roles: {  }
+    users: {  }
+    permissions: {  }
+  delete_any:
+    roles: {  }
+    users: {  }
+    permissions: {  }
+  purge_any:
+    roles: {  }
+    users: {  }
+    permissions: {  }
+  view_own:
+    roles: {  }
+    users: {  }
+    permissions: {  }
+  update_own:
+    roles: {  }
+    users: {  }
+    permissions: {  }
+  delete_own:
+    roles: {  }
+    users: {  }
+    permissions: {  }
+  administer:
+    roles: {  }
+    users: {  }
+    permissions: {  }
+  test:
+    roles: {  }
+    users: {  }
+    permissions: {  }
+  configuration:
+    roles: {  }
+    users: {  }
+    permissions: {  }
+handlers:
+  debug:
+    id: debug
+    label: Debug
+    notes: ''
+    handler_id: debug
+    status: true
+    conditions: {  }
+    weight: 0
+    settings: {  }
+variants: {  }
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_states_crosspage.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_states_crosspage.yml
index c648db7fe8..c6df0b4acf 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_states_crosspage.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_states_crosspage.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -45,7 +46,7 @@ elements: |
             checked: true
           ':input[name="trigger_2"]':
             checked: true
-
+  
 css: ''
 javascript: ''
 settings:
@@ -118,6 +119,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -173,6 +176,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_states_disabled.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_states_disabled.yml
index 552a6dfd97..4e09360eb2 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_states_disabled.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_states_disabled.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -132,6 +133,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -187,6 +190,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
@@ -238,6 +242,7 @@ handlers:
   debug:
     id: debug
     label: Debug
+    notes: ''
     handler_id: debug
     status: true
     conditions: {  }
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_states_server_clear.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_states_server_clear.yml
index 3109d55af5..8f36d31d94 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_states_server_clear.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_states_server_clear.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -175,6 +176,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -230,6 +233,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
@@ -281,6 +285,7 @@ handlers:
   debug:
     id: debug
     label: Debug
+    notes: ''
     handler_id: debug
     status: true
     conditions: {  }
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_states_server_comp.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_states_server_comp.yml
index a194cbeda5..d42792826b 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_states_server_comp.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_states_server_comp.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -76,7 +77,7 @@ elements: |
       '#first__title': webform_name_nested_first
       '#last__required': true
       '#last__title': webform_name_nested_last
-
+  
 css: ''
 javascript: ''
 settings:
@@ -149,6 +150,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -204,6 +207,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_states_server_containers.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_states_server_containers.yml
index 4756f2da38..50dcced9ad 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_states_server_containers.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_states_server_containers.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -73,7 +74,7 @@ elements: |
             checked: true
           ':input[name="visible_slide_textfield"]':
             filled: true
-
+  
 css: ''
 javascript: ''
 settings:
@@ -146,6 +147,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -201,6 +204,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_states_server_custom.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_states_server_custom.yml
index c6589afb64..7063694bcd 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_states_server_custom.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_states_server_custom.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -63,6 +64,22 @@ elements: |
         ':input[name="trigger_less"]':
           value:
             less: 10
+  trigger_less_equal:
+    '#type': number
+    '#title': trigger_less_equal
+    '#description': '<= 10'
+  dependent_less_equal:
+    '#type': textfield
+    '#title': dependent_less_equal
+    '#states':
+      visible:
+        ':input[name="trigger_less_equal"]':
+          value:
+            less_equal: 10
+      required:
+        ':input[name="trigger_less_equal"]':
+          value:
+            less_equal: 10
   trigger_greater:
     '#type': number
     '#title': trigger_greater
@@ -79,6 +96,22 @@ elements: |
         ':input[name="trigger_greater"]':
           value:
             greater: 10
+  trigger_greater_equal:
+    '#type': number
+    '#title': trigger_greater_equal
+    '#description': '>= 10'
+  dependent_greater_equal:
+    '#type': textfield
+    '#title': dependent_greater_equal
+    '#states':
+      visible:
+        ':input[name="trigger_greater_equal"]':
+          value:
+            greater_equal: 10
+      required:
+        ':input[name="trigger_greater_equal"]':
+          value:
+            greater_equal: 10
   trigger_between:
     '#type': number
     '#title': trigger_between
@@ -95,6 +128,18 @@ elements: |
         ':input[name="trigger_between"]':
           value:
             between: '10:20'
+  dependent_not_between:
+    '#type': textfield
+    '#title': dependent_not_between
+    '#states':
+      visible:
+        ':input[name="trigger_between"]':
+          value:
+            '!between': '10:20'
+      required:
+        ':input[name="trigger_between"]':
+          value:
+            '!between': '10:20'
   trigger_visible_slide:
     '#type': checkbox
     '#title': trigger_visible_slide
@@ -105,7 +150,7 @@ elements: |
       visible-slide:
         ':input[name="trigger_visible_slide"]':
           checked: true
-
+  
 css: ''
 javascript: ''
 settings:
@@ -178,6 +223,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -233,6 +280,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_states_server_hidden.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_states_server_hidden.yml
index c5ccec37c5..8bc736666a 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_states_server_hidden.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_states_server_hidden.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -211,6 +212,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -266,6 +269,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
@@ -317,6 +321,7 @@ handlers:
   debug:
     id: debug
     label: Debug
+    notes: ''
     handler_id: debug
     status: true
     conditions: {  }
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_states_server_likert.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_states_server_likert.yml
index e6262208f6..f4b616ee69 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_states_server_likert.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_states_server_likert.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -33,7 +34,7 @@ elements: |
       visible:
         ':input[name="trigger_likert"]':
           checked: true
-
+  
 css: ''
 javascript: ''
 settings:
@@ -106,6 +107,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -161,6 +164,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_states_server_multiple.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_states_server_multiple.yml
index 68d19ad111..f57ab35bdb 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_states_server_multiple.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_states_server_multiple.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -27,7 +28,7 @@ elements: |
       required:
         ':input[name="trigger_required"]':
           checked: true
-
+  
 css: ''
 javascript: ''
 settings:
@@ -100,6 +101,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -155,6 +158,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_states_server_nested.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_states_server_nested.yml
index 50f3e74e67..55f11be8ba 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_states_server_nested.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_states_server_nested.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -58,7 +59,7 @@ elements: |
                 checked: true
               ':input[name="b"]':
                 checked: true
-
+  
 css: ''
 javascript: ''
 settings:
@@ -131,6 +132,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -186,6 +189,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_states_server_preview.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_states_server_preview.yml
index 75e3df6a1e..59e6ccb04e 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_states_server_preview.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_states_server_preview.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -52,7 +53,7 @@ elements: |
       '#type': textfield
       '#title': nested_textfield
       '#default_value': '{value}'
-
+  
 css: ''
 javascript: ''
 settings:
@@ -125,6 +126,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -180,6 +183,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_states_server_required.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_states_server_required.yml
index 4301b52fc3..902732e5e4 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_states_server_required.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_states_server_required.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -333,7 +334,7 @@ elements: |
         visible:
           ':input[name="currency_trigger"]':
             checked: true
-
+  
   address_trigger_details:
     '#type': details
     '#title': address_trigger
@@ -447,7 +448,7 @@ elements: |
         required:
           ':input[name="composite_sub_elements_required_trigger"]':
             value: b
-
+  
 css: ''
 javascript: ''
 settings:
@@ -520,6 +521,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -575,6 +578,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_states_server_save.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_states_server_save.yml
index ade2fd6458..ec24e84421 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_states_server_save.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_states_server_save.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -143,6 +144,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -198,6 +201,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
@@ -249,6 +253,7 @@ handlers:
   debug:
     id: debug
     label: Debug
+    notes: ''
     handler_id: debug
     status: true
     conditions: {  }
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_states_server_wizard.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_states_server_wizard.yml
index 13fcdfb7d1..e2352b554a 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_states_server_wizard.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_states_server_wizard.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -220,6 +221,19 @@ elements: |
         collapsed:
           ':input[name="page_01_trigger_checkbox"]':
             checked: true
+  page_03:
+    '#type': webform_wizard_page
+    '#title': page_03
+    '#states':
+      visible:
+        ':input[name="page_01_trigger_checkbox"]':
+          checked: true
+    page_03_textfield_required:
+      '#type': textfield
+      '#title': page_02_textfield_required
+      '#default_value': '{default_value}'
+      '#required': '{default_value}'
+      '#description': '<b>Required:</b> page_01_trigger_checkbox:checked'
 
 css: ''
 javascript: ''
@@ -293,6 +307,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -348,6 +364,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
@@ -399,6 +416,7 @@ handlers:
   debug:
     id: debug
     label: Debug
+    notes: ''
     handler_id: debug
     status: true
     conditions: {  }
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_states_to_text.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_states_to_text.yml
new file mode 100644
index 0000000000..735a1e05d8
--- /dev/null
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_states_to_text.yml
@@ -0,0 +1,251 @@
+uuid: null
+langcode: en
+status: open
+dependencies:
+  enforced:
+    module:
+      - webform_test
+open: null
+close: null
+weight: 0
+uid: null
+template: false
+archive: false
+id: test_states_to_text
+title: 'Test: Form API #states to text'
+description: 'Test Drupal''s converting #states API to human readable text.'
+category: 'Test: Form API #states'
+elements: |
+  some_trigger:
+    '#type': checkbox
+    '#title': some_trigger
+  some_value:
+    '#type': select
+    '#title': some_value
+    '#options':
+      1: one
+      2: two
+      3: three
+  some_number:
+    '#type': number
+    '#title': some_number
+  textfield_and:
+    '#type': textfield
+    '#title': textfield_and
+    '#states':
+      required:
+        ':input[name="some_trigger"]':
+          checked: true
+        ':input[name="some_value"]':
+          value: 1
+        ':input[name="some_number"]':
+          value:
+            greater_equal: 1
+  textfield_or:
+    '#type': textfield
+    '#title': textfield_or
+    '#states':
+      required:
+        - ':input[name="some_trigger"]':
+            checked: true
+        - 'or'
+        - ':input[name="some_value"]':
+            value: 1
+        - 'or'
+        - ':input[name="some_number"]':
+            value:
+              greater_equal: 1
+  textfield_nested:
+    '#type': textfield
+    '#title': textfield_or
+    '#states':
+      required:
+        - ':input[name="some_trigger"]':
+            checked: true
+        -
+          - ':input[name="some_value"]':
+              value: 1
+          - 'or'
+          - ':input[name="some_number"]':
+              value:
+                between: '1:10'
+  
+css: ''
+javascript: ''
+settings:
+  ajax: false
+  ajax_scroll_top: form
+  ajax_progress_type: ''
+  ajax_effect: ''
+  ajax_speed: null
+  page: true
+  page_submit_path: ''
+  page_confirm_path: ''
+  page_theme_name: ''
+  form_title: source_entity_webform
+  form_submit_once: false
+  form_exception_message: ''
+  form_open_message: ''
+  form_close_message: ''
+  form_previous_submissions: true
+  form_confidential: false
+  form_confidential_message: ''
+  form_remote_addr: true
+  form_convert_anonymous: false
+  form_prepopulate: false
+  form_prepopulate_source_entity: false
+  form_prepopulate_source_entity_required: false
+  form_prepopulate_source_entity_type: ''
+  form_reset: false
+  form_disable_autocomplete: false
+  form_novalidate: false
+  form_disable_inline_errors: false
+  form_required: false
+  form_unsaved: false
+  form_disable_back: false
+  form_submit_back: false
+  form_autofocus: false
+  form_details_toggle: false
+  form_access_denied: default
+  form_access_denied_title: ''
+  form_access_denied_message: ''
+  form_access_denied_attributes: {  }
+  form_file_limit: ''
+  share: false
+  share_node: false
+  share_theme_name: ''
+  share_title: true
+  share_page_body_attributes: {  }
+  submission_label: ''
+  submission_log: false
+  submission_views: {  }
+  submission_views_replace: {  }
+  submission_user_columns: {  }
+  submission_user_duplicate: false
+  submission_access_denied: default
+  submission_access_denied_title: ''
+  submission_access_denied_message: ''
+  submission_access_denied_attributes: {  }
+  submission_exception_message: ''
+  submission_locked_message: ''
+  submission_excluded_elements: {  }
+  submission_exclude_empty: false
+  submission_exclude_empty_checkbox: false
+  previous_submission_message: ''
+  previous_submissions_message: ''
+  autofill: false
+  autofill_message: ''
+  autofill_excluded_elements: {  }
+  wizard_progress_bar: true
+  wizard_progress_pages: false
+  wizard_progress_percentage: false
+  wizard_progress_link: false
+  wizard_progress_states: false
+  wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
+  wizard_start_label: ''
+  wizard_preview_link: false
+  wizard_confirmation: true
+  wizard_confirmation_label: ''
+  wizard_track: ''
+  wizard_prev_button_label: ''
+  wizard_next_button_label: ''
+  wizard_toggle: false
+  wizard_toggle_show_label: ''
+  wizard_toggle_hide_label: ''
+  preview: 0
+  preview_label: ''
+  preview_title: ''
+  preview_message: ''
+  preview_attributes: {  }
+  preview_excluded_elements: {  }
+  preview_exclude_empty: true
+  preview_exclude_empty_checkbox: false
+  draft: none
+  draft_multiple: false
+  draft_auto_save: false
+  draft_saved_message: ''
+  draft_loaded_message: ''
+  draft_pending_single_message: ''
+  draft_pending_multiple_message: ''
+  confirmation_type: page
+  confirmation_title: ''
+  confirmation_message: ''
+  confirmation_url: ''
+  confirmation_attributes: {  }
+  confirmation_back: true
+  confirmation_back_label: ''
+  confirmation_back_attributes: {  }
+  confirmation_exclude_query: false
+  confirmation_exclude_token: false
+  confirmation_update: false
+  limit_total: null
+  limit_total_interval: null
+  limit_total_message: ''
+  limit_total_unique: false
+  limit_user: null
+  limit_user_interval: null
+  limit_user_message: ''
+  limit_user_unique: false
+  entity_limit_total: null
+  entity_limit_total_interval: null
+  entity_limit_user: null
+  entity_limit_user_interval: null
+  purge: none
+  purge_days: null
+  results_disabled: true
+  results_disabled_ignore: true
+  results_customize: false
+  token_view: false
+  token_update: false
+  serial_disabled: false
+access:
+  create:
+    roles:
+      - anonymous
+      - authenticated
+    users: {  }
+    permissions: {  }
+  view_any:
+    roles: {  }
+    users: {  }
+    permissions: {  }
+  update_any:
+    roles: {  }
+    users: {  }
+    permissions: {  }
+  delete_any:
+    roles: {  }
+    users: {  }
+    permissions: {  }
+  purge_any:
+    roles: {  }
+    users: {  }
+    permissions: {  }
+  view_own:
+    roles: {  }
+    users: {  }
+    permissions: {  }
+  update_own:
+    roles: {  }
+    users: {  }
+    permissions: {  }
+  delete_own:
+    roles: {  }
+    users: {  }
+    permissions: {  }
+  administer:
+    roles: {  }
+    users: {  }
+    permissions: {  }
+  test:
+    roles: {  }
+    users: {  }
+    permissions: {  }
+  configuration:
+    roles: {  }
+    users: {  }
+    permissions: {  }
+handlers: {  }
+variants: {  }
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_states_triggers.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_states_triggers.yml
index af22d61e9f..ee6b3815d3 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_states_triggers.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_states_triggers.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -130,7 +131,7 @@ elements: |
         visible:
           'details[data-webform-key="collapsed_trigger"]':
             collapsed: true
-
+  
 css: ''
 javascript: ''
 settings:
@@ -203,6 +204,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -258,6 +261,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_submission_label.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_submission_label.yml
index 640d62b40f..a50d911ce8 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_submission_label.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_submission_label.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -19,7 +20,7 @@ elements: |
     '#type': textfield
     '#title': Name
     '#required': true
-
+  
 css: ''
 javascript: ''
 settings:
@@ -92,6 +93,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -147,6 +150,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_submission_log.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_submission_log.yml
index 8e86ece1fa..481f4142fb 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_submission_log.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_submission_log.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -18,7 +19,7 @@ elements: |
   value:
     '#type': textfield
     '#title': 'Enter a value'
-
+  
 css: ''
 javascript: ''
 settings:
@@ -91,6 +92,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -146,6 +149,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_submission_views.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_submission_views.yml
index 395cf23433..eed2c4e3f1 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_submission_views.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_submission_views.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -18,7 +19,7 @@ elements: |
   textfield:
     '#type': textfield
     '#title': textfield
-
+  
 css: ''
 javascript: ''
 settings:
@@ -121,6 +122,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -176,6 +179,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_token.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_token.yml
index 9197481e28..c0a7d3f4ec 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_token.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_token.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -198,6 +199,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -253,6 +256,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: true
+  serial_disabled: false
 access:
   create:
     roles:
@@ -304,6 +308,7 @@ handlers:
   email:
     id: email
     label: Email
+    notes: ''
     handler_id: email
     status: true
     conditions: {  }
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_token_submission_value.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_token_submission_value.yml
index d34fb79fa5..0d1b48a305 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_token_submission_value.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_token_submission_value.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -141,7 +142,7 @@ elements: |
     '#type': textfield
     '#title': script
     '#default_value': '<script>alert(''hi'');</script>'
-
+  
 css: ''
 javascript: ''
 settings:
@@ -214,6 +215,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -250,7 +253,7 @@ settings:
     <tr><th width="50%">webform:element:not_element:description</th><td width="50%">[webform:element:not_element:description]</td></tr>
     <tr><th width="50%">webform:element:email:not_property</th><td width="50%">[webform:element:email:not_property]</td></tr>
     </table>
-
+    
     <h3>checkboxes</h3>
     <table class="table">
     <tr><th width="50%">webform:element:checkboxes</th><td width="50%">[webform_submission:values:checkboxes]</td></tr>
@@ -258,7 +261,7 @@ settings:
     <tr><th width="50%">webform:element:checkboxes:selected:two</th><td width="50%">[webform_submission:values:checkboxes:selected:two]</td></tr>
     <tr><th width="50%">webform:element:checkboxes:selected:three</th><td width="50%">[webform_submission:values:checkboxes:selected:three]</td></tr>
     </table>
-
+    
     <h3>emails</h3>
     <table class="table">
     <tr><th width="50%">webform_submission:values:email</th><td width="50%">[webform_submission:values:email]</td></tr>
@@ -273,7 +276,7 @@ settings:
     <tr><th width="50%">webform_submission:values:emails:2:html</th><td width="50%">[webform_submission:values:emails:2:html]</td></tr>
     <tr><th width="50%">webform_submission:values:emails:99:html</th><td width="50%">[webform_submission:values:emails:99]</td></tr>
     </table>
-
+    
     <h3>users</h3>
     <table class="table">
     <tr><th width="50%">webform_submission:values:user</th><td width="50%">[webform_submission:values:user]</td></tr>
@@ -282,13 +285,13 @@ settings:
     <tr><th width="50%">webform_submission:values:users:0:entity:account-name</th><td width="50%">[webform_submission:values:users:0:entity:account-name]</td></tr>
     <tr><th width="50%">webform_submission:values:users:99:entity:account-name</th><td width="50%">[webform_submission:values:users:99:entity:account-name]</td></tr>
     </table>
-
+    
     <h3>current-user</h3>
     <table class="table">
     <tr><th width="50%">current-user:display-name</th><td width="50%">[current-user:display-name]</td></tr>
     <tr><th width="50%">current-user:missing</th><td width="50%">[current-user:missing]</td></tr>
     </table>
-
+    
     <h3>terms</h3>
     <table class="table">
     <tr><th width="50%">webform_submission:values:term</th><td width="50%">[webform_submission:values:term]</td></tr>
@@ -297,7 +300,7 @@ settings:
     <tr><th width="50%">webform_submission:values:terms:entity:name</th><td width="50%">[webform_submission:values:terms:entity:name]</td></tr>
     <tr><th width="50%">webform_submission:values:terms:1:entity:name</th><td width="50%">[webform_submission:values:terms:1:entity:name]</td></tr>
     </table>
-
+    
     <h3>names</h3>
     <table class="table">
     <tr><th width="50%">webform_submission:values:name</th><td width="50%">[webform_submission:values:name]</td></tr>
@@ -306,7 +309,7 @@ settings:
     <tr><th width="50%">webform_submission:values:names:1</th><td width="50%">[webform_submission:values:names:1]</td></tr>
     <tr><th width="50%">webform_submission:values:names:99</th><td width="50%">[webform_submission:values:names:99]</td></tr>
     </table>
-
+    
     <h3>contacts</h3>
     <table class="table">
     <tr><th width="50%">webform_submission:values:contact</th><td width="50%">[webform_submission:values:contact]</td></tr>
@@ -318,7 +321,7 @@ settings:
     <tr><th width="50%">webform_submission:values:contacts:0:email:html</th><td width="50%">[webform_submission:values:contacts:0:email:html]</td></tr>
     <tr><th width="50%">webform_submission:values:contacts:1:email:raw:html</th><td width="50%">[webform_submission:values:contacts:1:email:raw:html]</td></tr>
     </table>
-
+    
     <h3>container</h3>
     <table class="table">
     <tr><th width="50%">webform_submission:values:fieldset</th><td width="50%"><pre>[webform_submission:values:fieldset]</pre></td></tr>
@@ -327,7 +330,7 @@ settings:
     <tr><th width="50%">webform_submission:values:fieldset:details:html</th><td width="50%">[webform_submission:values:fieldset:details:html]</td></tr>
     <tr><th width="50%">webform_submission:values:fieldset:fieldset:html</th><td width="50%">[webform_submission:values:fieldset:fieldset:html]</td></tr>
     </table>
-
+    
     <h3>submission limits</h3>
     <table class="table">
     <tr><th width="50%">webform_submission:limit:webform</th><td width="50%">[webform_submission:limit:webform]</td></tr>
@@ -339,13 +342,13 @@ settings:
     <tr><th width="50%">webform_submission:limit:user:source_entity</th><td width="50%">[webform_submission:limit:user:source_entity]</td></tr>
     <tr><th width="50%">webform_submission:total:user:source_entity</th><td width="50%">[webform_submission:total:user:source_entity]</td></tr>
     </table>
-
+    
     <h3>markup</h3>
     <table class="table">
     <tr><th width="50%">webform_submission:values:webform_markup</th><td width="50%">[webform_submission:values:webform_markup]</td></tr>
     <tr><th width="50%">webform_submission:values:webform_markup:html</th><td width="50%">[webform_submission:values:webform_markup:html]</td></tr>
     </table>
-
+    
     <h3>clear</h3>
     <table class="table">
     <tr><th width="50%">webform_submission:values:missing</th><td width="50%">[webform_submission:values:missing]</td></tr>
@@ -353,13 +356,13 @@ settings:
     <tr><th width="50%">webform:random:missing</th><td width="50%">[webform:random:missing]</td></tr>
     <tr><th width="50%">webform:random:missing:clear</th><td width="50%">[webform:random:missing:clear]</td></tr>
     </table>
-
+    
     <h3>urlencode</h3>
     <table class="table">
     <tr><th width="50%">webform_submission:values:url</th><td width="50%">[webform_submission:values:url]</td></tr>
     <tr><th width="50%">webform_submission:values:url:urlencode</th><td width="50%">[webform_submission:values:url:urlencode]</td></tr>
     </table>
-
+    
     <h3>htmldecode</h3>
     <table class="table">
     <tr><th width="50%">webform_submission:values:markup</th><td width="50%">[webform_submission:values:markup]</td></tr>
@@ -368,7 +371,7 @@ settings:
     <tr><th width="50%">webform_submission:values:script</th><td width="50%">[webform_submission:values:script]</td></tr>
     <tr><th width="50%">webform_submission:values:script:htmldecode</th><td width="50%">[webform_submission:values:script:htmldecode]</td></tr>
     </table>
-
+    
   confirmation_url: ''
   confirmation_attributes: {  }
   confirmation_back: true
@@ -396,6 +399,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: true
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_token_view_update.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_token_view_update.yml
index a230a1d41d..0dc7bb753f 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_token_view_update.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_token_view_update.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -91,6 +92,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -149,6 +152,7 @@ settings:
   results_customize: false
   token_view: true
   token_update: true
+  serial_disabled: false
 access:
   create:
     roles:
@@ -200,6 +204,7 @@ handlers:
   email:
     id: email
     label: Email
+    notes: ''
     handler_id: email
     status: true
     conditions: {  }
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_variant.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_variant.yml
new file mode 100644
index 0000000000..4487f89db0
--- /dev/null
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_variant.yml
@@ -0,0 +1,211 @@
+uuid: null
+langcode: en
+status: open
+dependencies:
+  enforced:
+    module:
+      - webform_test
+open: null
+close: null
+weight: 0
+uid: null
+template: false
+archive: false
+id: test_variant
+title: 'Test: Variant'
+description: 'Test variant.'
+category: 'Test: Variants'
+elements: |
+  letter:
+    '#type': webform_variant
+    '#title': test_offcanvas_width
+    '#variant': test_offcanvas_width
+
+css: ''
+javascript: ''
+settings:
+  ajax: false
+  ajax_scroll_top: form
+  ajax_progress_type: ''
+  ajax_effect: ''
+  ajax_speed: null
+  page: true
+  page_submit_path: ''
+  page_confirm_path: ''
+  page_theme_name: ''
+  form_title: source_entity_webform
+  form_submit_once: false
+  form_exception_message: ''
+  form_open_message: ''
+  form_close_message: ''
+  form_previous_submissions: true
+  form_confidential: false
+  form_confidential_message: ''
+  form_remote_addr: true
+  form_convert_anonymous: false
+  form_prepopulate: false
+  form_prepopulate_source_entity: false
+  form_prepopulate_source_entity_required: false
+  form_prepopulate_source_entity_type: ''
+  form_reset: false
+  form_disable_autocomplete: false
+  form_novalidate: false
+  form_disable_inline_errors: false
+  form_required: false
+  form_unsaved: false
+  form_disable_back: false
+  form_submit_back: false
+  form_autofocus: false
+  form_details_toggle: false
+  form_access_denied: default
+  form_access_denied_title: ''
+  form_access_denied_message: ''
+  form_access_denied_attributes: {  }
+  form_file_limit: ''
+  share: false
+  share_node: false
+  share_theme_name: ''
+  share_title: true
+  share_page_body_attributes: {  }
+  submission_label: ''
+  submission_log: false
+  submission_views: {  }
+  submission_views_replace: {  }
+  submission_user_columns: {  }
+  submission_user_duplicate: false
+  submission_access_denied: default
+  submission_access_denied_title: ''
+  submission_access_denied_message: ''
+  submission_access_denied_attributes: {  }
+  submission_exception_message: ''
+  submission_locked_message: ''
+  submission_excluded_elements: {  }
+  submission_exclude_empty: false
+  submission_exclude_empty_checkbox: false
+  previous_submission_message: ''
+  previous_submissions_message: ''
+  autofill: false
+  autofill_message: ''
+  autofill_excluded_elements: {  }
+  wizard_progress_bar: true
+  wizard_progress_pages: false
+  wizard_progress_percentage: false
+  wizard_progress_link: false
+  wizard_progress_states: false
+  wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
+  wizard_start_label: ''
+  wizard_preview_link: false
+  wizard_confirmation: true
+  wizard_confirmation_label: ''
+  wizard_track: ''
+  wizard_prev_button_label: ''
+  wizard_next_button_label: ''
+  wizard_toggle: false
+  wizard_toggle_show_label: ''
+  wizard_toggle_hide_label: ''
+  preview: 0
+  preview_label: ''
+  preview_title: ''
+  preview_message: ''
+  preview_attributes: {  }
+  preview_excluded_elements: {  }
+  preview_exclude_empty: true
+  preview_exclude_empty_checkbox: false
+  draft: none
+  draft_multiple: false
+  draft_auto_save: false
+  draft_saved_message: ''
+  draft_loaded_message: ''
+  draft_pending_single_message: ''
+  draft_pending_multiple_message: ''
+  confirmation_type: page
+  confirmation_title: ''
+  confirmation_message: ''
+  confirmation_url: ''
+  confirmation_attributes: {  }
+  confirmation_back: true
+  confirmation_back_label: ''
+  confirmation_back_attributes: {  }
+  confirmation_exclude_query: false
+  confirmation_exclude_token: false
+  confirmation_update: false
+  limit_total: null
+  limit_total_interval: null
+  limit_total_message: ''
+  limit_total_unique: false
+  limit_user: null
+  limit_user_interval: null
+  limit_user_message: ''
+  limit_user_unique: false
+  entity_limit_total: null
+  entity_limit_total_interval: null
+  entity_limit_user: null
+  entity_limit_user_interval: null
+  purge: none
+  purge_days: null
+  results_disabled: false
+  results_disabled_ignore: false
+  results_customize: false
+  token_view: false
+  token_update: false
+  serial_disabled: false
+access:
+  create:
+    roles:
+      - anonymous
+      - authenticated
+    users: {  }
+    permissions: {  }
+  view_any:
+    roles: {  }
+    users: {  }
+    permissions: {  }
+  update_any:
+    roles: {  }
+    users: {  }
+    permissions: {  }
+  delete_any:
+    roles: {  }
+    users: {  }
+    permissions: {  }
+  purge_any:
+    roles: {  }
+    users: {  }
+    permissions: {  }
+  view_own:
+    roles: {  }
+    users: {  }
+    permissions: {  }
+  update_own:
+    roles: {  }
+    users: {  }
+    permissions: {  }
+  delete_own:
+    roles: {  }
+    users: {  }
+    permissions: {  }
+  administer:
+    roles: {  }
+    users: {  }
+    permissions: {  }
+  test:
+    roles: {  }
+    users: {  }
+    permissions: {  }
+  configuration:
+    roles: {  }
+    users: {  }
+    permissions: {  }
+handlers:
+  debug:
+    id: debug
+    label: Debug
+    notes: ''
+    handler_id: debug
+    status: false
+    conditions: {  }
+    weight: 0
+    settings: {  }
+variants: {  }
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_variant_multiple.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_variant_multiple.yml
index 03d2f73ec7..51a4ac95c0 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_variant_multiple.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_variant_multiple.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -106,6 +107,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -161,6 +164,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
@@ -212,6 +216,7 @@ handlers:
   debug:
     id: debug
     label: Debug
+    notes: ''
     handler_id: debug
     status: false
     conditions: {  }
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_variant_override.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_variant_override.yml
index 462a23a140..bc72f12117 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_variant_override.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_variant_override.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -96,6 +97,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -151,6 +154,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
@@ -202,6 +206,7 @@ handlers:
   debug:
     id: debug
     label: Debug
+    notes: ''
     handler_id: debug
     status: false
     conditions: {  }
diff --git a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_variant_randomize.yml b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_variant_randomize.yml
index c328272c72..7019ec5510 100644
--- a/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_variant_randomize.yml
+++ b/web/modules/webform/tests/modules/webform_test/config/install/webform.webform.test_variant_randomize.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -98,6 +99,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -153,6 +156,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
@@ -204,6 +208,7 @@ handlers:
   debug:
     id: debug
     label: Debug
+    notes: ''
     handler_id: debug
     status: false
     conditions: {  }
diff --git a/web/modules/webform/tests/modules/webform_test/includes/webform_test.test_form_states.inc b/web/modules/webform/tests/modules/webform_test/includes/webform_test.test_states.inc
similarity index 63%
rename from web/modules/webform/tests/modules/webform_test/includes/webform_test.test_form_states.inc
rename to web/modules/webform/tests/modules/webform_test/includes/webform_test.test_states.inc
index ec33cadeb7..76b79c7e1a 100644
--- a/web/modules/webform/tests/modules/webform_test/includes/webform_test.test_form_states.inc
+++ b/web/modules/webform/tests/modules/webform_test/includes/webform_test.test_states.inc
@@ -7,80 +7,6 @@
 
 use Drupal\webform\Entity\Webform;
 
-/**
- * Generate test elements with #states.
- *
- * @return array
- *   An array containing test elements with #states.
- */
-function webform_test_test_states() {
-  $elements = [];
-
-  // Visible.
-  $elements['visible'] = [
-    '#type' => 'details',
-    '#title' => 'Test State: Visible and Required',
-  ];
-  $elements['visible']['visible_trigger'] = [
-    '#type' => 'checkbox',
-    '#title' => 'Displays and require elements',
-  ];
-  $elements['visible'] += _webform_test_states('visible', [
-    '#states' => [
-      'visible' => [
-        ':input[name="visible_trigger"]' => [
-          'checked' => TRUE,
-        ],
-      ],
-      'required' => [
-        ':input[name="visible_trigger"]' => [
-          'checked' => TRUE,
-        ],
-      ],
-    ],
-  ]);
-
-  // Invisible.
-  $elements['invisible'] = [
-    '#type' => 'details',
-    '#title' => 'Test State: Invisible (Hidden) and Empty',
-  ];
-  $elements['invisible']['invisible_trigger'] = [
-    '#type' => 'checkbox',
-    '#title' => 'Hide and empty elements',
-  ];
-  $elements['invisible'] += _webform_test_states('invisible', [
-    '#states' => [
-      'invisible' => [
-        ':input[name="invisible_trigger"]' => [
-          'checked' => TRUE,
-        ],
-      ],
-    ],
-  ]);
-
-  // Disable.
-  $elements['disabled'] = [
-    '#type' => 'details',
-    '#title' => 'Test State: Disabled',
-  ];
-  $elements['disabled']['disabled_trigger'] = [
-    '#type' => 'checkbox',
-    '#title' => 'Disable elements',
-  ];
-  $elements['disabled'] += _webform_test_states('disabled', [
-    '#states' => [
-      'disabled' => [
-        ':input[name="disabled_trigger"]' => [
-          'checked' => TRUE,
-        ],
-      ],
-    ],
-  ]);
-
-  return $elements;
-}
-
 /**
  * Generates a render array of example elements.
  *
@@ -93,6 +19,16 @@ function webform_test_test_states() {
  *   A render array of example elements
  */
 function _webform_test_states($type, array $default_properties = []) {
+  $ignored_element_types = [
+    'captcha',
+    'machine_name',
+    'table',
+    'webform_card',
+    'webform_more',
+    'webform_table',
+    'webform_table_row',
+  ];
+
   $data = [
     'containers' => [],
     'elements' => [],
@@ -108,6 +44,11 @@ function _webform_test_states($type, array $default_properties = []) {
   $element_manager = \Drupal::service('plugin.manager.webform.element');
   $elements = $element_manager->getInstances();
   foreach ($elements as $element_type => $webform_element) {
+    if (preg_match('/(webform_options_custom:|webform_options_custom_entity:)/', $element_type)
+    || in_array($element_type, $ignored_element_types)) {
+      continue;
+    }
+
     $element = _webform_test_get_element_preview($element_type);
     if (!$element) {
       continue;
@@ -134,7 +75,7 @@ function _webform_test_states($type, array $default_properties = []) {
     $element += $default_properties;
 
     $group = ($webform_element->isContainer($element)) ? 'containers' : 'elements';
-    $data[$group][$type . '_' . $element_type] = $element;
+    $data[$group][$element_type] = $element;
   }
 
   return $data['containers'] + $data['elements'];
diff --git a/web/modules/webform/tests/modules/webform_test/includes/webform_test.test_states_client_disabled.inc b/web/modules/webform/tests/modules/webform_test/includes/webform_test.test_states_client_disabled.inc
new file mode 100644
index 0000000000..d27d85c614
--- /dev/null
+++ b/web/modules/webform/tests/modules/webform_test/includes/webform_test.test_states_client_disabled.inc
@@ -0,0 +1,37 @@
+<?php
+
+/**
+ * @file
+ * Generate test elements with #states.
+ */
+
+/**
+ * Generate test elements with #states.
+ *
+ * @return array
+ *   An array containing test elements with #states.
+ */
+function webform_test_test_states_client_disabled() {
+  module_load_include('inc', 'webform_test', 'includes/webform_test.test_states');
+
+  $elements = [];
+  $elements['trigger'] = [
+    '#type' => 'checkbox',
+    '#title' => 'Disable elements',
+  ];
+  $elements += _webform_test_states('disabled', [
+    '#states' => [
+      'disabled' => [
+        ':input[name="trigger"]' => [
+          'checked' => TRUE,
+        ],
+      ],
+      'required' => [
+        ':input[name="trigger"]' => [
+          'checked' => TRUE,
+        ],
+      ],
+    ],
+  ]);
+  return $elements;
+}
diff --git a/web/modules/webform/tests/modules/webform_test/includes/webform_test.test_states_client_invisible.inc b/web/modules/webform/tests/modules/webform_test/includes/webform_test.test_states_client_invisible.inc
new file mode 100644
index 0000000000..b918d70c93
--- /dev/null
+++ b/web/modules/webform/tests/modules/webform_test/includes/webform_test.test_states_client_invisible.inc
@@ -0,0 +1,32 @@
+<?php
+
+/**
+ * @file
+ * Generate test elements with #states.
+ */
+
+/**
+ * Generate test elements with #states.
+ *
+ * @return array
+ *   An array containing test elements with #states.
+ */
+function webform_test_test_states_client_invisible() {
+  module_load_include('inc', 'webform_test', 'includes/webform_test.test_states');
+
+  $elements = [];
+  $elements['trigger'] = [
+    '#type' => 'checkbox',
+    '#title' => 'Hide and empty elements',
+  ];
+  $elements += _webform_test_states('invisible', [
+    '#states' => [
+      'invisible' => [
+        ':input[name="trigger"]' => [
+          'checked' => TRUE,
+        ],
+      ],
+    ],
+  ]);
+  return $elements;
+}
diff --git a/web/modules/webform/tests/modules/webform_test/includes/webform_test.test_states_client_visible.inc b/web/modules/webform/tests/modules/webform_test/includes/webform_test.test_states_client_visible.inc
new file mode 100644
index 0000000000..0116d84eed
--- /dev/null
+++ b/web/modules/webform/tests/modules/webform_test/includes/webform_test.test_states_client_visible.inc
@@ -0,0 +1,37 @@
+<?php
+
+/**
+ * @file
+ * Generate test elements with #states.
+ */
+
+/**
+ * Generate test elements with #states.
+ *
+ * @return array
+ *   An array containing test elements with #states.
+ */
+function webform_test_test_states_client_visible() {
+  module_load_include('inc', 'webform_test', 'includes/webform_test.test_states');
+
+  $elements = [];
+  $elements['trigger'] = [
+    '#type' => 'checkbox',
+    '#title' => 'Displays and require elements',
+  ];
+  $elements += _webform_test_states('visible', [
+    '#states' => [
+      'visible' => [
+        ':input[name="trigger"]' => [
+          'checked' => TRUE,
+        ],
+      ],
+      'required' => [
+        ':input[name="trigger"]' => [
+          'checked' => TRUE,
+        ],
+      ],
+    ],
+  ]);
+  return $elements;
+}
diff --git a/web/modules/webform/tests/modules/webform_test/webform_test.info.yml b/web/modules/webform/tests/modules/webform_test/webform_test.info.yml
index 192c85b7ba..b4dd448714 100644
--- a/web/modules/webform/tests/modules/webform_test/webform_test.info.yml
+++ b/web/modules/webform/tests/modules/webform_test/webform_test.info.yml
@@ -6,7 +6,7 @@ core_version_requirement: ^8.8
 dependencies:
   - 'webform:webform'
 
-# Information added by Drupal.org packaging script on 2020-07-02
-version: '8.x-5.19'
+# Information added by Drupal.org packaging script on 2020-10-05
+version: '8.x-5.22'
 project: 'webform'
-datestamp: 1593681142
+datestamp: 1601919526
diff --git a/web/modules/webform/tests/modules/webform_test/webform_test.module b/web/modules/webform/tests/modules/webform_test/webform_test.module
index 4f0e4a53ac..d908b423b5 100644
--- a/web/modules/webform/tests/modules/webform_test/webform_test.module
+++ b/web/modules/webform/tests/modules/webform_test/webform_test.module
@@ -48,6 +48,34 @@ function webform_test_preprocess_page(&$variables) {
   }
 }
 
+/**
+ * Implements hook_preprocess_webform_confirmation().
+ */
+function webform_test_preprocess_webform_confirmation(array &$variables) {
+  /** @var \Drupal\webform\WebformInterface $webform */
+  $webform = $variables['webform'];
+  switch ($webform->id()) {
+    case 'test_states_to_text':
+      /** @var \Drupal\webform\WebformEntityConditionsManagerInterface $conditions_manager */
+      $conditions_manager = \Drupal::service('webform.conditions_manager');
+
+      $build = [];
+      $elements = $webform->getElementsInitializedAndFlattened();
+      foreach ($elements as $element_key => $element) {
+        if (isset($element['#states'])) {
+          $build[$element_key] = [
+            '#type' => 'item',
+            '#title' => $element['#admin_title'],
+            'text' => $conditions_manager->toText($webform, $element['#states']),
+          ];
+        }
+      }
+      $variables['message'] = $build;
+      return;
+
+  }
+}
+
 /**
  * Implements hook_webform_load().
  */
@@ -60,7 +88,7 @@ function webform_test_webform_load(array $entities) {
 
   foreach ($entities as $id => $entity) {
     $name = _webform_test_load_include($id);
-    if ($name) {
+    if ($name && function_exists('webform_test_' . $name)) {
       $function = 'webform_test_' . $name;
       $elements = $function($entity);
       $entity->setElements($elements);
diff --git a/web/modules/webform/tests/modules/webform_test_ajax/src/Plugin/Block/WebformTestAjaxBlock.php b/web/modules/webform/tests/modules/webform_test_ajax/src/Plugin/Block/WebformTestAjaxBlock.php
index bdb6505d8b..ffb56b70bd 100644
--- a/web/modules/webform/tests/modules/webform_test_ajax/src/Plugin/Block/WebformTestAjaxBlock.php
+++ b/web/modules/webform/tests/modules/webform_test_ajax/src/Plugin/Block/WebformTestAjaxBlock.php
@@ -4,6 +4,7 @@
 
 use Drupal\Component\Serialization\Json;
 use Drupal\Core\Block\BlockBase;
+use Drupal\Core\Config\ConfigFactoryInterface;
 use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
 use Drupal\Core\Routing\RedirectDestinationInterface;
 use Drupal\Core\Url;
@@ -21,6 +22,13 @@
  */
 class WebformTestAjaxBlock extends BlockBase implements ContainerFactoryPluginInterface {
 
+  /**
+   * The configuration factory.
+   *
+   * @var \Drupal\Core\Config\ConfigFactoryInterface
+   */
+  protected $configFactory;
+
   /**
    * The redirect destination service.
    *
@@ -37,11 +45,14 @@ class WebformTestAjaxBlock extends BlockBase implements ContainerFactoryPluginIn
    *   The plugin_id for the plugin instance.
    * @param mixed $plugin_definition
    *   The plugin implementation definition.
+   * @param \Drupal\Core\Config\ConfigFactoryInterface $config_factory
+   *   The configuration factory.
    * @param \Drupal\Core\Routing\RedirectDestinationInterface $redirect_destination
    *   The redirect destination service.
    */
-  public function __construct(array $configuration, $plugin_id, $plugin_definition, RedirectDestinationInterface $redirect_destination) {
+  public function __construct(array $configuration, $plugin_id, $plugin_definition, ConfigFactoryInterface $config_factory, RedirectDestinationInterface $redirect_destination) {
     parent::__construct($configuration, $plugin_id, $plugin_definition);
+    $this->configFactory = $config_factory;
     $this->redirectDestination = $redirect_destination;
   }
 
@@ -53,6 +64,7 @@ public static function create(ContainerInterface $container, array $configuratio
       $configuration,
       $plugin_id,
       $plugin_definition,
+      $container->get('config.factory'),
       $container->get('redirect.destination')
     );
   }
@@ -63,6 +75,7 @@ public static function create(ContainerInterface $container, array $configuratio
   public function build() {
     $webforms = Webform::loadMultiple();
 
+    // Ajax links.
     $ajax_links = [];
     foreach ($webforms as $webform_id => $webform) {
       if (strpos($webform_id, 'test_ajax') !== 0 && $webform_id !== 'test_form_wizard_long_100') {
@@ -93,34 +106,36 @@ public function build() {
       ];
     }
 
+    // Inline links.
     $webform = Webform::load('contact');
-    $inline_links = [
-      'webform' => [
-        'title' => $this->t('Open Contact'),
-        'url' => $webform->toUrl('canonical'),
-        'attributes' => [
-          'class' => ['webform-dialog', 'webform-dialog-normal'],
-        ],
+    $inline_links = [];
+    $inline_links['webform'] = [
+      'title' => $this->t('Open Contact'),
+      'url' => $webform->toUrl('canonical'),
+      'attributes' => [
+        'class' => ['webform-dialog', 'webform-dialog-normal'],
       ],
-      'source_entity' => [
-        'title' => $this->t('Open Contact with Source Entity'),
-        'url' => $webform->toUrl('canonical', ['query' => ['source_entity_type' => 'ENTITY_TYPE', 'source_entity_id' => 'ENTITY_ID']]),
-        'attributes' => [
-          'class' => ['webform-dialog', 'webform-dialog-normal'],
-        ],
+    ];
+    $inline_links['source_entity'] = [
+      'title' => $this->t('Open Contact with Source Entity'),
+      'url' => $webform->toUrl('canonical', ['query' => ['source_entity_type' => 'ENTITY_TYPE', 'source_entity_id' => 'ENTITY_ID']]),
+      'attributes' => [
+        'class' => ['webform-dialog', 'webform-dialog-normal'],
       ],
-      'javascript' => [
-        'title' => "Drupal.webformOpenDialog('" . $webform->toUrl('canonical')->toString() . "', 'webform-dialog-normal'); return false;",
-        'url' => Url::fromRoute('<none>'),
-        'attributes' => [
-          'onclick' => "Drupal.webformOpenDialog('" . $webform->toUrl('canonical')->toString() . "', 'webform-dialog-normal'); return false;",
-        ],
+    ];
+    $inline_links['javascript'] = [
+      'title' => "Drupal.webformOpenDialog('" . $webform->toUrl('canonical')->toString() . "', 'webform-dialog-normal'); return false;",
+      'url' => Url::fromRoute('<none>'),
+      'attributes' => [
+        'onclick' => "Drupal.webformOpenDialog('" . $webform->toUrl('canonical')->toString() . "', 'webform-dialog-normal'); return false;",
       ],
     ];
 
+    // Dialog links.
+    $dialog_links = [];
     $webform_style_guide = Webform::load('example_style_guide');
-    $dialog_links = [
-      'style_guide' => [
+    if ($webform_style_guide) {
+      $dialog_links['style_guide'] = [
         'title' => $this->t('Open style guide'),
         'url' => $webform_style_guide->toUrl('canonical'),
         'attributes' => [
@@ -134,27 +149,32 @@ public function build() {
             'use-ajax',
           ],
         ],
-      ],
-    ];
-    $build = [
-      'ajax' => [
+      ];
+    }
+    $build = [];
+    if ($ajax_links) {
+      $build['ajax'] = [
         '#prefix' => '<h3>' . $this->t('Ajax links') . '</h3>',
         '#theme' => 'links',
         '#links' => $ajax_links,
-      ],
-      'inline' => [
+      ];
+    }
+    if ($inline_links) {
+      $build['inline'] = [
         '#prefix' => '<h3>' . $this->t('Inline (Global) links') . '</h3>',
         '#theme' => 'links',
         '#links' => $inline_links,
-      ],
-      'dialog' => [
+      ];
+    }
+    if ($dialog_links) {
+      $build['dialog'] = [
         '#prefix' => '<h3>' . $this->t('Dialog/Offcanvas links') . '</h3>',
         '#theme' => 'links',
         '#links' => $dialog_links,
-      ],
-    ];
+      ];
+    }
     $build['#attached']['library'][] = 'webform/webform.dialog';
-    $build['#attached']['drupalSettings']['webform']['dialog']['options'] = \Drupal::config('webform.settings')->get('settings.dialog_options');
+    $build['#attached']['drupalSettings']['webform']['dialog']['options'] = $this->configFactory->get('webform.settings')->get('settings.dialog_options');
     return $build;
   }
 
diff --git a/web/modules/webform/tests/modules/webform_test_ajax/webform_test_ajax.info.yml b/web/modules/webform/tests/modules/webform_test_ajax/webform_test_ajax.info.yml
index 6ca3ee5ae9..8dc3d152d7 100644
--- a/web/modules/webform/tests/modules/webform_test_ajax/webform_test_ajax.info.yml
+++ b/web/modules/webform/tests/modules/webform_test_ajax/webform_test_ajax.info.yml
@@ -7,7 +7,7 @@ dependencies:
   - 'drupal:block'
   - 'webform:webform'
 
-# Information added by Drupal.org packaging script on 2020-07-02
-version: '8.x-5.19'
+# Information added by Drupal.org packaging script on 2020-10-05
+version: '8.x-5.22'
 project: 'webform'
-datestamp: 1593681142
+datestamp: 1601919526
diff --git a/web/modules/webform/tests/modules/webform_test_alter_hooks/webform_test_alter_hooks.info.yml b/web/modules/webform/tests/modules/webform_test_alter_hooks/webform_test_alter_hooks.info.yml
index 344d5ab9e3..8b92435da1 100644
--- a/web/modules/webform/tests/modules/webform_test_alter_hooks/webform_test_alter_hooks.info.yml
+++ b/web/modules/webform/tests/modules/webform_test_alter_hooks/webform_test_alter_hooks.info.yml
@@ -6,7 +6,7 @@ core_version_requirement: ^8.8
 dependencies:
   - 'webform:webform'
 
-# Information added by Drupal.org packaging script on 2020-07-02
-version: '8.x-5.19'
+# Information added by Drupal.org packaging script on 2020-10-05
+version: '8.x-5.22'
 project: 'webform'
-datestamp: 1593681142
+datestamp: 1601919526
diff --git a/web/modules/webform/tests/modules/webform_test_block_context/webform_test_block_context.info.yml b/web/modules/webform/tests/modules/webform_test_block_context/webform_test_block_context.info.yml
index 0c01852553..9ba2fcb144 100644
--- a/web/modules/webform/tests/modules/webform_test_block_context/webform_test_block_context.info.yml
+++ b/web/modules/webform/tests/modules/webform_test_block_context/webform_test_block_context.info.yml
@@ -7,7 +7,7 @@ dependencies:
   - 'drupal:block'
   - 'webform:webform'
 
-# Information added by Drupal.org packaging script on 2020-07-02
-version: '8.x-5.19'
+# Information added by Drupal.org packaging script on 2020-10-05
+version: '8.x-5.22'
 project: 'webform'
-datestamp: 1593681142
+datestamp: 1601919526
diff --git a/web/modules/webform/tests/modules/webform_test_block_custom/webform_test_block_custom.info.yml b/web/modules/webform/tests/modules/webform_test_block_custom/webform_test_block_custom.info.yml
index 1b6e95c2bf..cb2415e387 100644
--- a/web/modules/webform/tests/modules/webform_test_block_custom/webform_test_block_custom.info.yml
+++ b/web/modules/webform/tests/modules/webform_test_block_custom/webform_test_block_custom.info.yml
@@ -8,7 +8,7 @@ dependencies:
   - 'drupal:block_content'
   - 'webform:webform'
 
-# Information added by Drupal.org packaging script on 2020-07-02
-version: '8.x-5.19'
+# Information added by Drupal.org packaging script on 2020-10-05
+version: '8.x-5.22'
 project: 'webform'
-datestamp: 1593681142
+datestamp: 1601919526
diff --git a/web/modules/webform/tests/modules/webform_test_block_submission_limit/webform_test_block_submission_limit.info.yml b/web/modules/webform/tests/modules/webform_test_block_submission_limit/webform_test_block_submission_limit.info.yml
index 4dfe0da374..f8b0da0909 100644
--- a/web/modules/webform/tests/modules/webform_test_block_submission_limit/webform_test_block_submission_limit.info.yml
+++ b/web/modules/webform/tests/modules/webform_test_block_submission_limit/webform_test_block_submission_limit.info.yml
@@ -7,7 +7,7 @@ dependencies:
   - 'drupal:block'
   - 'webform:webform'
 
-# Information added by Drupal.org packaging script on 2020-07-02
-version: '8.x-5.19'
+# Information added by Drupal.org packaging script on 2020-10-05
+version: '8.x-5.22'
 project: 'webform'
-datestamp: 1593681142
+datestamp: 1601919526
diff --git a/web/modules/webform/tests/modules/webform_test_config_performance/webform_test_config_performance.info.yml b/web/modules/webform/tests/modules/webform_test_config_performance/webform_test_config_performance.info.yml
index b340fea19c..4af6f89f90 100644
--- a/web/modules/webform/tests/modules/webform_test_config_performance/webform_test_config_performance.info.yml
+++ b/web/modules/webform/tests/modules/webform_test_config_performance/webform_test_config_performance.info.yml
@@ -6,7 +6,7 @@ core_version_requirement: ^8.8
 dependencies:
   - 'webform:webform'
 
-# Information added by Drupal.org packaging script on 2020-07-02
-version: '8.x-5.19'
+# Information added by Drupal.org packaging script on 2020-10-05
+version: '8.x-5.22'
 project: 'webform'
-datestamp: 1593681142
+datestamp: 1601919526
diff --git a/web/modules/webform/tests/modules/webform_test_element/config/install/webform.webform.test_element_comp_file_plugin.yml b/web/modules/webform/tests/modules/webform_test_element/config/install/webform.webform.test_element_comp_file_plugin.yml
index 54c27bc435..b740484dab 100644
--- a/web/modules/webform/tests/modules/webform_test_element/config/install/webform.webform.test_element_comp_file_plugin.yml
+++ b/web/modules/webform/tests/modules/webform_test_element/config/install/webform.webform.test_element_comp_file_plugin.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -100,6 +101,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -155,6 +158,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
@@ -206,6 +210,7 @@ handlers:
   debug:
     id: debug
     label: Debug
+    notes: ''
     handler_id: debug
     status: true
     conditions: {  }
diff --git a/web/modules/webform/tests/modules/webform_test_element/config/install/webform.webform.test_element_composite_plugin.yml b/web/modules/webform/tests/modules/webform_test_element/config/install/webform.webform.test_element_composite_plugin.yml
index 7f3a4963f2..487720a170 100644
--- a/web/modules/webform/tests/modules/webform_test_element/config/install/webform.webform.test_element_composite_plugin.yml
+++ b/web/modules/webform/tests/modules/webform_test_element/config/install/webform.webform.test_element_composite_plugin.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -100,6 +101,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -155,6 +158,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
@@ -206,6 +210,7 @@ handlers:
   debug:
     id: debug
     label: Debug
+    notes: ''
     handler_id: debug
     status: true
     conditions: {  }
diff --git a/web/modules/webform/tests/modules/webform_test_element/config/install/webform.webform.test_element_plugin.yml b/web/modules/webform/tests/modules/webform_test_element/config/install/webform.webform.test_element_plugin.yml
index f61a9236eb..7ccd4176af 100644
--- a/web/modules/webform/tests/modules/webform_test_element/config/install/webform.webform.test_element_plugin.yml
+++ b/web/modules/webform/tests/modules/webform_test_element/config/install/webform.webform.test_element_plugin.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -18,12 +19,12 @@ elements: |
   description:
     '#markup': |
       <p>This webform includes a #test elememt which will trigger all methods associated with a WebformElement plugin.</p>
-
+  
   test:
     '#type': webform_test_element
     '#title': 'This is a test element'
     '#default_value': '{default_value}'
-
+  
 css: ''
 javascript: ''
 settings:
@@ -96,6 +97,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -151,6 +154,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/tests/modules/webform_test_element/src/Plugin/WebformElement/WebformTestOffCanvasWidthElement.php b/web/modules/webform/tests/modules/webform_test_element/src/Plugin/WebformElement/WebformTestOffCanvasWidthElement.php
new file mode 100644
index 0000000000..81d07c0ae4
--- /dev/null
+++ b/web/modules/webform/tests/modules/webform_test_element/src/Plugin/WebformElement/WebformTestOffCanvasWidthElement.php
@@ -0,0 +1,26 @@
+<?php
+
+namespace Drupal\webform_test_element\Plugin\WebformElement;
+
+use Drupal\webform\Plugin\WebformElement\WebformMarkup;
+use Drupal\webform\Utility\WebformDialogHelper;
+
+/**
+ * Provides a 'webform_test_offcanvas_width_element' element.
+ *
+ * @WebformElement(
+ *   id = "webform_test_offcanvas_width_element",
+ *   label = @Translation("Test element off-canvas width"),
+ *   description = @Translation("Provides a form element for testing offcanvas width.")
+ * )
+ */
+class WebformTestOffCanvasWidthElement extends WebformMarkup {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getOffCanvasWidth() {
+    return WebformDialogHelper::DIALOG_WIDE;
+  }
+
+}
diff --git a/web/modules/webform/tests/modules/webform_test_element/webform_test_element.info.yml b/web/modules/webform/tests/modules/webform_test_element/webform_test_element.info.yml
index edb2a67f28..531189c201 100644
--- a/web/modules/webform/tests/modules/webform_test_element/webform_test_element.info.yml
+++ b/web/modules/webform/tests/modules/webform_test_element/webform_test_element.info.yml
@@ -6,7 +6,7 @@ core_version_requirement: ^8.8
 dependencies:
   - 'webform:webform'
 
-# Information added by Drupal.org packaging script on 2020-07-02
-version: '8.x-5.19'
+# Information added by Drupal.org packaging script on 2020-10-05
+version: '8.x-5.22'
 project: 'webform'
-datestamp: 1593681142
+datestamp: 1601919526
diff --git a/web/modules/webform/tests/modules/webform_test_element_input_masks/webform_test_element_input_masks.info.yml b/web/modules/webform/tests/modules/webform_test_element_input_masks/webform_test_element_input_masks.info.yml
index 1b66f8e1fa..4969235268 100644
--- a/web/modules/webform/tests/modules/webform_test_element_input_masks/webform_test_element_input_masks.info.yml
+++ b/web/modules/webform/tests/modules/webform_test_element_input_masks/webform_test_element_input_masks.info.yml
@@ -6,7 +6,7 @@ core_version_requirement: ^8.8
 dependencies:
   - 'webform:webform'
 
-# Information added by Drupal.org packaging script on 2020-07-02
-version: '8.x-5.19'
+# Information added by Drupal.org packaging script on 2020-10-05
+version: '8.x-5.22'
 project: 'webform'
-datestamp: 1593681142
+datestamp: 1601919526
diff --git a/web/modules/webform/tests/modules/webform_test_entity_reference/config/install/views.view.webform_test_entity_reference_vs.yml b/web/modules/webform/tests/modules/webform_test_entity_reference/config/install/views.view.webform_test_entity_reference_vs.yml
index 670fafac68..59c1bc048f 100644
--- a/web/modules/webform/tests/modules/webform_test_entity_reference/config/install/views.view.webform_test_entity_reference_vs.yml
+++ b/web/modules/webform/tests/modules/webform_test_entity_reference/config/install/views.view.webform_test_entity_reference_vs.yml
@@ -279,9 +279,9 @@ display:
         - 'config:field.storage.node.field_image'
         - env
         - extensions
-  entity_reference_1:
+  entity_reference:
     display_plugin: entity_reference
-    id: entity_reference_1
+    id: entity_reference
     display_title: 'Entity Reference'
     position: 1
     display_options:
diff --git a/web/modules/webform/tests/modules/webform_test_entity_reference/config/install/webform.webform.test_element_entity_reference_vs.yml b/web/modules/webform/tests/modules/webform_test_entity_reference/config/install/webform.webform.test_element_entity_reference_vs.yml
index 0ce115d315..58d180c3e9 100644
--- a/web/modules/webform/tests/modules/webform_test_entity_reference/config/install/webform.webform.test_element_entity_reference_vs.yml
+++ b/web/modules/webform/tests/modules/webform_test_entity_reference/config/install/webform.webform.test_element_entity_reference_vs.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -206,6 +207,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -261,6 +264,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
@@ -312,6 +316,7 @@ handlers:
   debug:
     id: debug
     label: Debug
+    notes: ''
     handler_id: debug
     status: true
     conditions: {  }
diff --git a/web/modules/webform/tests/modules/webform_test_entity_reference/webform_test_entity_reference_views.info.yml b/web/modules/webform/tests/modules/webform_test_entity_reference/webform_test_entity_reference_views.info.yml
index 7fde616281..60fa7df24e 100644
--- a/web/modules/webform/tests/modules/webform_test_entity_reference/webform_test_entity_reference_views.info.yml
+++ b/web/modules/webform/tests/modules/webform_test_entity_reference/webform_test_entity_reference_views.info.yml
@@ -9,7 +9,7 @@ dependencies:
   - 'drupal:views'
   - 'webform:webform'
 
-# Information added by Drupal.org packaging script on 2020-07-02
-version: '8.x-5.19'
+# Information added by Drupal.org packaging script on 2020-10-05
+version: '8.x-5.22'
 project: 'webform'
-datestamp: 1593681142
+datestamp: 1601919526
diff --git a/web/modules/webform/tests/modules/webform_test_exporter/webform_test_exporter.info.yml b/web/modules/webform/tests/modules/webform_test_exporter/webform_test_exporter.info.yml
index 11871bb086..7e7a2f9de4 100644
--- a/web/modules/webform/tests/modules/webform_test_exporter/webform_test_exporter.info.yml
+++ b/web/modules/webform/tests/modules/webform_test_exporter/webform_test_exporter.info.yml
@@ -6,7 +6,7 @@ core_version_requirement: ^8.8
 dependencies:
   - 'webform:webform'
 
-# Information added by Drupal.org packaging script on 2020-07-02
-version: '8.x-5.19'
+# Information added by Drupal.org packaging script on 2020-10-05
+version: '8.x-5.22'
 project: 'webform'
-datestamp: 1593681142
+datestamp: 1601919526
diff --git a/web/modules/webform/tests/modules/webform_test_handler/config/install/webform.webform.test_handler_conditions.yml b/web/modules/webform/tests/modules/webform_test_handler/config/install/webform.webform.test_handler_conditions.yml
index d8cd5ed403..d183e11055 100644
--- a/web/modules/webform/tests/modules/webform_test_handler/config/install/webform.webform.test_handler_conditions.yml
+++ b/web/modules/webform/tests/modules/webform_test_handler/config/install/webform.webform.test_handler_conditions.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -96,6 +97,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -151,6 +154,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
@@ -202,6 +206,7 @@ handlers:
   test_a:
     id: test
     label: 'Test A'
+    notes: ''
     handler_id: test_a
     status: true
     conditions:
@@ -214,6 +219,7 @@ handlers:
   test_b:
     id: test
     label: 'Test B'
+    notes: ''
     handler_id: test_b
     status: true
     conditions:
diff --git a/web/modules/webform/tests/modules/webform_test_handler/config/install/webform.webform.test_handler_test.yml b/web/modules/webform/tests/modules/webform_test_handler/config/install/webform.webform.test_handler_test.yml
index 3e791e3598..8cf148ff0d 100644
--- a/web/modules/webform/tests/modules/webform_test_handler/config/install/webform.webform.test_handler_test.yml
+++ b/web/modules/webform/tests/modules/webform_test_handler/config/install/webform.webform.test_handler_test.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -94,6 +95,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -149,6 +152,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
@@ -200,6 +204,7 @@ handlers:
   test:
     id: test
     label: Test
+    notes: ''
     handler_id: test
     status: true
     conditions: {  }
@@ -209,6 +214,7 @@ handlers:
   debug:
     id: debug
     label: Debug
+    notes: ''
     handler_id: debug
     status: false
     conditions: {  }
diff --git a/web/modules/webform/tests/modules/webform_test_handler/src/Plugin/WebformHandler/TestWebformOffCanvasWidthHandler.php b/web/modules/webform/tests/modules/webform_test_handler/src/Plugin/WebformHandler/TestWebformOffCanvasWidthHandler.php
new file mode 100644
index 0000000000..fe5fc86034
--- /dev/null
+++ b/web/modules/webform/tests/modules/webform_test_handler/src/Plugin/WebformHandler/TestWebformOffCanvasWidthHandler.php
@@ -0,0 +1,27 @@
+<?php
+
+namespace Drupal\webform_test_handler\Plugin\WebformHandler;
+
+use Drupal\webform\Plugin\WebformHandlerBase;
+use Drupal\webform\Utility\WebformDialogHelper;
+
+/**
+ * Webform submission test off-canvas width handler.
+ *
+ * @WebformHandler(
+ *   id = "test_offcanvas_width",
+ *   label = @Translation("Test off-canvas width"),
+ *   category = @Translation("Testing"),
+ *   description = @Translation("Tests handler off-canvas width.")
+ * )
+ */
+class TestWebformOffCanvasWidthHandler extends WebformHandlerBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getOffCanvasWidth() {
+    return WebformDialogHelper::DIALOG_WIDE;
+  }
+
+}
diff --git a/web/modules/webform/tests/modules/webform_test_handler/templates/webform-handler-test-offcanvas-width.html.twig b/web/modules/webform/tests/modules/webform_test_handler/templates/webform-handler-test-offcanvas-width.html.twig
new file mode 100644
index 0000000000..b59beee8ed
--- /dev/null
+++ b/web/modules/webform/tests/modules/webform_test_handler/templates/webform-handler-test-offcanvas-width.html.twig
@@ -0,0 +1,17 @@
+{#
+/**
+ * @file
+ * Default theme implementation for a summary of a form test handler.
+ *
+ * Available variables:
+ * - settings: The current configuration for this email handler:
+ *   - text: The text.
+ * - handler: The handler information, including:
+ *   - id: The handler plugin id.
+ *   - handler_id: The handler id.
+ *   - label: The handler label.
+ *   - description: The handler description.
+ *
+ * @ingroup themeable
+ */
+#}
diff --git a/web/modules/webform/tests/modules/webform_test_handler/webform_test_handler.info.yml b/web/modules/webform/tests/modules/webform_test_handler/webform_test_handler.info.yml
index 989457e2f8..cc0db94dd4 100644
--- a/web/modules/webform/tests/modules/webform_test_handler/webform_test_handler.info.yml
+++ b/web/modules/webform/tests/modules/webform_test_handler/webform_test_handler.info.yml
@@ -6,7 +6,7 @@ core_version_requirement: ^8.8
 dependencies:
   - 'webform:webform'
 
-# Information added by Drupal.org packaging script on 2020-07-02
-version: '8.x-5.19'
+# Information added by Drupal.org packaging script on 2020-10-05
+version: '8.x-5.22'
 project: 'webform'
-datestamp: 1593681142
+datestamp: 1601919526
diff --git a/web/modules/webform/tests/modules/webform_test_handler/webform_test_handler.module b/web/modules/webform/tests/modules/webform_test_handler/webform_test_handler.module
index abb574fef3..340e41cca4 100644
--- a/web/modules/webform/tests/modules/webform_test_handler/webform_test_handler.module
+++ b/web/modules/webform/tests/modules/webform_test_handler/webform_test_handler.module
@@ -13,5 +13,8 @@ function webform_test_handler_theme() {
     'webform_handler_test_summary' => [
       'variables' => ['settings' => NULL, 'handler' => []],
     ],
+    'webform_handler_test_offcanvas_width' => [
+      'variables' => ['settings' => NULL, 'handler' => []],
+    ],
   ];
 }
diff --git a/web/modules/webform/tests/modules/webform_test_handler_invoke_alter/webform_test_handler_invoke_alter.info.yml b/web/modules/webform/tests/modules/webform_test_handler_invoke_alter/webform_test_handler_invoke_alter.info.yml
index 19bde0d1a5..49fbc81e11 100644
--- a/web/modules/webform/tests/modules/webform_test_handler_invoke_alter/webform_test_handler_invoke_alter.info.yml
+++ b/web/modules/webform/tests/modules/webform_test_handler_invoke_alter/webform_test_handler_invoke_alter.info.yml
@@ -6,7 +6,7 @@ core_version_requirement: ^8.8
 dependencies:
   - 'webform:webform'
 
-# Information added by Drupal.org packaging script on 2020-07-02
-version: '8.x-5.19'
+# Information added by Drupal.org packaging script on 2020-10-05
+version: '8.x-5.22'
 project: 'webform'
-datestamp: 1593681142
+datestamp: 1601919526
diff --git a/web/modules/webform/tests/modules/webform_test_handler_remote_post/config/install/webform.webform.test_handler_remote_get.yml b/web/modules/webform/tests/modules/webform_test_handler_remote_post/config/install/webform.webform.test_handler_remote_get.yml
index bcced891f6..b46d70975a 100644
--- a/web/modules/webform/tests/modules/webform_test_handler_remote_post/config/install/webform.webform.test_handler_remote_get.yml
+++ b/web/modules/webform/tests/modules/webform_test_handler_remote_post/config/install/webform.webform.test_handler_remote_get.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -110,6 +111,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -167,6 +170,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
@@ -218,6 +222,7 @@ handlers:
   remote_post:
     id: remote_post
     label: 'Remote HTTP GET'
+    notes: ''
     handler_id: remote_post
     status: true
     conditions: {  }
diff --git a/web/modules/webform/tests/modules/webform_test_handler_remote_post/config/install/webform.webform.test_handler_remote_post.yml b/web/modules/webform/tests/modules/webform_test_handler_remote_post/config/install/webform.webform.test_handler_remote_post.yml
index 48d3e34d41..080d450fdf 100644
--- a/web/modules/webform/tests/modules/webform_test_handler_remote_post/config/install/webform.webform.test_handler_remote_post.yml
+++ b/web/modules/webform/tests/modules/webform_test_handler_remote_post/config/install/webform.webform.test_handler_remote_post.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -113,6 +114,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -170,6 +173,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
@@ -221,6 +225,7 @@ handlers:
   remote_post:
     id: remote_post
     label: 'Remote post'
+    notes: ''
     handler_id: remote_post
     status: true
     conditions: {  }
diff --git a/web/modules/webform/tests/modules/webform_test_handler_remote_post/config/install/webform.webform.test_handler_remote_post_cast.yml b/web/modules/webform/tests/modules/webform_test_handler_remote_post/config/install/webform.webform.test_handler_remote_post_cast.yml
index 9e091e5c3d..da9a433496 100644
--- a/web/modules/webform/tests/modules/webform_test_handler_remote_post/config/install/webform.webform.test_handler_remote_post_cast.yml
+++ b/web/modules/webform/tests/modules/webform_test_handler_remote_post/config/install/webform.webform.test_handler_remote_post_cast.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -113,6 +114,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -170,6 +173,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
@@ -221,6 +225,7 @@ handlers:
   remote_post:
     id: remote_post
     label: 'Remote post'
+    notes: ''
     handler_id: remote_post
     status: true
     conditions: {  }
diff --git a/web/modules/webform/tests/modules/webform_test_handler_remote_post/config/install/webform.webform.test_handler_remote_post_file.yml b/web/modules/webform/tests/modules/webform_test_handler_remote_post/config/install/webform.webform.test_handler_remote_post_file.yml
index a6171f46ff..de3076bb27 100644
--- a/web/modules/webform/tests/modules/webform_test_handler_remote_post/config/install/webform.webform.test_handler_remote_post_file.yml
+++ b/web/modules/webform/tests/modules/webform_test_handler_remote_post/config/install/webform.webform.test_handler_remote_post_file.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -99,6 +100,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -156,6 +159,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
@@ -207,6 +211,7 @@ handlers:
   remote_post:
     id: remote_post
     label: 'Remote post'
+    notes: ''
     handler_id: remote_post
     status: true
     conditions: {  }
diff --git a/web/modules/webform/tests/modules/webform_test_handler_remote_post/config/install/webform.webform.test_handler_remote_put.yml b/web/modules/webform/tests/modules/webform_test_handler_remote_post/config/install/webform.webform.test_handler_remote_put.yml
index e229d7c9b8..5e4869c756 100644
--- a/web/modules/webform/tests/modules/webform_test_handler_remote_post/config/install/webform.webform.test_handler_remote_put.yml
+++ b/web/modules/webform/tests/modules/webform_test_handler_remote_post/config/install/webform.webform.test_handler_remote_put.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -110,6 +111,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -167,6 +170,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
@@ -218,6 +222,7 @@ handlers:
   remote_post:
     id: remote_post
     label: 'Remote HTTP PUT'
+    notes: ''
     handler_id: remote_post
     status: true
     conditions: {  }
diff --git a/web/modules/webform/tests/modules/webform_test_handler_remote_post/webform_test_handler_remote_post.info.yml b/web/modules/webform/tests/modules/webform_test_handler_remote_post/webform_test_handler_remote_post.info.yml
index ccb1e766cc..43c3054a52 100644
--- a/web/modules/webform/tests/modules/webform_test_handler_remote_post/webform_test_handler_remote_post.info.yml
+++ b/web/modules/webform/tests/modules/webform_test_handler_remote_post/webform_test_handler_remote_post.info.yml
@@ -6,7 +6,7 @@ core_version_requirement: ^8.8
 dependencies:
   - 'webform:webform'
 
-# Information added by Drupal.org packaging script on 2020-07-02
-version: '8.x-5.19'
+# Information added by Drupal.org packaging script on 2020-10-05
+version: '8.x-5.22'
 project: 'webform'
-datestamp: 1593681142
+datestamp: 1601919526
diff --git a/web/modules/webform/tests/modules/webform_test_markup/webform_test_markup.info.yml b/web/modules/webform/tests/modules/webform_test_markup/webform_test_markup.info.yml
index 7fd811b733..fc0bf60a4b 100644
--- a/web/modules/webform/tests/modules/webform_test_markup/webform_test_markup.info.yml
+++ b/web/modules/webform/tests/modules/webform_test_markup/webform_test_markup.info.yml
@@ -6,7 +6,7 @@ core_version_requirement: ^8.8
 dependencies:
   - 'webform:webform'
 
-# Information added by Drupal.org packaging script on 2020-07-02
-version: '8.x-5.19'
+# Information added by Drupal.org packaging script on 2020-10-05
+version: '8.x-5.22'
 project: 'webform'
-datestamp: 1593681142
+datestamp: 1601919526
diff --git a/web/modules/webform/tests/modules/webform_test_message_custom/webform_test_message_custom.info.yml b/web/modules/webform/tests/modules/webform_test_message_custom/webform_test_message_custom.info.yml
index d5735d5154..c8ed8bb4e0 100644
--- a/web/modules/webform/tests/modules/webform_test_message_custom/webform_test_message_custom.info.yml
+++ b/web/modules/webform/tests/modules/webform_test_message_custom/webform_test_message_custom.info.yml
@@ -6,7 +6,7 @@ core_version_requirement: ^8.8
 dependencies:
   - 'webform:webform'
 
-# Information added by Drupal.org packaging script on 2020-07-02
-version: '8.x-5.19'
+# Information added by Drupal.org packaging script on 2020-10-05
+version: '8.x-5.22'
 project: 'webform'
-datestamp: 1593681142
+datestamp: 1601919526
diff --git a/web/modules/webform/tests/modules/webform_test_options/config/install/webform.webform.test_options.yml b/web/modules/webform/tests/modules/webform_test_options/config/install/webform.webform.test_options.yml
index 4e287a7c7b..94d2f213fe 100644
--- a/web/modules/webform/tests/modules/webform_test_options/config/install/webform.webform.test_options.yml
+++ b/web/modules/webform/tests/modules/webform_test_options/config/install/webform.webform.test_options.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -219,7 +220,7 @@ elements: |
       '#options': range
       '#min': a
       '#max': z
-
+  
 css: ''
 javascript: ''
 settings:
@@ -292,6 +293,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -347,6 +350,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/tests/modules/webform_test_options/webform_test_options.info.yml b/web/modules/webform/tests/modules/webform_test_options/webform_test_options.info.yml
index 624a03a553..c72fe1308a 100644
--- a/web/modules/webform/tests/modules/webform_test_options/webform_test_options.info.yml
+++ b/web/modules/webform/tests/modules/webform_test_options/webform_test_options.info.yml
@@ -6,7 +6,7 @@ core_version_requirement: ^8.8
 dependencies:
   - 'webform:webform'
 
-# Information added by Drupal.org packaging script on 2020-07-02
-version: '8.x-5.19'
+# Information added by Drupal.org packaging script on 2020-10-05
+version: '8.x-5.22'
 project: 'webform'
-datestamp: 1593681142
+datestamp: 1601919526
diff --git a/web/modules/webform/tests/modules/webform_test_paragraphs/webform_test_paragraphs.info.yml b/web/modules/webform/tests/modules/webform_test_paragraphs/webform_test_paragraphs.info.yml
index 04c3013ed0..8d97507f19 100644
--- a/web/modules/webform/tests/modules/webform_test_paragraphs/webform_test_paragraphs.info.yml
+++ b/web/modules/webform/tests/modules/webform_test_paragraphs/webform_test_paragraphs.info.yml
@@ -7,7 +7,7 @@ dependencies:
   - 'paragraphs:paragraphs'
   - 'webform:webform'
 
-# Information added by Drupal.org packaging script on 2020-07-02
-version: '8.x-5.19'
+# Information added by Drupal.org packaging script on 2020-10-05
+version: '8.x-5.22'
 project: 'webform'
-datestamp: 1593681142
+datestamp: 1601919526
diff --git a/web/modules/webform/tests/modules/webform_test_rest/webform_test_rest.info.yml b/web/modules/webform/tests/modules/webform_test_rest/webform_test_rest.info.yml
index 354f73abdc..b643d3683a 100644
--- a/web/modules/webform/tests/modules/webform_test_rest/webform_test_rest.info.yml
+++ b/web/modules/webform/tests/modules/webform_test_rest/webform_test_rest.info.yml
@@ -9,7 +9,7 @@ dependencies:
   - 'drupal:serialization'
   - 'webform:webform'
 
-# Information added by Drupal.org packaging script on 2020-07-02
-version: '8.x-5.19'
+# Information added by Drupal.org packaging script on 2020-10-05
+version: '8.x-5.22'
 project: 'webform'
-datestamp: 1593681142
+datestamp: 1601919526
diff --git a/web/modules/webform/tests/modules/webform_test_states/webform_test_states.info.yml b/web/modules/webform/tests/modules/webform_test_states/webform_test_states.info.yml
new file mode 100644
index 0000000000..2afe08e80b
--- /dev/null
+++ b/web/modules/webform/tests/modules/webform_test_states/webform_test_states.info.yml
@@ -0,0 +1,12 @@
+name: 'Webform #states API test'
+type: module
+description: 'Support module for webform #states API testing.'
+package: 'Webform Testing'
+core_version_requirement: ^8.8
+dependencies:
+  - 'webform:webform'
+
+# Information added by Drupal.org packaging script on 2020-10-05
+version: '8.x-5.22'
+project: 'webform'
+datestamp: 1601919526
diff --git a/web/modules/webform/tests/modules/webform_test_states/webform_test_states.module b/web/modules/webform/tests/modules/webform_test_states/webform_test_states.module
new file mode 100644
index 0000000000..0d4dc58ac2
--- /dev/null
+++ b/web/modules/webform/tests/modules/webform_test_states/webform_test_states.module
@@ -0,0 +1,33 @@
+<?php
+
+/**
+ * @file
+ * Support module for webform #states API testing.
+ */
+
+/**
+ * Implements hook_preprocess_webform_confirmation().
+ */
+function webform_test_states_preprocess_webform_confirmation(array &$variables) {
+  /** @var \Drupal\webform\WebformInterface $webform */
+  $webform = $variables['webform'];
+  switch ($webform->id()) {
+    case 'test_states_to_text':
+      /** @var \Drupal\webform\WebformEntityConditionsManagerInterface $conditions_manager */
+      $conditions_manager = \Drupal::service('webform.conditions_manager');
+
+      $build = [];
+      $elements = $webform->getElementsInitializedAndFlattened();
+      foreach ($elements as $element_key => $element) {
+        if (isset($element['#states'])) {
+          $build[$element_key] = [
+            '#type' => 'item',
+            '#title' => $element['#admin_title'],
+            'text' => $conditions_manager->toText($webform, $element['#states']),
+          ];
+        }
+      }
+      $variables['message'] = $build;
+      return;
+  }
+}
diff --git a/web/modules/webform/tests/modules/webform_test_submissions/config/install/webform.webform.test_submissions.yml b/web/modules/webform/tests/modules/webform_test_submissions/config/install/webform.webform.test_submissions.yml
index 994d3f1215..5307d62d21 100644
--- a/web/modules/webform/tests/modules/webform_test_submissions/config/install/webform.webform.test_submissions.yml
+++ b/web/modules/webform/tests/modules/webform_test_submissions/config/install/webform.webform.test_submissions.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -58,7 +59,7 @@ elements: |
   address:
     '#type': webform_address
     '#title': Address
-
+  
 css: ''
 javascript: ''
 settings:
@@ -131,6 +132,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -186,6 +189,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
diff --git a/web/modules/webform/tests/modules/webform_test_submissions/webform_test_submissions.info.yml b/web/modules/webform/tests/modules/webform_test_submissions/webform_test_submissions.info.yml
index 2aa6a70b91..d3df2fc139 100644
--- a/web/modules/webform/tests/modules/webform_test_submissions/webform_test_submissions.info.yml
+++ b/web/modules/webform/tests/modules/webform_test_submissions/webform_test_submissions.info.yml
@@ -7,7 +7,7 @@ dependencies:
   - 'drupal:node'
   - 'webform:webform'
 
-# Information added by Drupal.org packaging script on 2020-07-02
-version: '8.x-5.19'
+# Information added by Drupal.org packaging script on 2020-10-05
+version: '8.x-5.22'
 project: 'webform'
-datestamp: 1593681142
+datestamp: 1601919526
diff --git a/web/modules/webform/tests/modules/webform_test_third_party_settings/config/schema/webform_test_third_party_settings.schema.yml b/web/modules/webform/tests/modules/webform_test_third_party_settings/config/schema/webform_test_third_party_settings.schema.yml
index b547771904..5368d85003 100644
--- a/web/modules/webform/tests/modules/webform_test_third_party_settings/config/schema/webform_test_third_party_settings.schema.yml
+++ b/web/modules/webform/tests/modules/webform_test_third_party_settings/config/schema/webform_test_third_party_settings.schema.yml
@@ -5,6 +5,9 @@ webform.admin_settings.third_party.webform_test_third_party_settings:
     message:
       type: string
       label: 'Message'
+    error:
+      type: boolean
+      label: 'Error'
 
 webform.settings.third_party.webform_test_third_party_settings:
   type: mapping
@@ -13,3 +16,6 @@ webform.settings.third_party.webform_test_third_party_settings:
     message:
       type: string
       label: 'Message'
+    error:
+      type: boolean
+      label: 'Error'
diff --git a/web/modules/webform/tests/modules/webform_test_third_party_settings/webform_test_third_party_settings.info.yml b/web/modules/webform/tests/modules/webform_test_third_party_settings/webform_test_third_party_settings.info.yml
index ea814cf0b7..f9743c3ff5 100644
--- a/web/modules/webform/tests/modules/webform_test_third_party_settings/webform_test_third_party_settings.info.yml
+++ b/web/modules/webform/tests/modules/webform_test_third_party_settings/webform_test_third_party_settings.info.yml
@@ -6,7 +6,7 @@ core_version_requirement: ^8.8
 dependencies:
   - 'webform:webform'
 
-# Information added by Drupal.org packaging script on 2020-07-02
-version: '8.x-5.19'
+# Information added by Drupal.org packaging script on 2020-10-05
+version: '8.x-5.22'
 project: 'webform'
-datestamp: 1593681142
+datestamp: 1601919526
diff --git a/web/modules/webform/tests/modules/webform_test_third_party_settings/webform_test_third_party_settings.webform.inc b/web/modules/webform/tests/modules/webform_test_third_party_settings/webform_test_third_party_settings.webform.inc
index 47eb1a3b0a..ac985237ff 100644
--- a/web/modules/webform/tests/modules/webform_test_third_party_settings/webform_test_third_party_settings.webform.inc
+++ b/web/modules/webform/tests/modules/webform_test_third_party_settings/webform_test_third_party_settings.webform.inc
@@ -6,6 +6,7 @@
  */
 
 use Drupal\Core\Form\FormStateInterface;
+use Drupal\Core\Messenger\MessengerInterface;
 
 /**
  * Implements hook_webform_admin_third_party_settings_form_alter().
@@ -24,6 +25,19 @@ function webform_test_third_party_settings_webform_admin_third_party_settings_fo
     '#title' => t('Display the below message on every webform'),
     '#default_value' => $third_party_settings_manager->getThirdPartySetting('webform_test_third_party_settings', 'message'),
   ];
+  $form['third_party_settings']['webform_test_third_party_settings']['error'] = [
+    '#type' => 'checkbox',
+    '#title' => t('Display as error'),
+    '#default_value' => $third_party_settings_manager->getThirdPartySetting('webform_test_third_party_settings', 'error'),
+    '#return_value' => TRUE,
+    '#states' => [
+      'visible' => [
+        ':input[name="third_party_settings[webform_test_third_party_settings][message]"]' => ['filled' => TRUE],
+      ],
+    ],
+  ];
+
+  $form['#validate'][] = '_webform_test_third_party_settings_form_validate';
 }
 
 /**
@@ -43,6 +57,30 @@ function webform_test_third_party_settings_webform_third_party_settings_form_alt
     '#title' => t('Display the below message'),
     '#default_value' => $webform->getThirdPartySetting('webform_test_third_party_settings', 'message'),
   ];
+  $form['third_party_settings']['webform_test_third_party_settings']['error'] = [
+    '#type' => 'checkbox',
+    '#title' => t('Display as error'),
+    '#default_value' => $webform->getThirdPartySetting('webform_test_third_party_settings', 'error'),
+    '#return_value' => TRUE,
+    '#states' => [
+      'visible' => [
+        ':input[name="third_party_settings[webform_test_third_party_settings][message]"]' => ['filled' => TRUE],
+      ],
+    ],
+  ];
+
+  $form['#validate'][] = '_webform_test_third_party_settings_form_validate';
+}
+
+/**
+ * Validate callback; Cleans up third party settings.
+ */
+function _webform_test_third_party_settings_form_validate(&$form, FormStateInterface $form_state) {
+  $third_party_settings = $form_state->getValue('third_party_settings');
+  if (empty($third_party_settings['webform_test_third_party_settings']['message'])) {
+    $third_party_settings['webform_test_third_party_settings'] = NULL;
+  }
+  $form_state->setValue('third_party_settings', $third_party_settings);
 }
 
 /**
@@ -64,8 +102,11 @@ function webform_test_third_party_settings_webform_submission_form_alter(&$form,
   $message = $webform->getThirdPartySetting('webform_test_third_party_settings', 'message') ?:
     $third_party_settings_manager->getThirdPartySetting('webform_test_third_party_settings', 'message');
 
+  $error = $webform->getThirdPartySetting('webform_test_third_party_settings', 'error') ?:
+    $third_party_settings_manager->getThirdPartySetting('webform_test_third_party_settings', 'error');
+
   // If a message is set, display it.
   if ($message) {
-    \Drupal::messenger()->addStatus($message);
+    \Drupal::messenger()->addMessage($message, $error ? MessengerInterface::TYPE_ERROR : MessengerInterface::TYPE_STATUS);
   }
 }
diff --git a/web/modules/webform/tests/modules/webform_test_translation/config/install/webform.webform.test_translation.yml b/web/modules/webform/tests/modules/webform_test_translation/config/install/webform.webform.test_translation.yml
index cb9537cca1..f7860fd14a 100644
--- a/web/modules/webform/tests/modules/webform_test_translation/config/install/webform.webform.test_translation.yml
+++ b/web/modules/webform/tests/modules/webform_test_translation/config/install/webform.webform.test_translation.yml
@@ -1,3 +1,4 @@
+uuid: null
 langcode: en
 status: open
 dependencies:
@@ -135,6 +136,8 @@ settings:
   wizard_progress_link: false
   wizard_progress_states: false
   wizard_auto_forward: true
+  wizard_auto_forward_hide_next_button: false
+  wizard_keyboard: true
   wizard_start_label: ''
   wizard_preview_link: false
   wizard_confirmation: true
@@ -190,6 +193,7 @@ settings:
   results_customize: false
   token_view: false
   token_update: false
+  serial_disabled: false
 access:
   create:
     roles:
@@ -241,6 +245,7 @@ handlers:
   email_confirmation:
     id: email
     label: 'Email confirmation'
+    notes: ''
     handler_id: email_confirmation
     status: true
     conditions: {  }
diff --git a/web/modules/webform/tests/modules/webform_test_translation/webform_test_translation.info.yml b/web/modules/webform/tests/modules/webform_test_translation/webform_test_translation.info.yml
index 44f5e96d74..807e14e6ec 100644
--- a/web/modules/webform/tests/modules/webform_test_translation/webform_test_translation.info.yml
+++ b/web/modules/webform/tests/modules/webform_test_translation/webform_test_translation.info.yml
@@ -9,7 +9,7 @@ dependencies:
   - 'drupal:locale'
   - 'webform:webform'
 
-# Information added by Drupal.org packaging script on 2020-07-02
-version: '8.x-5.19'
+# Information added by Drupal.org packaging script on 2020-10-05
+version: '8.x-5.22'
 project: 'webform'
-datestamp: 1593681142
+datestamp: 1601919526
diff --git a/web/modules/webform/tests/modules/webform_test_translation_lingotek/webform_test_translation_lingotek.info.yml b/web/modules/webform/tests/modules/webform_test_translation_lingotek/webform_test_translation_lingotek.info.yml
index 16c8a62a84..9d2c99c97e 100644
--- a/web/modules/webform/tests/modules/webform_test_translation_lingotek/webform_test_translation_lingotek.info.yml
+++ b/web/modules/webform/tests/modules/webform_test_translation_lingotek/webform_test_translation_lingotek.info.yml
@@ -10,7 +10,7 @@ dependencies:
   - 'lingotek:lingotek'
   - 'webform:webform'
 
-# Information added by Drupal.org packaging script on 2020-07-02
-version: '8.x-5.19'
+# Information added by Drupal.org packaging script on 2020-10-05
+version: '8.x-5.22'
 project: 'webform'
-datestamp: 1593681142
+datestamp: 1601919526
diff --git a/web/modules/webform/tests/modules/webform_test_validate/webform_test_validate.info.yml b/web/modules/webform/tests/modules/webform_test_validate/webform_test_validate.info.yml
index f3a8a87407..b140c22e2a 100644
--- a/web/modules/webform/tests/modules/webform_test_validate/webform_test_validate.info.yml
+++ b/web/modules/webform/tests/modules/webform_test_validate/webform_test_validate.info.yml
@@ -6,7 +6,7 @@ core_version_requirement: ^8.8
 dependencies:
   - 'webform:webform'
 
-# Information added by Drupal.org packaging script on 2020-07-02
-version: '8.x-5.19'
+# Information added by Drupal.org packaging script on 2020-10-05
+version: '8.x-5.22'
 project: 'webform'
-datestamp: 1593681142
+datestamp: 1601919526
diff --git a/web/modules/webform/tests/modules/webform_test_variant/src/Plugin/WebformVariant/TestWebformOffCanvasWidthVariant.php b/web/modules/webform/tests/modules/webform_test_variant/src/Plugin/WebformVariant/TestWebformOffCanvasWidthVariant.php
new file mode 100644
index 0000000000..2153a5ffea
--- /dev/null
+++ b/web/modules/webform/tests/modules/webform_test_variant/src/Plugin/WebformVariant/TestWebformOffCanvasWidthVariant.php
@@ -0,0 +1,27 @@
+<?php
+
+namespace Drupal\webform_test_variant\Plugin\WebformVariant;
+
+use Drupal\webform\Plugin\WebformVariantBase;
+use Drupal\webform\Utility\WebformDialogHelper;
+
+/**
+ * Webform variant off-canvas width.
+ *
+ * @WebformVariant(
+ *   id = "test_offcanvas_width",
+ *   label = @Translation("Test off-canvas width"),
+ *   category = @Translation("Test"),
+ *   description = @Translation("Test of a webform variant off-canvas width."),
+ * )
+ */
+class TestWebformOffCanvasWidthVariant extends WebformVariantBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getOffCanvasWidth() {
+    return WebformDialogHelper::DIALOG_WIDE;
+  }
+
+}
diff --git a/web/modules/webform/tests/modules/webform_test_variant/templates/webform-variant-test-offcanvas-width.html.twig b/web/modules/webform/tests/modules/webform_test_variant/templates/webform-variant-test-offcanvas-width.html.twig
new file mode 100644
index 0000000000..de8df45bfa
--- /dev/null
+++ b/web/modules/webform/tests/modules/webform_test_variant/templates/webform-variant-test-offcanvas-width.html.twig
@@ -0,0 +1,17 @@
+{#
+/**
+ * @file
+ * Default theme implementation for a summary of a form test off-canvas width variant.
+ *
+ * Available variables:
+ * - settings: The current configuration for this variant:
+ *   - text: The text.
+ * - variant: The variant information, including:
+ *   - id: The variant plugin id.
+ *   - variant_id: The variant id.
+ *   - label: The variant label.
+ *   - description: The variant description.
+ *
+ * @ingroup themeable
+ */
+#}
diff --git a/web/modules/webform/tests/modules/webform_test_variant/templates/webform-variant-test-summary.html.twig b/web/modules/webform/tests/modules/webform_test_variant/templates/webform-variant-test-summary.html.twig
index c72c9e16d1..06ca3ce4d2 100644
--- a/web/modules/webform/tests/modules/webform_test_variant/templates/webform-variant-test-summary.html.twig
+++ b/web/modules/webform/tests/modules/webform_test_variant/templates/webform-variant-test-summary.html.twig
@@ -1,16 +1,16 @@
 {#
 /**
  * @file
- * Default theme implementation for a summary of a form test handler.
+ * Default theme implementation for a summary of a form test variant.
  *
  * Available variables:
- * - settings: The current configuration for this email handler:
+ * - settings: The current configuration for this test variant:
  *   - text: The text.
- * - handler: The handler information, including:
- *   - id: The handler plugin id.
- *   - handler_id: The handler id.
- *   - label: The handler label.
- *   - description: The handler description.
+ * - variant: The variant information, including:
+ *   - id: The variant plugin id.
+ *   - variant_id: The variant id.
+ *   - label: The variant label.
+ *   - description: The variant description.
  *
  * @ingroup themeable
  */
diff --git a/web/modules/webform/tests/modules/webform_test_variant/webform_test_variant.info.yml b/web/modules/webform/tests/modules/webform_test_variant/webform_test_variant.info.yml
index 4c339563ff..dda382f9ec 100644
--- a/web/modules/webform/tests/modules/webform_test_variant/webform_test_variant.info.yml
+++ b/web/modules/webform/tests/modules/webform_test_variant/webform_test_variant.info.yml
@@ -6,7 +6,7 @@ core_version_requirement: ^8.8
 dependencies:
   - 'webform:webform'
 
-# Information added by Drupal.org packaging script on 2020-07-02
-version: '8.x-5.19'
+# Information added by Drupal.org packaging script on 2020-10-05
+version: '8.x-5.22'
 project: 'webform'
-datestamp: 1593681142
+datestamp: 1601919526
diff --git a/web/modules/webform/tests/modules/webform_test_variant/webform_test_variant.module b/web/modules/webform/tests/modules/webform_test_variant/webform_test_variant.module
index a6d8ee6e2d..16fca11c48 100644
--- a/web/modules/webform/tests/modules/webform_test_variant/webform_test_variant.module
+++ b/web/modules/webform/tests/modules/webform_test_variant/webform_test_variant.module
@@ -13,5 +13,8 @@ function webform_test_variant_theme() {
     'webform_variant_test_summary' => [
       'variables' => ['settings' => NULL, 'variant' => []],
     ],
+    'webform_variant_test_offcanvas_width' => [
+      'variables' => ['settings' => NULL, 'variant' => []],
+    ],
   ];
 }
diff --git a/web/modules/webform/tests/modules/webform_test_views/webform_test_views.info.yml b/web/modules/webform/tests/modules/webform_test_views/webform_test_views.info.yml
index ed0990b8b6..e14ad6bd73 100644
--- a/web/modules/webform/tests/modules/webform_test_views/webform_test_views.info.yml
+++ b/web/modules/webform/tests/modules/webform_test_views/webform_test_views.info.yml
@@ -9,7 +9,7 @@ dependencies:
   - 'drupal:views'
   - 'webform:webform'
 
-# Information added by Drupal.org packaging script on 2020-07-02
-version: '8.x-5.19'
+# Information added by Drupal.org packaging script on 2020-10-05
+version: '8.x-5.22'
 project: 'webform'
-datestamp: 1593681142
+datestamp: 1601919526
diff --git a/web/modules/webform/tests/modules/webform_test_wizard_custom/webform_test_wizard_custom.info.yml b/web/modules/webform/tests/modules/webform_test_wizard_custom/webform_test_wizard_custom.info.yml
index c932c6b275..57f1ddc91c 100644
--- a/web/modules/webform/tests/modules/webform_test_wizard_custom/webform_test_wizard_custom.info.yml
+++ b/web/modules/webform/tests/modules/webform_test_wizard_custom/webform_test_wizard_custom.info.yml
@@ -6,7 +6,7 @@ core_version_requirement: ^8.8
 dependencies:
   - 'webform:webform'
 
-# Information added by Drupal.org packaging script on 2020-07-02
-version: '8.x-5.19'
+# Information added by Drupal.org packaging script on 2020-10-05
+version: '8.x-5.22'
 project: 'webform'
-datestamp: 1593681142
+datestamp: 1601919526
diff --git a/web/modules/webform/tests/src/Functional/Composite/WebformCompositeFormatTest.php b/web/modules/webform/tests/src/Functional/Composite/WebformCompositeFormatTest.php
index 72c822fba0..0f5ac77468 100644
--- a/web/modules/webform/tests/src/Functional/Composite/WebformCompositeFormatTest.php
+++ b/web/modules/webform/tests/src/Functional/Composite/WebformCompositeFormatTest.php
@@ -47,19 +47,19 @@ public function testFormat() {
     $body = $this->getMessageBody($submission, 'email_html');
     $elements = [
       'Text format (Plain text)' => '<p>&lt;p&gt;Lorem ipsum dolor sit amet, consectetur adipiscing elit. Negat esse eam, inquit, propter se expetendam. Primum Theophrasti, Strato, physicum se voluit; Id mihi magnum videtur. Itaque mihi non satis videmini considerare quod iter sit naturae quaeque progressio. Quare hoc videndum est, possitne nobis hoc ratio philosophorum dare. Est enim tanti philosophi tamque nobilis audacter sua decreta defendere.&lt;/p&gt;</p>',
-      'Likert (Value)' => '<div class="item-list"><ul><li><b>Please answer question 1?:</b> 1</li><li><b>How about now answering question 2?:</b> 1</li><li><b>Finally, here is question 3?:</b> 1</li></ul></div>',
-      'Likert (Raw value)' => '<div class="item-list"><ul><li><b>q1:</b> 1</li><li><b>q2:</b> 1</li><li><b>q3:</b> 1</li></ul></div>',
-      'Likert (List)' => '<div class="item-list"><ul><li><b>Please answer question 1?:</b> 1</li><li><b>How about now answering question 2?:</b> 1</li><li><b>Finally, here is question 3?:</b> 1</li></ul></div>',
+      'Likert (Value)' => '<ul><li><b>Please answer question 1?:</b> 1</li><li><b>How about now answering question 2?:</b> 1</li><li><b>Finally, here is question 3?:</b> 1</li></ul>',
+      'Likert (Raw value)' => '<ul><li><b>q1:</b> 1</li><li><b>q2:</b> 1</li><li><b>q3:</b> 1</li></ul>',
+      'Likert (List)' => '<ul><li><b>Please answer question 1?:</b> 1</li><li><b>How about now answering question 2?:</b> 1</li><li><b>Finally, here is question 3?:</b> 1</li></ul>',
       'Basic address (Value)' => '10 Main Street<br />10 Main Street<br />Springfield, Alabama. 11111<br />Afghanistan<br />',
-      'Basic address (Raw value)' => '<div class="item-list"><ul><li><b>address:</b> 10 Main Street</li><li><b>address_2:</b> 10 Main Street</li><li><b>city:</b> Springfield</li><li><b>state_province:</b> Alabama</li><li><b>postal_code:</b> 11111</li><li><b>country:</b> Afghanistan</li></ul></div><br /><br />',
-      'Basic address (List)' => '<div class="item-list"><ul><li><b>Address:</b> 10 Main Street</li><li><b>Address 2:</b> 10 Main Street</li><li><b>City/Town:</b> Springfield</li><li><b>State/Province:</b> Alabama</li><li><b>ZIP/Postal Code:</b> 11111</li><li><b>Country:</b> Afghanistan</li></ul></div><br /><br />',
+      'Basic address (Raw value)' => '<ul><li><b>address:</b> 10 Main Street</li><li><b>address_2:</b> 10 Main Street</li><li><b>city:</b> Springfield</li><li><b>state_province:</b> Alabama</li><li><b>postal_code:</b> 11111</li><li><b>country:</b> Afghanistan</li></ul><br /><br />',
+      'Basic address (List)' => '<ul><li><b>Address:</b> 10 Main Street</li><li><b>Address 2:</b> 10 Main Street</li><li><b>City/Town:</b> Springfield</li><li><b>State/Province:</b> Alabama</li><li><b>ZIP/Postal Code:</b> 11111</li><li><b>Country:</b> Afghanistan</li></ul><br /><br />',
       'Advanced address (Value)' => '<div class="address" translate="no"><span class="given-name">John</span> <span class="family-name">Smith</span><br>
 <span class="organization">Google Inc.</span><br>
 <span class="address-line1">1098 Alta Ave</span><br>
 <span class="locality">Mountain View</span>, <span class="administrative-area">CA</span> <span class="postal-code">94043</span><br>
 <span class="country">United States</span></div>',
-      'Advanced address (Raw value)' => '<div class="item-list"><ul><li><b>given_name:</b> John</li><li><b>family_name:</b> Smith</li><li><b>organization:</b> Google Inc.</li><li><b>address_line1:</b> 1098 Alta Ave</li><li><b>postal_code:</b> 94043</li><li><b>locality:</b> Mountain View</li><li><b>administrative_area:</b> CA</li><li><b>country_code:</b> US</li><li><b>langcode:</b> en</li></ul>',
-      'Advanced address (List)' => '<div class="item-list"><ul><li><b>Given name:</b> John</li><li><b>Family name:</b> Smith</li><li><b>Organization:</b> Google Inc.</li><li><b>Address line 1:</b> 1098 Alta Ave</li><li><b>Postal code:</b> 94043</li><li><b>Locality:</b> Mountain View</li><li><b>Administrative area:</b> CA</li><li><b>Country code:</b> US</li><li><b>Language code:</b> en</li></ul>',
+      'Advanced address (Raw value)' => '<ul><li><b>given_name:</b> John</li><li><b>family_name:</b> Smith</li><li><b>organization:</b> Google Inc.</li><li><b>address_line1:</b> 1098 Alta Ave</li><li><b>postal_code:</b> 94043</li><li><b>locality:</b> Mountain View</li><li><b>administrative_area:</b> CA</li><li><b>country_code:</b> US</li><li><b>langcode:</b> en</li></ul>',
+      'Advanced address (List)' => '<ul><li><b>Given name:</b> John</li><li><b>Family name:</b> Smith</li><li><b>Organization:</b> Google Inc.</li><li><b>Address line 1:</b> 1098 Alta Ave</li><li><b>Postal code:</b> 94043</li><li><b>Locality:</b> Mountain View</li><li><b>Administrative area:</b> CA</li><li><b>Country code:</b> US</li><li><b>Language code:</b> en</li></ul>',
       'Link (Value)' => '<a href="http://example.com">Loremipsum</a>',
     ];
     foreach ($elements as $label => $value) {
@@ -154,10 +154,10 @@ public function testFormat() {
     $this->debug($body);
 
     $elements = [
-      'Basic address (Ordered list)' => '<div class="item-list"><ol><li>10 Main Street<br />10 Main Street<br />Springfield, Alabama. 11111<br />Afghanistan</li><li>10 Main Street<br />10 Main Street<br />Springfield, Alabama. 11111<br />Afghanistan</li><li>10 Main Street<br />10 Main Street<br />Springfield, Alabama. 11111<br />Afghanistan</li></ol></div>',
-      'Basic address (Unordered list)' => '<div class="item-list"><ul><li>10 Main Street<br />10 Main Street<br />Springfield, Alabama. 11111<br />Afghanistan</li><li>10 Main Street<br />10 Main Street<br />Springfield, Alabama. 11111<br />Afghanistan</li><li>10 Main Street<br />10 Main Street<br />Springfield, Alabama. 11111<br />Afghanistan</li></ul></div>',
+      'Basic address (Ordered list)' => '<ol><li>10 Main Street<br />10 Main Street<br />Springfield, Alabama. 11111<br />Afghanistan</li><li>10 Main Street<br />10 Main Street<br />Springfield, Alabama. 11111<br />Afghanistan</li><li>10 Main Street<br />10 Main Street<br />Springfield, Alabama. 11111<br />Afghanistan</li></ol>',
+      'Basic address (Unordered list)' => '<ul><li>10 Main Street<br />10 Main Street<br />Springfield, Alabama. 11111<br />Afghanistan</li><li>10 Main Street<br />10 Main Street<br />Springfield, Alabama. 11111<br />Afghanistan</li><li>10 Main Street<br />10 Main Street<br />Springfield, Alabama. 11111<br />Afghanistan</li></ul>',
       'Basic address (Horizontal rule)' => '10 Main Street<br />10 Main Street<br />Springfield, Alabama. 11111<br />Afghanistan<hr class="webform-horizontal-rule" />10 Main Street<br />10 Main Street<br />Springfield, Alabama. 11111<br />Afghanistan<hr class="webform-horizontal-rule" />10 Main Street<br />10 Main Street<br />Springfield, Alabama. 11111<br />Afghanistan',
-      'Basic address (Table)' => '<table width="100%" cellspacing="0" cellpadding="5" border="1" class="responsive-enabled" data-striping="1"><thead><tr><th bgcolor="#eee">Address</th><th bgcolor="#eee">Address 2</th><th bgcolor="#eee">City/Town</th><th bgcolor="#eee">State/Province</th><th bgcolor="#eee">ZIP/Postal Code</th><th bgcolor="#eee">Country</th></tr></thead><tbody><tr class="odd"><td>10 Main Street</td><td>10 Main Street</td><td>Springfield</td><td>Alabama</td><td>11111</td><td>Afghanistan</td></tr><tr class="even"><td>10 Main Street</td><td>10 Main Street</td><td>Springfield</td><td>Alabama</td><td>11111</td><td>Afghanistan</td></tr><tr class="odd"><td>10 Main Street</td><td>10 Main Street</td><td>Springfield</td><td>Alabama</td><td>11111</td><td>Afghanistan</td></tr></tbody></table>',
+      'Basic address (Table)' => '<table width="100%" cellspacing="0" cellpadding="5" border="1" class="responsive-enabled" data-striping="1"><thead><tr><th bgcolor="#eee">Address</th><th bgcolor="#eee">Address 2</th><th bgcolor="#eee">City/Town</th><th bgcolor="#eee">State/Province</th><th bgcolor="#eee">ZIP/Postal Code</th><th bgcolor="#eee">Country</th></tr></thead><tbody><tr><td>10 Main Street</td><td>10 Main Street</td><td>Springfield</td><td>Alabama</td><td>11111</td><td>Afghanistan</td></tr><tr><td>10 Main Street</td><td>10 Main Street</td><td>Springfield</td><td>Alabama</td><td>11111</td><td>Afghanistan</td></tr><tr><td>10 Main Street</td><td>10 Main Street</td><td>Springfield</td><td>Alabama</td><td>11111</td><td>Afghanistan</td></tr></tbody></table>',
     ];
     foreach ($elements as $label => $value) {
       $this->assertStringContainsString('<b>' . $label . '</b><br />' . $value, $body, new FormattableMarkup('Found @label: @value', ['@label' => $label, '@value' => $value]));
diff --git a/web/modules/webform/tests/src/Functional/Composite/WebformCompositeTest.php b/web/modules/webform/tests/src/Functional/Composite/WebformCompositeTest.php
index d0ecf70352..a480142c24 100644
--- a/web/modules/webform/tests/src/Functional/Composite/WebformCompositeTest.php
+++ b/web/modules/webform/tests/src/Functional/Composite/WebformCompositeTest.php
@@ -53,8 +53,8 @@ public function testComposite() {
 
     // Check link multiple in table.
     $this->assertRaw('<label>Link multiple</label>');
-    $this->assertRaw('<th class="link_multiple-table--title webform-multiple-table--title">Link Title<span class="webform-element-help" role="tooltip" tabindex="0" data-webform-help="&lt;div class=&quot;webform-element-help--title&quot;&gt;Link Title&lt;/div&gt;&lt;div class=&quot;webform-element-help--content&quot;&gt;This is link title help&lt;/div&gt;"><span aria-hidden="true">?</span></span>');
-    $this->assertRaw('<th class="link_multiple-table--url webform-multiple-table--url">Link URL<span class="webform-element-help" role="tooltip" tabindex="0" data-webform-help="&lt;div class=&quot;webform-element-help--title&quot;&gt;Link URL&lt;/div&gt;&lt;div class=&quot;webform-element-help--content&quot;&gt;This is link url help&lt;/div&gt;"><span aria-hidden="true">?</span></span>');
+    $this->assertRaw('<th class="link_multiple-table--title webform-multiple-table--title">Link Title<span class="webform-element-help js-webform-element-help" role="tooltip" tabindex="0" data-webform-help="&lt;div class=&quot;webform-element-help--title&quot;&gt;Link Title&lt;/div&gt;&lt;div class=&quot;webform-element-help--content&quot;&gt;This is link title help&lt;/div&gt;"><span aria-hidden="true">?</span></span>');
+    $this->assertRaw('<th class="link_multiple-table--url webform-multiple-table--url">Link URL<span class="webform-element-help js-webform-element-help" role="tooltip" tabindex="0" data-webform-help="&lt;div class=&quot;webform-element-help--title&quot;&gt;Link URL&lt;/div&gt;&lt;div class=&quot;webform-element-help--content&quot;&gt;This is link url help&lt;/div&gt;"><span aria-hidden="true">?</span></span>');
 
     /* Processing */
 
diff --git a/web/modules/webform/tests/src/Functional/Element/WebformElementAccessTest.php b/web/modules/webform/tests/src/Functional/Element/WebformElementAccessTest.php
index a761172505..41fddedd8f 100644
--- a/web/modules/webform/tests/src/Functional/Element/WebformElementAccessTest.php
+++ b/web/modules/webform/tests/src/Functional/Element/WebformElementAccessTest.php
@@ -198,6 +198,29 @@ public function testAccess() {
       $this->drupalGet($url['path'], $url['options']);
       $this->assertRaw($raw, 'Admin submission user can access token');
     }
+
+    /* #access */
+
+    $this->drupalLogin($this->rootUser);
+
+    // Check that textfield and fieldset are disabled in the UI.
+    $this->drupalGet('/admin/structure/webform/manage/test_element_access');
+    $this->assertCssSelect('[data-webform-key="textfield_access_property"].webform-ui-element-disabled');
+    $this->assertCssSelect('[data-webform-key="fieldset_access_property"].webform-ui-element-disabled');
+    $this->assertCssSelect('[data-webform-key="fieldset_textfield_access"]');
+    $this->assertNoCssSelect('[data-webform-key="fieldset_textfield_access"].webform-ui-element-disabled');
+
+    // Check that textfield and fieldset are removed from results.
+    $this->drupalGet('/admin/structure/webform/manage/test_element_access/results/submissions');
+    $this->assertNoRaw('textfield_access_property');
+    $this->assertNoRaw('fieldset_access_property');
+    $this->assertRaw('fieldset_textfield_access');
+
+    // Check that textfield and fieldset are removed from download.
+    $this->drupalGet('/admin/structure/webform/manage/test_element_access/results/download');
+    $this->assertNoRaw('textfield_access_property');
+    $this->assertNoRaw('fieldset_access_property');
+    $this->assertRaw('fieldset_textfield_access');
   }
 
 }
diff --git a/web/modules/webform/tests/src/Functional/Element/WebformElementActionsTest.php b/web/modules/webform/tests/src/Functional/Element/WebformElementActionsTest.php
index 52666aa83d..4aa972d213 100644
--- a/web/modules/webform/tests/src/Functional/Element/WebformElementActionsTest.php
+++ b/web/modules/webform/tests/src/Functional/Element/WebformElementActionsTest.php
@@ -22,6 +22,8 @@ class WebformElementActionsTest extends WebformElementBrowserTestBase {
    * Tests actions element.
    */
   public function testActions() {
+    global $base_path;
+
     $webform = Webform::load('test_element_actions');
 
     /**************************************************************************/
@@ -35,41 +37,49 @@ public function testActions() {
     $this->assertRaw('<div style="border: 2px solid red; padding: 10px" data-drupal-selector="edit-actions-custom" class="form-actions webform-actions js-form-wrapper form-wrapper" id="edit-actions-custom">');
     $this->assertRaw('<input formnovalidate="formnovalidate" class="webform-button--draft custom-draft button js-form-submit form-submit" style="font-weight: bold" data-custom-draft data-drupal-selector="edit-actions-custom-draft" type="submit" id="edit-actions-custom-draft" name="op" value="{Custom draft}" />');
     $this->assertRaw('<input class="webform-button--next custom-wizard-next button js-form-submit form-submit" style="font-weight: bold" data-custom-wizard-next data-drupal-selector="edit-actions-custom-wizard-next" type="submit" id="edit-actions-custom-wizard-next" name="op" value="{Custom wizard next}" />');
-    $this->assertRaw('<input formnovalidate="formnovalidate" class="webform-button--reset custom-reet button js-form-submit form-submit" style="font-weight: bold" data-custom-reset data-drupal-selector="edit-actions-custom-reset" type="submit" id="edit-actions-custom-reset" name="op" value="{Custom reset}" />');
+    $this->assertRaw('<input formnovalidate="formnovalidate" class="webform-button--reset custom-reset button js-form-submit form-submit" style="font-weight: bold" data-custom-reset data-drupal-selector="edit-actions-custom-reset" type="submit" id="edit-actions-custom-reset" name="op" value="{Custom reset}" />');
 
     // Check wizard next.
-    $this->assertRaw('id="edit-actions-wizard-next-wizard-next"');
-    $this->assertNoRaw('id="edit-actions-wizard-prev-wizard-prev"');
+    $this->assertCssSelect('[id="edit-actions-wizard-next-wizard-next"]');
+    $this->assertNoCssSelect('[id="edit-actions-wizard-prev-wizard-prev"]');
 
     // Move to next page.
     $this->drupalPostForm(NULL, [], 'Next >');
 
     // Check no wizard next.
-    $this->assertNoRaw('id="edit-actions-wizard-next-wizard-next"');
-    $this->assertRaw('id="edit-actions-wizard-prev-wizard-prev"');
+    $this->assertNoCssSelect('[id="edit-actions-wizard-next-wizard-next"]');
+    $this->assertCssSelect('[id="edit-actions-wizard-prev-wizard-prev"]');
 
     // Move to preview.
     $this->drupalPostForm(NULL, [], 'Preview');
 
     // Check submit button.
-    $this->assertRaw('id="edit-actions-submit-submit"');
+    $this->assertCssSelect('[id="edit-actions-submit-submit"]');
 
     // Check reset button.
-    $this->assertRaw('id="edit-actions-reset-reset"');
+    $this->assertCssSelect('[id="edit-actions-reset-reset"]');
 
     // Submit form.
     $this->drupalPostForm(NULL, [], 'Submit');
     $sid = $this->getLastSubmissionId($webform);
 
     // Check no actions.
-    $this->assertNoRaw('form-actions');
+    $this->assertNoCssSelect('.form-actions');
 
-    // Check custom update action.
+    // Login as admin.
     $this->drupalLogin($this->rootUser);
+
+    // Check custom update action.
     $this->drupalGet("/admin/structure/webform/manage/test_element_actions/submission/$sid/edit");
     $this->drupalPostForm(NULL, [], 'Next >');
     $this->assertRaw('<input class="webform-button--submit custom-update button button--primary js-form-submit form-submit" style="font-weight: bold" data-custom-update data-drupal-selector="edit-actions-custom-submit" type="submit" id="edit-actions-custom-submit" name="op" value="{Custom update}" />');
 
+    // Check custom delete action.
+    $this->drupalPostForm('/webform/test_element_actions', [], 'Save Draft');
+    $sid = $this->getLastSubmissionId($webform);
+    $this->assertRaw('<a href="' . $base_path . 'admin/structure/webform/manage/test_element_actions/submission/' . $sid . '/delete?destination=' . $base_path . 'webform/test_element_actions" class="button button--danger custom-delete" style="font-weight: bold" data-custom-delete data-drupal-selector="edit-actions-custom-delete" id="edit-actions-custom-delete" hreflang="en">{Custom delete}</a>');
+    $this->assertCssSelect('[id="edit-actions-delete"]');
+
     /**************************************************************************/
     /* Test actions buttons */
     /**************************************************************************/
diff --git a/web/modules/webform/tests/src/Functional/Element/WebformElementAddressTest.php b/web/modules/webform/tests/src/Functional/Element/WebformElementAddressTest.php
index 5f0ad8a71c..c27ac23103 100644
--- a/web/modules/webform/tests/src/Functional/Element/WebformElementAddressTest.php
+++ b/web/modules/webform/tests/src/Functional/Element/WebformElementAddressTest.php
@@ -46,7 +46,7 @@ public function testAddress() {
 
     // Check advanced fieldset, legend, help, and description.
     $this->assertRaw('<fieldset data-drupal-selector="edit-address-advanced" aria-describedby="edit-address-advanced--wrapper--description" id="edit-address-advanced--wrapper" class="address--wrapper fieldgroup form-composite webform-composite-visible-title webform-element-help-container--title webform-element-help-container--title-after js-webform-type-address webform-type-address js-form-item form-item js-form-wrapper form-wrapper">');
-    $this->assertRaw('<span class="fieldset-legend">address_advanced<span class="webform-element-help" role="tooltip" tabindex="0" data-webform-help="&lt;div class=&quot;webform-element-help--title&quot;&gt;address_advanced&lt;/div&gt;&lt;div class=&quot;webform-element-help--content&quot;&gt;This is help text&lt;/div&gt;"><span aria-hidden="true">?</span></span>');
+    $this->assertRaw('<span class="fieldset-legend">address_advanced<span class="webform-element-help js-webform-element-help" role="tooltip" tabindex="0" data-webform-help="&lt;div class=&quot;webform-element-help--title&quot;&gt;address_advanced&lt;/div&gt;&lt;div class=&quot;webform-element-help--content&quot;&gt;This is help text&lt;/div&gt;"><span aria-hidden="true">?</span></span>');
     if (floatval(\Drupal::VERSION) >= 9) {
       $this->assertRaw('<div class="description"><div id="edit-address-advanced--wrapper--description" data-drupal-field-elements="description" class="webform-element-description">This is a description</div>');
     }
diff --git a/web/modules/webform/tests/src/Functional/Element/WebformElementCheckboxesTest.php b/web/modules/webform/tests/src/Functional/Element/WebformElementCheckboxesTest.php
index 1b5ca0d4c7..49ccfddfdc 100644
--- a/web/modules/webform/tests/src/Functional/Element/WebformElementCheckboxesTest.php
+++ b/web/modules/webform/tests/src/Functional/Element/WebformElementCheckboxesTest.php
@@ -41,7 +41,7 @@ public function testCheckboxes() {
     $this->assertRaw('<label class="webform-options-display-buttons-label option" for="edit-checkboxes-buttons-description-one"><div class="webform-options-display-buttons-title">One</div><div class="webform-options-display-buttons-description description">This is a description</div></label>');
 
     // Check options (custom) properties wrapper attributes.
-    $this->assertRaw('<div data-custom="custom wrapper data" style="border: red 1px solid" class="one-custom-wrapper-class js-form-item form-item js-form-type-checkbox form-type-checkbox js-form-item-checkboxes-options-properties-two form-item-checkboxes-options-properties-two">');
+    $this->assertRaw('<div data-custom="custom wrapper data" style="border: red 1px solid" class="one-custom-wrapper-class js-form-item form-item js-form-type-checkbox form-item-checkboxes-options-properties-two js-form-item-checkboxes-options-properties-two">');
 
     // Check options (custom) properties label attributes.
     $this->assertRaw('<label data-custom="custom label data" style="border: blue 1px solid" class="one-custom-label-class option" for="edit-checkboxes-options-properties-two">Two</label>');
diff --git a/web/modules/webform/tests/src/Functional/Element/WebformElementCodeMirrorTest.php b/web/modules/webform/tests/src/Functional/Element/WebformElementCodeMirrorTest.php
index 8f94112442..62c1848fd8 100644
--- a/web/modules/webform/tests/src/Functional/Element/WebformElementCodeMirrorTest.php
+++ b/web/modules/webform/tests/src/Functional/Element/WebformElementCodeMirrorTest.php
@@ -28,12 +28,12 @@ public function testCodeMirror() {
     // Check Text.
     $this->drupalGet('/webform/test_element_codemirror');
     $this->assertRaw('<label for="edit-text-basic">text_basic</label>');
-    $this->assertRaw('<textarea data-drupal-selector="edit-text-basic" class="js-webform-codemirror webform-codemirror text form-textarea resize-vertical" data-webform-codemirror-mode="text/plain" id="edit-text-basic" name="text_basic" rows="5" cols="60">Hello</textarea>');
+    $this->assertRaw('<textarea data-drupal-selector="edit-text-basic" class="js-webform-codemirror webform-codemirror text form-textarea" data-webform-codemirror-mode="text/plain" id="edit-text-basic" name="text_basic" rows="5" cols="60">Hello</textarea>');
 
     // Check Text with no wrap.
     $this->drupalGet('/webform/test_element_codemirror');
     $this->assertRaw('<label for="edit-text-basic-no-wrap">text_basic_no_wrap</label>');
-    $this->assertRaw('<textarea data-drupal-selector="edit-text-basic-no-wrap" wrap="off" class="js-webform-codemirror webform-codemirror text form-textarea resize-vertical" data-webform-codemirror-mode="text/plain" id="edit-text-basic-no-wrap" name="text_basic_no_wrap" rows="5" cols="60">');
+    $this->assertRaw('<textarea data-drupal-selector="edit-text-basic-no-wrap" wrap="off" class="js-webform-codemirror webform-codemirror text form-textarea" data-webform-codemirror-mode="text/plain" id="edit-text-basic-no-wrap" name="text_basic_no_wrap" rows="5" cols="60">');
 
     /**************************************************************************/
     // code:yaml
@@ -42,7 +42,7 @@ public function testCodeMirror() {
     // Check YAML.
     $this->drupalGet('/webform/test_element_codemirror');
     $this->assertRaw('<label for="edit-yaml-basic">yaml_basic</label>');
-    $this->assertRaw('<textarea data-drupal-selector="edit-yaml-basic" class="js-webform-codemirror webform-codemirror yaml form-textarea resize-vertical" data-webform-codemirror-mode="text/x-yaml" id="edit-yaml-basic" name="yaml_basic" rows="5" cols="60">test: hello</textarea>');
+    $this->assertRaw('<textarea data-drupal-selector="edit-yaml-basic" class="js-webform-codemirror webform-codemirror yaml form-textarea" data-webform-codemirror-mode="text/x-yaml" id="edit-yaml-basic" name="yaml_basic" rows="5" cols="60">test: hello</textarea>');
 
     // Check default value decoding.
     $this->drupalPostForm('/webform/test_element_codemirror', [], 'Submit');
@@ -75,7 +75,7 @@ public function testCodeMirror() {
     // Check HTML.
     $this->drupalGet('/webform/test_element_codemirror');
     $this->assertRaw('<label for="edit-html-basic">html_basic</label>');
-    $this->assertRaw('<textarea data-drupal-selector="edit-html-basic" class="js-webform-codemirror webform-codemirror html form-textarea resize-vertical" data-webform-codemirror-mode="text/html" id="edit-html-basic" name="html_basic" rows="5" cols="60">&lt;b&gt;Hello&lt;/b&gt;</textarea>');
+    $this->assertRaw('<textarea data-drupal-selector="edit-html-basic" class="js-webform-codemirror webform-codemirror html form-textarea" data-webform-codemirror-mode="text/html" id="edit-html-basic" name="html_basic" rows="5" cols="60">&lt;b&gt;Hello&lt;/b&gt;</textarea>');
 
     // Check invalid HTML.
     $edit = [
@@ -100,7 +100,7 @@ public function testCodeMirror() {
     // Check disabled Twig editor.
     $this->drupalGet('/webform/test_element_codemirror');
     $this->assertRaw('<label for="edit-twig-basic">twig_basic</label>');
-    $this->assertRaw('<textarea data-drupal-selector="edit-twig-basic" disabled="disabled" class="js-webform-codemirror webform-codemirror twig form-textarea resize-vertical" data-webform-codemirror-mode="twig" id="edit-twig-basic" name="twig_basic" rows="5" cols="60">
+    $this->assertRaw('<textarea data-drupal-selector="edit-twig-basic" disabled="disabled" class="js-webform-codemirror webform-codemirror twig form-textarea" data-webform-codemirror-mode="twig" id="edit-twig-basic" name="twig_basic" rows="5" cols="60">
 {% set value = &quot;Hello&quot; %}
 {{ value }}
 </textarea>');
@@ -110,7 +110,7 @@ public function testCodeMirror() {
 
     // Check enabled Twig editor.
     $this->drupalGet('/webform/test_element_codemirror');
-    $this->assertRaw('<textarea data-drupal-selector="edit-twig-basic" class="js-webform-codemirror webform-codemirror twig form-textarea resize-vertical" data-webform-codemirror-mode="twig" id="edit-twig-basic" name="twig_basic" rows="5" cols="60">
+    $this->assertRaw('<textarea data-drupal-selector="edit-twig-basic" class="js-webform-codemirror webform-codemirror twig form-textarea" data-webform-codemirror-mode="twig" id="edit-twig-basic" name="twig_basic" rows="5" cols="60">
 {% set value = &quot;Hello&quot; %}
 {{ value }}
 </textarea>');
diff --git a/web/modules/webform/tests/src/Functional/Element/WebformElementCompositeTest.php b/web/modules/webform/tests/src/Functional/Element/WebformElementCompositeTest.php
index 9f70012a18..075a1c2e54 100644
--- a/web/modules/webform/tests/src/Functional/Element/WebformElementCompositeTest.php
+++ b/web/modules/webform/tests/src/Functional/Element/WebformElementCompositeTest.php
@@ -124,7 +124,7 @@ public function testComposite() {
     $this->assertRaw('<fieldset data-drupal-selector="edit-radios-wrapper-fieldset-hidden-title" id="edit-radios-wrapper-fieldset-hidden-title--wrapper" class="radios--wrapper fieldgroup form-composite webform-composite-hidden-title required js-webform-type-radios webform-type-radios js-form-item form-item js-form-wrapper form-wrapper">');
 
     // Check form element wrapper.
-    $this->assertRaw('<div class="js-form-item form-item js-form-type-radios form-type-radios js-form-item-radios-wrapper-form-element form-item-radios-wrapper-form-element">');
+    $this->assertRaw('<div class="js-form-item form-item js-form-type-radios form-item-radios-wrapper-form-element js-form-item-radios-wrapper-form-element">');
 
     // Check container wrapper.
     $this->assertRaw('<div data-drupal-selector="edit-radios-wrapper-container" id="edit-radios-wrapper-container--wrapper" class="radios--wrapper fieldgroup form-composite js-form-wrapper form-wrapper">');
@@ -140,7 +140,7 @@ public function testComposite() {
 
     // Check wrapper with #states.
     $this->assertRaw('<fieldset data-drupal-selector="edit-states-fieldset" class="js-webform-states-hidden radios--wrapper fieldgroup form-composite webform-composite-visible-title js-webform-type-radios webform-type-radios js-form-item form-item js-form-wrapper form-wrapper" id="edit-states-fieldset--wrapper" data-drupal-states="{&quot;visible&quot;:{&quot;.webform-submission-test-element-composite-wrapper-add-form :input[name=\u0022states_checkbox\u0022]&quot;:{&quot;checked&quot;:true}}}">');
-    $this->assertRaw('<div class="js-webform-states-hidden js-form-item form-item js-form-type-radios form-type-radios js-form-item-states-form-item form-item-states-form-item" data-drupal-states="{&quot;visible&quot;:{&quot;.webform-submission-test-element-composite-wrapper-add-form :input[name=\u0022states_checkbox\u0022]&quot;:{&quot;checked&quot;:true}}}">');
+    $this->assertRaw('<div class="js-webform-states-hidden js-form-item form-item js-form-type-radios form-item-states-form-item js-form-item-states-form-item" data-drupal-states="{&quot;visible&quot;:{&quot;.webform-submission-test-element-composite-wrapper-add-form :input[name=\u0022states_checkbox\u0022]&quot;:{&quot;checked&quot;:true}}}">');
     $this->assertRaw('<div data-drupal-selector="edit-states-container" class="js-webform-states-hidden radios--wrapper fieldgroup form-composite js-form-wrapper form-wrapper" id="edit-states-container--wrapper" data-drupal-states="{&quot;visible&quot;:{&quot;.webform-submission-test-element-composite-wrapper-add-form :input[name=\u0022states_checkbox\u0022]&quot;:{&quot;checked&quot;:true}}}">');
 
     // Below tests are only failing on Drupal.org and pass locally.
diff --git a/web/modules/webform/tests/src/Functional/Element/WebformElementComputedTest.php b/web/modules/webform/tests/src/Functional/Element/WebformElementComputedTest.php
index cc3cbe2996..7cfe82ffdb 100644
--- a/web/modules/webform/tests/src/Functional/Element/WebformElementComputedTest.php
+++ b/web/modules/webform/tests/src/Functional/Element/WebformElementComputedTest.php
@@ -72,7 +72,7 @@ public function testComputedElement() {
     $this->assertRaw('<b class="webform_computed_token_html">xss:</b> &lt;script&gt;alert(&quot;XSS&quot;);&lt;/script&gt;<br />');
 
     // Check token plain text rendering.
-    $this->assertRaw('<div class="webform-element webform-element-type-webform-computed-token js-form-item form-item js-form-type-item form-type-item js-form-item-webform-computed-token-text form-item-webform-computed-token-text" id="test_element_computed_token--webform_computed_token_text">');
+    $this->assertRaw(' <div class="webform-element webform-element-type-webform-computed-token js-form-item form-item js-form-type-item form-item-webform-computed-token-text js-form-item-webform-computed-token-text" id="test_element_computed_token--webform_computed_token_text">');
     $this->assertRaw('<label>webform_computed_token_text</label>');
     $this->assertRaw('simple string: This is a string<br />');
     $this->assertRaw('complex string : This is a &lt;strong&gt;complex&lt;/strong&gt; string, which contains &quot;double&quot; and &#039;single&#039; quotes with special characters like &gt;, &lt;, &gt;&lt;, and &lt;&gt;.<br />');
diff --git a/web/modules/webform/tests/src/Functional/Element/WebformElementCounterTest.php b/web/modules/webform/tests/src/Functional/Element/WebformElementCounterTest.php
index a63ecec082..00f99a89c2 100644
--- a/web/modules/webform/tests/src/Functional/Element/WebformElementCounterTest.php
+++ b/web/modules/webform/tests/src/Functional/Element/WebformElementCounterTest.php
@@ -25,8 +25,8 @@ public function testCounter() {
     $this->drupalGet('/webform/test_element_counter');
     $this->assertRaw('<input data-counter-type="character" data-counter-minimum="5" data-counter-minimum-message="%d character(s) entered. This is custom text" class="js-webform-counter webform-counter form-text" data-drupal-selector="edit-counter-characters-min-message" type="text" id="edit-counter-characters-min-message" name="counter_characters_min_message" value="" size="60" maxlength="255" />');
     $this->assertRaw('<input data-counter-type="character" data-counter-maximum="10" data-counter-maximum-message="%d character(s) remaining. This is custom text" class="js-webform-counter webform-counter form-text" data-drupal-selector="edit-counter-characters-max-message" type="text" id="edit-counter-characters-max-message" name="counter_characters_max_message" value="" size="60" maxlength="10" />');
-    $this->assertRaw('<textarea data-counter-type="word" data-counter-minimum="5" data-counter-minimum-message="%d word(s) entered. This is custom text" class="js-webform-counter webform-counter form-textarea resize-vertical" data-drupal-selector="edit-counter-words-min-message" id="edit-counter-words-min-message" name="counter_words_min_message" rows="5" cols="60"></textarea>');
-    $this->assertRaw('<textarea data-counter-type="word" data-counter-maximum="10" data-counter-maximum-message="%d character(s) remaining. This is custom text" class="js-webform-counter webform-counter form-textarea resize-vertical" data-drupal-selector="edit-counter-words-max-message" id="edit-counter-words-max-message" name="counter_words_max_message" rows="5" cols="60"></textarea>');
+    $this->assertRaw('<textarea data-counter-type="word" data-counter-minimum="5" data-counter-minimum-message="%d word(s) entered. This is custom text" class="js-webform-counter webform-counter form-textarea" data-drupal-selector="edit-counter-words-min-message" id="edit-counter-words-min-message" name="counter_words_min_message" rows="5" cols="60"></textarea>');
+    $this->assertRaw('<textarea data-counter-type="word" data-counter-maximum="10" data-counter-maximum-message="%d character(s) remaining. This is custom text" class="js-webform-counter webform-counter form-textarea" data-drupal-selector="edit-counter-words-max-message" id="edit-counter-words-max-message" name="counter_words_max_message" rows="5" cols="60"></textarea>');
 
     // Check counter for XSS.
     $this->assertRaw('<input data-counter-type="character" data-counter-minimum="5" data-counter-minimum-message="alert(&#039;XSS&#039;);&lt;em&gt;%d&lt;/em&gt; character(s) entered." data-counter-maximum="10" data-counter-maximum-message="alert(&#039;XSS&#039;);&lt;em&gt;%d&lt;/em&gt; character(s) remaining." class="js-webform-counter webform-counter form-text" data-drupal-selector="edit-counter-characters-xss" type="text" id="edit-counter-characters-xss" name="counter_characters_xss" value="" size="60" maxlength="10" />');
diff --git a/web/modules/webform/tests/src/Functional/Element/WebformElementDetailsTest.php b/web/modules/webform/tests/src/Functional/Element/WebformElementDetailsTest.php
index 90cc38a67f..08debedb21 100644
--- a/web/modules/webform/tests/src/Functional/Element/WebformElementDetailsTest.php
+++ b/web/modules/webform/tests/src/Functional/Element/WebformElementDetailsTest.php
@@ -26,8 +26,8 @@ public function testDetails() {
     // and more. Also, check that invalid 'required' and 'aria-required'
     // attributes are removed.
     $this->assertRaw('<details data-webform-key="details" data-drupal-selector="edit-details" aria-describedby="edit-details--description" id="edit-details" class="js-form-wrapper form-wrapper required webform-element-help-container--title webform-element-help-container--title-after" open="open">');
-    $this->assertRaw('<summary role="button" aria-controls="edit-details" aria-expanded="true" aria-pressed="true" class="js-form-required form-required">details<span class="webform-element-help" role="tooltip" tabindex="0" data-webform-help="&lt;div class=&quot;webform-element-help--title&quot;&gt;details&lt;/div&gt;&lt;div class=&quot;webform-element-help--content&quot;&gt;This is help text.&lt;/div&gt;"><span aria-hidden="true">?</span>');
-    $this->assertRaw('<div class="details-description"><div id="edit-details--description" class="webform-element-description">This is a description.</div>');
+    $this->assertRaw('<summary role="button" aria-controls="edit-details" aria-expanded="true" aria-pressed="true" class="js-form-required form-required">details<span class="webform-element-help js-webform-element-help" role="tooltip" tabindex="0" data-webform-help="&lt;div class=&quot;webform-element-help--title&quot;&gt;details&lt;/div&gt;&lt;div class=&quot;webform-element-help--content&quot;&gt;This is help text.&lt;/div&gt;"><span aria-hidden="true">?</span>');
+    $this->assertRaw('<div id="edit-details--description" class="webform-element-description">This is a description.</div>');
     $this->assertRaw('<div id="edit-details--more" class="js-webform-element-more webform-element-more">');
 
     // Check details title_display: invisible.
diff --git a/web/modules/webform/tests/src/Functional/Element/WebformElementEmailConfirmTest.php b/web/modules/webform/tests/src/Functional/Element/WebformElementEmailConfirmTest.php
index ca27235198..c605dd74a1 100644
--- a/web/modules/webform/tests/src/Functional/Element/WebformElementEmailConfirmTest.php
+++ b/web/modules/webform/tests/src/Functional/Element/WebformElementEmailConfirmTest.php
@@ -25,21 +25,21 @@ public function testEmailConfirm() {
     // Check basic email confirm.
     $this->assertRaw('<fieldset id="edit-email-confirm-basic--wrapper" class="webform-email-confirm--wrapper fieldgroup form-composite webform-composite-hidden-title js-webform-type-webform-email-confirm webform-type-webform-email-confirm js-form-item form-item js-form-wrapper form-wrapper">');
     $this->assertRaw('<span class="visually-hidden fieldset-legend">email_confirm_basic</span>');
-    $this->assertRaw('<div class="js-form-item form-item js-form-type-email form-type-email js-form-item-email-confirm-basic-mail-1 form-item-email-confirm-basic-mail-1">');
+    $this->assertRaw('<div class="js-form-item form-item js-form-type-email form-item-email-confirm-basic-mail-1 js-form-item-email-confirm-basic-mail-1">');
     $this->assertRaw('<label for="edit-email-confirm-basic-mail-1">email_confirm_basic</label>');
     $this->assertRaw('<input data-drupal-selector="edit-email-confirm-basic-mail-1" class="webform-email form-email" type="email" id="edit-email-confirm-basic-mail-1" name="email_confirm_basic[mail_1]" value="" size="60" maxlength="254" />');
-    $this->assertRaw('<div class="js-form-item form-item js-form-type-email form-type-email js-form-item-email-confirm-basic-mail-2 form-item-email-confirm-basic-mail-2">');
+    $this->assertRaw('<div class="js-form-item form-item js-form-type-email form-item-email-confirm-basic-mail-2 js-form-item-email-confirm-basic-mail-2">');
     $this->assertRaw('<label for="edit-email-confirm-basic-mail-2">Confirm email</label>');
     $this->assertRaw('<input data-drupal-selector="edit-email-confirm-basic-mail-2" class="webform-email-confirm form-email" type="email" id="edit-email-confirm-basic-mail-2" name="email_confirm_basic[mail_2]" value="" size="60" maxlength="254" />');
 
     // Check advanced email confirm w/ custom label.
     $this->assertRaw('<fieldset id="edit-email-confirm-advanced--wrapper" class="webform-email-confirm--wrapper fieldgroup form-composite webform-composite-hidden-title js-webform-type-webform-email-confirm webform-type-webform-email-confirm js-form-item form-item js-form-wrapper form-wrapper">');
     $this->assertRaw('<span class="visually-hidden fieldset-legend">Email address</span>');
-    $this->assertRaw('<div class="js-form-item form-item js-form-type-email form-type-email js-form-item-email-confirm-advanced-mail-1 form-item-email-confirm-advanced-mail-1">');
+    $this->assertRaw('<div class="js-form-item form-item js-form-type-email form-item-email-confirm-advanced-mail-1 js-form-item-email-confirm-advanced-mail-1">');
     $this->assertRaw('<label for="edit-email-confirm-advanced-mail-1">Email address</label>');
     $this->assertRaw('<input data-drupal-selector="edit-email-confirm-advanced-mail-1" aria-describedby="edit-email-confirm-advanced-mail-1--description" class="webform-email form-email" type="email" id="edit-email-confirm-advanced-mail-1" name="email_confirm_advanced[mail_1]" value="" size="60" maxlength="254" placeholder="Enter email address" />');
     $this->assertRaw('<div id="edit-email-confirm-advanced-mail-1--description" class="webform-element-description">Please make sure to review your email address</div>');
-    $this->assertRaw('<div class="js-form-item form-item js-form-type-email form-type-email js-form-item-email-confirm-advanced-mail-2 form-item-email-confirm-advanced-mail-2">');
+    $this->assertRaw('<div class="js-form-item form-item js-form-type-email form-item-email-confirm-advanced-mail-2 js-form-item-email-confirm-advanced-mail-2">');
     $this->assertRaw('<label for="edit-email-confirm-advanced-mail-2">Please confirm your email address</label>');
     $this->assertRaw('<input data-drupal-selector="edit-email-confirm-advanced-mail-2" aria-describedby="edit-email-confirm-advanced-mail-2--description" class="webform-email-confirm form-email" type="email" id="edit-email-confirm-advanced-mail-2" name="email_confirm_advanced[mail_2]" value="" size="60" maxlength="254" placeholder="Enter confirmation email address" />');
     $this->assertRaw('<div id="edit-email-confirm-advanced-mail-2--description" class="webform-element-description">Please make sure to review your confirmation email address</div>');
diff --git a/web/modules/webform/tests/src/Functional/Element/WebformElementEntityAutocompleteTest.php b/web/modules/webform/tests/src/Functional/Element/WebformElementEntityAutocompleteTest.php
index 193e2c416e..cc7930ecb5 100644
--- a/web/modules/webform/tests/src/Functional/Element/WebformElementEntityAutocompleteTest.php
+++ b/web/modules/webform/tests/src/Functional/Element/WebformElementEntityAutocompleteTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\webform\Functional\Element;
 
+use Drupal\taxonomy\Entity\Term;
+use Drupal\taxonomy\Entity\Vocabulary;
 use Drupal\webform\Entity\Webform;
 
 /**
@@ -16,7 +18,7 @@ class WebformElementEntityAutocompleteTest extends WebformElementBrowserTestBase
    *
    * @var array
    */
-  public static $modules = ['filter', 'user', 'node', 'webform'];
+  public static $modules = ['filter', 'user', 'node', 'taxonomy', 'webform'];
 
   /**
    * Webforms to load.
@@ -29,12 +31,32 @@ class WebformElementEntityAutocompleteTest extends WebformElementBrowserTestBase
    * Test entity reference elements.
    */
   public function testEntityReferenceTest() {
+    $node_1 = $this->drupalCreateNode(['title' => 'node 01']);
+    $node_2 = $this->drupalCreateNode(['title' => 'node 02']);
+
+    $vocabulary = Vocabulary::create([
+      'vid' => 'tags',
+      'name' => 'Tags',
+    ]);
+    $vocabulary->save();
+    $term_1 = Term::create([
+      'name' => 'term 01',
+      'vid' => 'tags',
+    ]);
+    $term_1->save();
+
+    /**************************************************************************/
+
     $webform = Webform::load('test_element_entity_autocomplete');
 
     // Check render entity_autocomplete.
     $this->drupalGet('/webform/test_element_entity_autocomplete');
     $this->assertFieldByName('entity_autocomplete_user_default', 'admin (1)');
     $this->assertFieldByName('entity_autocomplete_user_tags', 'admin (1)');
+    $this->assertFieldByName('entity_autocomplete_user_multiple[items][0][_item_]', 'admin (1)');
+    $this->assertFieldByName('entity_autocomplete_node_default', $node_1->label() . ' (' . $node_1->id() . ')');
+    $this->assertFieldByName('entity_autocomplete_term_tags_autocreate', $term_1->label() . ' (' . $term_1->id() . ')');
+    $this->assertFieldByName('entity_autocomplete_term_multiple_autocreate[items][0][_item_]', $term_1->label() . ' (' . $term_1->id() . ')');
 
     // Check process entity_autocomplete.
     $this->postSubmission($webform);
@@ -43,9 +65,24 @@ public function testEntityReferenceTest() {
   - '1'
 entity_autocomplete_user_multiple:
   - '1'
-entity_autocomplete_node_default: null
-entity_autocomplete_node_view: null");
+entity_autocomplete_node_default: '1'
+entity_autocomplete_term_tags_autocreate:
+  - '1'
+entity_autocomplete_term_multiple_autocreate:
+  - '1'");
 
+    // Check term auto create.
+    $edit = [
+      'entity_autocomplete_term_tags_autocreate' => 'term 02',
+      'entity_autocomplete_term_multiple_autocreate[items][0][_item_]' => 'term 03',
+      'entity_autocomplete_term_multiple_autocreate[items][1][_item_]' => 'term 04',
+    ];
+    $this->postSubmission($webform, $edit);
+    $this->assertRaw("entity_autocomplete_term_tags_autocreate:
+  - '2'
+entity_autocomplete_term_multiple_autocreate:
+  - '3'
+  - '4'");
   }
 
 }
diff --git a/web/modules/webform/tests/src/Functional/Element/WebformElementFieldsetTest.php b/web/modules/webform/tests/src/Functional/Element/WebformElementFieldsetTest.php
index a40d24ed2c..cd23072598 100644
--- a/web/modules/webform/tests/src/Functional/Element/WebformElementFieldsetTest.php
+++ b/web/modules/webform/tests/src/Functional/Element/WebformElementFieldsetTest.php
@@ -26,7 +26,7 @@ public function testFieldset() {
     // and more. Also, check that invalid 'required' and 'aria-required'
     // attributes are removed.
     $this->assertRaw('<fieldset class="webform-has-field-prefix webform-has-field-suffix required webform-element-help-container--title webform-element-help-container--title-after js-webform-type-fieldset webform-type-fieldset js-form-item form-item js-form-wrapper form-wrapper" data-drupal-selector="edit-fieldset" aria-describedby="edit-fieldset--description" id="edit-fieldset">');
-    $this->assertRaw('<span class="fieldset-legend js-form-required form-required">fieldset<span class="webform-element-help" role="tooltip" tabindex="0" data-webform-help="&lt;div class=&quot;webform-element-help--title&quot;&gt;fieldset&lt;/div&gt;&lt;div class=&quot;webform-element-help--content&quot;&gt;This is help text.&lt;/div&gt;"><span aria-hidden="true">?</span></span>');
+    $this->assertRaw('<span class="fieldset-legend js-form-required form-required">fieldset<span class="webform-element-help js-webform-element-help" role="tooltip" tabindex="0" data-webform-help="&lt;div class=&quot;webform-element-help--title&quot;&gt;fieldset&lt;/div&gt;&lt;div class=&quot;webform-element-help--content&quot;&gt;This is help text.&lt;/div&gt;"><span aria-hidden="true">?</span></span>');
     $this->assertRaw('<span class="field-prefix">prefix</span>');
     $this->assertRaw('<span class="field-suffix">suffix</span>');
     $this->assertRaw('<div class="description">');
diff --git a/web/modules/webform/tests/src/Functional/Element/WebformElementFormatCustomTest.php b/web/modules/webform/tests/src/Functional/Element/WebformElementFormatCustomTest.php
index ed6594af64..224139262f 100644
--- a/web/modules/webform/tests/src/Functional/Element/WebformElementFormatCustomTest.php
+++ b/web/modules/webform/tests/src/Functional/Element/WebformElementFormatCustomTest.php
@@ -88,7 +88,7 @@ public function testFormatCustom() {
     $this->assertRaw("item['value']: $file_url<br/>");
     $this->assertRaw("item['raw']: $file_url<br/>");
     $this->assertRaw("item['link']:");
-    $this->assertRaw('<span class="file file--mime-image-png file--image"> <a href="' . $file_url . '" type="image/png; length=' . $file_size . '">' . $file_name . '</a></span>');
+    $this->assertRaw('<span class="file file--mime-image-png file--image"><a href="' . $file_url . '" type="image/png; length=' . $file_size . '">' . $file_name . '</a></span>');
     $this->assertRaw('item[\'id\']: 1<br/>');
     $this->assertRaw("item['url']: $file_url<br/>");
     $this->assertRaw('<img class="webform-image-file" alt="' . $file_name . '" title="' . $file_name . '" src="' . $file_url . '" />');
diff --git a/web/modules/webform/tests/src/Functional/Element/WebformElementFormatTest.php b/web/modules/webform/tests/src/Functional/Element/WebformElementFormatTest.php
index fcea4e52f1..a0e3c079a8 100644
--- a/web/modules/webform/tests/src/Functional/Element/WebformElementFormatTest.php
+++ b/web/modules/webform/tests/src/Functional/Element/WebformElementFormatTest.php
@@ -126,11 +126,8 @@ public function testFormat() {
     $elements = [
       'File (Value)' => $this->getSubmissionFileUrl($submission, 'managed_file_value'),
       'File (Raw value)' => $this->getSubmissionFileUrl($submission, 'managed_file_raw'),
-      'File (File)' => '<div>
-<span class="file file--mime-text-plain file--text"> <a href="' . $this->getSubmissionFileUrl($submission, 'managed_file_file') . '" type="text/plain; length=43">managed_file_file.txt</a></span>
-</div>',
-      'File (Link)' => '
-<span class="file file--mime-text-plain file--text"> <a href="' . $this->getSubmissionFileUrl($submission, 'managed_file_link') . '" type="text/plain; length=43">managed_file_link.txt</a></span>',
+      'File (File)' => '<div><span class="file file--mime-text-plain file--text"><a href="' . $this->getSubmissionFileUrl($submission, 'managed_file_file') . '" type="text/plain; length=43">managed_file_file.txt</a></span>',
+      'File (Link)' => '<span class="file file--mime-text-plain file--text"><a href="' . $this->getSubmissionFileUrl($submission, 'managed_file_link') . '" type="text/plain; length=43">managed_file_link.txt</a></span>',
       'File (File ID)' => $submission->getElementData('managed_file_id'),
       'File (File name)' => 'managed_file_name.txt',
       'File (File base name (no extension))' => 'managed_file_basename',
@@ -174,13 +171,13 @@ public function testFormat() {
       'Text field (Comma)' => 'Loremipsum, Oratione, Dixisset',
       'Text field (Semicolon)' => 'Loremipsum; Oratione; Dixisset',
       'Text field (And)' => 'Loremipsum, Oratione, and Dixisset',
-      'Text field (Ordered list)' => '<div class="item-list"><ol><li>Loremipsum</li><li>Oratione</li><li>Dixisset</li></ol></div>',
-      'Text field (Unordered list)' => '<div class="item-list"><ul><li>Loremipsum</li><li>Oratione</li><li>Dixisset</li></ul></div>',
+      'Text field (Ordered list)' => '<ol><li>Loremipsum</li><li>Oratione</li><li>Dixisset</li></ol>',
+      'Text field (Unordered list)' => '<ul><li>Loremipsum</li><li>Oratione</li><li>Dixisset</li></ul>',
       'Checkboxes (Comma)' => 'One, Two, Three',
       'Checkboxes (Semicolon)' => 'One; Two; Three',
       'Checkboxes (And)' => 'One, Two, and Three',
-      'Checkboxes (Ordered list)' => '<div class="item-list"><ol><li>One</li><li>Two</li><li>Three</li></ol>',
-      'Checkboxes (Unordered list)' => '<div class="item-list"><ul><li>One</li><li>Two</li><li>Three</li></ul>',
+      'Checkboxes (Ordered list)' => '<ol><li>One</li><li>Two</li><li>Three</li></ol>',
+      'Checkboxes (Unordered list)' => '<ul><li>One</li><li>Two</li><li>Three</li></ul>',
       'Checkboxes (Checklist)' => '<span style="font-size: 1.4em; line-height: 1em">☑</span> One<br /><span style="font-size: 1.4em; line-height: 1em">☑</span> Two<br /><span style="font-size: 1.4em; line-height: 1em">☑</span> Three<br />',
     ];
     foreach ($elements as $label => $value) {
@@ -240,8 +237,8 @@ public function testFormat() {
       'comma:' => 'one, two, three',
       'semicolon:' => 'one; two; three',
       'and:' => 'one, two, and three',
-      'ul:' => '<div class="item-list"><ul><li>one</li><li>two</li><li>three</li></ul></div>',
-      'ol:' => '<div class="item-list"><ol><li>one</li><li>two</li><li>three</li></ol></div>',
+      'ul:' => '<ul><li>one</li><li>two</li><li>three</li></ul>',
+      'ol:' => '<ol><li>one</li><li>two</li><li>three</li></ol>',
       'raw:' => '1, 2, 3',
     ];
     foreach ($elements as $label => $value) {
diff --git a/web/modules/webform/tests/src/Functional/Element/WebformElementHeightTest.php b/web/modules/webform/tests/src/Functional/Element/WebformElementHeightTest.php
new file mode 100644
index 0000000000..cc6b7cdec0
--- /dev/null
+++ b/web/modules/webform/tests/src/Functional/Element/WebformElementHeightTest.php
@@ -0,0 +1,82 @@
+<?php
+
+namespace Drupal\Tests\webform\Functional\Element;
+
+use Drupal\webform\Entity\Webform;
+
+/**
+ * Tests for webform height element.
+ *
+ * @group webform
+ */
+class WebformElementHeightTest extends WebformElementBrowserTestBase {
+
+  /**
+   * Webforms to load.
+   *
+   * @var array
+   */
+  protected static $testWebforms = ['test_element_height'];
+
+  /**
+   * Test height element.
+   */
+  public function testheightElement() {
+    $webform = Webform::load('test_element_height');
+
+    $this->drupalGet('/webform/test_element_height');
+
+    // Check height_number_text.
+    $this->assertRaw('<input data-drupal-selector="edit-height-number-text-feet" type="number" id="edit-height-number-text-feet" name="height_number_text[feet]" value="5" step="1" min="0" max="8" class="form-number" />');
+    $this->assertRaw('<input data-drupal-selector="edit-height-number-text-inches" type="number" id="edit-height-number-text-inches" name="height_number_text[inches]" value="0" step="1" min="0" max="11" class="form-number" />');
+
+    // Check height_select_text.
+    $this->assertRaw('<select data-drupal-selector="edit-height-select-text-feet" id="edit-height-select-text-feet" name="height_select_text[feet]" class="form-select"><option value=""></option><option value="0">0</option><option value="1">1</option><option value="2">2</option><option value="3" selected="selected">3</option><option value="4">4</option><option value="5">5</option><option value="6">6</option><option value="7">7</option><option value="8">8</option></select>');
+    $this->assertRaw('<select data-drupal-selector="edit-height-select-text-inches" id="edit-height-select-text-inches" name="height_select_text[inches]" class="form-select"><option value=""></option><option value="0">0</option><option value="1">1</option><option value="2">2</option><option value="3">3</option><option value="4" selected="selected">4</option><option value="5">5</option><option value="6">6</option><option value="7">7</option><option value="8">8</option><option value="9">9</option><option value="10">10</option><option value="11">11</option></select>');
+
+    // Check height_number_step.
+    $this->assertRaw('<select data-drupal-selector="edit-height-number-step-feet" id="edit-height-number-step-feet" name="height_number_step[feet]" class="form-select"><option value=""></option><option value="0">0</option><option value="1">1</option><option value="2">2</option><option value="3">3</option><option value="4">4</option><option value="5" selected="selected">5</option><option value="6">6</option><option value="7">7</option><option value="8">8</option></select>');
+    $this->assertRaw('<select data-drupal-selector="edit-height-number-step-inches" id="edit-height-number-step-inches" name="height_number_step[inches]" class="form-select"><option value=""></option><option value="0.0">0.0</option><option value="0.5" selected="selected">0.5</option><option value="1.0">1.0</option><option value="1.5">1.5</option><option value="2.0">2.0</option><option value="2.5">2.5</option><option value="3.0">3.0</option><option value="3.5">3.5</option><option value="4.0">4.0</option><option value="4.5">4.5</option><option value="5.0">5.0</option><option value="5.5">5.5</option><option value="6.0">6.0</option><option value="6.5">6.5</option><option value="7.0">7.0</option><option value="7.5">7.5</option><option value="8.0">8.0</option><option value="8.5">8.5</option><option value="9.0">9.0</option><option value="9.5">9.5</option><option value="10.0">10.0</option><option value="10.5">10.5</option><option value="11.0">11.0</option></select>');
+
+    // Post a submission.
+    $edit = [
+      'height_number_empty_required[feet]' => '5',
+      'height_number_empty_required[inches]' => '5',
+      'height_select_empty_required[feet]' => '5',
+      'height_select_empty_required[inches]' => '5',
+    ];
+    $this->postSubmission($webform, $edit);
+
+    // Check submission data.
+    $this->assertRaw("height_number_text: '60'
+height_number_symbol_required: '50'
+height_select_text: '40'
+height_select_text_abbreviate: '30'
+height_select_symbol_required: '20'
+height_select_suffix_symbol_required: '10'
+height_select_suffix_text: '0'
+height_select_min_max: '120'
+height_number_step: '60.5'
+height_number_empty: ''
+height_select_empty: ''
+height_number_empty_required: '65'
+height_select_empty_required: '65'");
+
+    // Check submission display.
+    $this->assertPattern('#<label>height_number_text</label>\s+5 feet\s+</div>#s');
+    $this->assertPattern('#<label>height_number_symbol_required</label>\s+4″2′\s+</div>#s');
+    $this->assertPattern('#<label>height_select_text</label>\s+3 feet 4 inches\s+</div>#s');
+    $this->assertPattern('#<label>height_select_text_abbreviate</label>\s+2 ft 6 in\s+</div>#s');
+    $this->assertPattern('#<label>height_select_symbol_required</label>\s+1″8′\s+</div>#s');
+    $this->assertPattern('#<label>height_select_suffix_symbol_required</label>\s+10′\s+</div>#s');
+    $this->assertPattern('#<label>height_select_min_max</label>\s+10 feet\s+</div>#s');
+    $this->assertPattern('#<label>height_number_step</label>\s+5 feet 0.5 inches\s+</div>#s');
+    $this->assertPattern('#<label>height_number_empty_required</label>\s+5 feet 5 inches\s+</div>#s');
+    $this->assertPattern('#<label>height_select_empty_required</label>\s+5 feet 5 inches\s+</div>#s');
+
+    $this->assertNoRaw('<label>height_select_suffix_text</label>');
+    $this->assertNoRaw('<label>height_number_empty</label>');
+    $this->assertNoRaw('<label>height_select_empty</label>');
+  }
+
+}
diff --git a/web/modules/webform/tests/src/Functional/Element/WebformElementHelpTest.php b/web/modules/webform/tests/src/Functional/Element/WebformElementHelpTest.php
index ac1622cacc..96a7e4027b 100644
--- a/web/modules/webform/tests/src/Functional/Element/WebformElementHelpTest.php
+++ b/web/modules/webform/tests/src/Functional/Element/WebformElementHelpTest.php
@@ -23,47 +23,47 @@ public function testHelp() {
     $this->drupalGet('/webform/test_element_help');
 
     // Check basic help.
-    $this->assertRaw('<label for="edit-help">help<span class="webform-element-help" role="tooltip" tabindex="0" data-webform-help="&lt;div class=&quot;webform-element-help--title&quot;&gt;help&lt;/div&gt;&lt;div class=&quot;webform-element-help--content&quot;&gt;{This is an example of help}&lt;/div&gt;"><span aria-hidden="true">?</span></span>');
+    $this->assertRaw('<label for="edit-help">help<span class="webform-element-help js-webform-element-help" role="tooltip" tabindex="0" data-webform-help="&lt;div class=&quot;webform-element-help--title&quot;&gt;help&lt;/div&gt;&lt;div class=&quot;webform-element-help--content&quot;&gt;{This is an example of help}&lt;/div&gt;"><span aria-hidden="true">?</span></span>');
 
     // Check help with required.
-    $this->assertRaw('<label for="edit-help-required" class="js-form-required form-required">help_required<span class="webform-element-help" role="tooltip" tabindex="0" data-webform-help="&lt;div class=&quot;webform-element-help--title&quot;&gt;help_required&lt;/div&gt;&lt;div class=&quot;webform-element-help--content&quot;&gt;{This is an example of help for a required element}&lt;/div&gt;"><span aria-hidden="true">?</span></span>');
+    $this->assertRaw('<label for="edit-help-required" class="js-form-required form-required">help_required<span class="webform-element-help js-webform-element-help" role="tooltip" tabindex="0" data-webform-help="&lt;div class=&quot;webform-element-help--title&quot;&gt;help_required&lt;/div&gt;&lt;div class=&quot;webform-element-help--content&quot;&gt;{This is an example of help for a required element}&lt;/div&gt;"><span aria-hidden="true">?</span></span>');
 
     // Check help with custom title.
-    $this->assertRaw('<label for="edit-help-title">help_title<span class="webform-element-help" role="tooltip" tabindex="0" data-webform-help="&lt;div class=&quot;webform-element-help--title&quot;&gt;{Help custom title}&lt;/div&gt;&lt;div class=&quot;webform-element-help--content&quot;&gt;{This is an example of help with a custom help title}&lt;/div&gt;"><span aria-hidden="true">?</span></span>');
+    $this->assertRaw('<label for="edit-help-title">help_title<span class="webform-element-help js-webform-element-help" role="tooltip" tabindex="0" data-webform-help="&lt;div class=&quot;webform-element-help--title&quot;&gt;{Help custom title}&lt;/div&gt;&lt;div class=&quot;webform-element-help--content&quot;&gt;{This is an example of help with a custom help title}&lt;/div&gt;"><span aria-hidden="true">?</span></span>');
 
     // Check help with HTML markup.
-    $this->assertRaw('<label for="edit-help-html">help_html<span class="webform-element-help" role="tooltip" tabindex="0" data-webform-help="&lt;div class=&quot;webform-element-help--title&quot;&gt;help_html&lt;/div&gt;&lt;div class=&quot;webform-element-help--content&quot;&gt;{This is an example of help with &lt;b&gt;HTML markup&lt;/b&gt;}&lt;/div&gt;"><span aria-hidden="true">?</span></span>');
+    $this->assertRaw('<label for="edit-help-html">help_html<span class="webform-element-help js-webform-element-help" role="tooltip" tabindex="0" data-webform-help="&lt;div class=&quot;webform-element-help--title&quot;&gt;help_html&lt;/div&gt;&lt;div class=&quot;webform-element-help--content&quot;&gt;{This is an example of help with &lt;b&gt;HTML markup&lt;/b&gt;}&lt;/div&gt;"><span aria-hidden="true">?</span></span>');
 
     // Check help with XSS.
-    $this->assertRaw('<label for="edit-help-xss">help_xss<span class="webform-element-help" role="tooltip" tabindex="0" data-webform-help="&lt;div class=&quot;webform-element-help--title&quot;&gt;help_xss&lt;/div&gt;&lt;div class=&quot;webform-element-help--content&quot;&gt;{This is an example of help with &lt;b&gt;XSS alert(&quot;XSS&quot;)&lt;/b&gt;}&lt;/div&gt;"><span aria-hidden="true">?</span></span>');
+    $this->assertRaw('<label for="edit-help-xss">help_xss<span class="webform-element-help js-webform-element-help" role="tooltip" tabindex="0" data-webform-help="&lt;div class=&quot;webform-element-help--title&quot;&gt;help_xss&lt;/div&gt;&lt;div class=&quot;webform-element-help--content&quot;&gt;{This is an example of help with &lt;b&gt;XSS alert(&quot;XSS&quot;)&lt;/b&gt;}&lt;/div&gt;"><span aria-hidden="true">?</span></span>');
 
     // Check help with inline title.
-    $this->assertRaw('<label for="edit-help-checkbox" class="option">help_checkbox<span class="webform-element-help" role="tooltip" tabindex="0" data-webform-help="&lt;div class=&quot;webform-element-help--title&quot;&gt;help_checkbox&lt;/div&gt;&lt;div class=&quot;webform-element-help--content&quot;&gt;{This is an example of help}&lt;/div&gt;"><span aria-hidden="true">?</span></span>');
-    $this->assertRaw('<label for="edit-help-inline"><span class="webform-element-help" role="tooltip" tabindex="0" data-webform-help="&lt;div class=&quot;webform-element-help--title&quot;&gt;help_inline&lt;/div&gt;&lt;div class=&quot;webform-element-help--content&quot;&gt;{This is an example of help with an inline title}&lt;/div&gt;"><span aria-hidden="true">?</span></span>');
+    $this->assertRaw('<label for="edit-help-checkbox" class="option">help_checkbox<span class="webform-element-help js-webform-element-help" role="tooltip" tabindex="0" data-webform-help="&lt;div class=&quot;webform-element-help--title&quot;&gt;help_checkbox&lt;/div&gt;&lt;div class=&quot;webform-element-help--content&quot;&gt;{This is an example of help}&lt;/div&gt;"><span aria-hidden="true">?</span></span>');
+    $this->assertRaw('<label for="edit-help-inline"><span class="webform-element-help js-webform-element-help" role="tooltip" tabindex="0" data-webform-help="&lt;div class=&quot;webform-element-help--title&quot;&gt;help_inline&lt;/div&gt;&lt;div class=&quot;webform-element-help--content&quot;&gt;{This is an example of help with an inline title}&lt;/div&gt;"><span aria-hidden="true">?</span></span>');
 
     // Check radios (fieldset).
-    $this->assertRaw('<span class="fieldset-legend">help_radios<span class="webform-element-help" role="tooltip" tabindex="0" data-webform-help="&lt;div class=&quot;webform-element-help--title&quot;&gt;help_radios&lt;/div&gt;&lt;div class=&quot;webform-element-help--content&quot;&gt;{This is an example of help for radio buttons}&lt;/div&gt;"><span aria-hidden="true">?</span></span>');
+    $this->assertRaw('<span class="fieldset-legend">help_radios<span class="webform-element-help js-webform-element-help" role="tooltip" tabindex="0" data-webform-help="&lt;div class=&quot;webform-element-help--title&quot;&gt;help_radios&lt;/div&gt;&lt;div class=&quot;webform-element-help--content&quot;&gt;{This is an example of help for radio buttons}&lt;/div&gt;"><span aria-hidden="true">?</span></span>');
 
     // Check fieldset.
-    $this->assertRaw('<span class="fieldset-legend">help_radios<span class="webform-element-help" role="tooltip" tabindex="0" data-webform-help="&lt;div class=&quot;webform-element-help--title&quot;&gt;help_radios&lt;/div&gt;&lt;div class=&quot;webform-element-help--content&quot;&gt;{This is an example of help for radio buttons}&lt;/div&gt;"><span aria-hidden="true">?</span></span>');
+    $this->assertRaw('<span class="fieldset-legend">help_radios<span class="webform-element-help js-webform-element-help" role="tooltip" tabindex="0" data-webform-help="&lt;div class=&quot;webform-element-help--title&quot;&gt;help_radios&lt;/div&gt;&lt;div class=&quot;webform-element-help--content&quot;&gt;{This is an example of help for radio buttons}&lt;/div&gt;"><span aria-hidden="true">?</span></span>');
 
     // Check details.
-    $this->assertRaw('<summary role="button" aria-controls="edit-help-details" aria-expanded="false" aria-pressed="false">help_details<span class="webform-element-help" role="tooltip" tabindex="0" data-webform-help="&lt;div class=&quot;webform-element-help--title&quot;&gt;help_details&lt;/div&gt;&lt;div class=&quot;webform-element-help--content&quot;&gt;{This is an example of help for a details element}&lt;/div&gt;"><span aria-hidden="true">?</span>');
+    $this->assertRaw('<summary role="button" aria-controls="edit-help-details" aria-expanded="false" aria-pressed="false">help_details<span class="webform-element-help js-webform-element-help" role="tooltip" tabindex="0" data-webform-help="&lt;div class=&quot;webform-element-help--title&quot;&gt;help_details&lt;/div&gt;&lt;div class=&quot;webform-element-help--content&quot;&gt;{This is an example of help for a details element}&lt;/div&gt;"><span aria-hidden="true">?</span>');
 
     // Check section.
-    $this->assertRaw('<h2 class="webform-section-title">help_section<span class="webform-element-help" role="tooltip" tabindex="0" data-webform-help="&lt;div class=&quot;webform-element-help--title&quot;&gt;help_section&lt;/div&gt;&lt;div class=&quot;webform-element-help--content&quot;&gt;{This is an example of help for a section element}&lt;/div&gt;"><span aria-hidden="true">?</span></span>');
+    $this->assertRaw('<h2 class="webform-section-title">help_section<span class="webform-element-help js-webform-element-help" role="tooltip" tabindex="0" data-webform-help="&lt;div class=&quot;webform-element-help--title&quot;&gt;help_section&lt;/div&gt;&lt;div class=&quot;webform-element-help--content&quot;&gt;{This is an example of help for a section element}&lt;/div&gt;"><span aria-hidden="true">?</span></span>');
 
     // Check help display title after.
-    $this->assertRaw('<label for="edit-help-after-title">help_after_title<span class="webform-element-help" role="tooltip" tabindex="0" data-webform-help="&lt;div class=&quot;webform-element-help--title&quot;&gt;help_after_title&lt;/div&gt;&lt;div class=&quot;webform-element-help--content&quot;&gt;{This is an example of help}&lt;/div&gt;"><span aria-hidden="true">?</span></span></label>');
+    $this->assertRaw('<label for="edit-help-after-title">help_after_title<span class="webform-element-help js-webform-element-help" role="tooltip" tabindex="0" data-webform-help="&lt;div class=&quot;webform-element-help--title&quot;&gt;help_after_title&lt;/div&gt;&lt;div class=&quot;webform-element-help--content&quot;&gt;{This is an example of help}&lt;/div&gt;"><span aria-hidden="true">?</span></span></label>');
 
     // Check help display title before.
-    $this->assertRaw('<label for="edit-help-before-title"><span class="webform-element-help" role="tooltip" tabindex="0" data-webform-help="&lt;div class=&quot;webform-element-help--title&quot;&gt;help_before_title&lt;/div&gt;&lt;div class=&quot;webform-element-help--content&quot;&gt;{This is an example of help}&lt;/div&gt;"><span aria-hidden="true">?</span></span>help_before_title</label>');
+    $this->assertRaw('<label for="edit-help-before-title"><span class="webform-element-help js-webform-element-help" role="tooltip" tabindex="0" data-webform-help="&lt;div class=&quot;webform-element-help--title&quot;&gt;help_before_title&lt;/div&gt;&lt;div class=&quot;webform-element-help--content&quot;&gt;{This is an example of help}&lt;/div&gt;"><span aria-hidden="true">?</span></span>help_before_title</label>');
 
     // Check help display element after.
-    $this->assertRaw('<span class="field-suffix"><span class="webform-element-help" role="tooltip" tabindex="0" data-webform-help="&lt;div class=&quot;webform-element-help--title&quot;&gt;help_after_element&lt;/div&gt;&lt;div class=&quot;webform-element-help--content&quot;&gt;{This is an example of help}&lt;/div&gt;"><span aria-hidden="true">?</span></span></span>');
+    $this->assertRaw('<span class="field-suffix"><span class="webform-element-help js-webform-element-help" role="tooltip" tabindex="0" data-webform-help="&lt;div class=&quot;webform-element-help--title&quot;&gt;help_after_element&lt;/div&gt;&lt;div class=&quot;webform-element-help--content&quot;&gt;{This is an example of help}&lt;/div&gt;"><span aria-hidden="true">?</span></span></span>');
 
     // Check help display element before.
-    $this->assertRaw('<span class="field-prefix"><span class="webform-element-help" role="tooltip" tabindex="0" data-webform-help="&lt;div class=&quot;webform-element-help--title&quot;&gt;help_before_element&lt;/div&gt;&lt;div class=&quot;webform-element-help--content&quot;&gt;{This is an example of help}&lt;/div&gt;"><span aria-hidden="true">?</span></span></span>');
+    $this->assertRaw('<span class="field-prefix"><span class="webform-element-help js-webform-element-help" role="tooltip" tabindex="0" data-webform-help="&lt;div class=&quot;webform-element-help--title&quot;&gt;help_before_element&lt;/div&gt;&lt;div class=&quot;webform-element-help--content&quot;&gt;{This is an example of help}&lt;/div&gt;"><span aria-hidden="true">?</span></span></span>');
   }
 
 }
diff --git a/web/modules/webform/tests/src/Functional/Element/WebformElementHtmlEditorTest.php b/web/modules/webform/tests/src/Functional/Element/WebformElementHtmlEditorTest.php
index a9c274812d..8edc8bcb82 100644
--- a/web/modules/webform/tests/src/Functional/Element/WebformElementHtmlEditorTest.php
+++ b/web/modules/webform/tests/src/Functional/Element/WebformElementHtmlEditorTest.php
@@ -62,21 +62,21 @@ public function testHtmlEditor() {
     $this->drupalGet('/webform/test_element_html_editor');
 
     // Check that HTML editor is enabled.
-    $this->assertRaw('<textarea data-drupal-selector="edit-webform-html-editor-value" class="js-html-editor form-textarea required resize-vertical" id="edit-webform-html-editor-value" name="webform_html_editor[value]" rows="5" cols="60" required="required" aria-required="true">Hello &lt;b&gt;World!!!&lt;/b&gt;</textarea>');
+    $this->assertRaw('<textarea data-drupal-selector="edit-webform-html-editor-value" class="js-html-editor form-textarea required" id="edit-webform-html-editor-value" name="webform_html_editor[value]" rows="5" cols="60" required="required" aria-required="true">Hello &lt;b&gt;World!!!&lt;/b&gt;</textarea>');
 
     // Check that HTML editor is disabled.
-    $this->assertRaw('<textarea class="custom-disabled js-html-editor form-textarea required resize-vertical" data-drupal-selector="edit-webform-html-editor-disable-value" id="edit-webform-html-editor-disable-value" name="webform_html_editor_disable[value]" rows="5" cols="60" required="required" aria-required="true">Hello &lt;b&gt;World!!!&lt;/b&gt;</textarea>');
+    $this->assertRaw('<textarea class="custom-disabled js-html-editor form-textarea required" data-drupal-selector="edit-webform-html-editor-disable-value" id="edit-webform-html-editor-disable-value" name="webform_html_editor_disable[value]" rows="5" cols="60" required="required" aria-required="true">Hello &lt;b&gt;World!!!&lt;/b&gt;</textarea>');
 
     // Check that CodeMirror is displayed when #format: FALSE.
-    $this->assertRaw('<textarea data-drupal-selector="edit-webform-html-editor-codemirror-value" class="js-webform-codemirror webform-codemirror html required form-textarea resize-vertical" required="required" aria-required="true" data-webform-codemirror-mode="text/html" id="edit-webform-html-editor-codemirror-value" name="webform_html_editor_codemirror[value]" rows="5" cols="60">Hello &lt;b&gt;World!!!&lt;/b&gt;</textarea>');
+    $this->assertRaw('<textarea data-drupal-selector="edit-webform-html-editor-codemirror-value" class="js-webform-codemirror webform-codemirror html required form-textarea" required="required" aria-required="true" data-webform-codemirror-mode="text/html" id="edit-webform-html-editor-codemirror-value" name="webform_html_editor_codemirror[value]" rows="5" cols="60">Hello &lt;b&gt;World!!!&lt;/b&gt;</textarea>');
 
     // Disable HTML editor.
     $this->drupalPostForm('/admin/structure/webform/config/elements', ['html_editor[disabled]' => TRUE], 'Save configuration');
 
     // Check that HTML editor is removed and replaced by CodeMirror HTML editor.
     $this->drupalGet('/webform/test_element_html_editor');
-    $this->assertNoRaw('<textarea class="js-html-editor form-textarea required resize-vertical" data-drupal-selector="edit-webform-html-editor-value" id="edit-webform-html-editor-value" name="webform_html_editor[value]" rows="5" cols="60" required="required" aria-required="true">Hello &lt;b&gt;World!!!&lt;/b&gt;</textarea>');
-    $this->assertRaw('<textarea data-drupal-selector="edit-webform-html-editor-value" class="js-webform-codemirror webform-codemirror html required form-textarea resize-vertical" required="required" aria-required="true" data-webform-codemirror-mode="text/html" id="edit-webform-html-editor-value" name="webform_html_editor[value]" rows="5" cols="60">Hello &lt;b&gt;World!!!&lt;/b&gt;</textarea>');
+    $this->assertNoRaw('<textarea class="js-html-editor form-textarea required" data-drupal-selector="edit-webform-html-editor-value" id="edit-webform-html-editor-value" name="webform_html_editor[value]" rows="5" cols="60" required="required" aria-required="true">Hello &lt;b&gt;World!!!&lt;/b&gt;</textarea>');
+    $this->assertRaw('<textarea data-drupal-selector="edit-webform-html-editor-value" class="js-webform-codemirror webform-codemirror html required form-textarea" required="required" aria-required="true" data-webform-codemirror-mode="text/html" id="edit-webform-html-editor-value" name="webform_html_editor[value]" rows="5" cols="60">Hello &lt;b&gt;World!!!&lt;/b&gt;</textarea>');
 
     // Enable HTML editor and element text format.
     $edit = [
@@ -87,10 +87,10 @@ public function testHtmlEditor() {
 
     // Check that Text format is disabled.
     $this->drupalGet('/webform/test_element_html_editor');
-    $this->assertNoRaw('<textarea class="js-html-editor form-textarea resize-vertical" data-drupal-selector="edit-webform-html-editor-value" id="edit-webform-html-editor-value" name="webform_html_editor[value]" rows="5" cols="60">Hello &lt;b&gt;World!!!&lt;/b&gt;</textarea>');
-    $this->assertNoRaw('<textarea data-drupal-selector="edit-webform-html-editor-value" class="js-webform-codemirror webform-codemirror html required form-textarea resize-vertical" required="required" aria-required="true" data-webform-codemirror-mode="text/html" id="edit-webform-html-editor-value" name="webform_html_editor[value]" rows="5" cols="60">Hello &lt;b&gt;World!!!&lt;/b&gt;</textarea>');
-    $this->assertRaw('<textarea data-drupal-selector="edit-webform-html-editor-value-value" id="edit-webform-html-editor-value-value" name="webform_html_editor[value][value]" rows="5" cols="60" class="form-textarea required resize-vertical" required="required" aria-required="true">Hello &lt;b&gt;World!!!&lt;/b&gt;</textarea>');
-    $this->assertRaw('<h4 class="label">Basic HTML</h4>');
+    $this->assertNoRaw('<textarea class="js-html-editor form-textarea" data-drupal-selector="edit-webform-html-editor-value" id="edit-webform-html-editor-value" name="webform_html_editor[value]" rows="5" cols="60">Hello &lt;b&gt;World!!!&lt;/b&gt;</textarea>');
+    $this->assertNoRaw('<textarea data-drupal-selector="edit-webform-html-editor-value" class="js-webform-codemirror webform-codemirror html required form-textarea" required="required" aria-required="true" data-webform-codemirror-mode="text/html" id="edit-webform-html-editor-value" name="webform_html_editor[value]" rows="5" cols="60">Hello &lt;b&gt;World!!!&lt;/b&gt;</textarea>');
+    $this->assertRaw('<textarea data-drupal-selector="edit-webform-html-editor-value-value" id="edit-webform-html-editor-value-value" name="webform_html_editor[value][value]" rows="5" cols="60" class="form-textarea required" required="required" aria-required="true">Hello &lt;b&gt;World!!!&lt;/b&gt;</textarea>');
+    $this->assertRaw('<h4>Basic HTML</h4>');
 
     // Disable element text format.
     $edit = [
@@ -126,7 +126,7 @@ public function testHtmlEditor() {
 
     // Check that HTML editor is used.
     $this->drupalGet('/admin/structure/webform/manage/contact/handlers/email_confirmation/edit');
-    $this->assertRaw('<textarea data-drupal-selector="edit-settings-body-custom-html-value" class="js-html-editor form-textarea resize-vertical" id="edit-settings-body-custom-html-value" name="settings[body_custom_html][value]" rows="5" cols="60">');
+    $this->assertRaw('<textarea data-drupal-selector="edit-settings-body-custom-html-value" class="js-html-editor form-textarea" id="edit-settings-body-custom-html-value" name="settings[body_custom_html][value]" rows="5" cols="60">');
 
     // Enable mail text format.
     $edit = [
@@ -136,8 +136,8 @@ public function testHtmlEditor() {
 
     // Check mail text format is used.
     $this->drupalGet('/admin/structure/webform/manage/contact/handlers/email_confirmation/edit');
-    $this->assertNoRaw('<textarea data-drupal-selector="edit-settings-body-custom-html-value" class="js-html-editor form-textarea resize-vertical" id="edit-settings-body-custom-html-value" name="settings[body_custom_html][value]" rows="5" cols="60">');
-    $this->assertRaw('<textarea data-drupal-selector="edit-settings-body-custom-html-value-value" id="edit-settings-body-custom-html-value-value" name="settings[body_custom_html][value][value]" rows="5" cols="60" class="form-textarea resize-vertical">');
+    $this->assertNoRaw('<textarea data-drupal-selector="edit-settings-body-custom-html-value" class="js-html-editor form-textarea" id="edit-settings-body-custom-html-value" name="settings[body_custom_html][value]" rows="5" cols="60">');
+    $this->assertRaw('<textarea data-drupal-selector="edit-settings-body-custom-html-value-value" id="edit-settings-body-custom-html-value-value" name="settings[body_custom_html][value][value]" rows="5" cols="60" class="form-textarea">');
     $this->assertRaw('<div class="js-filter-wrapper filter-wrapper js-form-wrapper form-wrapper" data-drupal-selector="edit-settings-body-custom-html-value-format" id="edit-settings-body-custom-html-value-format">');
   }
 
diff --git a/web/modules/webform/tests/src/Functional/Element/WebformElementLikertTest.php b/web/modules/webform/tests/src/Functional/Element/WebformElementLikertTest.php
index fb1a6804f9..90284964df 100644
--- a/web/modules/webform/tests/src/Functional/Element/WebformElementLikertTest.php
+++ b/web/modules/webform/tests/src/Functional/Element/WebformElementLikertTest.php
@@ -27,13 +27,13 @@ public function testLikertElement() {
     $this->assertRaw('<table class="webform-likert-table sticky-enabled responsive-enabled" data-likert-answers-count="3" data-drupal-selector="edit-likert-default-table" id="edit-likert-default-table" data-striping="1">');
     $this->assertPattern('#<tr>\s+<th><span class="visually-hidden">Questions</span></th>\s+<th>Option 1</th>\s+<th>Option 2</th>\s+<th>Option 3</th>\s+</tr>#');
     $this->assertRaw('<label>Question 1</label>');
-    $this->assertRaw('<td><div class="js-form-item form-item js-form-type-radio form-type-radio js-form-item-likert-default-q1 form-item-likert-default-q1">');
+    $this->assertRaw('<td><div class="js-form-item form-item js-form-type-radio form-item-likert-default-q1 js-form-item-likert-default-q1">');
     $this->assertRaw('<input aria-labelledby="edit-likert-default-table-q1-likert-question" data-drupal-selector="edit-likert-default-q1" type="radio" id="edit-likert-default-q1" name="likert_default[q1]" value="1" class="form-radio" />');
     $this->assertRaw('<label for="edit-likert-default-q1" class="option"><span class="webform-likert-label visually-hidden">Option 1</span></label>');
 
     // Check advanced likert element with N/A.
     $this->assertPattern('#<tr>\s+<th><span class="visually-hidden">Questions</span></th>\s+<th>Option 1</th>\s+<th>Option 2</th>\s+<th>Option 3</th>\s+<th>Not applicable</th>\s+</tr>#');
-    $this->assertRaw('<td><div class="js-form-item form-item js-form-type-radio form-type-radio js-form-item-likert-advanced-q1 form-item-likert-advanced-q1">');
+    $this->assertRaw('<td><div class="js-form-item form-item js-form-type-radio form-item-likert-advanced-q1 js-form-item-likert-advanced-q1">');
     $this->assertRaw('<input aria-labelledby="edit-likert-advanced-table-q1-likert-question" data-drupal-selector="edit-likert-advanced-q1" type="radio" id="edit-likert-advanced-q1--4" name="likert_advanced[q1]" value="N/A" class="form-radio" />');
     $this->assertRaw('<label for="edit-likert-advanced-q1--4" class="option"><span class="webform-likert-label visually-hidden">Not applicable</span></label>');
 
@@ -45,9 +45,9 @@ public function testLikertElement() {
     $this->assertRaw('<span class="webform-likert-description hidden">This is a description</span>');
 
     // Check likert with help.
-    $this->assertRaw('<th>Option 1<span class="webform-element-help" role="tooltip" tabindex="0" data-webform-help="&lt;div class=&quot;webform-element-help--title&quot;&gt;Option 1&lt;/div&gt;&lt;div class=&quot;webform-element-help--content&quot;&gt;This is help text&lt;/div&gt;"><span aria-hidden="true">?</span></span>');
-    $this->assertRaw('<label>Question 1<span class="webform-element-help" role="tooltip" tabindex="0" data-webform-help="&lt;div class=&quot;webform-element-help--title&quot;&gt;Question 1&lt;/div&gt;&lt;div class=&quot;webform-element-help--content&quot;&gt;This is help text&lt;/div&gt;"><span aria-hidden="true">?</span></span>');
-    $this->assertRaw('<label for="edit-likert-help-q1--2" class="option"><span class="webform-likert-label visually-hidden">Option 2<span class="webform-likert-help hidden"><span class="webform-element-help" role="tooltip" tabindex="0" data-webform-help="&lt;div class=&quot;webform-element-help--title&quot;&gt;Option 2&lt;/div&gt;&lt;div class=&quot;webform-element-help--content&quot;&gt;This is help text&lt;/div&gt;"><span aria-hidden="true">?</span></span>');
+    $this->assertRaw('<th>Option 1<span class="webform-element-help js-webform-element-help" role="tooltip" tabindex="0" data-webform-help="&lt;div class=&quot;webform-element-help--title&quot;&gt;Option 1&lt;/div&gt;&lt;div class=&quot;webform-element-help--content&quot;&gt;This is help text&lt;/div&gt;"><span aria-hidden="true">?</span></span>');
+    $this->assertRaw('<label>Question 1<span class="webform-element-help js-webform-element-help" role="tooltip" tabindex="0" data-webform-help="&lt;div class=&quot;webform-element-help--title&quot;&gt;Question 1&lt;/div&gt;&lt;div class=&quot;webform-element-help--content&quot;&gt;This is help text&lt;/div&gt;"><span aria-hidden="true">?</span></span>');
+    $this->assertRaw('<label for="edit-likert-help-q1--2" class="option"><span class="webform-likert-label visually-hidden">Option 2<span class="webform-likert-help hidden"><span class="webform-element-help js-webform-element-help" role="tooltip" tabindex="0" data-webform-help="&lt;div class=&quot;webform-element-help--title&quot;&gt;Option 2&lt;/div&gt;&lt;div class=&quot;webform-element-help--content&quot;&gt;This is help text&lt;/div&gt;"><span aria-hidden="true">?</span></span>');
 
     // Check likert required.
     $this->drupalPostForm('/webform/test_element_likert', [], 'Submit');
diff --git a/web/modules/webform/tests/src/Functional/Element/WebformElementManagedFilePreviewTest.php b/web/modules/webform/tests/src/Functional/Element/WebformElementManagedFilePreviewTest.php
index d1c4e116e1..9eec8f198d 100644
--- a/web/modules/webform/tests/src/Functional/Element/WebformElementManagedFilePreviewTest.php
+++ b/web/modules/webform/tests/src/Functional/Element/WebformElementManagedFilePreviewTest.php
@@ -31,10 +31,10 @@ public function testImageFileUpload() {
 
     // Check that anonymous users can not preview files.
     $this->drupalGet('/webform/test_element_managed_file_prev/test');
-    $this->assertRaw('<span data-drupal-selector="edit-webform-image-file-file-1-filename" class="file file--mime-image-gif file--image"> webform_image_file.gif</span>');
-    $this->assertRaw('<span data-drupal-selector="edit-webform-audio-file-file-3-filename" class="file file--mime-audio-mpeg file--audio"> webform_audio_file.mp3</span>');
-    $this->assertRaw('<span data-drupal-selector="edit-webform-video-file-file-5-filename" class="file file--mime-video-mp4 file--video"> webform_video_file.mp4</span>');
-    $this->assertRaw('<span data-drupal-selector="edit-webform-document-file-file-7-filename" class="file file--mime-text-plain file--text"> webform_document_file.txt</span>');
+    $this->assertRaw('<span data-drupal-selector="edit-webform-image-file-file-1-filename" class="file file--mime-image-gif file--image">webform_image_file.gif</span>');
+    $this->assertRaw('<span data-drupal-selector="edit-webform-audio-file-file-3-filename" class="file file--mime-audio-mpeg file--audio">webform_audio_file.mp3</span>');
+    $this->assertRaw('<span data-drupal-selector="edit-webform-video-file-file-5-filename" class="file file--mime-video-mp4 file--video">webform_video_file.mp4</span>');
+    $this->assertRaw('<span data-drupal-selector="edit-webform-document-file-file-7-filename" class="file file--mime-text-plain file--text">webform_document_file.txt</span>');
 
     // Login admin user.
     $this->drupalLogin($this->rootUser);
diff --git a/web/modules/webform/tests/src/Functional/Element/WebformElementManagedFilePrivateTest.php b/web/modules/webform/tests/src/Functional/Element/WebformElementManagedFilePrivateTest.php
index 6c8b381956..791660cec1 100644
--- a/web/modules/webform/tests/src/Functional/Element/WebformElementManagedFilePrivateTest.php
+++ b/web/modules/webform/tests/src/Functional/Element/WebformElementManagedFilePrivateTest.php
@@ -92,8 +92,8 @@ public function testPrivateFiles() {
     $temp_file_uri = file_create_url('private://webform/test_element_managed_file/_sid_/' . basename($this->files[1]->uri));
 
     // Check that temp file is not linked.
-    $this->assertNoRaw('<span class="file file--mime-text-plain file--text"> <a href="' . $temp_file_uri . '" type="text/plain; length=16384">text-1.txt</a></span>');
-    $this->assertRaw('<span class="file file--mime-text-plain file--text"> ' . basename($this->files[1]->uri) . '</span>');
+    $this->assertNoRaw('<span class="file file--mime-text-plain file--text"><a href="' . $temp_file_uri . '" type="text/plain; length=16384">text-1.txt</a></span>');
+    $this->assertRaw('<span class="file file--mime-text-plain file--text">' . basename($this->files[1]->uri) . '</span>');
 
     // Check that anonymous user can't access temp file.
     $this->drupalGet($temp_file_uri);
diff --git a/web/modules/webform/tests/src/Functional/Element/WebformElementManagedFileTest.php b/web/modules/webform/tests/src/Functional/Element/WebformElementManagedFileTest.php
index 0e61002217..1f13448f05 100644
--- a/web/modules/webform/tests/src/Functional/Element/WebformElementManagedFileTest.php
+++ b/web/modules/webform/tests/src/Functional/Element/WebformElementManagedFileTest.php
@@ -334,9 +334,9 @@ protected function checkFileUpload($type, $first_file, $second_file) {
     $this->drupalGet('/admin/structure/webform/manage/test_element_managed_file/submission/' . $sid);
     if ($type === 'multiple') {
       $this->assertRaw('<label>managed_file_multiple</label>');
-      $this->assertRaw('<div class="item-list">');
+      $this->assertRaw('<ul>');
     }
-    $this->assertRaw('<span class="file file--mime-text-plain file--text"> <a href="' . file_create_url($file->getFileUri()) . '" type="text/plain; length=' . $file->getSize() . '">' . $file->getFilename() . '</a></span>');
+    $this->assertRaw('<span class="file file--mime-text-plain file--text"><a href="' . file_create_url($file->getFileUri()) . '" type="text/plain; length=' . $file->getSize() . '">' . $file->getFilename() . '</a></span>');
 
     // Remove the uploaded file.
     if ($type === 'multiple') {
diff --git a/web/modules/webform/tests/src/Functional/Element/WebformElementMappingTest.php b/web/modules/webform/tests/src/Functional/Element/WebformElementMappingTest.php
index 912093760f..5dfa8b0a30 100644
--- a/web/modules/webform/tests/src/Functional/Element/WebformElementMappingTest.php
+++ b/web/modules/webform/tests/src/Functional/Element/WebformElementMappingTest.php
@@ -31,7 +31,7 @@ public function testMappingElement() {
     $this->assertRaw('<td>One &rarr;<div class="description js-form-wrapper form-wrapper" data-drupal-selector="edit-table-one-source-data-description" id="edit-table-one-source-data-description">This is a description. This is a <a href="https://google.com">link</a></div>');
 
     // Check source help.
-    $this->assertRaw('<td>One<span data-drupal-selector="edit-table-one-source-data-help" class="webform-element-help" role="tooltip" tabindex="0" data-webform-help="&lt;div class=&quot;webform-element-help--title&quot;&gt;One&lt;/div&gt;&lt;div class=&quot;webform-element-help--content&quot;&gt;This is help. This is a &lt;a href=&quot;https://google.com&quot;&gt;link&lt;/a&gt;&lt;/div&gt;"><span aria-hidden="true">?</span></span> &rarr;</td>');
+    $this->assertRaw('<td>One<span data-drupal-selector="edit-table-one-source-data-help" class="webform-element-help js-webform-element-help" role="tooltip" tabindex="0" data-webform-help="&lt;div class=&quot;webform-element-help--title&quot;&gt;One&lt;/div&gt;&lt;div class=&quot;webform-element-help--content&quot;&gt;This is help. This is a &lt;a href=&quot;https://google.com&quot;&gt;link&lt;/a&gt;&lt;/div&gt;"><span aria-hidden="true">?</span></span> &rarr;</td>');
 
     // Check custom element.
     $this->assertRaw('<th>{Custom source} &raquo;</th>');
diff --git a/web/modules/webform/tests/src/Functional/Element/WebformElementMarkupTest.php b/web/modules/webform/tests/src/Functional/Element/WebformElementMarkupTest.php
index 8cf2dbe789..7eeed9b9a3 100644
--- a/web/modules/webform/tests/src/Functional/Element/WebformElementMarkupTest.php
+++ b/web/modules/webform/tests/src/Functional/Element/WebformElementMarkupTest.php
@@ -30,7 +30,7 @@ public function testMarkup() {
 
     // Check markup display on form.
     $this->drupalGet('/webform/test_element_markup');
-    $this->assertRaw('<div id="edit-markup" class="js-form-item form-item js-form-type-webform-markup form-type-webform-markup js-form-item-markup form-item-markup form-no-label">');
+    $this->assertCssSelect('.js-form-item-markup.form-item-markup.form-no-label');
     $this->assertRaw('<p>This is normal markup</p>');
     $this->assertRaw('<p>This is only displayed on the form view.</p>');
     $this->assertNoRaw('<p>This is only displayed on the submission view.</p>');
diff --git a/web/modules/webform/tests/src/Functional/Element/WebformElementMessageTest.php b/web/modules/webform/tests/src/Functional/Element/WebformElementMessageTest.php
index 648adb8c94..1d0460aa3f 100644
--- a/web/modules/webform/tests/src/Functional/Element/WebformElementMessageTest.php
+++ b/web/modules/webform/tests/src/Functional/Element/WebformElementMessageTest.php
@@ -35,12 +35,12 @@ public function testMessage() {
 
     // Check basic message.
     $this->assertRaw('<div data-drupal-selector="edit-message-info" class="webform-message js-webform-message js-form-wrapper form-wrapper" id="edit-message-info">');
-    $this->assertRaw('<div role="contentinfo" aria-label="Information message" class="messages messages--info">');
+    $this->assertRaw('<div role="contentinfo" aria-label="Information message">');
     $this->assertRaw('This is an <strong>info</strong> message.');
 
     // Check close message with slide effect.
     $this->assertRaw('<div data-drupal-selector="edit-message-close-slide" class="webform-message js-webform-message webform-message--close js-webform-message--close js-form-wrapper form-wrapper" data-message-close-effect="slide" id="edit-message-close-slide">');
-    $this->assertRaw('<div role="contentinfo" aria-label="Information message" class="messages messages--info">');
+    $this->assertRaw('<div role="contentinfo" aria-label="Information message">');
     $this->assertRaw('<a href="#close" aria-label="close" class="js-webform-message__link webform-message__link">×</a>This is message that can be <b>closed using slide effect</b>.');
 
     // Set user and state storage.
diff --git a/web/modules/webform/tests/src/Functional/Element/WebformElementMultipleTest.php b/web/modules/webform/tests/src/Functional/Element/WebformElementMultipleTest.php
index 9d0261c108..45ad36e4ad 100644
--- a/web/modules/webform/tests/src/Functional/Element/WebformElementMultipleTest.php
+++ b/web/modules/webform/tests/src/Functional/Element/WebformElementMultipleTest.php
@@ -122,19 +122,19 @@ public function testMultiple() {
     $this->drupalGet('/webform/test_element_multiple');
 
     // Check first tr.
-    $this->assertRaw('<tr class="draggable odd" data-drupal-selector="edit-webform-multiple-default-items-0">');
-    $this->assertRaw('<td><div class="js-form-item form-item js-form-type-textfield form-type-textfield js-form-item-webform-multiple-default-items-0--item- form-item-webform-multiple-default-items-0--item- form-no-label">');
+    $this->assertRaw('<tr class="draggable" data-drupal-selector="edit-webform-multiple-default-items-0">');
+    $this->assertRaw('<td><div class="js-form-item form-item js-form-type-textfield form-item-webform-multiple-default-items-0--item- js-form-item-webform-multiple-default-items-0--item- form-no-label">');
     $this->assertRaw('<label for="edit-webform-multiple-default-items-0-item-" class="visually-hidden">Item value</label>');
     $this->assertRaw('<input data-drupal-selector="edit-webform-multiple-default-items-0-item-" type="text" id="edit-webform-multiple-default-items-0-item-" name="webform_multiple_default[items][0][_item_]" value="One" size="60" maxlength="128" placeholder="Enter value…" class="form-text" />');
-    $this->assertRaw('<td class="webform-multiple-table--weight"><div class="webform-multiple-table--weight js-form-item form-item js-form-type-number form-type-number js-form-item-webform-multiple-default-items-0-weight form-item-webform-multiple-default-items-0-weight form-no-label">');
+    $this->assertRaw('<td class="webform-multiple-table--weight"><div class="webform-multiple-table--weight js-form-item form-item js-form-type-number form-item-webform-multiple-default-items-0-weight js-form-item-webform-multiple-default-items-0-weight form-no-label">');
     $this->assertRaw('<label for="edit-webform-multiple-default-items-0-weight" class="visually-hidden">Item weight</label>');
     $this->assertRaw('<input class="webform-multiple-sort-weight form-number" data-drupal-selector="edit-webform-multiple-default-items-0-weight" type="number" id="edit-webform-multiple-default-items-0-weight" name="webform_multiple_default[items][0][weight]" value="0" step="1" size="10" />');
     $this->assertRaw('<td class="webform-multiple-table--operations webform-multiple-table--operations-two"><input data-drupal-selector="edit-webform-multiple-default-items-0-operations-add" formnovalidate="formnovalidate" type="image" id="edit-webform-multiple-default-items-0-operations-add" name="webform_multiple_default_table_add_0"');
     $this->assertRaw('<input data-drupal-selector="edit-webform-multiple-default-items-0-operations-remove" formnovalidate="formnovalidate" type="image" id="edit-webform-multiple-default-items-0-operations-remove" name="webform_multiple_default_table_remove_0"');
 
     // Check that sorting is disabled.
-    $this->assertNoRaw('<tr class="draggable odd" data-drupal-selector="edit-webform-multiple-no-sorting-items-0">');
-    $this->assertRaw('<tr data-drupal-selector="edit-webform-multiple-no-sorting-items-0" class="odd">');
+    $this->assertNoRaw('<tr class="draggable" data-drupal-selector="edit-webform-multiple-no-sorting-items-0">');
+    $this->assertRaw('<tr data-drupal-selector="edit-webform-multiple-no-sorting-items-0">');
 
     // Check that add more is removed.
     $this->assertFieldByName('webform_multiple_no_operations[add][more_items]', '1');
diff --git a/web/modules/webform/tests/src/Functional/Element/WebformElementOtherTest.php b/web/modules/webform/tests/src/Functional/Element/WebformElementOtherTest.php
index e28b44572d..584a9a1bb4 100644
--- a/web/modules/webform/tests/src/Functional/Element/WebformElementOtherTest.php
+++ b/web/modules/webform/tests/src/Functional/Element/WebformElementOtherTest.php
@@ -63,7 +63,7 @@ public function testBuildingOtherElements() {
     $this->assertRaw('<span class="fieldset-legend js-form-required form-required">Checkboxes other advanced</span>');
     $this->assertRaw('<input data-drupal-selector="edit-checkboxes-other-advanced-other" aria-describedby="edit-checkboxes-other-advanced-other--description" type="text" id="edit-checkboxes-other-advanced-other" name="checkboxes_other_advanced[other]" value="Four" size="60" maxlength="255" placeholder="What is this other option" class="form-text" />');
     $this->assertRaw('<div id="edit-checkboxes-other-advanced-other--description" class="webform-element-description">Other checkbox description</div>');
-    $this->assertRaw('<label for="edit-checkboxes-other-advanced-checkboxes-one" class="option">One<span class="webform-element-help"');
+    $this->assertRaw('<label for="edit-checkboxes-other-advanced-checkboxes-one" class="option">One<span class="webform-element-help js-webform-element-help"');
 
     /**************************************************************************/
     // radios_other
@@ -80,14 +80,14 @@ public function testBuildingOtherElements() {
     $this->assertRaw('<input data-drupal-selector="edit-radios-other-advanced-radios-other-" type="radio" id="edit-radios-other-advanced-radios-other-" name="radios_other_advanced[radios]" value="_other_" checked="checked" class="form-radio" />');
     $this->assertRaw('<input data-drupal-selector="edit-radios-other-advanced-other" aria-describedby="edit-radios-other-advanced-other--description" type="text" id="edit-radios-other-advanced-other" name="radios_other_advanced[other]" value="Four" size="60" maxlength="255" placeholder="What is this other option" class="form-text" />');
     $this->assertRaw('<div id="edit-radios-other-advanced-other--description" class="webform-element-description">Other radio description</div>');
-    $this->assertRaw('<label for="edit-radios-other-advanced-radios-one" class="option">One<span class="webform-element-help"');
+    $this->assertRaw('<label for="edit-radios-other-advanced-radios-one" class="option">One<span class="webform-element-help js-webform-element-help"');
 
     /**************************************************************************/
     // wrapper_type
     /**************************************************************************/
 
     // Check form_item wrapper type.
-    $this->assertRaw('<div class="js-webform-select-other webform-select-other js-form-item form-item js-form-type-webform-select-other form-type-webform-select-other js-form-item-wrapper-other-form-element form-item-wrapper-other-form-element" id="edit-wrapper-other-form-element">');
+    $this->assertRaw('<div class="js-webform-select-other webform-select-other js-form-item form-item js-form-type-webform-select-other form-item-wrapper-other-form-element js-form-item-wrapper-other-form-element" id="edit-wrapper-other-form-element">');
 
     // Check container wrapper type.
     $this->assertRaw('<div data-drupal-selector="edit-wrapper-other-container" class="js-webform-select-other webform-select-other webform-select-other--wrapper fieldgroup form-composite js-form-wrapper form-wrapper" id="edit-wrapper-other-container">');
diff --git a/web/modules/webform/tests/src/Functional/Element/WebformElementPluginDefinitionsTest.php b/web/modules/webform/tests/src/Functional/Element/WebformElementPluginDefinitionsTest.php
index 46e5cf4fbf..74aa248f37 100644
--- a/web/modules/webform/tests/src/Functional/Element/WebformElementPluginDefinitionsTest.php
+++ b/web/modules/webform/tests/src/Functional/Element/WebformElementPluginDefinitionsTest.php
@@ -1204,6 +1204,25 @@ class: Drupal\webform\Plugin\WebformElement\WebformFlexbox
   container: true
   root: false
   multiple: false
+webform_height:
+  dependencies: {  }
+  default_key: ''
+  category: 'Advanced elements'
+  description: 'Provides a form element to collect height in feet and inches.'
+  hidden: false
+  multiline: false
+  composite: false
+  states_wrapper: false
+  deprecated: false
+  deprecated_message: ''
+  id: webform_height
+  label: 'Height (feet/inches)'
+  class: Drupal\webform\Plugin\WebformElement\WebformHeight
+  provider: webform
+  input: true
+  container: false
+  root: false
+  multiple: true
 webform_horizontal_rule:
   dependencies: {  }
   default_key: horizontal_rule
@@ -1877,6 +1896,7 @@ class: Drupal\webform\Plugin\WebformElement\WebformWizardPage
   root: true
   multiple: false
 YAML;
+
     return Yaml::decode($yaml);
   }
 
diff --git a/web/modules/webform/tests/src/Functional/Element/WebformElementPluginPropertiesTest.php b/web/modules/webform/tests/src/Functional/Element/WebformElementPluginPropertiesTest.php
index 35e4336efa..a5b6577022 100644
--- a/web/modules/webform/tests/src/Functional/Element/WebformElementPluginPropertiesTest.php
+++ b/web/modules/webform/tests/src/Functional/Element/WebformElementPluginPropertiesTest.php
@@ -102,6 +102,7 @@ protected function getActualElementDefaultProperties() {
   protected function getExpectedElementDefaultProperties() {
     $yaml = <<<YAML
 address:
+  access: true
   access_create_permissions: {  }
   access_create_roles:
     - anonymous
@@ -117,6 +118,7 @@ protected function getExpectedElementDefaultProperties() {
     - anonymous
     - authenticated
   access_view_users: {  }
+  admin_notes: ''
   admin_title: ''
   available_countries: {  }
   default_value: {  }
@@ -137,6 +139,7 @@ protected function getExpectedElementDefaultProperties() {
   more: ''
   more_title: ''
   multiple: false
+  multiple__add: true
   multiple__add_more: true
   multiple__add_more_button_label: Add
   multiple__add_more_input: true
@@ -148,6 +151,7 @@ protected function getExpectedElementDefaultProperties() {
   multiple__min_items: null
   multiple__no_items_message: 'No items entered. Please add items below.'
   multiple__operations: true
+  multiple__remove: true
   multiple__sorting: true
   prepopulate: false
   private: false
@@ -163,6 +167,7 @@ protected function getExpectedElementDefaultProperties() {
   captcha_type: default
   flex: 1
 checkbox:
+  access: true
   access_create_permissions: {  }
   access_create_roles:
     - anonymous
@@ -178,6 +183,7 @@ protected function getExpectedElementDefaultProperties() {
     - anonymous
     - authenticated
   access_view_users: {  }
+  admin_notes: ''
   admin_title: ''
   attributes: {  }
   default_value: false
@@ -209,6 +215,7 @@ protected function getExpectedElementDefaultProperties() {
   title_display: after
   wrapper_attributes: {  }
 checkboxes:
+  access: true
   access_create_permissions: {  }
   access_create_roles:
     - anonymous
@@ -224,6 +231,7 @@ protected function getExpectedElementDefaultProperties() {
     - anonymous
     - authenticated
   access_view_users: {  }
+  admin_notes: ''
   admin_title: ''
   attributes: {  }
   default_value: ''
@@ -274,6 +282,7 @@ protected function getExpectedElementDefaultProperties() {
   wrapper_attributes: {  }
   wrapper_type: fieldset
 color:
+  access: true
   access_create_permissions: {  }
   access_create_roles:
     - anonymous
@@ -289,6 +298,7 @@ protected function getExpectedElementDefaultProperties() {
     - anonymous
     - authenticated
   access_view_users: {  }
+  admin_notes: ''
   admin_title: ''
   attributes: {  }
   color_size: medium
@@ -333,6 +343,7 @@ protected function getExpectedElementDefaultProperties() {
   states: {  }
   states_clear: true
 date:
+  access: true
   access_create_permissions: {  }
   access_create_roles:
     - anonymous
@@ -348,6 +359,7 @@ protected function getExpectedElementDefaultProperties() {
     - anonymous
     - authenticated
   access_view_users: {  }
+  admin_notes: ''
   admin_title: ''
   attributes: {  }
   date_date_format: Y-m-d
@@ -384,6 +396,7 @@ protected function getExpectedElementDefaultProperties() {
   more: ''
   more_title: ''
   multiple: false
+  multiple__add: true
   multiple__add_more: true
   multiple__add_more_button_label: Add
   multiple__add_more_input: true
@@ -395,6 +408,7 @@ protected function getExpectedElementDefaultProperties() {
   multiple__min_items: null
   multiple__no_items_message: 'No items entered. Please add items below.'
   multiple__operations: true
+  multiple__remove: true
   multiple__sorting: true
   placeholder: ''
   prepopulate: false
@@ -413,6 +427,7 @@ protected function getExpectedElementDefaultProperties() {
   unique_user: false
   wrapper_attributes: {  }
 datelist:
+  access: true
   access_create_permissions: {  }
   access_create_roles:
     - anonymous
@@ -428,6 +443,7 @@ protected function getExpectedElementDefaultProperties() {
     - anonymous
     - authenticated
   access_view_users: {  }
+  admin_notes: ''
   admin_title: ''
   attributes: {  }
   date_abbreviate: true
@@ -474,6 +490,7 @@ protected function getExpectedElementDefaultProperties() {
   more: ''
   more_title: ''
   multiple: false
+  multiple__add: true
   multiple__add_more: true
   multiple__add_more_button_label: Add
   multiple__add_more_input: true
@@ -485,6 +502,7 @@ protected function getExpectedElementDefaultProperties() {
   multiple__min_items: null
   multiple__no_items_message: 'No items entered. Please add items below.'
   multiple__operations: true
+  multiple__remove: true
   multiple__sorting: true
   prepopulate: false
   private: false
@@ -500,6 +518,7 @@ protected function getExpectedElementDefaultProperties() {
   unique_user: false
   wrapper_attributes: {  }
 datetime:
+  access: true
   access_create_permissions: {  }
   access_create_roles:
     - anonymous
@@ -515,6 +534,7 @@ protected function getExpectedElementDefaultProperties() {
     - anonymous
     - authenticated
   access_view_users: {  }
+  admin_notes: ''
   admin_title: ''
   attributes: {  }
   date_date_datepicker_button: false
@@ -561,6 +581,7 @@ protected function getExpectedElementDefaultProperties() {
   more: ''
   more_title: ''
   multiple: false
+  multiple__add: true
   multiple__add_more: true
   multiple__add_more_button_label: Add
   multiple__add_more_input: true
@@ -572,6 +593,7 @@ protected function getExpectedElementDefaultProperties() {
   multiple__min_items: null
   multiple__no_items_message: 'No items entered. Please add items below.'
   multiple__operations: true
+  multiple__remove: true
   multiple__sorting: true
   prepopulate: false
   private: false
@@ -587,6 +609,7 @@ protected function getExpectedElementDefaultProperties() {
   unique_user: false
   wrapper_attributes: {  }
 details:
+  access: true
   access_create_permissions: {  }
   access_create_roles:
     - anonymous
@@ -602,6 +625,7 @@ protected function getExpectedElementDefaultProperties() {
     - anonymous
     - authenticated
   access_view_users: {  }
+  admin_notes: ''
   admin_title: ''
   attributes: {  }
   description: ''
@@ -625,6 +649,7 @@ protected function getExpectedElementDefaultProperties() {
   title: ''
   title_display: ''
 email:
+  access: true
   access_create_permissions: {  }
   access_create_roles:
     - anonymous
@@ -640,6 +665,7 @@ protected function getExpectedElementDefaultProperties() {
     - anonymous
     - authenticated
   access_view_users: {  }
+  admin_notes: ''
   admin_title: ''
   attributes: {  }
   autocomplete: 'on'
@@ -667,6 +693,7 @@ protected function getExpectedElementDefaultProperties() {
   more: ''
   more_title: ''
   multiple: false
+  multiple__add: true
   multiple__add_more: true
   multiple__add_more_button_label: Add
   multiple__add_more_input: true
@@ -678,6 +705,7 @@ protected function getExpectedElementDefaultProperties() {
   multiple__min_items: null
   multiple__no_items_message: 'No items entered. Please add items below.'
   multiple__operations: true
+  multiple__remove: true
   multiple__sorting: true
   pattern: ''
   pattern_error: ''
@@ -698,6 +726,7 @@ protected function getExpectedElementDefaultProperties() {
   unique_user: false
   wrapper_attributes: {  }
 entity_autocomplete:
+  access: true
   access_create_permissions: {  }
   access_create_roles:
     - anonymous
@@ -713,6 +742,7 @@ protected function getExpectedElementDefaultProperties() {
     - anonymous
     - authenticated
   access_view_users: {  }
+  admin_notes: ''
   admin_title: ''
   attributes: {  }
   default_value: ''
@@ -736,6 +766,7 @@ protected function getExpectedElementDefaultProperties() {
   more: ''
   more_title: ''
   multiple: false
+  multiple__add: true
   multiple__add_more: true
   multiple__add_more_button_label: Add
   multiple__add_more_input: true
@@ -747,6 +778,7 @@ protected function getExpectedElementDefaultProperties() {
   multiple__min_items: null
   multiple__no_items_message: 'No items entered. Please add items below.'
   multiple__operations: true
+  multiple__remove: true
   multiple__sorting: true
   prepopulate: false
   private: false
@@ -766,6 +798,7 @@ protected function getExpectedElementDefaultProperties() {
   unique_user: false
   wrapper_attributes: {  }
 fieldset:
+  access: true
   access_create_permissions: {  }
   access_create_roles:
     - anonymous
@@ -781,6 +814,7 @@ protected function getExpectedElementDefaultProperties() {
     - anonymous
     - authenticated
   access_view_users: {  }
+  admin_notes: ''
   admin_title: ''
   attributes: {  }
   description: ''
@@ -823,6 +857,7 @@ protected function getExpectedElementDefaultProperties() {
   private: false
   title: ''
 item:
+  access: true
   access_create_permissions: {  }
   access_create_roles:
     - anonymous
@@ -838,6 +873,7 @@ protected function getExpectedElementDefaultProperties() {
     - anonymous
     - authenticated
   access_view_users: {  }
+  admin_notes: ''
   admin_title: ''
   description: ''
   description_display: ''
@@ -858,6 +894,7 @@ protected function getExpectedElementDefaultProperties() {
   title_display: ''
   wrapper_attributes: {  }
 label:
+  access: true
   access_create_permissions: {  }
   access_create_roles:
     - anonymous
@@ -873,6 +910,7 @@ protected function getExpectedElementDefaultProperties() {
     - anonymous
     - authenticated
   access_view_users: {  }
+  admin_notes: ''
   admin_title: ''
   attributes: {  }
   description: ''
@@ -882,6 +920,7 @@ protected function getExpectedElementDefaultProperties() {
   states: {  }
   title: ''
 language_select:
+  access: true
   access_create_permissions: {  }
   access_create_roles:
     - anonymous
@@ -897,6 +936,7 @@ protected function getExpectedElementDefaultProperties() {
     - anonymous
     - authenticated
   access_view_users: {  }
+  admin_notes: ''
   admin_title: ''
   attributes: {  }
   default_value: ''
@@ -930,6 +970,7 @@ protected function getExpectedElementDefaultProperties() {
   unique_user: false
   wrapper_attributes: {  }
 machine_name:
+  access: true
   access_create_permissions: {  }
   access_create_roles:
     - anonymous
@@ -945,6 +986,7 @@ protected function getExpectedElementDefaultProperties() {
     - anonymous
     - authenticated
   access_view_users: {  }
+  admin_notes: ''
   admin_title: ''
   attributes: {  }
   default_value: ''
@@ -978,6 +1020,7 @@ protected function getExpectedElementDefaultProperties() {
   unique_user: false
   wrapper_attributes: {  }
 managed_file:
+  access: true
   access_create_permissions: {  }
   access_create_roles:
     - anonymous
@@ -993,6 +1036,7 @@ protected function getExpectedElementDefaultProperties() {
     - anonymous
     - authenticated
   access_view_users: {  }
+  admin_notes: ''
   admin_title: ''
   attributes: {  }
   button: false
@@ -1040,6 +1084,7 @@ protected function getExpectedElementDefaultProperties() {
   uri_scheme: private
   wrapper_attributes: {  }
 number:
+  access: true
   access_create_permissions: {  }
   access_create_roles:
     - anonymous
@@ -1055,6 +1100,7 @@ protected function getExpectedElementDefaultProperties() {
     - anonymous
     - authenticated
   access_view_users: {  }
+  admin_notes: ''
   admin_title: ''
   attributes: {  }
   autocomplete: 'on'
@@ -1081,6 +1127,7 @@ protected function getExpectedElementDefaultProperties() {
   more: ''
   more_title: ''
   multiple: false
+  multiple__add: true
   multiple__add_more: true
   multiple__add_more_button_label: Add
   multiple__add_more_input: true
@@ -1092,6 +1139,7 @@ protected function getExpectedElementDefaultProperties() {
   multiple__min_items: null
   multiple__no_items_message: 'No items entered. Please add items below.'
   multiple__operations: true
+  multiple__remove: true
   multiple__sorting: true
   placeholder: ''
   prepopulate: false
@@ -1111,6 +1159,7 @@ protected function getExpectedElementDefaultProperties() {
   unique_user: false
   wrapper_attributes: {  }
 processed_text:
+  access: true
   access_create_permissions: {  }
   access_create_roles:
     - anonymous
@@ -1126,6 +1175,7 @@ protected function getExpectedElementDefaultProperties() {
     - anonymous
     - authenticated
   access_view_users: {  }
+  admin_notes: ''
   admin_title: ''
   display_on: form
   flex: 1
@@ -1136,6 +1186,7 @@ protected function getExpectedElementDefaultProperties() {
   text: ''
   wrapper_attributes: {  }
 radios:
+  access: true
   access_create_permissions: {  }
   access_create_roles:
     - anonymous
@@ -1151,6 +1202,7 @@ protected function getExpectedElementDefaultProperties() {
     - anonymous
     - authenticated
   access_view_users: {  }
+  admin_notes: ''
   admin_title: ''
   attributes: {  }
   default_value: ''
@@ -1190,6 +1242,7 @@ protected function getExpectedElementDefaultProperties() {
   wrapper_attributes: {  }
   wrapper_type: fieldset
 range:
+  access: true
   access_create_permissions: {  }
   access_create_roles:
     - anonymous
@@ -1205,6 +1258,7 @@ protected function getExpectedElementDefaultProperties() {
     - anonymous
     - authenticated
   access_view_users: {  }
+  admin_notes: ''
   admin_title: ''
   attributes: {  }
   default_value: ''
@@ -1246,6 +1300,7 @@ protected function getExpectedElementDefaultProperties() {
   unique_user: false
   wrapper_attributes: {  }
 search:
+  access: true
   access_create_permissions: {  }
   access_create_roles:
     - anonymous
@@ -1261,6 +1316,7 @@ protected function getExpectedElementDefaultProperties() {
     - anonymous
     - authenticated
   access_view_users: {  }
+  admin_notes: ''
   admin_title: ''
   attributes: {  }
   autocomplete: 'on'
@@ -1302,6 +1358,7 @@ protected function getExpectedElementDefaultProperties() {
   unique_user: false
   wrapper_attributes: {  }
 select:
+  access: true
   access_create_permissions: {  }
   access_create_roles:
     - anonymous
@@ -1317,6 +1374,7 @@ protected function getExpectedElementDefaultProperties() {
     - anonymous
     - authenticated
   access_view_users: {  }
+  admin_notes: ''
   admin_title: ''
   attributes: {  }
   choices: false
@@ -1368,6 +1426,7 @@ protected function getExpectedElementDefaultProperties() {
   empty: ''
   header: {  }
 tableselect:
+  access: true
   access_create_permissions: {  }
   access_create_roles:
     - anonymous
@@ -1383,6 +1442,7 @@ protected function getExpectedElementDefaultProperties() {
     - anonymous
     - authenticated
   access_view_users: {  }
+  admin_notes: ''
   admin_title: ''
   attributes: {  }
   default_value: ''
@@ -1424,6 +1484,7 @@ protected function getExpectedElementDefaultProperties() {
   unique_user: false
   wrapper_attributes: {  }
 tel:
+  access: true
   access_create_permissions: {  }
   access_create_roles:
     - anonymous
@@ -1439,6 +1500,7 @@ protected function getExpectedElementDefaultProperties() {
     - anonymous
     - authenticated
   access_view_users: {  }
+  admin_notes: ''
   admin_title: ''
   attributes: {  }
   autocomplete: 'on'
@@ -1469,6 +1531,7 @@ protected function getExpectedElementDefaultProperties() {
   more: ''
   more_title: ''
   multiple: false
+  multiple__add: true
   multiple__add_more: true
   multiple__add_more_button_label: Add
   multiple__add_more_input: true
@@ -1480,6 +1543,7 @@ protected function getExpectedElementDefaultProperties() {
   multiple__min_items: null
   multiple__no_items_message: 'No items entered. Please add items below.'
   multiple__operations: true
+  multiple__remove: true
   multiple__sorting: true
   pattern: ''
   pattern_error: ''
@@ -1500,6 +1564,7 @@ protected function getExpectedElementDefaultProperties() {
   unique_user: false
   wrapper_attributes: {  }
 text_format:
+  access: true
   access_create_permissions: {  }
   access_create_roles:
     - anonymous
@@ -1515,6 +1580,7 @@ protected function getExpectedElementDefaultProperties() {
     - anonymous
     - authenticated
   access_view_users: {  }
+  admin_notes: ''
   admin_title: ''
   allowed_formats: {  }
   default_value: {  }
@@ -1539,6 +1605,7 @@ protected function getExpectedElementDefaultProperties() {
   states_clear: true
   title: ''
 textarea:
+  access: true
   access_create_permissions: {  }
   access_create_roles:
     - anonymous
@@ -1554,6 +1621,7 @@ protected function getExpectedElementDefaultProperties() {
     - anonymous
     - authenticated
   access_view_users: {  }
+  admin_notes: ''
   admin_title: ''
   attributes: {  }
   autocomplete: 'on'
@@ -1585,6 +1653,7 @@ protected function getExpectedElementDefaultProperties() {
   more: ''
   more_title: ''
   multiple: false
+  multiple__add: true
   multiple__add_more: true
   multiple__add_more_button_label: Add
   multiple__add_more_input: true
@@ -1596,6 +1665,7 @@ protected function getExpectedElementDefaultProperties() {
   multiple__min_items: null
   multiple__no_items_message: 'No items entered. Please add items below.'
   multiple__operations: true
+  multiple__remove: true
   multiple__sorting: true
   pattern: ''
   pattern_error: ''
@@ -1617,6 +1687,7 @@ protected function getExpectedElementDefaultProperties() {
   unique_user: false
   wrapper_attributes: {  }
 textfield:
+  access: true
   access_create_permissions: {  }
   access_create_roles:
     - anonymous
@@ -1632,6 +1703,7 @@ protected function getExpectedElementDefaultProperties() {
     - anonymous
     - authenticated
   access_view_users: {  }
+  admin_notes: ''
   admin_title: ''
   attributes: {  }
   autocomplete: 'on'
@@ -1665,6 +1737,7 @@ protected function getExpectedElementDefaultProperties() {
   more: ''
   more_title: ''
   multiple: false
+  multiple__add: true
   multiple__add_more: true
   multiple__add_more_button_label: Add
   multiple__add_more_input: true
@@ -1676,6 +1749,7 @@ protected function getExpectedElementDefaultProperties() {
   multiple__min_items: null
   multiple__no_items_message: 'No items entered. Please add items below.'
   multiple__operations: true
+  multiple__remove: true
   multiple__sorting: true
   pattern: ''
   pattern_error: ''
@@ -1696,6 +1770,7 @@ protected function getExpectedElementDefaultProperties() {
   unique_user: false
   wrapper_attributes: {  }
 url:
+  access: true
   access_create_permissions: {  }
   access_create_roles:
     - anonymous
@@ -1711,6 +1786,7 @@ protected function getExpectedElementDefaultProperties() {
     - anonymous
     - authenticated
   access_view_users: {  }
+  admin_notes: ''
   admin_title: ''
   attributes: {  }
   autocomplete: 'on'
@@ -1738,6 +1814,7 @@ protected function getExpectedElementDefaultProperties() {
   more: ''
   more_title: ''
   multiple: false
+  multiple__add: true
   multiple__add_more: true
   multiple__add_more_button_label: Add
   multiple__add_more_input: true
@@ -1749,6 +1826,7 @@ protected function getExpectedElementDefaultProperties() {
   multiple__min_items: null
   multiple__no_items_message: 'No items entered. Please add items below.'
   multiple__operations: true
+  multiple__remove: true
   multiple__sorting: true
   pattern: ''
   pattern_error: ''
@@ -1772,6 +1850,7 @@ protected function getExpectedElementDefaultProperties() {
   title: ''
   value: ''
 view:
+  access: true
   access_create_permissions: {  }
   access_create_roles:
     - anonymous
@@ -1787,6 +1866,7 @@ protected function getExpectedElementDefaultProperties() {
     - anonymous
     - authenticated
   access_view_users: {  }
+  admin_notes: ''
   admin_title: ''
   arguments: {  }
   display_id: ''
@@ -1796,6 +1876,7 @@ protected function getExpectedElementDefaultProperties() {
   private: false
   states: {  }
 webform_actions:
+  access: true
   access_create_permissions: {  }
   access_create_roles:
     - anonymous
@@ -1811,8 +1892,13 @@ protected function getExpectedElementDefaultProperties() {
     - anonymous
     - authenticated
   access_view_users: {  }
+  admin_notes: ''
   admin_title: ''
   attributes: {  }
+  delete__attributes: {  }
+  delete__dialog: false
+  delete__label: ''
+  delete_hide: true
   draft__attributes: {  }
   draft__label: ''
   draft_hide: false
@@ -1833,6 +1919,9 @@ protected function getExpectedElementDefaultProperties() {
   submit__label: ''
   submit_hide: false
   title: ''
+  update__attributes: {  }
+  update__label: ''
+  update_hide: false
   wizard_next__attributes: {  }
   wizard_next__label: ''
   wizard_next_hide: false
@@ -1840,6 +1929,7 @@ protected function getExpectedElementDefaultProperties() {
   wizard_prev__label: ''
   wizard_prev_hide: false
 webform_address:
+  access: true
   access_create_permissions: {  }
   access_create_roles:
     - anonymous
@@ -1871,6 +1961,7 @@ protected function getExpectedElementDefaultProperties() {
   address__title: Address
   address__title_display: ''
   address__type: textfield
+  admin_notes: ''
   admin_title: ''
   attributes: {  }
   choices: false
@@ -1914,6 +2005,7 @@ protected function getExpectedElementDefaultProperties() {
   more: ''
   more_title: ''
   multiple: false
+  multiple__add: true
   multiple__add_more: true
   multiple__add_more_button_label: Add
   multiple__add_more_input: true
@@ -1926,6 +2018,7 @@ protected function getExpectedElementDefaultProperties() {
   multiple__min_items: null
   multiple__no_items_message: 'No items entered. Please add items below.'
   multiple__operations: true
+  multiple__remove: true
   multiple__sorting: true
   postal_code__access: true
   postal_code__description: ''
@@ -1955,6 +2048,7 @@ protected function getExpectedElementDefaultProperties() {
   wrapper_attributes: {  }
   wrapper_type: fieldset
 webform_attachment_token:
+  access: true
   access_create_permissions: {  }
   access_create_roles:
     - anonymous
@@ -1970,6 +2064,7 @@ protected function getExpectedElementDefaultProperties() {
     - anonymous
     - authenticated
   access_view_users: {  }
+  admin_notes: ''
   admin_title: ''
   display_on: none
   download: false
@@ -1986,6 +2081,7 @@ protected function getExpectedElementDefaultProperties() {
   trim: false
   wrapper_attributes: {  }
 webform_attachment_twig:
+  access: true
   access_create_permissions: {  }
   access_create_roles:
     - anonymous
@@ -2001,6 +2097,7 @@ protected function getExpectedElementDefaultProperties() {
     - anonymous
     - authenticated
   access_view_users: {  }
+  admin_notes: ''
   admin_title: ''
   display_on: none
   download: false
@@ -2017,6 +2114,7 @@ protected function getExpectedElementDefaultProperties() {
   trim: false
   wrapper_attributes: {  }
 webform_attachment_url:
+  access: true
   access_create_permissions: {  }
   access_create_roles:
     - anonymous
@@ -2032,6 +2130,7 @@ protected function getExpectedElementDefaultProperties() {
     - anonymous
     - authenticated
   access_view_users: {  }
+  admin_notes: ''
   admin_title: ''
   display_on: none
   download: false
@@ -2048,6 +2147,7 @@ protected function getExpectedElementDefaultProperties() {
   url: ''
   wrapper_attributes: {  }
 webform_audio_file:
+  access: true
   access_create_permissions: {  }
   access_create_roles:
     - anonymous
@@ -2063,6 +2163,7 @@ protected function getExpectedElementDefaultProperties() {
     - anonymous
     - authenticated
   access_view_users: {  }
+  admin_notes: ''
   admin_title: ''
   attributes: {  }
   button: false
@@ -2110,6 +2211,7 @@ protected function getExpectedElementDefaultProperties() {
   uri_scheme: private
   wrapper_attributes: {  }
 webform_autocomplete:
+  access: true
   access_create_permissions: {  }
   access_create_roles:
     - anonymous
@@ -2125,6 +2227,7 @@ protected function getExpectedElementDefaultProperties() {
     - anonymous
     - authenticated
   access_view_users: {  }
+  admin_notes: ''
   admin_title: ''
   attributes: {  }
   autocomplete_existing: false
@@ -2162,6 +2265,7 @@ protected function getExpectedElementDefaultProperties() {
   more: ''
   more_title: ''
   multiple: false
+  multiple__add: true
   multiple__add_more: true
   multiple__add_more_button_label: Add
   multiple__add_more_input: true
@@ -2173,6 +2277,7 @@ protected function getExpectedElementDefaultProperties() {
   multiple__min_items: null
   multiple__no_items_message: 'No items entered. Please add items below.'
   multiple__operations: true
+  multiple__remove: true
   multiple__sorting: true
   pattern: ''
   pattern_error: ''
@@ -2193,6 +2298,7 @@ protected function getExpectedElementDefaultProperties() {
   unique_user: false
   wrapper_attributes: {  }
 webform_card:
+  access: true
   access_create_permissions: {  }
   access_create_roles:
     - anonymous
@@ -2208,6 +2314,7 @@ protected function getExpectedElementDefaultProperties() {
     - anonymous
     - authenticated
   access_view_users: {  }
+  admin_notes: ''
   admin_title: ''
   format: details
   format_attributes: {  }
@@ -2223,6 +2330,7 @@ protected function getExpectedElementDefaultProperties() {
   title_display: ''
   title_tag: h2
 webform_checkboxes_other:
+  access: true
   access_create_permissions: {  }
   access_create_roles:
     - anonymous
@@ -2238,6 +2346,7 @@ protected function getExpectedElementDefaultProperties() {
     - anonymous
     - authenticated
   access_view_users: {  }
+  admin_notes: ''
   admin_title: ''
   attributes: {  }
   default_value: ''
@@ -2303,6 +2412,7 @@ protected function getExpectedElementDefaultProperties() {
   wrapper_attributes: {  }
   wrapper_type: fieldset
 webform_codemirror:
+  access: true
   access_create_permissions: {  }
   access_create_roles:
     - anonymous
@@ -2318,6 +2428,7 @@ protected function getExpectedElementDefaultProperties() {
     - anonymous
     - authenticated
   access_view_users: {  }
+  admin_notes: ''
   admin_title: ''
   attributes: {  }
   default_value: ''
@@ -2354,6 +2465,7 @@ protected function getExpectedElementDefaultProperties() {
   wrap: true
   wrapper_attributes: {  }
 webform_computed_token:
+  access: true
   access_create_permissions: {  }
   access_create_roles:
     - anonymous
@@ -2369,6 +2481,7 @@ protected function getExpectedElementDefaultProperties() {
     - anonymous
     - authenticated
   access_view_users: {  }
+  admin_notes: ''
   admin_title: ''
   ajax: false
   description: ''
@@ -2392,6 +2505,7 @@ protected function getExpectedElementDefaultProperties() {
   title_display: ''
   wrapper_attributes: {  }
 webform_computed_twig:
+  access: true
   access_create_permissions: {  }
   access_create_roles:
     - anonymous
@@ -2407,6 +2521,7 @@ protected function getExpectedElementDefaultProperties() {
     - anonymous
     - authenticated
   access_view_users: {  }
+  admin_notes: ''
   admin_title: ''
   ajax: false
   description: ''
@@ -2431,6 +2546,7 @@ protected function getExpectedElementDefaultProperties() {
   whitespace: ''
   wrapper_attributes: {  }
 webform_contact:
+  access: true
   access_create_permissions: {  }
   access_create_roles:
     - anonymous
@@ -2462,6 +2578,7 @@ protected function getExpectedElementDefaultProperties() {
   address__title: Address
   address__title_display: ''
   address__type: textfield
+  admin_notes: ''
   admin_title: ''
   attributes: {  }
   choices: false
@@ -2521,6 +2638,7 @@ protected function getExpectedElementDefaultProperties() {
   more: ''
   more_title: ''
   multiple: false
+  multiple__add: true
   multiple__add_more: true
   multiple__add_more_button_label: Add
   multiple__add_more_input: true
@@ -2533,6 +2651,7 @@ protected function getExpectedElementDefaultProperties() {
   multiple__min_items: null
   multiple__no_items_message: 'No items entered. Please add items below.'
   multiple__operations: true
+  multiple__remove: true
   multiple__sorting: true
   name__access: true
   name__description: ''
@@ -2578,6 +2697,7 @@ protected function getExpectedElementDefaultProperties() {
   wrapper_attributes: {  }
   wrapper_type: fieldset
 webform_custom_composite:
+  access: true
   access_create_permissions: {  }
   access_create_roles:
     - anonymous
@@ -2593,6 +2713,7 @@ protected function getExpectedElementDefaultProperties() {
     - anonymous
     - authenticated
   access_view_users: {  }
+  admin_notes: ''
   admin_title: ''
   attributes: {  }
   choices: false
@@ -2619,6 +2740,7 @@ protected function getExpectedElementDefaultProperties() {
   more: ''
   more_title: ''
   multiple: true
+  multiple__add: true
   multiple__add_more: true
   multiple__add_more_button_label: Add
   multiple__add_more_input: true
@@ -2631,6 +2753,7 @@ protected function getExpectedElementDefaultProperties() {
   multiple__min_items: null
   multiple__no_items_message: 'No items entered. Please add items below.'
   multiple__operations: true
+  multiple__remove: true
   multiple__sorting: true
   prepopulate: false
   private: false
@@ -2643,6 +2766,7 @@ protected function getExpectedElementDefaultProperties() {
   wrapper_attributes: {  }
   wrapper_type: fieldset
 webform_document_file:
+  access: true
   access_create_permissions: {  }
   access_create_roles:
     - anonymous
@@ -2658,6 +2782,7 @@ protected function getExpectedElementDefaultProperties() {
     - anonymous
     - authenticated
   access_view_users: {  }
+  admin_notes: ''
   admin_title: ''
   attributes: {  }
   button: false
@@ -2706,6 +2831,7 @@ protected function getExpectedElementDefaultProperties() {
   wrapper_attributes: {  }
 webform_element: {  }
 webform_email_confirm:
+  access: true
   access_create_permissions: {  }
   access_create_roles:
     - anonymous
@@ -2721,6 +2847,7 @@ protected function getExpectedElementDefaultProperties() {
     - anonymous
     - authenticated
   access_view_users: {  }
+  admin_notes: ''
   admin_title: ''
   attributes: {  }
   autocomplete: 'on'
@@ -2748,6 +2875,7 @@ protected function getExpectedElementDefaultProperties() {
   minlength: null
   more: ''
   more_title: ''
+  multiple__add: true
   multiple__add_more: true
   multiple__add_more_button_label: Add
   multiple__add_more_input: true
@@ -2758,6 +2886,7 @@ protected function getExpectedElementDefaultProperties() {
   multiple__min_items: null
   multiple__no_items_message: 'No items entered. Please add items below.'
   multiple__operations: true
+  multiple__remove: true
   multiple__sorting: true
   pattern: ''
   pattern_error: ''
@@ -2779,6 +2908,7 @@ protected function getExpectedElementDefaultProperties() {
   wrapper_attributes: {  }
   wrapper_type: fieldset
 webform_email_multiple:
+  access: true
   access_create_permissions: {  }
   access_create_roles:
     - anonymous
@@ -2794,6 +2924,7 @@ protected function getExpectedElementDefaultProperties() {
     - anonymous
     - authenticated
   access_view_users: {  }
+  admin_notes: ''
   admin_title: ''
   attributes: {  }
   autocomplete: 'on'
@@ -2817,6 +2948,7 @@ protected function getExpectedElementDefaultProperties() {
   minlength: null
   more: ''
   more_title: ''
+  multiple__add: true
   multiple__add_more: true
   multiple__add_more_button_label: Add
   multiple__add_more_input: true
@@ -2828,6 +2960,7 @@ protected function getExpectedElementDefaultProperties() {
   multiple__min_items: null
   multiple__no_items_message: 'No items entered. Please add items below.'
   multiple__operations: true
+  multiple__remove: true
   multiple__sorting: true
   pattern: ''
   pattern_error: ''
@@ -2848,6 +2981,7 @@ protected function getExpectedElementDefaultProperties() {
   unique_user: false
   wrapper_attributes: {  }
 webform_entity_checkboxes:
+  access: true
   access_create_permissions: {  }
   access_create_roles:
     - anonymous
@@ -2863,6 +2997,7 @@ protected function getExpectedElementDefaultProperties() {
     - anonymous
     - authenticated
   access_view_users: {  }
+  admin_notes: ''
   admin_title: ''
   attributes: {  }
   default_value: ''
@@ -2911,6 +3046,7 @@ protected function getExpectedElementDefaultProperties() {
   wrapper_attributes: {  }
   wrapper_type: fieldset
 webform_entity_radios:
+  access: true
   access_create_permissions: {  }
   access_create_roles:
     - anonymous
@@ -2926,6 +3062,7 @@ protected function getExpectedElementDefaultProperties() {
     - anonymous
     - authenticated
   access_view_users: {  }
+  admin_notes: ''
   admin_title: ''
   attributes: {  }
   default_value: ''
@@ -2966,6 +3103,7 @@ protected function getExpectedElementDefaultProperties() {
   wrapper_attributes: {  }
   wrapper_type: fieldset
 webform_entity_select:
+  access: true
   access_create_permissions: {  }
   access_create_roles:
     - anonymous
@@ -2981,6 +3119,7 @@ protected function getExpectedElementDefaultProperties() {
     - anonymous
     - authenticated
   access_view_users: {  }
+  admin_notes: ''
   admin_title: ''
   attributes: {  }
   choices: false
@@ -3041,11 +3180,84 @@ protected function getExpectedElementDefaultProperties() {
   randomize: false
   states: {  }
   states_clear: true
+webform_height:
+  access: true
+  access_create_permissions: {  }
+  access_create_roles:
+    - anonymous
+    - authenticated
+  access_create_users: {  }
+  access_update_permissions: {  }
+  access_update_roles:
+    - anonymous
+    - authenticated
+  access_update_users: {  }
+  access_view_permissions: {  }
+  access_view_roles:
+    - anonymous
+    - authenticated
+  access_view_users: {  }
+  admin_notes: ''
+  admin_title: ''
+  attributes: {  }
+  default_value: ''
+  description: ''
+  description_display: ''
+  disabled: false
+  feet__max: 8
+  feet__min: 0
+  field_prefix: ''
+  field_suffix: ''
+  flex: 1
+  format: value
+  format_attributes: {  }
+  format_html: ''
+  format_items: ul
+  format_items_html: ''
+  format_items_text: ''
+  format_text: ''
+  height_format: ''
+  height_type: number
+  help: ''
+  help_display: ''
+  help_title: ''
+  label_attributes: {  }
+  more: ''
+  more_title: ''
+  multiple: false
+  multiple__add: true
+  multiple__add_more: true
+  multiple__add_more_button_label: Add
+  multiple__add_more_input: true
+  multiple__add_more_input_label: 'more items'
+  multiple__add_more_items: 1
+  multiple__empty_items: 1
+  multiple__header_label: ''
+  multiple__item_label: item
+  multiple__min_items: null
+  multiple__no_items_message: 'No items entered. Please add items below.'
+  multiple__operations: true
+  multiple__remove: true
+  multiple__sorting: true
+  prepopulate: false
+  private: false
+  required: false
+  required_error: ''
+  states: {  }
+  states_clear: true
+  title: ''
+  title_display: ''
+  unique: false
+  unique_entity: false
+  unique_error: ''
+  unique_user: false
+  wrapper_attributes: {  }
 webform_horizontal_rule:
   attributes: {  }
   display_on: form
   states: {  }
 webform_image_file:
+  access: true
   access_create_permissions: {  }
   access_create_roles:
     - anonymous
@@ -3061,6 +3273,7 @@ protected function getExpectedElementDefaultProperties() {
     - anonymous
     - authenticated
   access_view_users: {  }
+  admin_notes: ''
   admin_title: ''
   attachment_image_style: ''
   attributes: {  }
@@ -3111,6 +3324,7 @@ protected function getExpectedElementDefaultProperties() {
   uri_scheme: private
   wrapper_attributes: {  }
 webform_image_select:
+  access: true
   access_create_permissions: {  }
   access_create_roles:
     - anonymous
@@ -3126,6 +3340,7 @@ protected function getExpectedElementDefaultProperties() {
     - anonymous
     - authenticated
   access_view_users: {  }
+  admin_notes: ''
   admin_title: ''
   attributes: {  }
   choices: false
@@ -3176,6 +3391,7 @@ protected function getExpectedElementDefaultProperties() {
   unique_user: false
   wrapper_attributes: {  }
 webform_likert:
+  access: true
   access_create_permissions: {  }
   access_create_roles:
     - anonymous
@@ -3191,6 +3407,7 @@ protected function getExpectedElementDefaultProperties() {
     - anonymous
     - authenticated
   access_view_users: {  }
+  admin_notes: ''
   admin_title: ''
   answers: {  }
   answers_description_display: description
@@ -3226,6 +3443,7 @@ protected function getExpectedElementDefaultProperties() {
   title_display: ''
   wrapper_attributes: {  }
 webform_link:
+  access: true
   access_create_permissions: {  }
   access_create_roles:
     - anonymous
@@ -3241,6 +3459,7 @@ protected function getExpectedElementDefaultProperties() {
     - anonymous
     - authenticated
   access_view_users: {  }
+  admin_notes: ''
   admin_title: ''
   attributes: {  }
   choices: false
@@ -3267,6 +3486,7 @@ protected function getExpectedElementDefaultProperties() {
   more: ''
   more_title: ''
   multiple: false
+  multiple__add: true
   multiple__add_more: true
   multiple__add_more_button_label: Add
   multiple__add_more_input: true
@@ -3279,6 +3499,7 @@ protected function getExpectedElementDefaultProperties() {
   multiple__min_items: null
   multiple__no_items_message: 'No items entered. Please add items below.'
   multiple__operations: true
+  multiple__remove: true
   multiple__sorting: true
   prepopulate: false
   private: false
@@ -3306,6 +3527,7 @@ protected function getExpectedElementDefaultProperties() {
   wrapper_attributes: {  }
   wrapper_type: fieldset
 webform_location_geocomplete:
+  access: true
   access_create_permissions: {  }
   access_create_roles:
     - anonymous
@@ -3321,6 +3543,7 @@ protected function getExpectedElementDefaultProperties() {
     - anonymous
     - authenticated
   access_view_users: {  }
+  admin_notes: ''
   admin_title: ''
   administrative_area_level_1__access: false
   administrative_area_level_1__title: State/Province
@@ -3381,6 +3604,7 @@ protected function getExpectedElementDefaultProperties() {
   value__title: Address
   wrapper_attributes: {  }
 webform_location_places:
+  access: true
   access_create_permissions: {  }
   access_create_roles:
     - anonymous
@@ -3396,6 +3620,7 @@ protected function getExpectedElementDefaultProperties() {
     - anonymous
     - authenticated
   access_view_users: {  }
+  admin_notes: ''
   admin_title: ''
   administrative__access: false
   administrative__title: State/Province
@@ -3451,6 +3676,7 @@ protected function getExpectedElementDefaultProperties() {
   value__title: Address
   wrapper_attributes: {  }
 webform_mapping:
+  access: true
   access_create_permissions: {  }
   access_create_roles:
     - anonymous
@@ -3466,6 +3692,7 @@ protected function getExpectedElementDefaultProperties() {
     - anonymous
     - authenticated
   access_view_users: {  }
+  admin_notes: ''
   admin_title: ''
   arrow: →
   default_value: {  }
@@ -3500,6 +3727,7 @@ protected function getExpectedElementDefaultProperties() {
   title_display: ''
   wrapper_attributes: {  }
 webform_markup:
+  access: true
   access_create_permissions: {  }
   access_create_roles:
     - anonymous
@@ -3515,6 +3743,7 @@ protected function getExpectedElementDefaultProperties() {
     - anonymous
     - authenticated
   access_view_users: {  }
+  admin_notes: ''
   admin_title: ''
   display_on: form
   flex: 1
@@ -3523,6 +3752,7 @@ protected function getExpectedElementDefaultProperties() {
   states: {  }
   wrapper_attributes: {  }
 webform_message:
+  access: true
   access_create_permissions: {  }
   access_create_roles:
     - anonymous
@@ -3538,6 +3768,7 @@ protected function getExpectedElementDefaultProperties() {
     - anonymous
     - authenticated
   access_view_users: {  }
+  admin_notes: ''
   admin_title: ''
   attributes: {  }
   display_on: form
@@ -3551,6 +3782,7 @@ protected function getExpectedElementDefaultProperties() {
   private: false
   states: {  }
 webform_more:
+  access: true
   access_create_permissions: {  }
   access_create_roles:
     - anonymous
@@ -3566,6 +3798,7 @@ protected function getExpectedElementDefaultProperties() {
     - anonymous
     - authenticated
   access_view_users: {  }
+  admin_notes: ''
   admin_title: ''
   attributes: {  }
   display_on: form
@@ -3575,6 +3808,7 @@ protected function getExpectedElementDefaultProperties() {
   private: false
   states: {  }
 webform_name:
+  access: true
   access_create_permissions: {  }
   access_create_roles:
     - anonymous
@@ -3590,6 +3824,7 @@ protected function getExpectedElementDefaultProperties() {
     - anonymous
     - authenticated
   access_view_users: {  }
+  admin_notes: ''
   admin_title: ''
   attributes: {  }
   choices: false
@@ -3648,6 +3883,7 @@ protected function getExpectedElementDefaultProperties() {
   more: ''
   more_title: ''
   multiple: false
+  multiple__add: true
   multiple__add_more: true
   multiple__add_more_button_label: Add
   multiple__add_more_input: true
@@ -3660,6 +3896,7 @@ protected function getExpectedElementDefaultProperties() {
   multiple__min_items: null
   multiple__no_items_message: 'No items entered. Please add items below.'
   multiple__operations: true
+  multiple__remove: true
   multiple__sorting: true
   prepopulate: false
   private: false
@@ -3689,6 +3926,7 @@ protected function getExpectedElementDefaultProperties() {
   wrapper_attributes: {  }
   wrapper_type: fieldset
 'webform_options_custom:buttons':
+  access: true
   access_create_permissions: {  }
   access_create_roles:
     - anonymous
@@ -3704,6 +3942,7 @@ protected function getExpectedElementDefaultProperties() {
     - anonymous
     - authenticated
   access_view_users: {  }
+  admin_notes: ''
   admin_title: ''
   attributes: {  }
   choices: false
@@ -3753,6 +3992,7 @@ protected function getExpectedElementDefaultProperties() {
   unique_user: false
   wrapper_attributes: {  }
 'webform_options_custom:us_states':
+  access: true
   access_create_permissions: {  }
   access_create_roles:
     - anonymous
@@ -3768,6 +4008,7 @@ protected function getExpectedElementDefaultProperties() {
     - anonymous
     - authenticated
   access_view_users: {  }
+  admin_notes: ''
   admin_title: ''
   attributes: {  }
   choices: false
@@ -3817,6 +4058,7 @@ protected function getExpectedElementDefaultProperties() {
   unique_user: false
   wrapper_attributes: {  }
 webform_radios_other:
+  access: true
   access_create_permissions: {  }
   access_create_roles:
     - anonymous
@@ -3832,6 +4074,7 @@ protected function getExpectedElementDefaultProperties() {
     - anonymous
     - authenticated
   access_view_users: {  }
+  admin_notes: ''
   admin_title: ''
   attributes: {  }
   default_value: ''
@@ -3889,6 +4132,7 @@ protected function getExpectedElementDefaultProperties() {
   wrapper_attributes: {  }
   wrapper_type: fieldset
 webform_rating:
+  access: true
   access_create_permissions: {  }
   access_create_roles:
     - anonymous
@@ -3904,6 +4148,7 @@ protected function getExpectedElementDefaultProperties() {
     - anonymous
     - authenticated
   access_view_users: {  }
+  admin_notes: ''
   admin_title: ''
   attributes: {  }
   default_value: 0
@@ -3943,6 +4188,7 @@ protected function getExpectedElementDefaultProperties() {
   unique_user: false
   wrapper_attributes: {  }
 webform_same:
+  access: true
   access_create_permissions: {  }
   access_create_roles:
     - anonymous
@@ -3958,6 +4204,7 @@ protected function getExpectedElementDefaultProperties() {
     - anonymous
     - authenticated
   access_view_users: {  }
+  admin_notes: ''
   admin_title: ''
   attributes: {  }
   default_value: false
@@ -3990,6 +4237,7 @@ protected function getExpectedElementDefaultProperties() {
   title_display: after
   wrapper_attributes: {  }
 webform_scale:
+  access: true
   access_create_permissions: {  }
   access_create_roles:
     - anonymous
@@ -4005,6 +4253,7 @@ protected function getExpectedElementDefaultProperties() {
     - anonymous
     - authenticated
   access_view_users: {  }
+  admin_notes: ''
   admin_title: ''
   attributes: {  }
   default_value: ''
@@ -4047,6 +4296,7 @@ protected function getExpectedElementDefaultProperties() {
   wrapper_attributes: {  }
   wrapper_type: fieldset
 webform_section:
+  access: true
   access_create_permissions: {  }
   access_create_roles:
     - anonymous
@@ -4062,6 +4312,7 @@ protected function getExpectedElementDefaultProperties() {
     - anonymous
     - authenticated
   access_view_users: {  }
+  admin_notes: ''
   admin_title: ''
   attributes: {  }
   description: ''
@@ -4085,6 +4336,7 @@ protected function getExpectedElementDefaultProperties() {
   title_display: ''
   title_tag: h2
 webform_select_other:
+  access: true
   access_create_permissions: {  }
   access_create_roles:
     - anonymous
@@ -4100,6 +4352,7 @@ protected function getExpectedElementDefaultProperties() {
     - anonymous
     - authenticated
   access_view_users: {  }
+  admin_notes: ''
   admin_title: ''
   attributes: {  }
   choices: false
@@ -4167,6 +4420,7 @@ protected function getExpectedElementDefaultProperties() {
   wrapper_attributes: {  }
   wrapper_type: fieldset
 webform_signature:
+  access: true
   access_create_permissions: {  }
   access_create_roles:
     - anonymous
@@ -4182,6 +4436,7 @@ protected function getExpectedElementDefaultProperties() {
     - anonymous
     - authenticated
   access_view_users: {  }
+  admin_notes: ''
   admin_title: ''
   attributes: {  }
   default_value: ''
@@ -4216,6 +4471,7 @@ protected function getExpectedElementDefaultProperties() {
   unique_user: false
   wrapper_attributes: {  }
 webform_table:
+  access: true
   access_create_permissions: {  }
   access_create_roles:
     - anonymous
@@ -4231,6 +4487,7 @@ protected function getExpectedElementDefaultProperties() {
     - anonymous
     - authenticated
   access_view_users: {  }
+  admin_notes: ''
   admin_title: ''
   attributes: {  }
   caption: ''
@@ -4262,6 +4519,7 @@ protected function getExpectedElementDefaultProperties() {
   title_display: ''
   wrapper_attributes: {  }
 webform_table_row:
+  access: true
   access_create_permissions: {  }
   access_create_roles:
     - anonymous
@@ -4277,6 +4535,7 @@ protected function getExpectedElementDefaultProperties() {
     - anonymous
     - authenticated
   access_view_users: {  }
+  admin_notes: ''
   admin_title: ''
   attributes: {  }
   flex: 1
@@ -4285,6 +4544,7 @@ protected function getExpectedElementDefaultProperties() {
   states_clear: true
   title: ''
 webform_table_sort:
+  access: true
   access_create_permissions: {  }
   access_create_roles:
     - anonymous
@@ -4300,6 +4560,7 @@ protected function getExpectedElementDefaultProperties() {
     - anonymous
     - authenticated
   access_view_users: {  }
+  admin_notes: ''
   admin_title: ''
   attributes: {  }
   default_value: ''
@@ -4337,6 +4598,7 @@ protected function getExpectedElementDefaultProperties() {
   unique_user: false
   wrapper_attributes: {  }
 webform_tableselect_sort:
+  access: true
   access_create_permissions: {  }
   access_create_roles:
     - anonymous
@@ -4352,6 +4614,7 @@ protected function getExpectedElementDefaultProperties() {
     - anonymous
     - authenticated
   access_view_users: {  }
+  admin_notes: ''
   admin_title: ''
   attributes: {  }
   default_value: ''
@@ -4393,6 +4656,7 @@ protected function getExpectedElementDefaultProperties() {
   unique_user: false
   wrapper_attributes: {  }
 webform_telephone:
+  access: true
   access_create_permissions: {  }
   access_create_roles:
     - anonymous
@@ -4408,6 +4672,7 @@ protected function getExpectedElementDefaultProperties() {
     - anonymous
     - authenticated
   access_view_users: {  }
+  admin_notes: ''
   admin_title: ''
   attributes: {  }
   choices: false
@@ -4441,6 +4706,7 @@ protected function getExpectedElementDefaultProperties() {
   more: ''
   more_title: ''
   multiple: false
+  multiple__add: true
   multiple__add_more: true
   multiple__add_more_button_label: Add
   multiple__add_more_input: true
@@ -4453,6 +4719,7 @@ protected function getExpectedElementDefaultProperties() {
   multiple__min_items: null
   multiple__no_items_message: 'No items entered. Please add items below.'
   multiple__operations: true
+  multiple__remove: true
   multiple__sorting: true
   phone__access: true
   phone__description: ''
@@ -4484,6 +4751,7 @@ protected function getExpectedElementDefaultProperties() {
   wrapper_attributes: {  }
   wrapper_type: fieldset
 webform_term_checkboxes:
+  access: true
   access_create_permissions: {  }
   access_create_roles:
     - anonymous
@@ -4499,6 +4767,7 @@ protected function getExpectedElementDefaultProperties() {
     - anonymous
     - authenticated
   access_view_users: {  }
+  admin_notes: ''
   admin_title: ''
   attributes: {  }
   breadcrumb: false
@@ -4551,6 +4820,7 @@ protected function getExpectedElementDefaultProperties() {
   wrapper_attributes: {  }
   wrapper_type: fieldset
 webform_term_select:
+  access: true
   access_create_permissions: {  }
   access_create_roles:
     - anonymous
@@ -4566,6 +4836,7 @@ protected function getExpectedElementDefaultProperties() {
     - anonymous
     - authenticated
   access_view_users: {  }
+  admin_notes: ''
   admin_title: ''
   attributes: {  }
   breadcrumb: false
@@ -4615,6 +4886,7 @@ protected function getExpectedElementDefaultProperties() {
   vocabulary: ''
   wrapper_attributes: {  }
 webform_terms_of_service:
+  access: true
   access_create_permissions: {  }
   access_create_roles:
     - anonymous
@@ -4630,6 +4902,7 @@ protected function getExpectedElementDefaultProperties() {
     - anonymous
     - authenticated
   access_view_users: {  }
+  admin_notes: ''
   admin_title: ''
   attributes: {  }
   default_value: false
@@ -4659,6 +4932,7 @@ protected function getExpectedElementDefaultProperties() {
   title: 'I agree to the {terms of service}.'
   wrapper_attributes: {  }
 webform_time:
+  access: true
   access_create_permissions: {  }
   access_create_roles:
     - anonymous
@@ -4674,6 +4948,7 @@ protected function getExpectedElementDefaultProperties() {
     - anonymous
     - authenticated
   access_view_users: {  }
+  admin_notes: ''
   admin_title: ''
   attributes: {  }
   default_value: ''
@@ -4699,6 +4974,7 @@ protected function getExpectedElementDefaultProperties() {
   more: ''
   more_title: ''
   multiple: false
+  multiple__add: true
   multiple__add_more: true
   multiple__add_more_button_label: Add
   multiple__add_more_input: true
@@ -4710,6 +4986,7 @@ protected function getExpectedElementDefaultProperties() {
   multiple__min_items: null
   multiple__no_items_message: 'No items entered. Please add items below.'
   multiple__operations: true
+  multiple__remove: true
   multiple__sorting: true
   placeholder: ''
   prepopulate: false
@@ -4729,6 +5006,7 @@ protected function getExpectedElementDefaultProperties() {
   unique_user: false
   wrapper_attributes: {  }
 webform_toggle:
+  access: true
   access_create_permissions: {  }
   access_create_roles:
     - anonymous
@@ -4744,6 +5022,7 @@ protected function getExpectedElementDefaultProperties() {
     - anonymous
     - authenticated
   access_view_users: {  }
+  admin_notes: ''
   admin_title: ''
   attributes: {  }
   default_value: false
@@ -4778,6 +5057,7 @@ protected function getExpectedElementDefaultProperties() {
   toggle_theme: light
   wrapper_attributes: {  }
 webform_toggles:
+  access: true
   access_create_permissions: {  }
   access_create_roles:
     - anonymous
@@ -4793,6 +5073,7 @@ protected function getExpectedElementDefaultProperties() {
     - anonymous
     - authenticated
   access_view_users: {  }
+  admin_notes: ''
   admin_title: ''
   attributes: {  }
   default_value: ''
@@ -4834,6 +5115,7 @@ protected function getExpectedElementDefaultProperties() {
   unique_user: false
   wrapper_attributes: {  }
 webform_variant:
+  access: true
   access_create_permissions: {  }
   access_create_roles:
     - anonymous
@@ -4849,6 +5131,7 @@ protected function getExpectedElementDefaultProperties() {
     - anonymous
     - authenticated
   access_view_users: {  }
+  admin_notes: ''
   admin_title: ''
   attributes: {  }
   default_value: ''
@@ -4873,6 +5156,7 @@ protected function getExpectedElementDefaultProperties() {
   variant: ''
   wrapper_attributes: {  }
 webform_video_file:
+  access: true
   access_create_permissions: {  }
   access_create_roles:
     - anonymous
@@ -4888,6 +5172,7 @@ protected function getExpectedElementDefaultProperties() {
     - anonymous
     - authenticated
   access_view_users: {  }
+  admin_notes: ''
   admin_title: ''
   attributes: {  }
   button: false
@@ -4935,6 +5220,7 @@ protected function getExpectedElementDefaultProperties() {
   uri_scheme: private
   wrapper_attributes: {  }
 webform_wizard_page:
+  access: true
   access_create_permissions: {  }
   access_create_roles:
     - anonymous
@@ -4950,6 +5236,7 @@ protected function getExpectedElementDefaultProperties() {
     - anonymous
     - authenticated
   access_view_users: {  }
+  admin_notes: ''
   admin_title: ''
   attributes: {  }
   format: details
diff --git a/web/modules/webform/tests/src/Functional/Element/WebformElementPrepopulateTest.php b/web/modules/webform/tests/src/Functional/Element/WebformElementPrepopulateTest.php
index 9da0ec5510..9818e2c63c 100644
--- a/web/modules/webform/tests/src/Functional/Element/WebformElementPrepopulateTest.php
+++ b/web/modules/webform/tests/src/Functional/Element/WebformElementPrepopulateTest.php
@@ -62,7 +62,7 @@ public function testElementPrepopulate() {
     $this->drupalPostForm('/webform/test_element_prepopulate', [], 'Next >', $options);
     $this->assertFieldByName('textfield_prepopulate_02', 'value_02');
 
-    // Check prepopulating textfield on multiple pages and changing the value
+    // Check prepopulating textfield on multiple pages and changing the value.
     $options = [
       'query' => [
         'textfield_prepopulate_01' => 'value_01',
diff --git a/web/modules/webform/tests/src/Functional/Element/WebformElementRadiosTest.php b/web/modules/webform/tests/src/Functional/Element/WebformElementRadiosTest.php
index 2b84293beb..2fa5078f07 100644
--- a/web/modules/webform/tests/src/Functional/Element/WebformElementRadiosTest.php
+++ b/web/modules/webform/tests/src/Functional/Element/WebformElementRadiosTest.php
@@ -31,24 +31,24 @@ public function testElementRadios() {
 
     // Check radios with help text display.
     $this->assertRaw('<input data-drupal-selector="edit-radios-help-one" type="radio" id="edit-radios-help-one" name="radios_help" value="one" class="form-radio" />');
-    $this->assertRaw('<label for="edit-radios-help-one" class="option">One<span class="webform-element-help" role="tooltip" tabindex="0" data-webform-help="&lt;div class=&quot;webform-element-help--title&quot;&gt;One&lt;/div&gt;&lt;div class=&quot;webform-element-help--content&quot;&gt;This is a description&lt;/div&gt;"><span aria-hidden="true">?</span></span>');
+    $this->assertRaw('<label for="edit-radios-help-one" class="option">One<span class="webform-element-help js-webform-element-help" role="tooltip" tabindex="0" data-webform-help="&lt;div class=&quot;webform-element-help--title&quot;&gt;One&lt;/div&gt;&lt;div class=&quot;webform-element-help--content&quot;&gt;This is a description&lt;/div&gt;"><span aria-hidden="true">?</span></span>');
 
     // Check radios displayed as buttons.
-    $this->assertRaw('<div id="edit-radios-buttons" class="js-webform-radios webform-options-display-buttons form-radios"><div class="webform-options-display-buttons-wrapper">');
+    $this->assertRaw('<div id="edit-radios-buttons" class="js-webform-radios webform-options-display-buttons"><div class="webform-options-display-buttons-wrapper">');
     $this->assertRaw('<input data-drupal-selector="edit-radios-buttons-yes" class="visually-hidden form-radio" type="radio" id="edit-radios-buttons-yes" name="radios_buttons" value="Yes" />');
     $this->assertRaw('<label class="webform-options-display-buttons-label option" for="edit-radios-buttons-yes">Yes</label>');
 
     // Check radios displayed as buttons_horizontal.
-    $this->assertRaw('<div id="edit-radios-buttons-horizontal" class="js-webform-radios webform-options-display-buttons webform-options-display-buttons-horizontal form-radios"><div class="webform-options-display-buttons-wrapper">');
+    $this->assertRaw('<div id="edit-radios-buttons-horizontal" class="js-webform-radios webform-options-display-buttons webform-options-display-buttons-horizontal"><div class="webform-options-display-buttons-wrapper">');
 
     // Check radios displayed as buttons_vertical.
-    $this->assertRaw('<div id="edit-radios-buttons-vertical" class="js-webform-radios webform-options-display-buttons webform-options-display-buttons-vertical form-radios"><div class="webform-options-display-buttons-wrapper">');
+    $this->assertRaw('<div id="edit-radios-buttons-vertical" class="js-webform-radios webform-options-display-buttons webform-options-display-buttons-vertical"><div class="webform-options-display-buttons-wrapper">');
 
     // Check radios displayed as buttons with description.
     $this->assertRaw('<label class="webform-options-display-buttons-label option" for="edit-radios-buttons-description-one"><div class="webform-options-display-buttons-title">One</div><div class="webform-options-display-buttons-description description">This is a description</div></label>');
 
     // Check options (custom) properties wrapper attributes.
-    $this->assertRaw('<div data-custom="custom wrapper data" style="border: red 1px solid" class="one-custom-wrapper-class js-form-item form-item js-form-type-radio form-type-radio js-form-item-radios-options-properties form-item-radios-options-properties">');
+    $this->assertRaw('<div data-custom="custom wrapper data" style="border: red 1px solid" class="one-custom-wrapper-class js-form-item form-item js-form-type-radio form-item-radios-options-properties js-form-item-radios-options-properties">');
 
     // Check options (custom) properties label attributes.
     $this->assertRaw('<label data-custom="custom label data" style="border: blue 1px solid" class="one-custom-label-class option" for="edit-radios-options-properties-two">Two</label>');
diff --git a/web/modules/webform/tests/src/Functional/Element/WebformElementRangeTest.php b/web/modules/webform/tests/src/Functional/Element/WebformElementRangeTest.php
index aee23ba398..cff6048117 100644
--- a/web/modules/webform/tests/src/Functional/Element/WebformElementRangeTest.php
+++ b/web/modules/webform/tests/src/Functional/Element/WebformElementRangeTest.php
@@ -38,12 +38,12 @@ public function testRating() {
     $this->assertRaw('<output style="background-color: yellow" for="range_output_below" data-display="below" data-field-prefix="$" data-field-suffix=".00"></output>');
 
     // Check output left range element.
-    $this->assertRaw('<span class="field-prefix"><div class="js-form-item form-item js-form-type-number form-type-number js-form-item-range-output-left__output form-item-range-output-left__output form-no-label">');
+    $this->assertRaw('<span class="field-prefix"><div class="js-form-item form-item js-form-type-number form-item-range-output-left__output js-form-item-range-output-left__output form-no-label">');
     $this->assertRaw('<label for="range_output_left__output" class="visually-hidden">range_output_left</label>');
     $this->assertRaw('<input style="background-color: yellow;width:6em" type="number" id="range_output_left__output" step="100" min="0" max="10000" class="form-number" />');
 
     // Check output right range element.
-    $this->assertRaw('<span class="field-suffix"><span class="webform-range-output-delimiter"></span><div class="js-form-item form-item js-form-type-number form-type-number js-form-item-range-output-disabled__output form-item-range-output-disabled__output form-no-label form-disabled">');
+    $this->assertRaw('<span class="field-suffix"><span class="webform-range-output-delimiter"></span><div class="js-form-item form-item js-form-type-number form-item-range-output-disabled__output js-form-item-range-output-disabled__output form-no-label form-disabled">');
     $this->assertRaw('<label for="range_output_right__output" class="visually-hidden">range_output_right</label>');
     $this->assertRaw('<input style="width:4em" type="number" id="range_output_right__output" step="1" min="0" max="100" class="form-number" />');
 
diff --git a/web/modules/webform/tests/src/Functional/Element/WebformElementReadonlyTest.php b/web/modules/webform/tests/src/Functional/Element/WebformElementReadonlyTest.php
index 8550eb2413..76900aa9ae 100644
--- a/web/modules/webform/tests/src/Functional/Element/WebformElementReadonlyTest.php
+++ b/web/modules/webform/tests/src/Functional/Element/WebformElementReadonlyTest.php
@@ -22,10 +22,10 @@ class WebformElementReadonlyTest extends WebformElementBrowserTestBase {
   public function testReadonly() {
     $this->drupalGet('/webform/test_element_readonly');
 
-    $this->assertRaw('<div class="webform-readonly js-form-item form-item js-form-type-textfield form-type-textfield js-form-item-textfield form-item-textfield">');
+    $this->assertCssSelect('.js-form-item-textfield.form-item-textfield');
     $this->assertRaw('<input readonly="readonly" data-drupal-selector="edit-textfield" type="text" id="edit-textfield" name="textfield" value="" size="60" maxlength="255" class="form-text" />');
-    $this->assertRaw('<div class="webform-readonly js-form-item form-item js-form-type-textarea form-type-textarea js-form-item-textarea form-item-textarea">');
-    $this->assertRaw('<textarea readonly="readonly" data-drupal-selector="edit-textarea" id="edit-textarea" name="textarea" rows="5" cols="60" class="form-textarea resize-vertical"></textarea>');
+    $this->assertCssSelect('.js-form-item-textarea.form-item-textarea');
+    $this->assertRaw('<textarea readonly="readonly" data-drupal-selector="edit-textarea" id="edit-textarea" name="textarea" rows="5" cols="60" class="form-textarea"></textarea>');
   }
 
 }
diff --git a/web/modules/webform/tests/src/Functional/Element/WebformElementSectionTest.php b/web/modules/webform/tests/src/Functional/Element/WebformElementSectionTest.php
index e5a70a6bba..e4360ccaa7 100644
--- a/web/modules/webform/tests/src/Functional/Element/WebformElementSectionTest.php
+++ b/web/modules/webform/tests/src/Functional/Element/WebformElementSectionTest.php
@@ -24,7 +24,7 @@ public function testSection() {
 
     // Check section element.
     $this->assertRaw('<section data-drupal-selector="edit-webform-section" aria-describedby="edit-webform-section--description" id="edit-webform-section" class="required webform-element-help-container--title webform-element-help-container--title-after js-form-item form-item js-form-wrapper form-wrapper webform-section" required="required" aria-required="true">');
-    $this->assertRaw('<h2 class="webform-section-title js-form-required form-required">webform_section<span class="webform-element-help" role="tooltip" tabindex="0" data-webform-help="&lt;div class=&quot;webform-element-help--title&quot;&gt;webform_section&lt;/div&gt;&lt;div class=&quot;webform-element-help--content&quot;&gt;This is help text.&lt;/div&gt;"><span aria-hidden="true">?</span></span>');
+    $this->assertRaw('<h2 class="webform-section-title js-form-required form-required">webform_section<span class="webform-element-help js-webform-element-help" role="tooltip" tabindex="0" data-webform-help="&lt;div class=&quot;webform-element-help--title&quot;&gt;webform_section&lt;/div&gt;&lt;div class=&quot;webform-element-help--content&quot;&gt;This is help text.&lt;/div&gt;"><span aria-hidden="true">?</span></span>');
     $this->assertRaw('<div class="description"><div id="edit-webform-section--description" class="webform-element-description">This is a description.</div>');
     $this->assertRaw('<div id="edit-webform-section--more" class="js-webform-element-more webform-element-more">');
 
diff --git a/web/modules/webform/tests/src/Functional/Element/WebformElementStatesTest.php b/web/modules/webform/tests/src/Functional/Element/WebformElementStatesTest.php
index 12c2dd3c90..63c535bfd0 100644
--- a/web/modules/webform/tests/src/Functional/Element/WebformElementStatesTest.php
+++ b/web/modules/webform/tests/src/Functional/Element/WebformElementStatesTest.php
@@ -94,11 +94,11 @@ public function testElement() {
 
     // Check 'States unsupport operator'.
     $this->assertRaw('Conditional logic (Form API #states) is using the <em class="placeholder">XXX</em> operator. Form API #states must be manually entered.');
-    $this->assertRaw('<textarea data-drupal-selector="edit-states-unsupported-operator-states" aria-describedby="edit-states-unsupported-operator-states--description" class="js-webform-codemirror webform-codemirror yaml form-textarea resize-vertical" data-webform-codemirror-mode="text/x-yaml" id="edit-states-unsupported-operator-states" name="states_unsupported_operator[states]" rows="5" cols="60">');
+    $this->assertRaw('<textarea data-drupal-selector="edit-states-unsupported-operator-states" aria-describedby="edit-states-unsupported-operator-states--description" class="js-webform-codemirror webform-codemirror yaml form-textarea" data-webform-codemirror-mode="text/x-yaml" id="edit-states-unsupported-operator-states" name="states_unsupported_operator[states]" rows="5" cols="60">');
 
     // Check 'States unsupport nested multiple selectors'.
     $this->assertRaw('Conditional logic (Form API #states) is using multiple nested conditions. Form API #states must be manually entered.');
-    $this->assertRaw('<textarea data-drupal-selector="edit-states-unsupported-nesting-states" aria-describedby="edit-states-unsupported-nesting-states--description" class="js-webform-codemirror webform-codemirror yaml form-textarea resize-vertical" data-webform-codemirror-mode="text/x-yaml" id="edit-states-unsupported-nesting-states" name="states_unsupported_nesting[states]" rows="5" cols="60">');
+    $this->assertRaw('<textarea data-drupal-selector="edit-states-unsupported-nesting-states" aria-describedby="edit-states-unsupported-nesting-states--description" class="js-webform-codemirror webform-codemirror yaml form-textarea" data-webform-codemirror-mode="text/x-yaml" id="edit-states-unsupported-nesting-states" name="states_unsupported_nesting[states]" rows="5" cols="60">');
 
     // Check 'States single' (#multiple: FALSE)
     $this->assertFieldById('edit-states-empty-actions-add', NULL);
diff --git a/web/modules/webform/tests/src/Functional/Element/WebformElementTableTest.php b/web/modules/webform/tests/src/Functional/Element/WebformElementTableTest.php
index fb0d6a2505..5b72f2c9f3 100644
--- a/web/modules/webform/tests/src/Functional/Element/WebformElementTableTest.php
+++ b/web/modules/webform/tests/src/Functional/Element/WebformElementTableTest.php
@@ -43,13 +43,13 @@ public function testTable() {
     // Check default table rendering.
     $this->assertRaw('<table class="js-form-wrapper responsive-enabled" data-drupal-selector="edit-table" id="edit-table" data-striping="1">');
     $this->assertPattern('#<th>First Name</th>\s+<th>Last Name</th>\s+<th>Gender</th>#');
-    $this->assertRaw('<tr data-drupal-selector="edit-table-1" class="odd">');
-    $this->assertRaw('<td><div class="js-form-item form-item js-form-type-textfield form-type-textfield js-form-item-table__1__first-name form-item-table__1__first-name form-no-label">');
+    $this->assertRaw('<tr data-drupal-selector="edit-table-1">');
+    $this->assertRaw('<td><div class="js-form-item form-item js-form-type-textfield form-item-table__1__first-name js-form-item-table__1__first-name form-no-label">');
     $this->assertRaw('<input data-drupal-selector="edit-table-1-first-name" type="text" id="edit-table-1-first-name" name="table__1__first_name" value="John" size="20" maxlength="255" class="form-text" />');
 
     // Check webform table basic rendering.
     $this->assertRaw('<table data-drupal-selector="edit-table-basic" class="webform-table responsive-enabled" id="edit-table-basic" data-striping="1">');
-    $this->assertRaw('<tr data-drupal-selector="edit-table-basic-01" class="webform-table-row odd">');
+    $this->assertRaw('<tr data-drupal-selector="edit-table-basic-01" class="webform-table-row">');
     $this->assertRaw('<input data-drupal-selector="edit-table-basic-01-first-name" type="text" id="edit-table-basic-01-first-name" name="table_basic_01_first_name" value="" size="60" maxlength="255" class="form-text" />');
 
     // Check webform table advanced rendering.
@@ -58,7 +58,7 @@ public function testTable() {
 
     // Check webform table states rendering.
     $this->assertRaw('<table data-drupal-selector="edit-table-states" class="webform-table responsive-enabled" id="edit-table-states" data-drupal-states="{&quot;invisible&quot;:{&quot;.webform-submission-test-element-table-add-form :input[name=\u0022table_rows\u0022]&quot;:{&quot;value&quot;:&quot;&quot;}}}" data-striping="1">');
-    $this->assertRaw('<tr data-drupal-selector="edit-table-states-01" class="webform-table-row js-form-item odd" data-drupal-states="{&quot;visible&quot;:{&quot;.webform-submission-test-element-table-add-form :input[name=\u0022table_rows\u0022]&quot;:{&quot;value&quot;:{&quot;greater&quot;:&quot;0&quot;}}}}">');
+    $this->assertRaw('<tr data-drupal-selector="edit-table-states-01" class="webform-table-row js-form-item" data-drupal-states="{&quot;visible&quot;:{&quot;.webform-submission-test-element-table-add-form :input[name=\u0022table_rows\u0022]&quot;:{&quot;value&quot;:{&quot;greater&quot;:&quot;0&quot;}}}}">');
 
     /**************************************************************************/
     // Display.
@@ -102,14 +102,14 @@ public function testTable() {
 
     // Check basic table display.
     $this->assertPattern('#<label>table_basic</label>\s+<table class="responsive-enabled" data-striping="1">#');
-    $this->assertPattern('#<tr class="odd">\s+<td>Ringo</td>\s+<td>Starr</td>\s+<td>Male</td>\s+<td>{markup_1}</td>\s+</tr>#');
+    $this->assertPattern('#<tr>\s+<td>Ringo</td>\s+<td>Starr</td>\s+<td>Male</td>\s+<td>{markup_1}</td>\s+</tr>#');
 
     // Check advanced table display.
     $this->assertPattern('#<label>table_advanced</label>\s+<div><details class="webform-container webform-container-type-details#');
-    $this->assertPattern('<section class="js-form-item form-item js-form-wrapper form-wrapper webform-section" id="test_element_table--table_advanced_01_container">');
+    $this->assertRaw('<section class="js-form-item form-item js-form-wrapper form-wrapper webform-section" id="test_element_table--table_advanced_01_container">');
 
     // Check states table display.
-    $this->assertPattern('<div class="webform-element webform-element-type-webform-table js-form-item form-item js-form-type-item form-type-item js-form-item-table-states form-item-table-states" id="test_element_table--table_states">');
+    $this->assertPattern('<div class="webform-element webform-element-type-webform-table js-form-item form-item js-form-type-item form-item-table-states js-form-item-table-states" id="test_element_table--table_states">');
 
     /**************************************************************************/
     // User interface.
diff --git a/web/modules/webform/tests/src/Functional/Element/WebformElementTermReferenceTest.php b/web/modules/webform/tests/src/Functional/Element/WebformElementTermReferenceTest.php
index bec6131125..5c49b6a995 100644
--- a/web/modules/webform/tests/src/Functional/Element/WebformElementTermReferenceTest.php
+++ b/web/modules/webform/tests/src/Functional/Element/WebformElementTermReferenceTest.php
@@ -70,7 +70,7 @@ public function testTermReference() {
     ];
     $this->postSubmission($webform, $edit, 'Preview');
     $this->assertRaw('<label>webform_term_checkboxes_breadcrumb_advanced</label>');
-    $this->assertRaw('<div class="item-list"><ul><li>Parent 1 › Parent 1: Child 1</li><li>Parent 1 › Parent 1: Child 2</li></ul></div>');
+    $this->assertRaw('<ul><li>Parent 1 › Parent 1: Child 1</li><li>Parent 1 › Parent 1: Child 2</li></ul>');
 
      // Unpublish term:2.
      Term::load(2)->setUnpublished()->save();
@@ -128,7 +128,7 @@ public function testTermReference() {
     ];
     $this->postSubmission($webform, $edit, 'Preview');
     $this->assertRaw('<label>webform_term_select_breadcrumb_advanced</label>');
-    $this->assertRaw('<div class="item-list"><ul><li>Parent 1 › Parent 1: Child 1</li><li>Parent 1 › Parent 1: Child 2</li></ul></div>');
+    $this->assertRaw('<ul><li>Parent 1 › Parent 1: Child 1</li><li>Parent 1 › Parent 1: Child 2</li></ul>');
 
     // Unpublish term:2.
     Term::load(2)->setUnpublished()->save();
diff --git a/web/modules/webform/tests/src/Functional/Element/WebformElementTermsOfServiceTest.php b/web/modules/webform/tests/src/Functional/Element/WebformElementTermsOfServiceTest.php
index 79eda2adb4..c814cf11ed 100644
--- a/web/modules/webform/tests/src/Functional/Element/WebformElementTermsOfServiceTest.php
+++ b/web/modules/webform/tests/src/Functional/Element/WebformElementTermsOfServiceTest.php
@@ -31,7 +31,7 @@ public function testTermsOfService() {
     $this->drupalGet('/webform/test_element_terms_of_service');
 
     // Check modal.
-    $this->assertRaw('<div data-webform-terms-of-service-type="modal" class="form-type-webform-terms-of-service js-form-type-webform-terms-of-service js-form-item form-item js-form-type-checkbox form-type-checkbox js-form-item-terms-of-service-default form-item-terms-of-service-default">');
+    $this->assertCssSelect('[data-webform-terms-of-service-type="modal"].form-item-terms-of-service-default');
     $this->assertRaw('<input data-drupal-selector="edit-terms-of-service-default" type="checkbox" id="edit-terms-of-service-default" name="terms_of_service_default" value class="form-checkbox required" required="required" aria-required="true" />');
     $this->assertRaw('<label for="edit-terms-of-service-default" class="option js-form-required form-required">I agree to the <a role="button" href="#terms">terms of service</a>. (default)</label>');
     $this->assertRaw('<div id="edit-terms-of-service-default--description" class="webform-element-description">');
diff --git a/web/modules/webform/tests/src/Functional/Element/WebformElementTextFormatTest.php b/web/modules/webform/tests/src/Functional/Element/WebformElementTextFormatTest.php
index 77d6a03b42..b2011d4fe1 100644
--- a/web/modules/webform/tests/src/Functional/Element/WebformElementTextFormatTest.php
+++ b/web/modules/webform/tests/src/Functional/Element/WebformElementTextFormatTest.php
@@ -58,7 +58,7 @@ public function testTextFormat() {
     $this->assertRaw('<div class="filter-help js-form-wrapper form-wrapper" data-drupal-selector="edit-text-format-format-help" style="display: none" id="edit-text-format-format-help">');
 
     // Check description + more.
-    $this->assertRaw('<div data-drupal-selector="edit-text-format-description-more" id="edit-text-format-description-more--description" class="description"><div class="webform-element-description">This is a description</div>');
+    $this->assertRaw('<div data-drupal-selector="edit-text-format-description-more" id="edit-text-format-description-more--description"><div class="webform-element-description">This is a description</div>');
     $this->assertRaw('<div id="edit-text-format-description-more--more" class="js-webform-element-more webform-element-more">');
     $this->assertRaw('<div class="webform-element-more--link"><a role="button" href="#edit-text-format-description-more--more--content">More</a></div>');
     $this->assertRaw('<div id="edit-text-format-description-more--more--content" class="webform-element-more--content">This is more</div>');
diff --git a/web/modules/webform/tests/src/Functional/Element/WebformElementValidatePatternTest.php b/web/modules/webform/tests/src/Functional/Element/WebformElementValidatePatternTest.php
index 5adb8f0791..d664b793b8 100644
--- a/web/modules/webform/tests/src/Functional/Element/WebformElementValidatePatternTest.php
+++ b/web/modules/webform/tests/src/Functional/Element/WebformElementValidatePatternTest.php
@@ -35,10 +35,10 @@ public function testPattern() {
       'pattern_unicode' => 'Unicode',
     ];
     $this->drupalPostForm('/webform/test_element_validate_pattern', $edit, 'Submit');
-    $this->assertRaw('<li class="messages__item"><em class="placeholder">pattern</em> field is not in the right format.</li>');
-    $this->assertRaw('<li class="messages__item">You did not enter &#039;Hello&#039;</li>');
-    $this->assertRaw('<li class="messages__item">You did not enter <strong>Hello</strong></li>');
-    $this->assertRaw('<li class="messages__item"><em class="placeholder">pattern_unicode</em> field is not in the right format.</li>');
+    $this->assertRaw('<li><em class="placeholder">pattern</em> field is not in the right format.</li>');
+    $this->assertRaw('<li>You did not enter &#039;Hello&#039;</li>');
+    $this->assertRaw('<li>You did not enter <strong>Hello</strong></li>');
+    $this->assertRaw('<li><em class="placeholder">pattern_unicode</em> field is not in the right format.</li>');
 
     // Check validation.
     $edit = [
@@ -48,10 +48,10 @@ public function testPattern() {
       'pattern_unicode' => '⺏',
     ];
     $this->drupalPostForm('/webform/test_element_validate_pattern', $edit, 'Submit');
-    $this->assertNoRaw('<li class="messages__item"><em class="placeholder">pattern</em> field is not in the right format.</li>');
-    $this->assertNoRaw('<li class="messages__item">You did not enter &#039;Hello&#039;</li>');
-    $this->assertNoRaw('<li class="messages__item">You did not enter <strong>Hello</strong></li>');
-    $this->assertNoRaw('<li class="messages__item"><em class="placeholder">pattern_unicode</em> field is not in the right format.</li>');
+    $this->assertNoRaw('<li><em class="placeholder">pattern</em> field is not in the right format.</li>');
+    $this->assertNoRaw('<li>You did not enter &#039;Hello&#039;</li>');
+    $this->assertNoRaw('<li>You did not enter <strong>Hello</strong></li>');
+    $this->assertNoRaw('<li><em class="placeholder">pattern_unicode</em> field is not in the right format.</li>');
   }
 
 }
diff --git a/web/modules/webform/tests/src/Functional/Element/WebformElementValidateRequiredTest.php b/web/modules/webform/tests/src/Functional/Element/WebformElementValidateRequiredTest.php
index 329ab41021..edf0358a66 100644
--- a/web/modules/webform/tests/src/Functional/Element/WebformElementValidateRequiredTest.php
+++ b/web/modules/webform/tests/src/Functional/Element/WebformElementValidateRequiredTest.php
@@ -26,7 +26,7 @@ public function testPattern() {
 
     // Check that HTML tags are rendered in validation message.
     $this->drupalPostForm('/webform/test_element_validate_required', [], 'Submit');
-    $this->assertRaw('<li class="messages__item">This is a <em>custom required message</em></li>');
+    $this->assertRaw('<li>This is a <em>custom required message</em></li>');
   }
 
 }
diff --git a/web/modules/webform/tests/src/Functional/Element/WebformElementViewTest.php b/web/modules/webform/tests/src/Functional/Element/WebformElementViewTest.php
index 510c3f042c..9bfaefc13e 100644
--- a/web/modules/webform/tests/src/Functional/Element/WebformElementViewTest.php
+++ b/web/modules/webform/tests/src/Functional/Element/WebformElementViewTest.php
@@ -29,8 +29,6 @@ class WebformElementViewTest extends WebformElementBrowserTestBase {
   public function testView() {
     // Check that embedded view is render.
     $this->drupalGet('/webform/test_element_view');
-    $this->assertCssSelect('.view-webform-submissions');
-    $this->assertRaw('<div class="view-empty">');
     $this->assertRaw('No submissions available.');
 
     // Check that embedded view can't be edited.
diff --git a/web/modules/webform/tests/src/Functional/Field/WebformFieldTest.php b/web/modules/webform/tests/src/Functional/Field/WebformFieldTest.php
new file mode 100644
index 0000000000..2e52dc5a93
--- /dev/null
+++ b/web/modules/webform/tests/src/Functional/Field/WebformFieldTest.php
@@ -0,0 +1,88 @@
+<?php
+
+namespace Drupal\Tests\webform\Functional\Field;
+
+use Drupal\field\Entity\FieldConfig;
+use Drupal\field\Entity\FieldStorageConfig;
+use Drupal\Tests\webform\Functional\WebformBrowserTestBase;
+use Drupal\webform\Entity\Webform;
+
+/**
+ * Tests the webform (entity reference) field.
+ *
+ * @group webform
+ */
+class WebformFieldTest extends WebformBrowserTestBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  public static $modules = ['node', 'field_ui'];
+
+  /**
+   * Tests the webform (entity reference) field.
+   */
+  public function testWebformField() {
+    /** @var \Drupal\Core\Entity\EntityDisplayRepositoryInterface $display_repository */
+    $display_repository = \Drupal::service('entity_display.repository');
+
+    $this->drupalCreateContentType(['type' => 'page']);
+
+    FieldStorageConfig::create([
+      'field_name' => 'field_webform',
+      'type' => 'webform',
+      'entity_type' => 'node',
+      'cardinality' => 1,
+    ])->save();
+    FieldConfig::create([
+      'field_name' => 'field_webform',
+      'entity_type' => 'node',
+      'bundle' => 'page',
+      'label' => 'webform',
+    ])->save();
+    $form_display = $display_repository->getFormDisplay('node', 'page');
+    $form_display->setComponent('field_webform', [
+      'type' => 'webform_entity_reference_select',
+      'settings' => [],
+    ]);
+    $form_display->save();
+
+    $this->drupalLogin($this->rootUser);
+
+    /**************************************************************************/
+
+    // Check that webform select menu is visible.
+    $this->drupalGet('/node/add/page');
+    $this->assertNoCssSelect('#edit-field-webform-0-target-id optgroup');
+    $this->assertOption('edit-field-webform-0-target-id', 'contact');
+
+    // Add category to 'contact' webform.
+    /** @var \Drupal\webform\WebformInterface $webform */
+    $webform = Webform::load('contact');
+    $webform->set('category', '{Some category}');
+    $webform->save();
+
+    // Check that webform select menu included optgroup.
+    $this->drupalGet('/node/add/page');
+    $this->assertCssSelect('#edit-field-webform-0-target-id optgroup[label="{Some category}"]');
+
+    // Create a second webform.
+    $webform_2 = $this->createWebform();
+
+    // Check that webform 2 is included in the select menu.
+    $this->drupalGet('/node/add/page');
+    $this->assertOption('edit-field-webform-0-target-id', 'contact');
+    $this->assertOption('edit-field-webform-0-target-id', $webform_2->id());
+
+    // Limit the webform select menu to only the contact form.
+    $this->drupalGet('/admin/structure/types/manage/page/form-display');
+    $this->drupalPostForm('/admin/structure/types/manage/page/form-display', [], 'field_webform_settings_edit');
+    $this->drupalPostForm(NULL, ['fields[field_webform][settings_edit_form][settings][webforms][]' => ['contact']], 'Save');
+
+    // Check that webform 2 is NOT included in the select menu.
+    $this->drupalGet('/node/add/page');
+    $this->assertOption('edit-field-webform-0-target-id', 'contact');
+    $this->assertNoOption('edit-field-webform-0-target-id', $webform_2->id());
+  }
+
+}
diff --git a/web/modules/webform/tests/src/Functional/Handler/WebformHandlerRemotePostTest.php b/web/modules/webform/tests/src/Functional/Handler/WebformHandlerRemotePostTest.php
index 8da58c2d6b..acb5eb527b 100644
--- a/web/modules/webform/tests/src/Functional/Handler/WebformHandlerRemotePostTest.php
+++ b/web/modules/webform/tests/src/Functional/Handler/WebformHandlerRemotePostTest.php
@@ -148,15 +148,12 @@ public function testRemotePostHandler() {
     $this->postSubmission($webform, ['response_type' => '200']);
     $this->assertRaw('This is a custom 200 success message.');
     $this->assertRaw('Processed completed request.');
-    $this->assertRaw('messages--status');
-    $this->assertNoRaw('messages--error');
 
     // Check 500 Internal Server Error.
     $this->postSubmission($webform, ['response_type' => '500']);
+    $this->assertNoRaw('Processed completed request.');
     $this->assertRaw('Failed to process completed request.');
     $this->assertRaw('Unable to process this submission. Please contact the site administrator.');
-    $this->assertRaw('messages--error');
-    $this->assertNoRaw('messages--status');
 
     // Check default custom response message.
     $handler = $webform->getHandler('remote_post');
@@ -174,16 +171,12 @@ public function testRemotePostHandler() {
 
     $this->assertNoRaw('Processed created request.');
     $this->assertNoRaw('This is a custom 404 not found message.');
-    $this->assertNoRaw('messages--status');
-    $this->assertNoRaw('messages--error');
 
     // Check 404 Not Found with custom message.
     $this->postSubmission($webform, ['response_type' => '404']);
     $this->assertRaw('File not found');
     $this->assertNoRaw('Unable to process this submission. Please contact the site administrator.');
     $this->assertRaw('This is a custom 404 not found message.');
-    $this->assertRaw('messages--error');
-    $this->assertNoRaw('messages--status');
 
     // Check 401 Unauthorized with custom message and token.
     $this->postSubmission($webform, ['response_type' => '401']);
diff --git a/web/modules/webform/tests/src/Functional/Handler/WebformHandlerSettingsTest.php b/web/modules/webform/tests/src/Functional/Handler/WebformHandlerSettingsTest.php
index 49169a7d9e..9f59f68e99 100644
--- a/web/modules/webform/tests/src/Functional/Handler/WebformHandlerSettingsTest.php
+++ b/web/modules/webform/tests/src/Functional/Handler/WebformHandlerSettingsTest.php
@@ -42,12 +42,12 @@ public function testSettingsHandler() {
 
     // Check custom preview title and message.
     $this->drupalPostForm('/webform/test_handler_settings', [], 'Preview');
-    $this->assertRaw('<li class="messages__item">{Custom preview message}</li>');
-    $this->assertRaw('<h1 class="page-title">{Custom preview title}</h1>');
+    $this->assertRaw('<li>{Custom preview message}</li>');
+    $this->assertRaw('<h1>{Custom preview title}</h1>');
 
     // Check custom confirmation title and message.
     $this->drupalPostForm('/webform/test_handler_settings', [], 'Submit');
-    $this->assertRaw('<h1 class="page-title">{Custom confirmation title}</h1>');
+    $this->assertRaw('<h1>{Custom confirmation title}</h1>');
     $this->assertRaw('<div class="webform-confirmation__message">{Custom confirmation message}</div>');
 
     // Check no custom save draft message.
@@ -65,7 +65,7 @@ public function testSettingsHandler() {
 
     // Check no custom preview title and message.
     $this->drupalPostForm('/webform/test_handler_settings', [], 'Preview');
-    $this->assertNoRaw('<h1 class="page-title">{Custom confirmation title}</h1>');
+    $this->assertNoRaw('<h1>{Custom confirmation title}</h1>');
     $this->assertNoRaw('<div class="webform-confirmation__message">{Custom confirmation message}</div>');
 
     // Check no custom confirmation title and message.
diff --git a/web/modules/webform/tests/src/Functional/Handler/WebformHandlerTest.php b/web/modules/webform/tests/src/Functional/Handler/WebformHandlerTest.php
index 0a87cd0c6a..5e1cce895c 100644
--- a/web/modules/webform/tests/src/Functional/Handler/WebformHandlerTest.php
+++ b/web/modules/webform/tests/src/Functional/Handler/WebformHandlerTest.php
@@ -257,6 +257,23 @@ public function testWebformHandler() {
     $this->drupalGet('/webform/test_handler_test/test', ['query' => ['_webform_handler' => 'missing']]);
     $this->assertResponse(403);
     $this->assertRaw('The <em class="placeholder">missing</em> email/handler for the <em class="placeholder">Test: Handler: Test invoke methods</em> webform does not exist.');
+
+    /**************************************************************************/
+    // Off-canvas width.
+    /**************************************************************************/
+
+    // Check add off-canvas element width is 800.
+    $this->drupalGet('/admin/structure/webform/manage/test_handler_test/handlers/add');
+    $this->assertCssSelect('[href$="/admin/structure/webform/manage/test_handler_test/handlers/add/test_offcanvas_width"][data-dialog-options*="800"]');
+    $this->assertNoCssSelect('[href$="/admin/structure/webform/manage/test_handler_test/handlers/add/test_offcanvas_width"][data-dialog-options*="550"]');
+
+    // Add handler.
+    $this->drupalPostForm('/admin/structure/webform/manage/test_handler_test/handlers/add/test_offcanvas_width', ['handler_id' => 'test_offcanvas_width'], 'Save');
+
+    // Check edit off-canvas element width is 800.
+    $this->drupalGet('/admin/structure/webform/manage/test_handler_test/handlers');
+    $this->assertCssSelect('[href$="/admin/structure/webform/manage/test_handler_test/handlers/test_offcanvas_width/edit"][data-dialog-options*="800"]');
+    $this->assertNoCssSelect('[href$="/admin/structure/webform/manage/test_handler_test/handlers/test_offcanvas_width/edit"][data-dialog-options*="550"]');
   }
 
   /**
diff --git a/web/modules/webform/tests/src/Functional/Settings/WebformSettingsAccessDeniedTest.php b/web/modules/webform/tests/src/Functional/Settings/WebformSettingsAccessDeniedTest.php
index e79d7ffeba..4aab78d842 100644
--- a/web/modules/webform/tests/src/Functional/Settings/WebformSettingsAccessDeniedTest.php
+++ b/web/modules/webform/tests/src/Functional/Settings/WebformSettingsAccessDeniedTest.php
@@ -90,7 +90,7 @@ public function testWebformAccessDenied() {
 
     // Check custom access denied page.
     $this->drupalGet('/admin/structure/webform/manage/test_form_access_denied');
-    $this->assertRaw('<h1 class="page-title">Webform: Access denied</h1>');
+    $this->assertRaw('<h1>Webform: Access denied</h1>');
     $this->assertRaw('<div style="border: 1px solid red" class="webform-access-denied">Please login to access <b>Test: Webform: Access Denied</b>.</div>');
 
     /**************************************************************************/
@@ -171,7 +171,7 @@ public function testWebformSubmissionAccessDenied() {
     // Check custom access denied page.
     $this->drupalGet("admin/structure/webform/manage/test_form_access_denied/submission/$sid");
     $this->assertNoRaw('You are not authorized to access this page.');
-    $this->assertRaw('<h1 class="page-title">Webform submission: Access denied</h1>');
+    $this->assertRaw('<h1>Webform submission: Access denied</h1>');
     $this->assertRaw('<div style="border: 1px solid red" class="webform-submission-access-denied">Please login to access <b>Test: Webform: Access Denied: Submission #' . $sid . '</b>.</div>');
   }
 
diff --git a/web/modules/webform/tests/src/Functional/Settings/WebformSettingsAdminTest.php b/web/modules/webform/tests/src/Functional/Settings/WebformSettingsAdminTest.php
index 17f5a26af0..15fac79352 100644
--- a/web/modules/webform/tests/src/Functional/Settings/WebformSettingsAdminTest.php
+++ b/web/modules/webform/tests/src/Functional/Settings/WebformSettingsAdminTest.php
@@ -17,7 +17,7 @@ class WebformSettingsAdminTest extends WebformBrowserTestBase {
    *
    * @var array
    */
-  public static $modules = ['block', 'captcha', 'node', 'views', 'webform', 'webform_ui', 'webform_node'];
+  public static $modules = ['block', 'captcha', 'node', 'toolbar', 'views', 'webform', 'webform_ui', 'webform_node'];
 
   /**
    * Webforms to load.
@@ -106,11 +106,28 @@ public function testAdminSettings() {
 
     // Check moving #description to #help for webform admin routes.
     $this->drupalPostForm('/admin/structure/webform/config/advanced', ['ui[description_help]' => TRUE], 'Save configuration');
-    $this->assertRaw('<span class="webform-element-help" role="tooltip" tabindex="0" data-webform-help="&lt;div class=&quot;webform-element-help--title&quot;&gt;Display element description as help text (tooltip)&lt;/div&gt;&lt;div class=&quot;webform-element-help--content&quot;&gt;If checked, all element descriptions will be moved to help text (tooltip).&lt;/div&gt;"><span aria-hidden="true">?</span></span>');
+    $this->assertRaw('<span class="webform-element-help js-webform-element-help" role="tooltip" tabindex="0" data-webform-help="&lt;div class=&quot;webform-element-help--title&quot;&gt;Display element description as help text (tooltip)&lt;/div&gt;&lt;div class=&quot;webform-element-help--content&quot;&gt;If checked, all element descriptions will be moved to help text (tooltip).&lt;/div&gt;"><span aria-hidden="true">?</span></span>');
 
     // Check moving #description to #help for webform admin routes.
     $this->drupalPostForm('/admin/structure/webform/config/advanced', ['ui[description_help]' => FALSE], 'Save configuration');
-    $this->assertNoRaw('<span class="webform-element-help" role="tooltip" tabindex="0" data-webform-help="&lt;div class=&quot;webform-element-help--title&quot;&gt;Display element description as help text (tooltip)&lt;/div&gt;&lt;div class=&quot;webform-element-help--content&quot;&gt;If checked, all element descriptions will be moved to help text (tooltip).&lt;/div&gt;"><span aria-hidden="true">?</span></span>');
+    $this->assertNoRaw('<span class="webform-element-help js-webform-element-help" role="tooltip" tabindex="0" data-webform-help="&lt;div class=&quot;webform-element-help--title&quot;&gt;Display element description as help text (tooltip)&lt;/div&gt;&lt;div class=&quot;webform-element-help--content&quot;&gt;If checked, all element descriptions will be moved to help text (tooltip).&lt;/div&gt;"><span aria-hidden="true">?</span></span>');
+
+    /* Toolbar */
+
+    // Check that Webforms are NOT displayed as a top-level item in the toolbar.
+    $this->drupalGet('/admin/structure/webform/config/advanced');
+    $this->assertResponse(200);
+    $this->assertNoCssSelect('.menu-item a.toolbar-icon-entity-webform-collection');
+
+    // Check that Webforms are displayed as a top-level item in the toolbar.
+    $this->drupalPostForm('/admin/structure/webform/config/advanced', ['ui[toolbar_item]' => TRUE], 'Save configuration');
+    $this->assertCssSelect('.menu-item a.toolbar-icon-entity-webform-collection');
+
+    // Check that /structure/ is removed from webform paths.
+    $this->drupalGet('/admin/structure/webform/config/advanced');
+    $this->assertResponse(404);
+    $this->drupalGet('/admin/webform/config/advanced');
+    $this->assertResponse(200);
   }
 
   /**
diff --git a/web/modules/webform/tests/src/Functional/Settings/WebformSettingsBehaviorsTest.php b/web/modules/webform/tests/src/Functional/Settings/WebformSettingsBehaviorsTest.php
index 7e4f1dc96c..3110d43b31 100644
--- a/web/modules/webform/tests/src/Functional/Settings/WebformSettingsBehaviorsTest.php
+++ b/web/modules/webform/tests/src/Functional/Settings/WebformSettingsBehaviorsTest.php
@@ -357,8 +357,8 @@ public function testSettings() {
     $this->assertNoPattern('#<h2 class="visually-hidden">Error message</h2>\s+textfield field is required.#m');
 
     // Check that error message is displayed inline.
-    $this->assertRaw('1 error has been found: <div class="item-list--comma-list item-list"><ul class="item-list__comma-list"><li><a href="#edit-textfield">textfield</a></li></ul>');
-    $this->assertRaw('<strong>textfield field is required.</strong>');
+    $this->assertRaw('1 error has been found: <ul class="item-list__comma-list"><li><a href="#edit-textfield">textfield</a></li></ul>');
+    $this->assertRaw('textfield field is required.');
 
     // Check disable inline errors checkbox is enabled.
     $this->drupalGet('/admin/structure/webform/manage/test_form_disable_inline_errors/settings/form');
@@ -376,8 +376,8 @@ public function testSettings() {
     $this->assertRaw('Inline form errors is disabled for all forms.');
 
     // Check that error message is not displayed inline.
-    $this->assertNoRaw('1 error has been found: <div class="item-list--comma-list item-list"><ul class="item-list__comma-list"><li><a href="#edit-textfield">textfield</a></li></ul>');
-    $this->assertNoRaw('<strong>textfield field is required.</strong>');
+    $this->assertNoRaw('1 error has been found: <ul class="item-list__comma-list"><li><a href="#edit-textfield">textfield</a></li></ul>');
+    $this->assertNoRaw('textfield field is required.');
   }
 
 }
diff --git a/web/modules/webform/tests/src/Functional/Settings/WebformSettingsConfirmationTest.php b/web/modules/webform/tests/src/Functional/Settings/WebformSettingsConfirmationTest.php
index c1fd7bd4b7..909c914b81 100644
--- a/web/modules/webform/tests/src/Functional/Settings/WebformSettingsConfirmationTest.php
+++ b/web/modules/webform/tests/src/Functional/Settings/WebformSettingsConfirmationTest.php
@@ -86,7 +86,7 @@ public function testConfirmation() {
     $sid = $this->postSubmission($webform_confirmation_modal, ['test' => 'value']);
     $this->assertRaw('This is a <b>custom</b> confirmation modal.');
     $this->assertRaw('<div class="js-hide webform-confirmation-modal js-webform-confirmation-modal webform-message js-webform-message js-form-wrapper form-wrapper" data-drupal-selector="edit-webform-confirmation-modal" id="edit-webform-confirmation-modal">');
-    $this->assertRaw('<div role="contentinfo" aria-label="Status message" class="messages messages--status">');
+    $this->assertRaw('<div role="contentinfo" aria-label="Status message">');
     $this->assertRaw('<b class="webform-confirmation-modal--title">Custom confirmation modal</b><br />');
     $this->assertRaw('<div class="webform-confirmation-modal--content">This is a <b>custom</b> confirmation modal. (test: value)</div>');
     $this->assertUrl('webform/test_confirmation_modal');
@@ -109,12 +109,12 @@ public function testConfirmation() {
 
     // Check confirmation inline.
     $this->drupalPostForm('/webform/test_confirmation_inline', [], 'Submit');
-    $this->assertRaw('<a href="' . $webform_confirmation_inline->toUrl('canonical', ['absolute' => TRUE])->toString() . '" rel="prev" title="Back to form">Back to form</a>');
+    $this->assertRaw('<a href="' . $webform_confirmation_inline->toUrl('canonical', ['absolute' => TRUE])->toString() . '" rel="prev">Back to form</a>');
     $this->assertUrl('webform/test_confirmation_inline');
 
     // Check confirmation inline with custom query parameters.
     $this->drupalPostForm('/webform/test_confirmation_inline', [], 'Submit', ['query' => ['custom' => 'param']]);
-    $this->assertRaw('<a href="' . $webform_confirmation_inline->toUrl('canonical', ['absolute' => TRUE, 'query' => ['custom' => 'param']])->toString() . '" rel="prev" title="Back to form">Back to form</a>');
+    $this->assertRaw('<a href="' . $webform_confirmation_inline->toUrl('canonical', ['absolute' => TRUE, 'query' => ['custom' => 'param']])->toString() . '" rel="prev">Back to form</a>');
     $this->assertUrl('webform/test_confirmation_inline', ['query' => ['custom' => 'param']]);
 
     /* Test confirmation page (confirmation_type=page) */
@@ -125,7 +125,7 @@ public function testConfirmation() {
     $sid = $this->postSubmission($webform_confirmation_page);
     $webform_submission = WebformSubmission::load($sid);
     $this->assertRaw('This is a custom confirmation page.');
-    $this->assertRaw('<a href="' . $webform_confirmation_page->toUrl('canonical', ['absolute' => TRUE])->toString() . '" rel="prev" title="Back to form">Back to form</a>');
+    $this->assertRaw('<a href="' . $webform_confirmation_page->toUrl('canonical', ['absolute' => TRUE])->toString() . '" rel="prev">Back to form</a>');
     $this->assertUrl('webform/test_confirmation_page/confirmation', ['query' => ['token' => $webform_submission->getToken()]]);
 
     // Check that the confirmation page's 'Back to form 'link includes custom
@@ -158,15 +158,15 @@ public function testConfirmation() {
 
     // Check custom confirmation page.
     $this->postSubmission($webform_confirmation_page_custom);
-    $this->assertRaw('<h1 class="page-title">Custom confirmation page title</h1>');
+    $this->assertRaw('<h1>Custom confirmation page title</h1>');
     $this->assertRaw('<div style="border: 10px solid red; padding: 1em;" class="webform-confirmation">');
-    $this->assertRaw('<a href="' . $webform_confirmation_page_custom->toUrl()->setAbsolute()->toString() . '" rel="prev" title="Custom back to link" class="button">Custom back to link</a>');
+    $this->assertRaw('<a href="' . $webform_confirmation_page_custom->toUrl()->setAbsolute()->toString() . '" rel="prev" class="button">Custom back to link</a>');
 
     // Check back link is hidden.
     $webform_confirmation_page_custom->setSetting('confirmation_back', FALSE);
     $webform_confirmation_page_custom->save();
     $this->postSubmission($webform_confirmation_page_custom);
-    $this->assertNoRaw('<a href="' . $webform_confirmation_page_custom->toUrl()->toString() . '" rel="prev" title="Custom back to link" class="button">Custom back to link</a>');
+    $this->assertNoRaw('<a href="' . $webform_confirmation_page_custom->toUrl()->toString() . '" rel="prev" class="button">Custom back to link</a>');
 
     /* Test confirmation URL (confirmation_type=url) */
 
diff --git a/web/modules/webform/tests/src/Functional/Settings/WebformSettingsDraftTest.php b/web/modules/webform/tests/src/Functional/Settings/WebformSettingsDraftTest.php
index 3483d654f0..7860e5bc64 100644
--- a/web/modules/webform/tests/src/Functional/Settings/WebformSettingsDraftTest.php
+++ b/web/modules/webform/tests/src/Functional/Settings/WebformSettingsDraftTest.php
@@ -26,6 +26,9 @@ class WebformSettingsDraftTest extends WebformBrowserTestBase {
    * Test webform submission form draft.
    */
   public function testDraft() {
+    /** @var \Drupal\webform\WebformSubmissionStorageInterface $webform_submission_storage */
+    $webform_submission_storage = \Drupal::entityTypeManager()->getStorage('webform_submission');
+
     $normal_user = $this->drupalCreateUser(['view own webform submission']);
 
     $admin_submission_user = $this->drupalCreateUser([
@@ -152,7 +155,7 @@ public function testDraft() {
     $this->assertRaw('Your draft has been saved');
 
     // Check that submission is owned anonymous.
-    \Drupal::entityTypeManager()->getStorage('webform_submission')->resetCache();
+    $webform_submission_storage->resetCache();
     $webform_submission = WebformSubmission::load($sid);
     $this->assertEqual($webform_submission->getOwnerId(), 0);
 
@@ -165,7 +168,7 @@ public function testDraft() {
     $this->drupalLogin($normal_user);
 
     // Check that submission is now owned by the normal user.
-    \Drupal::entityTypeManager()->getStorage('webform_submission')->resetCache();
+    $webform_submission_storage->resetCache();
     $webform_submission = WebformSubmission::load($sid);
     $this->assertEqual($webform_submission->getOwnerId(), $normal_user->id());
 
@@ -177,7 +180,7 @@ public function testDraft() {
     $this->drupalLogin($normal_user);
 
     // Check that submission is still owned by anonymous user.
-    \Drupal::entityTypeManager()->getStorage('webform_submission')->resetCache();
+    $webform_submission_storage->resetCache();
     $webform_submission = WebformSubmission::load($sid);
     $this->assertEqual($webform_submission->getOwnerId(), 0);
 
@@ -192,7 +195,7 @@ public function testDraft() {
     $this->assertRaw('Your draft has been saved');
 
     // Check that submission is owned anonymous.
-    \Drupal::entityTypeManager()->getStorage('webform_submission')->resetCache();
+    $webform_submission_storage->resetCache();
     $webform_submission = WebformSubmission::load($sid);
     $this->assertEqual($webform_submission->getOwnerId(), 0);
 
@@ -203,7 +206,7 @@ public function testDraft() {
     // Login the normal user.
     $this->drupalLogin($normal_user);
 
-    \Drupal::entityTypeManager()->getStorage('webform_submission')->resetCache();
+    $webform_submission_storage->resetCache();
     $webform_submission = WebformSubmission::load($sid);
     // Check that submission is NOT owned by the normal user.
     $this->assertNotEqual($webform_submission->getOwnerId(), $normal_user->id());
@@ -331,6 +334,25 @@ public function testDraft() {
     $this->clickLink('Load your pending draft');
     $this->assertFieldByName('name', 'Jane Doe');
 
+    // Get the total number of drafts.
+    $total_drafts = $webform_submission_storage->getTotal($webform, NULL, NULL, ['in_draft' => TRUE]);
+
+    // Post form with validation errors.
+    $this->postSubmission($webform);
+    $this->assertRaw('Name field is required.');
+
+    // Check that 1 additional draft was created.
+    $total = $webform_submission_storage->getTotal($webform, NULL, NULL, ['in_draft' => TRUE]);
+    $this->assertEqual($total_drafts + 1, $total);
+
+    // Post the same form with validation errors.
+    $this->drupalPostForm(NULL, [], 'Submit');
+    $this->assertRaw('Name field is required.');
+
+    // Check that only 1 additional draft exists.
+    $total = $webform_submission_storage->getTotal($webform, NULL, NULL, ['in_draft' => TRUE]);
+    $this->assertEqual($total_drafts + 1, $total);
+
     /**************************************************************************/
     // Test webform submission form reset draft.
     /**************************************************************************/
@@ -347,24 +369,28 @@ public function testDraft() {
 
     // Check reset delete's the draft.
     $this->postSubmission($webform, [], 'Reset');
-    \Drupal::entityTypeManager()->getStorage('webform_submission')->resetCache();
+    $webform_submission_storage->resetCache();
     $webform_submission = WebformSubmission::load($sid);
     $this->assertNull($webform_submission);
 
     // Check submission with comment.
     $sid = $this->postSubmission($webform, ['name' => 'John Smith', 'comment' => 'This is a comment'], 'Save Draft');
     $this->postSubmission($webform);
-    \Drupal::entityTypeManager()->getStorage('webform_submission')->resetCache();
+    $webform_submission_storage->resetCache();
     $webform_submission = WebformSubmission::load($sid);
     $this->assertEqual('This is a comment', $webform_submission->getElementData('comment'));
 
     // Check submitted draft is not delete on reset.
     $this->drupalPostForm('/admin/structure/webform/manage/test_form_draft_authenticated/submission/' . $sid . '/edit', ['comment' => 'This is ignored'], 'Reset');
-    \Drupal::entityTypeManager()->getStorage('webform_submission')->resetCache();
+    $webform_submission_storage->resetCache();
     $webform_submission = WebformSubmission::load($sid);
     $this->assertEqual($sid, $webform_submission->id());
     $this->assertEqual('This is a comment', $webform_submission->getElementData('comment'));
     $this->assertNotEqual('This is ignored', $webform_submission->getElementData('comment'));
+
+    // Check total number of drafts.
+    $total = $webform_submission_storage->getTotal($webform, NULL, $this->rootUser, ['in_draft' => TRUE]);
+    $this->assertEqual(0, $total);
   }
 
 }
diff --git a/web/modules/webform/tests/src/Functional/Settings/WebformSettingsPreviewTest.php b/web/modules/webform/tests/src/Functional/Settings/WebformSettingsPreviewTest.php
index 1354ac52e8..b48bd031de 100644
--- a/web/modules/webform/tests/src/Functional/Settings/WebformSettingsPreviewTest.php
+++ b/web/modules/webform/tests/src/Functional/Settings/WebformSettingsPreviewTest.php
@@ -48,7 +48,7 @@ public function testPreview() {
     // Check default preview with values.
     $this->drupalPostForm('/webform/test_form_preview', ['name' => 'test', 'email' => 'example@example.com', 'checkbox' => TRUE], 'Preview');
 
-    $this->assertRaw('<h1 class="page-title">Test: Webform: Preview: Preview</h1>');
+    $this->assertRaw('<h1>Test: Webform: Preview: Preview</h1>');
 
     $this->assertRaw('<b>Preview</b></li>');
 
@@ -60,14 +60,14 @@ public function testPreview() {
     $this->assertRaw('<div class="webform-preview js-form-wrapper form-wrapper" data-drupal-selector="edit-preview" id="edit-preview">');
     $this->assertRaw('<div data-drupal-selector="edit-submission" class="webform-submission-data webform-submission-data--webform-test-form-preview webform-submission-data--view-mode-preview">');
     $this->assertRaw('<fieldset class="format-attributes-class webform-container webform-container-type-fieldset js-form-item form-item js-form-wrapper form-wrapper" id="test_form_preview--fieldset">');
-    $this->assertRaw('<div class="format-attributes-class webform-element webform-element-type-textfield js-form-item form-item js-form-type-item form-type-item js-form-item-name form-item-name" id="test_form_preview--name">');
+    $this->assertRaw('<div class="format-attributes-class webform-element webform-element-type-textfield js-form-item form-item js-form-type-item form-item-name js-form-item-name" id="test_form_preview--name">');
     $this->assertRaw('<label>Name</label>' . PHP_EOL . '        test');
 
     $this->assertRaw('<section class="format-attributes-class js-form-item form-item js-form-wrapper form-wrapper webform-section" id="test_form_preview--container">');
-    $this->assertRaw('<div class="format-attributes-class webform-element webform-element-type-email js-form-item form-item js-form-type-item form-type-item js-form-item-email form-item-email" id="test_form_preview--email">');
+    $this->assertRaw('<div class="format-attributes-class webform-element webform-element-type-email js-form-item form-item js-form-type-item form-item-email js-form-item-email" id="test_form_preview--email">');
     $this->assertRaw('<label>Email</label>' . PHP_EOL . '        <a href="mailto:example@example.com">example@example.com</a>');
 
-    $this->assertRaw('<div class="format-attributes-class webform-element webform-element-type-checkbox js-form-item form-item js-form-type-item form-type-item js-form-item-checkbox form-item-checkbox" id="test_form_preview--checkbox">');
+    $this->assertRaw('<div class="format-attributes-class webform-element webform-element-type-checkbox js-form-item form-item js-form-type-item form-item-checkbox js-form-item-checkbox" id="test_form_preview--checkbox">');
     $this->assertRaw('<section class="format-attributes-class js-form-item form-item js-form-wrapper form-wrapper webform-section" id="test_form_preview--section">');
     $this->assertRaw('<label>Checkbox</label>' . PHP_EOL . '        Yes');
     $this->assertRaw('<div class="webform-preview js-form-wrapper form-wrapper" data-drupal-selector="edit-preview" id="edit-preview">');
@@ -111,7 +111,7 @@ public function testPreview() {
     // Check empty elements are included in preview.
     $this->drupalPostForm('/webform/test_form_preview', ['name' => '', 'email' => '', 'checkbox' => FALSE], 'Preview');
     $this->assertRaw('<label>Name</label>' . PHP_EOL . '        {Empty}');
-    $this->assertRaw('<div class="format-attributes-class webform-element webform-element-type-email js-form-item form-item js-form-type-item form-type-item js-form-item-email form-item-email" id="test_form_preview--email">');
+    $this->assertRaw('<div class="format-attributes-class webform-element webform-element-type-email js-form-item form-item js-form-type-item form-item-email js-form-item-email" id="test_form_preview--email">');
     $this->assertRaw('<label>Email</label>' . PHP_EOL . '        {Empty}');
     $this->assertRaw('<label>Checkbox</label>' . PHP_EOL . '        No');
 
@@ -136,12 +136,12 @@ public function testPreview() {
     // Check special characters in form page title.
     $this->drupalGet('/webform/test_form_preview');
     $this->assertRaw('<title>This has special characters. \'"& | Drupal</title>');
-    $this->assertRaw('<h1 class="page-title">This has special characters. &#039;&lt;&gt;&quot;&amp;</h1>');
+    $this->assertRaw('<h1>This has special characters. &#039;&lt;&gt;&quot;&amp;</h1>');
 
     // Check special characters in preview page title.
     $this->drupalPostForm('/webform/test_form_preview', ['name' => 'test'], 'Preview');
     $this->assertRaw('<title>This has special characters. \'"&: Preview | Drupal</title>');
-    $this->assertRaw('<h1 class="page-title">This has special characters. &#039;&lt;&gt;&quot;&amp;: Preview</h1>');
+    $this->assertRaw('<h1>This has special characters. &#039;&lt;&gt;&quot;&amp;: Preview</h1>');
 
     // Check required preview with custom settings.
     $webform_preview->setSettings([
@@ -163,7 +163,7 @@ public function testPreview() {
 
     // Check custom preview.
     $this->drupalPostForm('/webform/test_form_preview', ['name' => 'test'], '{Preview}');
-    $this->assertRaw('<h1 class="page-title">{Title}</h1>');
+    $this->assertRaw('<h1>{Title}</h1>');
     $this->assertRaw('<b>{Label}</b></li>');
     $this->assertRaw('{Message}');
     $this->assertFieldByName('op', 'Submit');
diff --git a/web/modules/webform/tests/src/Functional/Settings/WebformSettingsSerialTest.php b/web/modules/webform/tests/src/Functional/Settings/WebformSettingsSerialTest.php
index ed03e01805..64f8fc0830 100644
--- a/web/modules/webform/tests/src/Functional/Settings/WebformSettingsSerialTest.php
+++ b/web/modules/webform/tests/src/Functional/Settings/WebformSettingsSerialTest.php
@@ -20,19 +20,31 @@ public function testSettings() {
     // Login the admin user.
     $this->drupalLogin($this->rootUser);
 
-    $webform_contact = Webform::load('contact');
+    /** @var \Drupal\webform\WebformInterface $webform */
+    $webform = Webform::load('contact');
 
     // Set next serial to 99.
     $this->drupalPostForm('/admin/structure/webform/manage/contact/settings/submissions', ['next_serial' => 99], 'Save');
 
     // Check next serial is 99.
-    $sid = $this->postSubmissionTest($webform_contact);
+    $sid = $this->postSubmissionTest($webform);
     $webform_submission = WebformSubmission::load($sid);
     $this->assertEqual($webform_submission->serial(), 99);
+    $this->assertNotEqual($webform_submission->serial(), $sid);
 
     // Check that next serial is set to max serial.
     $this->drupalPostForm('/admin/structure/webform/manage/contact/settings/submissions', ['next_serial' => 1], 'Save');
     $this->assertRaw('The next submission number was increased to 100 to make it higher than existing submissions.');
+
+    // Disable serial.
+    $webform->setSetting('serial_disabled', TRUE)->save();
+
+    // Check next serial is not 100 but equal to the sid.
+    $sid = $this->postSubmissionTest($webform);
+    $webform_submission = WebformSubmission::load($sid);
+    $this->assertNotEqual($webform_submission->serial(), 100);
+    $this->assertEqual($webform_submission->serial(), $sid);
+
   }
 
 }
diff --git a/web/modules/webform/tests/src/Functional/States/WebformStatesHiddenTest.php b/web/modules/webform/tests/src/Functional/States/WebformStatesHiddenTest.php
index de6c287554..a6b3935996 100644
--- a/web/modules/webform/tests/src/Functional/States/WebformStatesHiddenTest.php
+++ b/web/modules/webform/tests/src/Functional/States/WebformStatesHiddenTest.php
@@ -42,13 +42,13 @@ public function testFormStatesHidden() {
     $this->drupalGet('/webform/test_states_server_hidden');
 
     // Text field.
-    $this->assertRaw('<div class="js-webform-states-hidden js-form-item form-item js-form-type-textfield form-type-textfield js-form-item-dependent-textfield form-item-dependent-textfield">');
+    $this->assertRaw('<div class="js-webform-states-hidden js-form-item form-item js-form-type-textfield form-item-dependent-textfield js-form-item-dependent-textfield">');
 
     // Text field multiple.
-    $this->assertRaw('<div class="js-form-wrapper js-webform-states-hidden" data-drupal-states="{&quot;visible&quot;:{&quot;.webform-submission-test-states-server-hidden-add-form :input[name=\u0022trigger_checkbox\u0022]&quot;:{&quot;checked&quot;:true}}}"><div id="dependent_textfield_multiple_table">');
+    $this->assertRaw('<div class="js-webform-states-hidden js-form-wrapper" data-drupal-states="{&quot;visible&quot;:{&quot;.webform-submission-test-states-server-hidden-add-form :input[name=\u0022trigger_checkbox\u0022]&quot;:{&quot;checked&quot;:true}}}"><div id="dependent_textfield_multiple_table">');
 
     // Checkbox.
-    $this->assertRaw('<div class="js-webform-states-hidden js-form-item form-item js-form-type-checkbox form-type-checkbox js-form-item-dependent-checkbox form-item-dependent-checkbox">');
+    $this->assertRaw('<div class="js-webform-states-hidden js-form-item form-item js-form-type-checkbox form-item-dependent-checkbox js-form-item-dependent-checkbox">');
 
     // Radios.
     $this->assertRaw('<fieldset data-drupal-selector="edit-dependent-radios" class="js-webform-states-hidden radios--wrapper fieldgroup form-composite webform-composite-visible-title js-webform-type-radios webform-type-radios js-form-item form-item js-form-wrapper form-wrapper" id="edit-dependent-radios--wrapper" data-drupal-states="{&quot;visible&quot;:{&quot;.webform-submission-test-states-server-hidden-add-form :input[name=\u0022trigger_checkbox\u0022]&quot;:{&quot;checked&quot;:true}}}">');
@@ -57,16 +57,16 @@ public function testFormStatesHidden() {
     $this->assertRaw('<fieldset data-drupal-selector="edit-dependent-select-other" class="js-webform-select-other webform-select-other js-webform-states-hidden js-form-item webform-select-other--wrapper fieldgroup form-composite webform-composite-visible-title js-webform-type-webform-select-other webform-type-webform-select-other form-item js-form-wrapper form-wrapper" id="edit-dependent-select-other" data-drupal-states="{&quot;visible&quot;:{&quot;.webform-submission-test-states-server-hidden-add-form :input[name=\u0022trigger_checkbox\u0022]&quot;:{&quot;checked&quot;:true}}}">');
 
     // Managed file.
-    $this->assertRaw('<div class="js-form-wrapper js-webform-states-hidden" data-drupal-states="{&quot;visible&quot;:{&quot;.webform-submission-test-states-server-hidden-add-form :input[name=\u0022trigger_checkbox\u0022]&quot;:{&quot;checked&quot;:true}}}">');
+    $this->assertRaw('<div class="js-webform-states-hidden js-form-wrapper" data-drupal-states="{&quot;visible&quot;:{&quot;.webform-submission-test-states-server-hidden-add-form :input[name=\u0022trigger_checkbox\u0022]&quot;:{&quot;checked&quot;:true}}}">');
 
     // Address composite states wrapper.
-    $this->assertRaw('<div class="js-form-wrapper js-webform-states-hidden" data-drupal-states="{&quot;visible&quot;:{&quot;.webform-submission-test-states-server-hidden-add-form :input[name=\u0022trigger_checkbox\u0022]&quot;:{&quot;checked&quot;:true}}}"><fieldset data-drupal-selector="edit-dependent-address" class="webform-address--wrapper fieldgroup form-composite webform-composite-hidden-title js-webform-type-webform-address webform-type-webform-address js-form-item form-item js-form-wrapper form-wrapper" id="edit-dependent-address--wrapper">');
+    $this->assertRaw('<div class="js-webform-states-hidden js-form-wrapper" data-drupal-states="{&quot;visible&quot;:{&quot;.webform-submission-test-states-server-hidden-add-form :input[name=\u0022trigger_checkbox\u0022]&quot;:{&quot;checked&quot;:true}}}"><fieldset data-drupal-selector="edit-dependent-address" class="webform-address--wrapper fieldgroup form-composite webform-composite-hidden-title js-webform-type-webform-address webform-type-webform-address js-form-item form-item js-form-wrapper form-wrapper" id="edit-dependent-address--wrapper">');
 
     // Table select sort.
-    $this->assertRaw('<div class="js-webform-states-hidden js-form-item form-item js-form-type-webform-tableselect-sort form-type-webform-tableselect-sort js-form-item-dependent-tableselect-sort form-item-dependent-tableselect-sort form-no-label">');
+    $this->assertRaw('<div class="js-webform-states-hidden js-form-item form-item js-form-type-webform-tableselect-sort form-item-dependent-tableselect-sort js-form-item-dependent-tableselect-sort form-no-label">');
 
     // Details.
-    $this->assertRaw('<details data-webform-states-no-clear data-webform-key="dependent_details" class="js-webform-states-hidden js-form-wrapper form-wrapper" data-drupal-selector="edit-dependent-details" id="edit-dependent-details" data-drupal-states="{&quot;visible&quot;:{&quot;.webform-submission-test-states-server-hidden-add-form :input[name=\u0022trigger_checkbox\u0022]&quot;:{&quot;checked&quot;:true}}}">    <summary role="button" aria-controls="edit-dependent-details" aria-expanded="false" aria-pressed="false">dependent_details</summary><div class="details-wrapper">');
+    $this->assertRaw('<details data-webform-states-no-clear data-webform-key="dependent_details" class="js-webform-states-hidden js-form-wrapper form-wrapper" data-drupal-selector="edit-dependent-details" id="edit-dependent-details" data-drupal-states="{&quot;visible&quot;:{&quot;.webform-submission-test-states-server-hidden-add-form :input[name=\u0022trigger_checkbox\u0022]&quot;:{&quot;checked&quot;:true}}}">');
   }
 
 }
diff --git a/web/modules/webform/tests/src/Functional/States/WebformStatesManagerTest.php b/web/modules/webform/tests/src/Functional/States/WebformStatesManagerTest.php
new file mode 100644
index 0000000000..39524c1e63
--- /dev/null
+++ b/web/modules/webform/tests/src/Functional/States/WebformStatesManagerTest.php
@@ -0,0 +1,42 @@
+<?php
+
+namespace Drupal\Tests\webform\Functional\States;
+
+use Drupal\Tests\webform\Functional\WebformBrowserTestBase;
+
+/**
+ * Tests for webform states manager.
+ *
+ * @group webform
+ */
+class WebformStatesManagerTest extends WebformBrowserTestBase {
+
+  /**
+   * Modules to enable.
+   *
+   * @var array
+   */
+  public static $modules = ['webform', 'webform_test_states'];
+
+  /**
+   * Webforms to load.
+   *
+   * @var array
+   */
+  protected static $testWebforms = ['test_states_to_text'];
+
+  /**
+   * Tests states to text.
+   */
+  public function testStatesToText() {
+    // Check converting #states to human readable text.
+    $this->drupalGet('/webform/test_states_to_text/confirmation');
+    $this->assertRaw('<label>textfield_and</label>');
+    $this->assertRaw('This element is <strong>required</strong> when <strong>all</strong> of the following conditions are met:<ul><li><strong>some_trigger</strong> is checked.</li><li><strong>some_value</strong> = <strong>one</strong>.</li><li><strong>some_number</strong> &gt;= <strong>1</strong>.</li></ul>');
+    $this->assertRaw('<label>textfield_or</label>');
+    $this->assertRaw('This element is <strong>required</strong> when <strong>any</strong> of the following conditions are met:<ul><li><strong>some_trigger</strong> is checked.</li><li><strong>some_value</strong> = <strong>one</strong>.</li><li><strong>some_number</strong> &gt;= <strong>1</strong>.</li></ul>');
+    $this->assertRaw('<label>textfield_or</label>');
+    $this->assertRaw('This element is <strong>required</strong> when <strong>any</strong> of the following conditions are met:<ul><li><strong>some_trigger</strong> is checked.</li><li>When <strong>any</strong> of the following (nested) conditions are met:<ul><li><strong>some_value</strong> = <strong>one</strong>.</li><li><strong>some_number</strong> is between <strong>1</strong> and <strong>10</strong>.</li></ul></li></ul>');
+  }
+
+}
diff --git a/web/modules/webform/tests/src/Functional/States/WebformStatesServerTest.php b/web/modules/webform/tests/src/Functional/States/WebformStatesServerTest.php
index 4e6869a5f6..b8cb4d3eda 100644
--- a/web/modules/webform/tests/src/Functional/States/WebformStatesServerTest.php
+++ b/web/modules/webform/tests/src/Functional/States/WebformStatesServerTest.php
@@ -356,26 +356,51 @@ public function testFormStatesValidatorRequired() {
       'trigger_pattern' => 'abc',
       'trigger_not_pattern' => 'ABC',
       'trigger_less' => 1,
+      'trigger_less_equal' => 1,
       'trigger_greater' => 11,
+      'trigger_greater_equal' => 11,
     ];
     $this->postSubmission($webform, $edit);
     $this->assertNoRaw('New submission added to Test: Form API #states custom pattern, less, greater, and between condition validation.');
     $this->assertRaw('dependent_pattern field is required.');
     $this->assertRaw('dependent_not_pattern field is required.');
     $this->assertRaw('dependent_less field is required.');
+    $this->assertRaw('dependent_less_equal field is required.');
     $this->assertRaw('dependent_greater field is required.');
+    $this->assertRaw('dependent_greater_equal field is required.');
+
+    $edit = [
+      'trigger_less' => 10,
+      'trigger_less_equal' => 10,
+      'trigger_greater' => 10,
+      'trigger_greater_equal' => 10,
+    ];
+    $this->postSubmission($webform, $edit);
+    $this->assertNoRaw('dependent_less field is required.');
+    $this->assertRaw('dependent_less_equal field is required.');
+    $this->assertNoRaw('dependent_greater field is required.');
+    $this->assertRaw('dependent_greater_equal field is required.');
+
+    $edit = [
+      'trigger_between' => 11,
+    ];
+    $this->postSubmission($webform, $edit);
+    $this->assertRaw('dependent_between field is required.');
+    $this->assertNoRaw('dependent_not_between field is required.');
 
     $edit = [
       'trigger_between' => 9,
     ];
     $this->postSubmission($webform, $edit);
     $this->assertNoRaw('dependent_between field is required.');
+    $this->assertRaw('dependent_not_between field is required.');
 
     $edit = [
       'trigger_between' => 21,
     ];
     $this->postSubmission($webform, $edit);
     $this->assertNoRaw('dependent_between field is required.');
+    $this->assertRaw('dependent_not_between field is required.');
 
     /**************************************************************************/
     // multiple element.
diff --git a/web/modules/webform/tests/src/Functional/States/WebformStatesWizardTest.php b/web/modules/webform/tests/src/Functional/States/WebformStatesWizardTest.php
index 2a9a574b3b..e94c14db7a 100644
--- a/web/modules/webform/tests/src/Functional/States/WebformStatesWizardTest.php
+++ b/web/modules/webform/tests/src/Functional/States/WebformStatesWizardTest.php
@@ -50,28 +50,30 @@ public function testFormStatesValidatorWizard() {
 page_02_textfield_invisible: '{default_value}'
 page_02_textfield_invisible_slide: '{default_value}'
 page_02_checkbox_checked: 0
-page_02_checkbox_unchecked: 0");
+page_02_checkbox_unchecked: 0
+page_03_textfield_required: '{default_value}'
+page_01_trigger_checkbox_computed: 'No'");
 
     // Check trigger-checkbox value is No.
-    $this->assertRaw('<input data-drupal-selector="edit-page-01-trigger-checkbox-computed" type="hidden" name="page_01_trigger_checkbox_computed" value="No" />');
+    $this->assertFieldByName('page_01_trigger_checkbox_computed', 'No');
 
     // Check page_02_textfield_required is not required.
-    $this->assertRaw('<input data-drupal-selector="edit-page-02-textfield-required" aria-describedby="edit-page-02-textfield-required--description" type="text" id="edit-page-02-textfield-required" name="page_02_textfield_required" value="{default_value}" size="60" maxlength="255" class="form-text" />');
+    $this->assertNoCssSelect('[name="page_02_textfield_required"][required]');
 
     // Check page_02_textfield_optional is required.
-    $this->assertRaw('<input data-drupal-selector="edit-page-02-textfield-optional" aria-describedby="edit-page-02-textfield-optional--description" type="text" id="edit-page-02-textfield-optional" name="page_02_textfield_optional" value="{default_value}" size="60" maxlength="255" class="form-text required" required="required" aria-required="true" />');
+    $this->assertCssSelect('[name="page_02_textfield_optional"][required]');
 
     // Check page_02_textfield_disabled is not disabled.
-    $this->assertRaw('<input data-drupal-selector="edit-page-02-textfield-disabled" aria-describedby="edit-page-02-textfield-disabled--description" type="text" id="edit-page-02-textfield-disabled" name="page_02_textfield_disabled" value="" size="60" maxlength="255" class="form-text" />');
+    $this->assertNoCssSelect('[name="page_02_textfield_disabled"][disabled]');
 
     // Check page_02_textfield_enabled is disabled.
-    $this->assertRaw('<input data-drupal-selector="edit-page-02-textfield-enabled" aria-describedby="edit-page-02-textfield-enabled--description" disabled="disabled" type="text" id="edit-page-02-textfield-enabled" name="page_02_textfield_enabled" value="" size="60" maxlength="255" class="form-text" />');
+    $this->assertCssSelect('[name="page_02_textfield_enabled"][disabled]');
 
     // Check page_02_textfield_visible is hidden via .js-webform-states-hidden.
-    $this->assertRaw('<div class="js-webform-states-hidden js-form-item form-item js-form-type-textfield form-type-textfield js-form-item-page-02-textfield-visible form-item-page-02-textfield-visible">');
+    $this->assertCssSelect('.form-item-page-02-textfield-visible.js-webform-states-hidden');
 
     // Check page_02_textfield_visible_slide is hidden via .js-webform-states-hidden.
-    $this->assertRaw('<div class="js-webform-states-hidden js-form-item form-item js-form-type-textfield form-type-textfield js-form-item-page-02-textfield-visible-slide form-item-page-02-textfield-visible-slide">');
+    $this->assertCssSelect('.form-item-page-02-textfield-visible-slide.js-webform-states-hidden');
 
     // Check page_02_textfield_invisible is visible.
     $this->assertFieldByName('page_02_textfield_invisible', '{default_value}');
@@ -80,16 +82,17 @@ public function testFormStatesValidatorWizard() {
     $this->assertFieldByName('page_02_textfield_invisible_slide', '{default_value}');
 
     // Check page_02_checkbox_checked is not checked.
-    $this->assertRaw('<input data-drupal-selector="edit-page-02-checkbox-checked" aria-describedby="edit-page-02-checkbox-checked--description" type="checkbox" id="edit-page-02-checkbox-checked" name="page_02_checkbox_checked" value="1" class="form-checkbox" />');
+    $this->assertNoFieldChecked('page_02_checkbox_checked');
 
     // Check page_02_checkbox_unchecked is checked.
-    $this->assertRaw('<input data-drupal-selector="edit-page-02-checkbox-unchecked" aria-describedby="edit-page-02-checkbox-unchecked--description" type="checkbox" id="edit-page-02-checkbox-unchecked" name="page_02_checkbox_unchecked" value="1" checked="checked" class="form-checkbox" />');
+    $this->assertFieldChecked('page_02_checkbox_unchecked');
 
     // Check page_02_details_expanded is not open.
-    $this->assertRaw('<details data-webform-details-nosave data-webform-key="page_02_details_expanded" data-drupal-selector="edit-page-02-details-expanded" aria-describedby="edit-page-02-details-expanded--description" id="edit-page-02-details-expanded" class="js-form-wrapper form-wrapper"> ');
+    $this->assertCssSelect('details[id="edit-page-02-details-expanded"]');
+    $this->assertNoCssSelect('details[id="edit-page-02-details-expanded"][open]');
 
     // Check page_02_details_collapsed is open.
-    $this->assertRaw('<details data-webform-details-nosave data-webform-key="page_02_details_collapsed" data-drupal-selector="edit-page-02-details-collapsed" aria-describedby="edit-page-02-details-collapsed--description" id="edit-page-02-details-collapsed" class="js-form-wrapper form-wrapper" open="open">');
+    $this->assertCssSelect('details[id="edit-page-02-details-collapsed"][open]');
 
     // Check submission data.
     $this->drupalPostForm(NULL, [], 'Submit');
@@ -111,7 +114,9 @@ public function testFormStatesValidatorWizard() {
 page_02_textfield_invisible: '{default_value}'
 page_02_textfield_invisible_slide: '{default_value}'
 page_02_checkbox_checked: 0
-page_02_checkbox_unchecked: 1");
+page_02_checkbox_unchecked: 1
+page_03_textfield_required: ''
+page_01_trigger_checkbox_computed: 'No'");
 
     /**************************************************************************/
 
@@ -136,22 +141,24 @@ public function testFormStatesValidatorWizard() {
 page_02_textfield_invisible: '{default_value}'
 page_02_textfield_invisible_slide: '{default_value}'
 page_02_checkbox_checked: 0
-page_02_checkbox_unchecked: 0");
+page_02_checkbox_unchecked: 0
+page_03_textfield_required: '{default_value}'
+page_01_trigger_checkbox_computed: 'Yes'");
 
     // Check trigger-checkbox value is Yes.
-    $this->assertRaw('<input data-drupal-selector="edit-page-01-trigger-checkbox-computed" type="hidden" name="page_01_trigger_checkbox_computed" value="Yes" />');
+    $this->assertCssSelect('[name="page_01_trigger_checkbox_computed"][value="Yes"]');
 
     // Check page_02_textfield_required is required.
-    $this->assertRaw('<input data-drupal-selector="edit-page-02-textfield-required" aria-describedby="edit-page-02-textfield-required--description" type="text" id="edit-page-02-textfield-required" name="page_02_textfield_required" value="{default_value}" size="60" maxlength="255" class="form-text required" required="required" aria-required="true" />');
+    $this->assertCssSelect('[name="page_02_textfield_required"][required]');
 
     // Check page_02_textfield_optional is not required.
-    $this->assertRaw('<input data-drupal-selector="edit-page-02-textfield-optional" aria-describedby="edit-page-02-textfield-optional--description" type="text" id="edit-page-02-textfield-optional" name="page_02_textfield_optional" value="{default_value}" size="60" maxlength="255" class="form-text" />');
+    $this->assertNoCssSelect('[name="page_02_textfield_optional"][required]');
 
     // Check page_02_textfield_disabled is disabled.
-    $this->assertRaw('<input data-drupal-selector="edit-page-02-textfield-disabled" aria-describedby="edit-page-02-textfield-disabled--description" disabled="disabled" type="text" id="edit-page-02-textfield-disabled" name="page_02_textfield_disabled" value="" size="60" maxlength="255" class="form-text" />');
+    $this->assertCssSelect('[name="page_02_textfield_disabled"][disabled="disabled"]');
 
     // Check page_02_textfield_enabled is not disabled.
-    $this->assertRaw('<input data-drupal-selector="edit-page-02-textfield-enabled" aria-describedby="edit-page-02-textfield-enabled--description" type="text" id="edit-page-02-textfield-enabled" name="page_02_textfield_enabled" value="" size="60" maxlength="255" class="form-text" />');
+    $this->assertNoCssSelect('[name="page_02_textfield_enabled"][disabled="disabled"]');
 
     // Check page_02_textfield_visible is visible.
     $this->assertFieldByName('page_02_textfield_visible', '{default_value}');
@@ -160,26 +167,50 @@ public function testFormStatesValidatorWizard() {
     $this->assertFieldByName('page_02_textfield_visible_slide', '{default_value}');
 
     // Check page_02_textfield_invisible is hidden with no default value.
-    $this->assertRaw('<div class="js-webform-states-hidden js-form-item form-item js-form-type-textfield form-type-textfield js-form-item-page-02-textfield-invisible form-item-page-02-textfield-invisible">');
+    $this->assertCssSelect('.form-item-page-02-textfield-invisible.js-webform-states-hidden');
     $this->assertNoFieldByName('page_02_textfield_invisible', '{default_value}');
     $this->assertFieldByName('page_02_textfield_invisible', '');
 
     // Check page_02_textfield_invisible_slides is hidden with no default value.
-    $this->assertRaw('<div class="js-webform-states-hidden js-form-item form-item js-form-type-textfield form-type-textfield js-form-item-page-02-textfield-invisible-slide form-item-page-02-textfield-invisible-slide">');
+    $this->assertCssSelect('.form-item-page-02-textfield-invisible-slide.js-webform-states-hidden');
     $this->assertNoFieldByName('page_02_textfield_invisible_slide', '{default_value}');
     $this->assertFieldByName('page_02_textfield_invisible_slide', '');
 
     // Check page_02_checkbox_checked is checked.
-    $this->assertRaw('<input data-drupal-selector="edit-page-02-checkbox-checked" aria-describedby="edit-page-02-checkbox-checked--description" type="checkbox" id="edit-page-02-checkbox-checked" name="page_02_checkbox_checked" value="1" checked="checked" class="form-checkbox" />');
+    $this->assertFieldChecked('page_02_checkbox_checked');
 
     // Check page_02_checkbox_unchecked is not checked.
-    $this->assertRaw('<input data-drupal-selector="edit-page-02-checkbox-unchecked" aria-describedby="edit-page-02-checkbox-unchecked--description" type="checkbox" id="edit-page-02-checkbox-unchecked" name="page_02_checkbox_unchecked" value="1" class="form-checkbox" />');
+    $this->assertNoFieldChecked('page_02_checkbox_unchecked');
 
     // Check page_02_details_expanded is open.
-    $this->assertRaw('<details data-webform-details-nosave data-webform-key="page_02_details_expanded" data-drupal-selector="edit-page-02-details-expanded" aria-describedby="edit-page-02-details-expanded--description" id="edit-page-02-details-expanded" class="js-form-wrapper form-wrapper" open="open">');
+    $this->assertCssSelect('details[id="edit-page-02-details-expanded"][open]');
 
     // Check page_02_details_collapsed is not open.
-    $this->assertRaw('<details data-webform-details-nosave data-webform-key="page_02_details_collapsed" data-drupal-selector="edit-page-02-details-collapsed" aria-describedby="edit-page-02-details-collapsed--description" id="edit-page-02-details-collapsed" class="js-form-wrapper form-wrapper">');
+    $this->assertNoCssSelect('details[id="edit-page-02-details-collapsed"][open]');
+
+    // Check third page data.
+    $this->drupalPostForm(NULL, [], 'Next >');
+    $this->assertRaw("page_01_trigger_checkbox: 1
+page_01_textfield_required: '{default_value}'
+page_01_textfield_optional: '{default_value}'
+page_01_textfield_disabled: ''
+page_01_textfield_enabled: ''
+page_01_textfield_visible: ''
+page_01_textfield_invisible: ''
+page_01_checkbox_checked: 0
+page_01_checkbox_unchecked: 0
+page_02_textfield_required: '{default_value}'
+page_02_textfield_optional: '{default_value}'
+page_02_textfield_disabled: ''
+page_02_textfield_enabled: ''
+page_02_textfield_visible: '{default_value}'
+page_02_textfield_visible_slide: '{default_value}'
+page_02_textfield_invisible: ''
+page_02_textfield_invisible_slide: ''
+page_02_checkbox_checked: 1
+page_02_checkbox_unchecked: 0
+page_03_textfield_required: '{default_value}'
+page_01_trigger_checkbox_computed: 'Yes'");
 
     // Check submission data.
     $this->drupalPostForm(NULL, [], 'Submit');
@@ -201,7 +232,9 @@ public function testFormStatesValidatorWizard() {
 page_02_textfield_invisible: ''
 page_02_textfield_invisible_slide: ''
 page_02_checkbox_checked: 1
-page_02_checkbox_unchecked: 0");
+page_02_checkbox_unchecked: 0
+page_03_textfield_required: '{default_value}'
+page_01_trigger_checkbox_computed: 'Yes'");
   }
 
 }
diff --git a/web/modules/webform/tests/src/Functional/Token/WebformTokenSubmissionValueTest.php b/web/modules/webform/tests/src/Functional/Token/WebformTokenSubmissionValueTest.php
index 1e7372b630..bf55d6b908 100644
--- a/web/modules/webform/tests/src/Functional/Token/WebformTokenSubmissionValueTest.php
+++ b/web/modules/webform/tests/src/Functional/Token/WebformTokenSubmissionValueTest.php
@@ -64,7 +64,7 @@ public function testWebformTokenSubmissionValue() {
       'webform_submission:values:emails:1' => 'two@example.com',
       'webform_submission:values:emails:2' => 'three@example.com',
       'webform_submission:values:emails:value:comma' => 'one@example.com, two@example.com, three@example.com',
-      'webform_submission:values:emails:html' => '<div class="item-list"><ul><li><a href="mailto:one@example.com">one@example.com</a></li><li><a href="mailto:two@example.com">two@example.com</a></li><li><a href="mailto:three@example.com">three@example.com</a></li></ul></div>',
+      'webform_submission:values:emails:html' => '<ul><li><a href="mailto:one@example.com">one@example.com</a></li><li><a href="mailto:two@example.com">two@example.com</a></li><li><a href="mailto:three@example.com">three@example.com</a></li></ul>',
       'webform_submission:values:emails:0:html' => '<a href="mailto:one@example.com">one@example.com</a>',
       'webform_submission:values:emails:1:html' => '<a href="mailto:two@example.com">two@example.com</a>',
       'webform_submission:values:emails:2:html' => '<a href="mailto:three@example.com">three@example.com</a>',
@@ -112,7 +112,7 @@ public function testWebformTokenSubmissionValue() {
   Springfield, Alabama. 12345
   United States
   jane@example.com',
-      'webform_submission:values:contacts:html' => '<div class="item-list"><ul><li>John Smith<br />10 Main Street<br />Springfield, Alabama. 12345<br />United States<br /><a href="mailto:john@example.com">john@example.com</a></li><li>Jane Doe<br />10 Main Street<br />Springfield, Alabama. 12345<br />United States<br /><a href="mailto:jane@example.com">jane@example.com</a></li></ul></div>',
+      'webform_submission:values:contacts:html' => '<ul><li>John Smith<br />10 Main Street<br />Springfield, Alabama. 12345<br />United States<br /><a href="mailto:john@example.com">john@example.com</a></li><li>Jane Doe<br />10 Main Street<br />Springfield, Alabama. 12345<br />United States<br /><a href="mailto:jane@example.com">jane@example.com</a></li></ul>',
       'webform_submission:values:contacts:0:html' => 'John Smith<br />10 Main Street<br />Springfield, Alabama. 12345<br />United States<br /><a href="mailto:john@example.com">john@example.com</a>',
       'webform_submission:values:contacts:0:name' => 'John Smith',
       'webform_submission:values:contacts:1:name' => 'Jane Doe',
diff --git a/web/modules/webform/tests/src/Functional/Variant/WebformVariantRandomizeTest.php b/web/modules/webform/tests/src/Functional/Variant/WebformVariantRandomizeTest.php
deleted file mode 100644
index fcba54f129..0000000000
--- a/web/modules/webform/tests/src/Functional/Variant/WebformVariantRandomizeTest.php
+++ /dev/null
@@ -1,54 +0,0 @@
-<?php
-
-namespace Drupal\Tests\webform\Functional\Variant;
-
-use Drupal\Tests\webform\Functional\WebformBrowserTestBase;
-use Drupal\webform\Entity\Webform;
-
-/**
- * Tests for the webform variant randomize.
- *
- * @group webform
- */
-class WebformVariantRandomizeTest extends WebformBrowserTestBase {
-
-  /**
-   * Webforms to load.
-   *
-   * @var array
-   */
-  protected static $testWebforms = ['test_variant_randomize'];
-
-  /**
-   * Test variant randomize.
-   */
-  public function testVariantRandomize() {
-    $webform = Webform::load('test_variant_randomize');
-
-    // Check that randomize JavaScript is generated for 'a' and 'b'.
-    $this->drupalGet('/webform/test_variant_randomize');
-    $this->assertRaw('var variants = {"letter":["a","b"]};');
-
-    // Disable variant 'a'.
-    /** @var \Drupal\webform\Plugin\WebformVariantInterface $variant_plugin */
-    $variant_plugin = $webform->getVariant('a');
-    $variant_plugin->disable();
-    $webform->save();
-
-    // Check that randomize JavaScript is generated for only 'b'.
-    $this->drupalGet('/webform/test_variant_randomize');
-    $this->assertRaw('var variants = {"letter":["b"]};');
-
-    // Disable variant 'b'.
-    /** @var \Drupal\webform\Plugin\WebformVariantInterface $variant_plugin */
-    $variant_plugin = $webform->getVariant('b');
-    $variant_plugin->disable();
-    $webform->save();
-
-    // Check that no randomize JavaScript is generated because no variants
-    // are enabled.
-    $this->drupalGet('/webform/test_variant_randomize');
-    $this->assertNoRaw('var variants');
-  }
-
-}
diff --git a/web/modules/webform/tests/src/Functional/Variant/WebformVariantTest.php b/web/modules/webform/tests/src/Functional/Variant/WebformVariantTest.php
new file mode 100644
index 0000000000..0386507943
--- /dev/null
+++ b/web/modules/webform/tests/src/Functional/Variant/WebformVariantTest.php
@@ -0,0 +1,52 @@
+<?php
+
+namespace Drupal\Tests\webform\Functional\Handler;
+
+use Drupal\Tests\webform\Functional\WebformBrowserTestBase;
+
+/**
+ * Tests for webform variant plugin.
+ *
+ * @group webform
+ */
+class WebformVariantTest extends WebformBrowserTestBase {
+
+  /**
+   * Modules to enable.
+   *
+   * @var array
+   */
+  public static $modules = ['webform', 'webform_test_variant'];
+
+  /**
+   * Webforms to load.
+   *
+   * @var array
+   */
+  protected static $testWebforms = ['test_variant'];
+
+  /**
+   * Tests webform variant plugin.
+   */
+  public function testWebformVariant() {
+    $this->drupalLogin($this->rootUser);
+
+    /**************************************************************************/
+    // Off-canvas width.
+    /**************************************************************************/
+
+    // Check add off-canvas element width is 800.
+    $this->drupalGet('/admin/structure/webform/manage/test_variant/variants/add');
+    $this->assertCssSelect('[href$="/admin/structure/webform/manage/test_variant/variants/add/test_offcanvas_width"][data-dialog-options*="800"]');
+    $this->assertNoCssSelect('[href$="/admin/structure/webform/manage/test_variant/variants/add/test_offcanvas_width"][data-dialog-options*="550"]');
+
+    // Add variant.
+    $this->drupalPostForm('/admin/structure/webform/manage/test_variant/variants/add/test_offcanvas_width', ['variant_id' => 'test_offcanvas_width', 'label' => 'test_offcanvas_width'], 'Save');
+
+    // Check edit off-canvas element width is 800.
+    $this->drupalGet('/admin/structure/webform/manage/test_variant/variants/');
+    $this->assertCssSelect('[href$="/admin/structure/webform/manage/test_variant/variants/test_offcanvas_width/edit"][data-dialog-options*="800"]');
+    $this->assertNoCssSelect('[href$="/admin/structure/webform/manage/test_variant/variants/test_offcanvas_width/edit"][data-dialog-options*="550"]');
+  }
+
+}
diff --git a/web/modules/webform/tests/src/Functional/WebformBrowserTestBase.php b/web/modules/webform/tests/src/Functional/WebformBrowserTestBase.php
index 72608c7e19..bd8fcaedba 100644
--- a/web/modules/webform/tests/src/Functional/WebformBrowserTestBase.php
+++ b/web/modules/webform/tests/src/Functional/WebformBrowserTestBase.php
@@ -17,12 +17,11 @@ abstract class WebformBrowserTestBase extends BrowserTestBase {
   use WebformAssertLegacyTrait;
 
   /**
-   * Set default theme to classy.
+   * Set default theme to stable.
    *
    * @var string
-   * @see https://www.drupal.org/node/3083055
    */
-  protected $defaultTheme = 'classy';
+  protected $defaultTheme = 'stable';
 
   /**
    * Modules to enable.
diff --git a/web/modules/webform/tests/src/Functional/WebformBrowserTestBaseTest.php b/web/modules/webform/tests/src/Functional/WebformBrowserTestBaseTest.php
index c405aed885..0ec878cbf1 100644
--- a/web/modules/webform/tests/src/Functional/WebformBrowserTestBaseTest.php
+++ b/web/modules/webform/tests/src/Functional/WebformBrowserTestBaseTest.php
@@ -73,9 +73,9 @@ public function testWebformBase() {
     // Check place blocks.
     $this->placeBlocks();
     $this->drupalGet('/webform/contact');
-    $this->assertRaw('block-system-breadcrumb-block');
-    $this->assertRaw('block-page-title-block');
-    $this->assertRaw('block-local-tasks-block');
+    $this->assertRaw('<h1>Contact</h1>');
+    $this->assertRaw('<h2 id="system-breadcrumb" class="visually-hidden">Breadcrumb</h2>');
+    $this->assertRaw('<h2 class="visually-hidden">Primary tabs</h2>');
   }
 
 }
diff --git a/web/modules/webform/tests/src/Functional/WebformEmailProviderTest.php b/web/modules/webform/tests/src/Functional/WebformEmailProviderTest.php
index 1b477df7ef..6696ffa07e 100644
--- a/web/modules/webform/tests/src/Functional/WebformEmailProviderTest.php
+++ b/web/modules/webform/tests/src/Functional/WebformEmailProviderTest.php
@@ -27,7 +27,7 @@ public function testEmailProvider() {
     // Check Default PHP mailer is enabled because we manually changed the
     // system.mail configuration.
     $this->drupalGet('/admin/reports/status');
-    $this->assertRaw('Provided by php_mail mail plugin.');
+    $this->assertRaw('Provided by the php_mail mail plugin.');
     $this->assertNoRaw("Webform PHP mailer: Sends the message as plain text or HTML, using PHP's native mail() function.");
     $this->assertRaw('Default PHP mailer: Sends the message as plain text, using PHP\'s native mail() function.');
 
diff --git a/web/modules/webform/tests/src/Functional/WebformEntityTranslationTest.php b/web/modules/webform/tests/src/Functional/WebformEntityTranslationTest.php
index 3196a787a0..f4d1c09a3d 100644
--- a/web/modules/webform/tests/src/Functional/WebformEntityTranslationTest.php
+++ b/web/modules/webform/tests/src/Functional/WebformEntityTranslationTest.php
@@ -122,7 +122,7 @@ public function testTranslate() {
 
     // Check default elements.
     $this->drupalGet('/admin/structure/webform/manage/test_translation/translate/fr/add');
-    $this->assertRaw('<textarea lang="fr" data-drupal-selector="edit-translation-config-names-webformwebformtest-translation-elements" aria-describedby="edit-translation-config-names-webformwebformtest-translation-elements--description" class="js-webform-codemirror webform-codemirror yaml form-textarea resize-vertical" data-webform-codemirror-mode="text/x-yaml" id="edit-translation-config-names-webformwebformtest-translation-elements" name="translation[config_names][webform.webform.test_translation][elements]" rows="48" cols="60">textfield:
+    $this->assertRaw('<textarea lang="fr" data-drupal-selector="edit-translation-config-names-webformwebformtest-translation-elements" aria-describedby="edit-translation-config-names-webformwebformtest-translation-elements--description" class="js-webform-codemirror webform-codemirror yaml form-textarea" data-webform-codemirror-mode="text/x-yaml" id="edit-translation-config-names-webformwebformtest-translation-elements" name="translation[config_names][webform.webform.test_translation][elements]" rows="48" cols="60">textfield:
   &#039;#title&#039;: &#039;Text field&#039;
 select_options:
   &#039;#title&#039;: &#039;Select (options)&#039;
diff --git a/web/modules/webform/tests/src/Functional/WebformHelpTest.php b/web/modules/webform/tests/src/Functional/WebformHelpTest.php
index 7e483e8f4e..dc30890431 100644
--- a/web/modules/webform/tests/src/Functional/WebformHelpTest.php
+++ b/web/modules/webform/tests/src/Functional/WebformHelpTest.php
@@ -53,7 +53,7 @@ public function testHelp() {
 
     // Check that help is enabled.
     $this->drupalGet('/admin/structure/webform/config/advanced');
-    $this->assertRaw('block block-help block-help-block');
+    $this->assertPattern('#<div id="block-[^"]+" role="complementary">#');
     $this->assertRaw('The <strong>Advanced configuration</strong> page allows an administrator to enable/disable UI behaviors, manage requirements and define data used for testing webforms.');
 
     // Disable help via the UI which will clear the cached help block.
@@ -61,7 +61,7 @@ public function testHelp() {
 
     // Check that help is disabled.
     $this->drupalGet('/admin/structure/webform/config/advanced');
-    $this->assertNoRaw('block block-help block-help-block');
+    $this->assertNoPattern('#<div id="block-[^"]+" role="complementary">#');
     $this->assertNoRaw('The <strong>Advanced configuration</strong> page allows an administrator to enable/disable UI behaviors, manage requirements and define data used for testing webforms.');
 
   }
diff --git a/web/modules/webform/tests/src/Functional/WebformLibrariesTest.php b/web/modules/webform/tests/src/Functional/WebformLibrariesTest.php
index e92a4f26b6..8376a52007 100644
--- a/web/modules/webform/tests/src/Functional/WebformLibrariesTest.php
+++ b/web/modules/webform/tests/src/Functional/WebformLibrariesTest.php
@@ -37,7 +37,7 @@ public function testLibraries() {
 
     $this->drupalLogin($this->rootUser);
 
-    // Enable choices and jquery.chosen
+    // Enable choices and jquery.chosen.
     $edit = [
       'excluded_libraries[choices]' => TRUE,
       'excluded_libraries[jquery.chosen]' => TRUE,
diff --git a/web/modules/webform/tests/src/Functional/WebformRenderingTest.php b/web/modules/webform/tests/src/Functional/WebformRenderingTest.php
index 81f324445b..b0aa405a3e 100644
--- a/web/modules/webform/tests/src/Functional/WebformRenderingTest.php
+++ b/web/modules/webform/tests/src/Functional/WebformRenderingTest.php
@@ -108,7 +108,7 @@ public function testRendering() {
     $this->drupalGet("admin/structure/webform/manage/test_rendering/submission/$sid");
 
     // Check submission label token replacements.
-    $this->assertRaw('<h1 class="page-title">submission &lt;em&gt;label&lt;/em&gt; (&amp;&gt;&lt;#)</h1>');
+    $this->assertRaw('<h1>submission &lt;em&gt;label&lt;/em&gt; (&amp;&gt;&lt;#)</h1>');
   }
 
 }
diff --git a/web/modules/webform/tests/src/Functional/WebformSubmissionViewsTest.php b/web/modules/webform/tests/src/Functional/WebformSubmissionViewsTest.php
index f68f8f421b..ced9e8d877 100644
--- a/web/modules/webform/tests/src/Functional/WebformSubmissionViewsTest.php
+++ b/web/modules/webform/tests/src/Functional/WebformSubmissionViewsTest.php
@@ -11,6 +11,13 @@
  */
 class WebformSubmissionViewsTest extends WebformBrowserTestBase {
 
+  /**
+   * Set default theme to classy to have view specific classes.
+   *
+   * @var string
+   */
+  protected $defaultTheme = 'classy';
+
   /**
    * Modules to enable.
    *
diff --git a/web/modules/webform/tests/src/Functional/WebformThirdPartySettingsTest.php b/web/modules/webform/tests/src/Functional/WebformThirdPartySettingsTest.php
index b11b71c33a..38a15a50fc 100644
--- a/web/modules/webform/tests/src/Functional/WebformThirdPartySettingsTest.php
+++ b/web/modules/webform/tests/src/Functional/WebformThirdPartySettingsTest.php
@@ -88,6 +88,23 @@ public function testThirdPartySettings() {
     $webform = $this->reloadWebform('contact');
     $this->assertTrue($webform->getThirdPartySetting('honeypot', 'honeypot'));
 
+    // Check 'Check 'Contact: Settings: Third party' is not null.
+    $this->assertNotNull(
+      $this->config('webform.webform.contact')->get('third_party_settings.webform_test_third_party_settings')
+    );
+
+    // Check clearing 'Check 'Contact: Settings: Third party' message
+    // sets the value to null.
+    $edit = [
+      'third_party_settings[webform_test_third_party_settings][message]' => '',
+    ];
+    $this->drupalPostForm('/admin/structure/webform/manage/contact/settings', $edit, 'Save');
+    $webform = $this->reloadWebform('contact');
+    $this->assertEqual([], $webform->getThirdPartySettings('webform_test_third_party_settings'));
+    $this->assertNull(
+      $this->config('webform.webform.contact')->get('third_party_settings.webform_test_third_party_settings')
+    );
+
     // Uninstall test third party settings module.
     $this->drupalPostForm('admin/modules/uninstall', [
       'uninstall[webform_test_third_party_settings]' => TRUE,
diff --git a/web/modules/webform/tests/src/Functional/Wizard/WebformWizardAdvancedTest.php b/web/modules/webform/tests/src/Functional/Wizard/WebformWizardAdvancedTest.php
index 72b08bc888..5faec55879 100644
--- a/web/modules/webform/tests/src/Functional/Wizard/WebformWizardAdvancedTest.php
+++ b/web/modules/webform/tests/src/Functional/Wizard/WebformWizardAdvancedTest.php
@@ -159,7 +159,7 @@ public function testAdvancedWizard() {
     $this->assertRaw('<a href="mailto:janesmith@example.com">janesmith@example.com</a>');
     $this->assertRaw('<label>Phone</label>');
     $this->assertRaw('<a href="tel:111-111-1111">111-111-1111</a>');
-    $this->assertRaw('<div class="webform-element webform-element-type-textarea js-form-item form-item js-form-type-item form-type-item js-form-item-comments form-item-comments form-no-label" id="test_form_wizard_advanced--comments">');
+    $this->assertRaw('<div class="webform-element webform-element-type-textarea js-form-item form-item js-form-type-item form-item-comments js-form-item-comments form-no-label" id="test_form_wizard_advanced--comments">');
     $this->assertRaw('This is working fine.');
 
     // Submit the webform.
diff --git a/web/modules/webform/tests/src/FunctionalJavascript/Element/WebformElementCheckboxesJavaScriptTest.php b/web/modules/webform/tests/src/FunctionalJavascript/Element/WebformElementCheckboxesJavaScriptTest.php
index 7eba773e9e..ac201efe08 100644
--- a/web/modules/webform/tests/src/FunctionalJavascript/Element/WebformElementCheckboxesJavaScriptTest.php
+++ b/web/modules/webform/tests/src/FunctionalJavascript/Element/WebformElementCheckboxesJavaScriptTest.php
@@ -49,28 +49,15 @@ public function testCheckboxesAllNone() {
 
     // Check that checking 'none' disables all checkboxes.
     $this->click('#edit-checkboxes-none-none');
-    $assert_session->fieldDisabled('edit-checkboxes-none-one');
     $assert_session->checkboxNotChecked('edit-checkboxes-none-one');
-    $assert_session->fieldDisabled('edit-checkboxes-none-two');
     $assert_session->checkboxNotChecked('edit-checkboxes-none-two');
-    $assert_session->fieldDisabled('edit-checkboxes-none-three');
     $assert_session->checkboxNotChecked('edit-checkboxes-none-three');
 
-    // Check that unchecking 'none' enables all checkboxes.
-    $this->click('#edit-checkboxes-none-none');
-    $assert_session->fieldEnabled('edit-checkboxes-none-one');
-    $assert_session->fieldEnabled('edit-checkboxes-none-two');
-    $assert_session->fieldEnabled('edit-checkboxes-none-three');
-
     // Check the 'all' and 'none' work together.
     $this->click('#edit-checkboxes-both-none');
-    $assert_session->fieldDisabled('edit-checkboxes-both-one');
     $assert_session->checkboxNotChecked('edit-checkboxes-both-one');
-    $assert_session->fieldDisabled('edit-checkboxes-both-two');
     $assert_session->checkboxNotChecked('edit-checkboxes-both-two');
-    $assert_session->fieldDisabled('edit-checkboxes-both-three');
     $assert_session->checkboxNotChecked('edit-checkboxes-both-three');
-    $assert_session->fieldDisabled('edit-checkboxes-both-all');
     $assert_session->checkboxNotChecked('edit-checkboxes-both-all');
 
     $this->click('#edit-checkboxes-both-none');
diff --git a/web/modules/webform/tests/src/FunctionalJavascript/States/WebformStatesCustomJavaScriptTest.php b/web/modules/webform/tests/src/FunctionalJavascript/States/WebformStatesCustomJavaScriptTest.php
index 1fe3c6c9ea..b6f07d7827 100644
--- a/web/modules/webform/tests/src/FunctionalJavascript/States/WebformStatesCustomJavaScriptTest.php
+++ b/web/modules/webform/tests/src/FunctionalJavascript/States/WebformStatesCustomJavaScriptTest.php
@@ -77,6 +77,22 @@ public function testCustomStates() {
     $page->fillField('edit-trigger-less', '11');
     $this->assertFalse($dependent_less->isVisible());
 
+    /**************************************************************************/
+    // Less/Equal (<= 10).
+    /**************************************************************************/
+
+    // Check less dependent is not visible.
+    $dependent_less_equal = $page->findField('edit-dependent-less-equal');
+    $this->assertFalse($dependent_less_equal->isVisible());
+
+    // Check less dependent is visible.
+    $page->fillField('edit-trigger-less-equal', '10');
+    $this->assertTrue($dependent_less_equal->isVisible());
+
+    // Check less dependent is not visible.
+    $page->fillField('edit-trigger-less-equal', '11');
+    $this->assertFalse($dependent_less_equal->isVisible());
+
     /**************************************************************************/
     // Greater (> 10).
     /**************************************************************************/
@@ -93,29 +109,51 @@ public function testCustomStates() {
     $page->fillField('edit-trigger-greater', '5');
     $this->assertFalse($dependent_greater->isVisible());
 
+    /**************************************************************************/
+    // Greater/Equal (> 10).
+    /**************************************************************************/
+
+    // Check greater dependent is not visible.
+    $dependent_greater_equal = $page->findField('edit-dependent-greater-equal');
+    $this->assertFalse($dependent_greater_equal->isVisible());
+
+    // Check greater dependent is visible.
+    $page->fillField('edit-trigger-greater-equal', '10');
+    $this->assertTrue($dependent_greater_equal->isVisible());
+
+    // Check greater dependent is not visible.
+    $page->fillField('edit-trigger-greater-equal', '5');
+    $this->assertFalse($dependent_greater_equal->isVisible());
+
     /**************************************************************************/
     // Between (10 > & < 20).
     /**************************************************************************/
 
     // Check between dependent is not visible.
     $dependent_between = $page->findField('edit-dependent-between');
+    $dependent_not_between = $page->findField('edit-dependent-not-between');
     $this->assertFalse($dependent_between->isVisible());
+    $this->assertFalse($dependent_not_between->isVisible());
 
     // Check between dependent is visible.
     $page->fillField('edit-trigger-between', '11');
     $this->assertTrue($dependent_between->isVisible());
+    $this->assertFalse($dependent_not_between->isVisible());
 
     // Check between dependent is not visible.
     $page->fillField('edit-trigger-between', '5');
     $this->assertFalse($dependent_between->isVisible());
+    $this->assertTrue($dependent_not_between->isVisible());
 
     // Check between dependent is not visible.
     $page->fillField('edit-trigger-between', '');
     $this->assertFalse($dependent_between->isVisible());
+    $this->assertFalse($dependent_not_between->isVisible());
 
     // Check between dependent is not visible.
     $page->fillField('edit-trigger-between', '21');
     $this->assertFalse($dependent_between->isVisible());
+    $this->assertTrue($dependent_not_between->isVisible());
   }
 
 }
diff --git a/web/modules/webform/tests/src/FunctionalJavascript/States/WebformStatesRequiredJavaScriptTest.php b/web/modules/webform/tests/src/FunctionalJavascript/States/WebformStatesRequiredJavaScriptTest.php
new file mode 100644
index 0000000000..0c7a16acab
--- /dev/null
+++ b/web/modules/webform/tests/src/FunctionalJavascript/States/WebformStatesRequiredJavaScriptTest.php
@@ -0,0 +1,160 @@
+<?php
+
+namespace Drupal\Tests\webform\FunctionalJavascript\States;
+
+use Drupal\Tests\webform\FunctionalJavascript\WebformWebDriverTestBase;
+
+/**
+ * Tests for webform (custom) #states required logic.
+ *
+ * @group webform_javascript
+ */
+class WebformStatesRequiredJavaScriptTest extends WebformWebDriverTestBase {
+
+  /**
+   * Modules to enable.
+   *
+   * @var array
+   */
+  public static $modules = ['webform', 'webform_clientside_validation', 'file'];
+
+  /**
+   * Webforms to load.
+   *
+   * @var array
+   */
+  protected static $testWebforms = [
+    'test_states_client_required',
+  ];
+
+  /**
+   * Tests webform (custom) #states required logic.
+   */
+  public function testRequiredState() {
+    // @todo Fix random test failure that can't be reproduced locally.
+    // My best guess is a different version of the clientside_validation.module
+    // is being enabled via DrupalCI.
+    $this->assert(TRUE);
+    return;
+
+    $session = $this->getSession();
+    $page = $session->getPage();
+
+    /**************************************************************************/
+
+    $this->drupalGet('/webform/test_states_client_required');
+
+    // Check that all of the static radios are required.
+    $this->assertCssSelect('#edit-radios-static-one[required]');
+    $this->assertCssSelect('#edit-radios-static-two[required]');
+    $this->assertCssSelect('#edit-radios-static-three[required]');
+
+    // Check that all of the static radios has required message.
+    $this->assertCssSelect('#edit-radios-static-one[data-msg-required="radios_static field is required."]');
+    $this->assertCssSelect('#edit-radios-static-two[data-msg-required="radios_static field is required."]');
+    $this->assertCssSelect('#edit-radios-static-three[data-msg-required="radios_static field is required."]');
+
+    // Check that all of the static radios other are required.
+    $this->assertCssSelect('#edit-radios-other-static-radios-one[required]');
+    $this->assertCssSelect('#edit-radios-other-static-radios-two[required]');
+    $this->assertCssSelect('#edit-radios-other-static-radios-three[required]');
+
+    // Check that only the first static checkbox is required.
+    $this->assertCssSelect('#edit-checkboxes-static-one[required]');
+    $this->assertNoCssSelect('#edit-checkboxes-static-two[required]');
+    $this->assertNoCssSelect('#edit-checkboxes-static-three[required]');
+
+    // Check that only the first static checkboxes has require message.
+    $this->assertCssSelect('#edit-checkboxes-static-one[data-msg-required="checkboxes_static field is required."]');
+    $this->assertNoCssSelect('#edit-checkboxes-static-two[data-msg-required="checkboxes_static field is required."]');
+    $this->assertNoCssSelect('#edit-checkboxes-static-three[data-msg-required="checkboxes_static field is required."]');
+
+    // Check that only the first static checkboxes is required.
+    $this->assertCssSelect('#edit-checkboxes-other-static-checkboxes-one[required]');
+    $this->assertNoCssSelect('#edit-checkboxes-other-static-checkboxes--two[required]');
+    $this->assertNoCssSelect('#edit-checkboxes-other-static-checkboxes--three[required]');
+
+    // Check that file upload is not required.
+    $this->assertNoCssSelect('#edit-managed-file-upload[required]');
+
+    // Check that radios and checkboxes fieldset wrapper is not required.
+    $this->assertNoCssSelect('[data-drupal-selector="edit-radios"] .fieldset-legend.js-form-required.form-required');
+    $this->assertNoCssSelect('[data-drupal-selector="edit-checkboxes"] .fieldset-legend.js-form-required.form-required');
+
+    // Check that none of the radios are required.
+    $this->assertNoCssSelect('#edit-radios-one[required]');
+    $this->assertNoCssSelect('#edit-radios-two[required]');
+    $this->assertNoCssSelect('#edit-radios-three[required]');
+
+    // Check that none of the checkboxes are required.
+    $this->assertNoCssSelect('#edit-checkboxes-one[required]');
+    $this->assertNoCssSelect('#edit-checkboxes-two[required]');
+    $this->assertNoCssSelect('#edit-checkboxes-three[required]');
+
+    // Check select other is not required.
+    $this->assertNoCssSelect('#edit-select-other-select[required]');
+
+    // Trigger the required state for all elements.
+    $page->checkField('trigger');
+
+    // Check that file upload is required.
+    $this->assertCssSelect('#edit-managed-file-upload[required]');
+
+    // Check that radios and checkbox fieldset wrapper is required.
+    $this->assertCssSelect('[data-drupal-selector="edit-radios"] .fieldset-legend.js-form-required.form-required');
+    $this->assertCssSelect('[data-drupal-selector="edit-checkboxes"] .fieldset-legend.js-form-required.form-required');
+
+    // Check that all of the radios are required.
+    $this->assertCssSelect('#edit-radios-one[required]');
+    $this->assertCssSelect('#edit-radios-two[required]');
+    $this->assertCssSelect('#edit-radios-three[required]');
+
+    // Check that all of the radios has required message.
+    $this->assertCssSelect('#edit-radios-one[data-msg-required="radios field is required."]');
+    $this->assertCssSelect('#edit-radios-two[data-msg-required="radios field is required."]');
+    $this->assertCssSelect('#edit-radios-three[data-msg-required="radios field is required."]');
+
+    // Check that all of the radios other are required.
+    $this->assertCssSelect('#edit-radios-other-radios-one[required]');
+    $this->assertCssSelect('#edit-radios-other-radios-two[required]');
+    $this->assertCssSelect('#edit-radios-other-radios-three[required]');
+
+    // Check that only the first checkbox is required.
+    $this->assertCssSelect('#edit-checkboxes-one[required]');
+    $this->assertNoCssSelect('#edit-checkboxes-two[required]');
+    $this->assertNoCssSelect('#edit-checkboxes-three[required]');
+
+    // Check that only the first checkbox has require message.
+    $this->assertCssSelect('#edit-checkboxes-one[data-msg-required="checkboxes field is required."]');
+    $this->assertNoCssSelect('#edit-checkboxes-two[data-msg-required="checkboxes field is required."]');
+    $this->assertNoCssSelect('#edit-checkboxes-three[data-msg-required="checkboxes field is required."]');
+
+    // Check that only the first checkbox other is required.
+    $this->assertCssSelect('#edit-checkboxes-other-checkboxes-one[required]');
+    $this->assertNoCssSelect('#edit-checkboxes-other-checkboxes-two[required]');
+    $this->assertNoCssSelect('#edit-checkboxes-other-checkboxes-three[required]');
+
+    // Check select other is required.
+    $this->assertCssSelect('#edit-select-other-select[required]');
+
+    // Check select other label without [for] attribute is required.
+    $this->assertNoCssSelect('#edit-select-other-form-element > label[for]');
+    $this->assertCssSelect('#edit-select-other-form-element > label.js-form-required.form-required');
+
+    // Check that fieldsets are never required.
+    $this->assertNoCssSelect('fieldset#edit-fieldset[required]');
+
+    // Check checking the first checkbox removes the [required] attribute.
+    $page->checkField('edit-checkboxes-one');
+    $this->assertNoCssSelect('#edit-checkboxes-one[required]');
+
+    // Check unchecking the first checkbox restores the [required] attribute.
+    $page->uncheckField('edit-checkboxes-one');
+    $this->assertCssSelect('#edit-checkboxes-one[required]');
+
+    // Check checking the first checkbox removes the [required] attribute.
+    $page->checkField('edit-checkboxes-two');
+    $this->assertNoCssSelect('#edit-checkboxes-one[required]');
+  }
+
+}
diff --git a/web/modules/webform/tests/src/FunctionalJavascript/Variant/WebformVariantRandomizeJavaScriptTest.php b/web/modules/webform/tests/src/FunctionalJavascript/Variant/WebformVariantRandomizeJavaScriptTest.php
new file mode 100644
index 0000000000..ab4127e2c5
--- /dev/null
+++ b/web/modules/webform/tests/src/FunctionalJavascript/Variant/WebformVariantRandomizeJavaScriptTest.php
@@ -0,0 +1,75 @@
+<?php
+
+namespace Drupal\Tests\webform\FunctionalJavascript\Variant;
+
+use Drupal\Tests\webform\FunctionalJavascript\WebformWebDriverTestBase;
+use Drupal\webform\Entity\Webform;
+
+/**
+ * Tests for the webform variant randomize.
+ *
+ * @group webform
+ */
+class WebformVariantRandomizeJavaScriptTest extends WebformWebDriverTestBase {
+
+  /**
+   * Webforms to load.
+   *
+   * @var array
+   */
+  protected static $testWebforms = ['test_variant_randomize'];
+
+  /**
+   * Gets the persisted variant from the current browsing session.
+   *
+   * @return string|null
+   *   The persisted variant id or NULL if one is not persisted.
+   */
+  protected function getSavedVariantId() {
+    $script = <<<JS
+(function() {
+  var key = 'Drupal.webform.test_variant_randomize.variant.letter';
+  return window.sessionStorage.getItem(key);
+})();
+JS;
+    return $this->getSession()->evaluateScript($script);
+  }
+
+  /**
+   * Test variant randomize.
+   */
+  public function testVariantRandomize() {
+    $webform = Webform::load('test_variant_randomize');
+
+    $this->drupalGet('/webform/test_variant_randomize');
+
+    // Check that either 'a' or 'b' is persisted.
+    $saved_variant = $this->getSavedVariantId();
+    $this->assertContains($saved_variant, ['a', 'b']);
+
+    // Disable the variant that is saved in the client session.
+    /** @var \Drupal\webform\Plugin\WebformVariantInterface $variant_plugin */
+    $variant_plugin = $webform->getVariant($saved_variant);
+    $variant_plugin->disable();
+    $webform->save();
+
+    // Check that the disabled variant is no longer persisted, but rather
+    // that the remaining variant is instead.
+    $this->drupalGet('/webform/test_variant_randomize');
+    $new_saved_variant = $this->getSavedVariantId();
+    $this->assertContains($new_saved_variant, ['a', 'b']);
+    $this->assertNotEqual($saved_variant, $new_saved_variant);
+
+    // Disable the other variant.
+    /** @var \Drupal\webform\Plugin\WebformVariantInterface $variant_plugin */
+    $variant_plugin = $webform->getVariant($new_saved_variant);
+    $variant_plugin->disable();
+    $webform->save();
+
+    // Check that no variant is now persisted.
+    $this->drupalGet('/webform/test_variant_randomize');
+    $null_variant = $this->getSavedVariantId();
+    $this->assertNull($null_variant);
+  }
+
+}
diff --git a/web/modules/webform/tests/src/FunctionalJavascript/WebformWebDriverTestBase.php b/web/modules/webform/tests/src/FunctionalJavascript/WebformWebDriverTestBase.php
index 91ab85f4a5..10cef94b06 100644
--- a/web/modules/webform/tests/src/FunctionalJavascript/WebformWebDriverTestBase.php
+++ b/web/modules/webform/tests/src/FunctionalJavascript/WebformWebDriverTestBase.php
@@ -6,6 +6,7 @@
 use Drupal\FunctionalJavascriptTests\WebDriverTestBase;
 use Drupal\Tests\webform\Traits\WebformBrowserTestTrait;
 use Drupal\Tests\webform\Traits\WebformAssertLegacyTrait;
+use Drupal\Tests\webform\Traits\WebformWebDriverTestTrait;
 
 /**
  * Defines an abstract test base for webform JavaScript tests.
@@ -15,6 +16,7 @@ abstract class WebformWebDriverTestBase extends WebDriverTestBase {
   use AssertMailTrait;
   use WebformBrowserTestTrait;
   use WebformAssertLegacyTrait;
+  use WebformWebDriverTestTrait;
 
   /**
    * Set default theme to classy.
diff --git a/web/modules/webform/tests/src/Kernel/Breadcrumb/WebformBreadcrumbBuilderTest.php b/web/modules/webform/tests/src/Kernel/Breadcrumb/WebformBreadcrumbBuilderTest.php
index 7b93a3405d..90681c4bb3 100644
--- a/web/modules/webform/tests/src/Kernel/Breadcrumb/WebformBreadcrumbBuilderTest.php
+++ b/web/modules/webform/tests/src/Kernel/Breadcrumb/WebformBreadcrumbBuilderTest.php
@@ -27,6 +27,13 @@ class WebformBreadcrumbBuilderTest extends UnitTestCase {
    */
   protected $moduleHandler;
 
+  /**
+   * The config factory.
+   *
+   * @var \Drupal\Core\Config\ConfigFactory
+   */
+  protected $configFactory;
+
   /**
    * The webform request handler.
    *
@@ -107,12 +114,15 @@ protected function setUp() {
 
     // Make some test doubles.
     $this->moduleHandler = $this->createMock('Drupal\Core\Extension\ModuleHandlerInterface');
+    $this->configFactory = $this->getConfigFactoryStub([
+      'webform.settings' => ['ui' => ['toolbar_item' => FALSE]],
+    ]);
     $this->requestHandler = $this->createMock('Drupal\webform\WebformRequestInterface');
     $this->translationManager = $this->createMock('Drupal\Core\StringTranslation\TranslationInterface');
 
     // Make an object to test.
     $this->breadcrumbBuilder = $this->getMockBuilder('Drupal\webform\Breadcrumb\WebformBreadcrumbBuilder')
-      ->setConstructorArgs([$this->moduleHandler, $this->requestHandler, $this->translationManager])
+      ->setConstructorArgs([$this->moduleHandler, $this->requestHandler, $this->translationManager, $this->configFactory])
       ->setMethods(NULL)
       ->getMock();
 
diff --git a/web/modules/webform/tests/src/Traits/WebformSubmissionViewAccessTrait.php b/web/modules/webform/tests/src/Traits/WebformSubmissionViewAccessTrait.php
index 07fee863bd..d07966a710 100644
--- a/web/modules/webform/tests/src/Traits/WebformSubmissionViewAccessTrait.php
+++ b/web/modules/webform/tests/src/Traits/WebformSubmissionViewAccessTrait.php
@@ -41,7 +41,7 @@ protected function checkUserSubmissionAccess(WebformInterface $webform, array $a
       $this->drupalGet('/admin/structure/webform/test/views_access');
 
       $views_sids = [];
-      foreach ($this->cssSelect('.view .view-content tbody .views-field-sid') as $node) {
+      foreach ($this->cssSelect('td.views-field-sid') as $node) {
         $views_sids[] = $node->getText();
       }
       sort($views_sids);
diff --git a/web/modules/webform/tests/src/Traits/WebformWebDriverTestTrait.php b/web/modules/webform/tests/src/Traits/WebformWebDriverTestTrait.php
new file mode 100644
index 0000000000..0d11bf299d
--- /dev/null
+++ b/web/modules/webform/tests/src/Traits/WebformWebDriverTestTrait.php
@@ -0,0 +1,28 @@
+<?php
+
+namespace Drupal\Tests\webform\Traits;
+
+use Drupal\Component\Serialization\Json;
+
+/**
+ * Provides convenience methods for webform assertions in browser tests.
+ */
+trait WebformWebDriverTestTrait {
+
+  /**
+   * Execute jQuery event.
+   *
+   * @param string $selector
+   *   Selector to trigger the event on.
+   * @param string $event_type
+   *   The event type.
+   * @param array $event_options
+   *   The event options.
+   */
+  public function executeJqueryEvent($selector, $event_type, array $event_options = []) {
+    $event_options = Json::encode($event_options);
+    $script = "jQuery('$selector').trigger(jQuery.Event('$event_type', $event_options));";
+    $this->getSession()->executeScript($script);
+  }
+
+}
diff --git a/web/modules/webform/tests/src/Unit/Access/WebformSubmissionAccessTest.php b/web/modules/webform/tests/src/Unit/Access/WebformSubmissionAccessTest.php
index 056c4dc1f4..227c8d689d 100644
--- a/web/modules/webform/tests/src/Unit/Access/WebformSubmissionAccessTest.php
+++ b/web/modules/webform/tests/src/Unit/Access/WebformSubmissionAccessTest.php
@@ -3,6 +3,7 @@
 namespace Drupal\Tests\webform\Unit\Access;
 
 use Drupal\Core\Access\AccessResult;
+use Drupal\Core\DependencyInjection\ContainerBuilder;
 use Drupal\webform\Access\WebformSubmissionAccess;
 
 /**
@@ -19,6 +20,17 @@ class WebformSubmissionAccessTest extends WebformAccessTestBase {
    * @covers ::checkWizardPagesAccess
    */
   public function testWebformSubmissionAccess() {
+    // Mock Drupal service container.
+    $this->container = new ContainerBuilder();
+    \Drupal::setContainer($this->container);
+
+    // Mock module handler.
+    $module_handler = $this->createMock('Drupal\Core\Extension\ModuleHandlerInterface');
+    $module_handler->expects($this->any())
+      ->method('moduleExists')
+      ->will($this->returnValue(FALSE));
+    $this->container->set('module_handler', $module_handler);
+
     // Mock anonymous account.
     $anonymous_account = $this->mockAccount();
 
@@ -62,8 +74,8 @@ public function testWebformSubmissionAccess() {
     // Mock webform wizard.
     $webform_wizard = $this->createMock('Drupal\webform\WebformInterface');
     $webform_wizard->expects($this->any())
-      ->method('getElementsRaw')
-      ->will($this->returnValue("'#type': webform_wizard_page"));
+      ->method('hasWizardPages')
+      ->will($this->returnValue(TRUE));
 
     // Mock webform wizard submission.
     $webform_wizard_submission = $this->createMock('Drupal\webform\WebformSubmissionInterface');
diff --git a/web/modules/webform/tests/src/Unit/Utility/WebformOptionsHelperTest.php b/web/modules/webform/tests/src/Unit/Utility/WebformOptionsHelperTest.php
index 802f4f3294..48c519b40f 100644
--- a/web/modules/webform/tests/src/Unit/Utility/WebformOptionsHelperTest.php
+++ b/web/modules/webform/tests/src/Unit/Utility/WebformOptionsHelperTest.php
@@ -42,6 +42,7 @@ public function providerHasOption() {
     $tests[] = ['value', ['value' => 'text'], TRUE];
     $tests[] = ['value', [], FALSE];
     $tests[] = [3, [1 => 'One', 2 => 'Two', 'optgroup' => [3 => 'Three']], TRUE];
+    $tests[] = ['3', [1 => 'One', 2 => 'Two', 'optgroup' => [3 => 'Three']], TRUE];
     $tests[] = ['optgroup', [1 => 'One', 2 => 'Two', 'optgroup' => [3 => 'Three']], FALSE];
     return $tests;
   }
diff --git a/web/modules/webform/tests/src/Unit/Utility/WebformYamlTest.php b/web/modules/webform/tests/src/Unit/Utility/WebformYamlTest.php
index 07ce41e73c..d644b77edf 100644
--- a/web/modules/webform/tests/src/Unit/Utility/WebformYamlTest.php
+++ b/web/modules/webform/tests/src/Unit/Utility/WebformYamlTest.php
@@ -66,7 +66,7 @@ public function providerTidy() {
   }
 
   /**
-   * Tests WebformYaml tidy with WebformYaml::decode().
+   * Tests WebformYaml decode with WebformYaml::decode().
    *
    * @param string $yaml
    *   The string to run through WebformYaml::decode().
@@ -127,4 +127,62 @@ public function providerDecode() {
     return $tests;
   }
 
+  /**
+   * Tests WebformYaml encode with WebformYaml::encode().
+   *
+   * @param string $yaml
+   *   The string to run through WebformYaml::encode().
+   * @param string $expected
+   *   The expected result from calling the function.
+   *
+   * @see WebformYaml::encode()
+   *
+   * @dataProvider providerEncode
+   */
+  public function testEncdoe($yaml, $expected) {
+    $result = WebformYaml::encode($yaml);
+    $this->assertEquals($expected, $result);
+  }
+
+  /**
+   * Data provider for testEncode().
+   *
+   * @see testEncode()
+   */
+  public function providerEncode() {
+    $tests[] = [
+      ['simple' => 'value'],
+      "simple: value",
+    ];
+    $tests[] = [
+      ['returns' => "line 1\nline 2"],
+      "returns: |\n  line 1\n  line 2",
+    ];
+    $tests[] = [
+      ['one two' => "line 1\nline 2"],
+      "'one two': |\n  line 1\n  line 2",
+    ];
+    $tests[] = [
+      ['array' => ['one', 'two']],
+      "array:\n  - one\n  - two",
+    ];
+    $tests[] = [
+      [['one' => 'One'], ['two' => 'Two']],
+      "- one: One\n- two: Two",
+    ];
+    $tests[] = [
+      [],
+      '',
+    ];
+    $tests[] = [
+      '',
+      "''",
+    ];
+    $tests[] = [
+      0,
+      '0',
+    ];
+    return $tests;
+  }
+
 }
diff --git a/web/modules/webform/tests/src/Unit/WebformMessageManagerTest.php b/web/modules/webform/tests/src/Unit/WebformMessageManagerTest.php
index 1619af52c3..bfdc8b565a 100644
--- a/web/modules/webform/tests/src/Unit/WebformMessageManagerTest.php
+++ b/web/modules/webform/tests/src/Unit/WebformMessageManagerTest.php
@@ -105,7 +105,7 @@ public function testMessageManager() {
     $token_manager->method('replace')
       ->will($this->returnCallback(function ($text) {
         return $text;
-    }));
+      }));
 
     // Mock Drupal's container.
     $container = new ContainerBuilder();
diff --git a/web/modules/webform/tests/themes/webform_test_bartik/webform_test_bartik.info.yml b/web/modules/webform/tests/themes/webform_test_bartik/webform_test_bartik.info.yml
index 69a6a04857..1c429a49e9 100644
--- a/web/modules/webform/tests/themes/webform_test_bartik/webform_test_bartik.info.yml
+++ b/web/modules/webform/tests/themes/webform_test_bartik/webform_test_bartik.info.yml
@@ -5,7 +5,7 @@ name: 'Webform Bartik test'
 description: 'Support theme for webform Bartik integration testing.'
 package: 'Webform Testing'
 
-# Information added by Drupal.org packaging script on 2020-07-02
-version: '8.x-5.19'
+# Information added by Drupal.org packaging script on 2020-10-05
+version: '8.x-5.22'
 project: 'webform'
-datestamp: 1593681142
+datestamp: 1601919526
diff --git a/web/modules/webform/third_party_settings/webform.antibot.inc b/web/modules/webform/third_party_settings/webform.antibot.inc
index 14db7cf0db..e44288114b 100644
--- a/web/modules/webform/third_party_settings/webform.antibot.inc
+++ b/web/modules/webform/third_party_settings/webform.antibot.inc
@@ -70,7 +70,6 @@ function _webform_antibot_form(array &$form, FormStateInterface $form_state, $an
   }
 
   $form['#validate'][] = '_webform_antibot_form_validate';
-
 }
 
 /**
@@ -81,9 +80,6 @@ function _webform_antibot_form_validate(&$form, FormStateInterface $form_state)
   if ($form_state->get('antibot_disabled') || empty($third_party_settings['antibot']['antibot'])) {
     unset($third_party_settings['antibot']['antibot']);
   }
-  if (empty($third_party_settings['antibot'])) {
-    unset($third_party_settings['antibot']);
-  }
   $form_state->setValue('third_party_settings', $third_party_settings);
 }
 
diff --git a/web/modules/webform/third_party_settings/webform.captcha.inc b/web/modules/webform/third_party_settings/webform.captcha.inc
index e161e3e0ea..be5a3541cb 100644
--- a/web/modules/webform/third_party_settings/webform.captcha.inc
+++ b/web/modules/webform/third_party_settings/webform.captcha.inc
@@ -33,8 +33,7 @@ function captcha_webform_admin_third_party_settings_form_alter(&$form, FormState
     '#type' => 'checkbox',
     '#title' => t('Replace <em>Add CAPTCHA administration links to forms</em> with CAPTCHA webform element'),
     '#description' => t('If checked and <a href=":href">Add CAPTCHA administration links to forms</a> is enabled, the CAPTCHA fieldset added to every form will create a new CAPTCHA webform element instead of tracking each webform\'s id.', $t_args) . '<br/><br/>' .
-      t('It changes the "@from" link label and behavior to "@to"', $t_args)
-    ,
+      t('It changes the "@from" link label and behavior to "@to"', $t_args),
     '#default_value' => $replace_administration_mode,
     '#return_value' => TRUE,
   ];
@@ -66,7 +65,7 @@ function captcha_webform_submission_form_alter(&$form, FormStateInterface $form_
     return;
   }
 
-  // If the webform already has a CAPTCHA point is alread configured, do not
+  // If the webform already has a CAPTCHA point is already configured, do not
   // do anything.
   /* @var \Drupal\captcha\CaptchaPointInterface $captcha_point */
   $captcha_point = \Drupal::entityTypeManager()
@@ -80,7 +79,7 @@ function captcha_webform_submission_form_alter(&$form, FormStateInterface $form_
 }
 
 /**
- * After buld callback to add warning to CAPTCHA placement.
+ * After build callback to add warning to CAPTCHA placement.
  */
 function _captcha_webform_submission_form_after_build(array $form, FormStateInterface $form_state) {
   // Make sure 'Add CAPTCHA administration links to forms' is appended to the
diff --git a/web/modules/webform/third_party_settings/webform.honeypot.inc b/web/modules/webform/third_party_settings/webform.honeypot.inc
index 4c9e90cd90..813b8a81da 100644
--- a/web/modules/webform/third_party_settings/webform.honeypot.inc
+++ b/web/modules/webform/third_party_settings/webform.honeypot.inc
@@ -113,7 +113,6 @@ function _webform_honeypot_form(array &$form, FormStateInterface $form_state, $h
     . '<strong>' . t('Page caching will be disabled when a time restriction is applied to a webform.') . '</strong>';
 
   $form['#validate'][] = '_webform_honeypot_form_validate';
-
 }
 
 /**
@@ -127,9 +126,6 @@ function _webform_honeypot_form_validate(&$form, FormStateInterface $form_state)
   if ($form_state->get('time_restriction_disabled') || empty($third_party_settings['honeypot']['time_restriction'])) {
     unset($third_party_settings['honeypot']['time_restriction']);
   }
-  if (empty($third_party_settings['honeypot'])) {
-    unset($third_party_settings['honeypot']);
-  }
   $form_state->setValue('third_party_settings', $third_party_settings);
 }
 
diff --git a/web/modules/webform/webform.api.php b/web/modules/webform/webform.api.php
index 1d9f00d6d4..b4e98a3a3c 100644
--- a/web/modules/webform/webform.api.php
+++ b/web/modules/webform/webform.api.php
@@ -509,7 +509,7 @@ function hook_webform_libraries_info_alter(&$libraries) {
  *   - message_id: (string) Optional message ID that will be supplied into
  *     'webform_message' element. You are free to use 'message_*' keys if you
  *     want to additionally display a message when your help is displayed. These
- *     keyes will be supplied into 'webform_message' element. Refer to the docs
+ *     keys will be supplied into 'webform_message' element. Refer to the docs
  *     of this element for their meaning.
  *   - message_type: (string) Will be supplied into 'webform_message' element.
  *   - message_close: (bool) Will be supplied into 'webform_message' element.
@@ -605,8 +605,8 @@ function hook_webform_access_rules() {
     // The below 2 operations can be queried together as following:
     //
     // \Drupal::entityTypeManager()
-    //  ->getAccessControlHandler('webform_submission')
-    //  ->access($webform_submission, 'some_operation', $account);
+    //   ->getAccessControlHandler('webform_submission')
+    //   ->access($webform_submission, 'some_operation', $account);
     //
     // This will return TRUE as long as the $account is has either
     // 'some_operation_any' or has 'some_operation_own' and is author of
diff --git a/web/modules/webform/webform.info.yml b/web/modules/webform/webform.info.yml
index 5b5fe1012d..3e120960a7 100644
--- a/web/modules/webform/webform.info.yml
+++ b/web/modules/webform/webform.info.yml
@@ -8,7 +8,7 @@ dependencies:
   - 'drupal:field'
   - 'drupal:user'
 
-# Information added by Drupal.org packaging script on 2020-07-02
-version: '8.x-5.19'
+# Information added by Drupal.org packaging script on 2020-10-05
+version: '8.x-5.22'
 project: 'webform'
-datestamp: 1593681142
+datestamp: 1601919526
diff --git a/web/modules/webform/webform.libraries.yml b/web/modules/webform/webform.libraries.yml
index f71e976608..821bda4858 100644
--- a/web/modules/webform/webform.libraries.yml
+++ b/web/modules/webform/webform.libraries.yml
@@ -89,6 +89,12 @@ webform.admin.tabledrag:
   dependencies:
     - core/drupal.tabledrag
 
+webform.admin.toolbar:
+  version: VERSION
+  css:
+    theme:
+      css/webform.admin.toolbar.css: {}
+
 webform.admin.translation:
   version: VERSION
   css:
@@ -800,14 +806,6 @@ webform.element.rating:
   dependencies:
     - webform/libraries.jquery.rateit
 
-webform.element.radios:
-  version: VERSION
-  js:
-    js/webform.element.radios.js: {}
-  dependencies:
-    - core/drupal
-    - core/jquery.once
-
 webform.element.roles:
   version: VERSION
   js:
@@ -851,6 +849,7 @@ webform.element.signature:
     js/webform.element.signature.js: {}
   dependencies:
     - core/drupal
+    - core/drupal.debounce
     - webform/libraries.signature_pad
 
 webform.element.states:
@@ -987,17 +986,18 @@ libraries.choices:
       /libraries/choices/public/assets/styles/choices.min.css: { minified: true }
   js:
     /libraries/choices/public/assets/scripts/choices.min.js: { minified: true }
+    'https://polyfill.io/v3/polyfill.min.js?features=es5%2Ces6%2CArray.prototype.includes%2Cfetch%2CCustomEvent%2CElement.prototype.closest%2CElement.prototype.classList': { weight: -1, browsers: { IE: 'lte IE 11'} }
 
 libraries.codemirror.text:
   remote: https://github.com/codemirror/codemirror
-  version: &webform_codemirror_version '5.53.2'
+  version: &webform_codemirror_version '5.57.0'
   license: &webform_codemirror_license
     name: MIT
     url: http://codemirror.net/LICENSE
     gpl-compatible: true
   cdn: &webform_codemirror_cdn
-    /libraries/codemirror/lib/: https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.53.2/
-    /libraries/codemirror/: https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.53.2/
+    /libraries/codemirror/lib/: https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.57.0/
+    /libraries/codemirror/: https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.57.0/
   css:
     component:
       /libraries/codemirror/lib/codemirror.css: {}
@@ -1076,25 +1076,25 @@ libraries.codemirror.twig:
 
 libraries.algolia.places:
   remote: https://github.com/algolia/places
-  version: '1.18.2'
+  version: '1.19.0'
   license:
     name: MIT
     url: https://github.com/algolia/places/blob/master/LICENSE
     gpl-compatible: true
   cdn:
-    /libraries/algolia.places/dist/cdn/: https://cdn.jsdelivr.net/npm/places.js@1.18.2/dist/cdn/
+    /libraries/algolia.places/dist/cdn/: https://cdn.jsdelivr.net/npm/places.js@1.19.0/dist/cdn/
   js:
     /libraries/algolia.places/dist/cdn/places.js: {}
 
 libraries.jquery.inputmask:
   remote: https://github.com/RobinHerbots/jquery.inputmask
-  version: '5.0.3'
+  version: '5.0.5'
   license:
     name: MIT
     url: http://opensource.org/licenses/mit-license.php
     gpl-compatible: true
   cdn:
-    /libraries/jquery.inputmask/: https://cdn.jsdelivr.net/gh/RobinHerbots/Inputmask@5.0.3/
+    /libraries/jquery.inputmask/: https://cdn.jsdelivr.net/gh/RobinHerbots/Inputmask@5.0.5/
   js:
     /libraries/jquery.inputmask/dist/jquery.inputmask.min.js: { minified: true }
   dependencies:
@@ -1186,13 +1186,13 @@ libraries.jquery.textcounter:
 
 libraries.jquery.timepicker:
   remote: https://github.com/jonthornton/jquery-timepicker
-  version: '1.13.10'
+  version: '1.13.14'
   license:
     name: MIT
     url: http://opensource.org/licenses/mit-license.php
     gpl-compatible: true
   cdn:
-    /libraries/jquery.timepicker/: https://cdn.jsdelivr.net/gh/jonthornton/jquery-timepicker@1.13.10/
+    /libraries/jquery.timepicker/: https://cdn.jsdelivr.net/gh/jonthornton/jquery-timepicker@1.13.14/
   css:
     component:
       /libraries/jquery.timepicker/jquery.timepicker.min.css: { minified: true }
diff --git a/web/modules/webform/webform.links.menu.yml b/web/modules/webform/webform.links.menu.yml
index f31ef94d4a..9ef9880533 100644
--- a/web/modules/webform/webform.links.menu.yml
+++ b/web/modules/webform/webform.links.menu.yml
@@ -3,6 +3,7 @@ entity.webform.collection:
   description: 'Create webforms and manage submissions.'
   parent: system.admin_structure
   route_name: entity.webform.collection
+
 webform.reports_plugins:
   title: 'Webform plugins'
   parent: system.admin_reports
diff --git a/web/modules/webform/webform.links.task.yml b/web/modules/webform/webform.links.task.yml
index 3d3e00dcb5..0b2137befb 100644
--- a/web/modules/webform/webform.links.task.yml
+++ b/web/modules/webform/webform.links.task.yml
@@ -109,12 +109,6 @@ webform.help:
   base_route: entity.webform.collection
   weight: 60
 
-webform.help.videos:
-  title: 'Videos'
-  route_name: webform.help
-  parent_id: webform.help
-  weight: 0
-
 # Form
 
 entity.webform.canonical:
diff --git a/web/modules/webform/webform.module b/web/modules/webform/webform.module
index d6d9163b69..af3825ae69 100644
--- a/web/modules/webform/webform.module
+++ b/web/modules/webform/webform.module
@@ -302,10 +302,10 @@ function webform_token_info_alter(&$data) {
   // @see webform_page_attachments()
   $token_suffixes = t('Append the below suffixes to alter the returned value.') .
     '<ul>' .
-    '<li>' . t('<code>:clear</code> to removes token when not replaced.') . '</li>' .
+    '<li>' . t('<code>:clear</code> removes the token when it is not replaced.') . '</li>' .
     '<li>' . t('<code>:urlencode</code> URL encodes returned value.') . '</li>' .
     '<li>' . t('<code>:xmlencode</code> XML encodes returned value.') . '</li>' .
-    '<li>' . t('<code>:htmldecode</code> decodes HTML enities in returned value.') . '<br/><b>' . t('This suffix has security implications.') . '</b><br/>' . t('Use <code>:htmldecode</code> with <code>:striptags</code>.') . '</li>' .
+    '<li>' . t('<code>:htmldecode</code> decodes HTML entities in returned value.') . '<br/><b>' . t('This suffix has security implications.') . '</b><br/>' . t('Use <code>:htmldecode</code> with <code>:striptags</code>.') . '</li>' .
     '<li>' . t('<code>:striptags</code> removes all HTML tags from returned value.') . '</li>' .
   '</ul>';
   $more = _webform_token_render_more(t('Learn about token suffixes'), $token_suffixes);
@@ -472,6 +472,73 @@ function webform_mail_alter(&$message) {
   }
 }
 
+/**
+ * Implements hook_toolbar_alter().
+ */
+function webform_toolbar_alter(&$items) {
+  if (\Drupal::config('webform.settings')->get('ui.toolbar_item')) {
+    $items['administration']['#attached']['library'][] = 'webform/webform.admin.toolbar';
+  }
+}
+
+
+/**
+ * Implements hook_menu_links_discovered_alter().
+ */
+function webform_menu_links_discovered_alter(&$links) {
+  if (\Drupal::config('webform.settings')->get('ui.toolbar_item')) {
+    $links['entity.webform.collection']['parent'] = 'system.admin';
+    $links['entity.webform.collection']['weight'] = -9;
+  }
+
+  // Add webform local tasks as admin menu toolbar menu items.
+  // @see admin_toolbar_tools_menu_links_discovered_alter()
+  if (\Drupal::moduleHandler()->moduleExists('admin_toolbar_tools')) {
+    /** @var \Drupal\Core\Menu\LocalTaskManager $local_task_manager */
+    $local_task_manager = \Drupal::service('plugin.manager.menu.local_task');
+
+    $local_tasks = $local_task_manager->getLocalTasks('entity.webform.collection', 0);
+    foreach ($local_tasks['tabs'] as $local_task) {
+      if (!$local_task['#link']['url'] instanceof Url) {
+        continue;
+      }
+
+      $menu_item_title = $local_task['#link']['title'];
+      $menu_item_route_name = $local_task['#link']['url']->getRouteName();
+      $menu_item_name = $menu_item_route_name . '.item';
+      $links[$menu_item_name] = [
+        'title' => $menu_item_title,
+        'route_name' => $menu_item_route_name,
+        'parent' => 'entity.webform.collection',
+        'weight' => $local_task['#weight'],
+        'provider' => 'webform',
+        'menu_name' => 'admin',
+      ];
+
+      if (\Drupal::config('webform.settings')->get('ui.toolbar_item')) {
+        $local_sub_tasks = $local_task_manager->getLocalTasks($menu_item_route_name, 1);
+        foreach ($local_sub_tasks['tabs'] as $local_sub_task) {
+          if (!$local_task['#link']['url'] instanceof Url) {
+            continue;
+          }
+
+          $menu_sub_item_title = $local_sub_task['#link']['title'];
+          $menu_sub_item_route_name = $local_sub_task['#link']['url']->getRouteName();
+          $menu_sub_item_name = $menu_sub_item_route_name . '.sub_item';
+          $links[$menu_sub_item_name] = [
+            'title' => $menu_sub_item_title,
+            'route_name' => $menu_sub_item_route_name,
+            'parent' => $menu_item_name,
+            'weight' => $local_sub_task['#weight'],
+            'provider' => 'webform',
+            'menu_name' => 'admin',
+          ];
+        }
+      }
+    }
+  }
+}
+
 /**
  * Implements hook_page_attachments().
  */
@@ -579,6 +646,27 @@ function _webform_page_attachments(array &$attachments) {
         if ($variant_plugins->count()) {
           $variants[$element_key] = array_values($variant_plugins->getInstanceIds());
         }
+        else {
+          $attachments['#attached']['html_head'][] = [
+            [
+              '#type' => 'html_tag',
+              '#tag' => 'script',
+              '#value' => Markup::create("
+(function(){
+  try {
+    if (window.sessionStorage) {
+      var key = 'Drupal.webform.{$webform->id()}.variant.{$element_key}';
+      window.sessionStorage.removeItem(key);
+    }
+  }
+  catch(e) {}
+})();
+"),
+              '#weight' => 1000,
+            ],
+            'webform_variant_' . $element_key . '_clear',
+          ];
+        }
       }
     }
 
@@ -592,6 +680,33 @@ function _webform_page_attachments(array &$attachments) {
           '#tag' => 'script',
           '#value' => Markup::create("
 (function(){
+
+  var hasSessionStorage = (function () {
+    try {
+      sessionStorage.setItem('webform', 'webform');
+      sessionStorage.removeItem('webform');
+      return true;
+    }
+    catch (e) {
+      return false;
+    }
+  }());
+
+  function getSessionVariantID(variant_key) {
+    if (hasSessionStorage) {
+      var key = 'Drupal.webform.{$webform->id()}.variant.' + variant_key;
+      return window.sessionStorage.getItem(key);
+    }
+    return null;
+  }
+
+  function setSessionVariantID(variant_key, variant_id) {
+    if (hasSessionStorage) {
+      var key = 'Drupal.webform.{$webform->id()}.variant.' + variant_key;
+      window.sessionStorage.setItem(key, variant_id);
+    }
+  }
+
   var variants = $json_variants;
   var search = location.search;
   var element_key, variant_ids, variant_id;
@@ -599,7 +714,11 @@ function _webform_page_attachments(array &$attachments) {
     if (variants.hasOwnProperty(element_key)
       && !search.match(new RegExp('[?&]' + element_key + '='))) {
         variant_ids = variants[element_key];
-        variant_id = variant_ids[Math.floor(Math.random() * variant_ids.length)];
+        variant_id = getSessionVariantID(element_key);
+        if (!variant_ids.includes(variant_id)) {
+          variant_id = variant_ids[Math.floor(Math.random() * variant_ids.length)];
+          setSessionVariantID(element_key, variant_id);
+        }
         search += (search ? '&' : '?') + element_key + '=' + variant_id;
     }
   }
diff --git a/web/modules/webform/webform.routing.yml b/web/modules/webform/webform.routing.yml
index 377381c991..2e93a74c75 100644
--- a/web/modules/webform/webform.routing.yml
+++ b/web/modules/webform/webform.routing.yml
@@ -625,7 +625,7 @@ webform_submission.multiple_delete_confirm:
   defaults:
     _form: '\Drupal\webform\Form\WebformSubmissionDeleteMultiple'
   requirements:
-    _permission: 'administer webform submission'
+    _permission: 'administer webform submission+delete any webform submission+delete own webform submission'
 
 # Handlers.
 
diff --git a/web/modules/webform/webform.services.yml b/web/modules/webform/webform.services.yml
index 313d08e700..e6bb3890be 100644
--- a/web/modules/webform/webform.services.yml
+++ b/web/modules/webform/webform.services.yml
@@ -43,6 +43,10 @@ services:
   webform.cli_service:
     class: Drupal\webform\Commands\WebformCliService
 
+  webform.conditions_manager:
+    class: Drupal\webform\WebformEntityConditionsManager
+    arguments: ['@plugin.manager.webform.element']
+
   webform.elements_validator:
     class: Drupal\webform\WebformEntityElementsValidator
     arguments: ['@renderer', '@plugin.manager.webform.element', '@entity_type.manager', '@form_builder', '@config.factory']
@@ -107,7 +111,7 @@ services:
 
   webform.breadcrumb:
     class: Drupal\webform\Breadcrumb\WebformBreadcrumbBuilder
-    arguments: ['@module_handler', '@webform.request', '@string_translation']
+    arguments: ['@module_handler', '@webform.request', '@string_translation', '@config.factory']
     tags:
       - { name: breadcrumb_builder, priority: 1002 }
 
@@ -123,7 +127,7 @@ services:
 
   webform.route_subscriber:
     class: Drupal\webform\Routing\WebformRouteSubscriber
-    arguments: ['@module_handler']
+    arguments: ['@module_handler', '@config.factory']
     tags:
       - { name: event_subscriber }
 
diff --git a/web/modules/webform/webform.tokens.inc b/web/modules/webform/webform.tokens.inc
index ef0f635112..404adbef95 100644
--- a/web/modules/webform/webform.tokens.inc
+++ b/web/modules/webform/webform.tokens.inc
@@ -1103,7 +1103,7 @@ function _webform_token_render_more($more_title, $more) {
   // Token info might be called via CLI and not all modules are loaded
   // or an active theme is defined.
   //
-  // Prevent the below expections:
+  // Prevent the below exceptions:
   // - The theme implementations may not be rendered until all modules
   //   are loaded.
   // - Call to a member function setParser() on array in Twig\Parser->parse().
-- 
GitLab