From abf43e58bfb294b9da5efe0f49a47008eddcabb1 Mon Sep 17 00:00:00 2001
From: Alexandre Dias <alex.jm.dias@gmail.com>
Date: Tue, 19 Nov 2024 00:39:55 +0000
Subject: [PATCH 001/137] ISAICP-9100: Empty autocomplete filter is not working
 anymore.

---
 .../custom/joinup_group/joinup_group.module   | 31 +++++++++++++++++
 .../custom/joinup_search/joinup_search.module | 34 -------------------
 2 files changed, 31 insertions(+), 34 deletions(-)

diff --git a/web/modules/custom/joinup_group/joinup_group.module b/web/modules/custom/joinup_group/joinup_group.module
index 04ec1eb9ef..712a42d08c 100644
--- a/web/modules/custom/joinup_group/joinup_group.module
+++ b/web/modules/custom/joinup_group/joinup_group.module
@@ -526,6 +526,9 @@ function joinup_group_form_views_exposed_form_alter(array &$form, FormStateInter
       ],
       '#validate_reference' => FALSE,
       '#maxlength' => 1024,
+      '#element_validate' => [
+        'validateAutocompleteWithoutId',
+      ],
       '#default_value' => !empty($form['group']['#default_value']) ? $storage->load($form['group']['#default_value']) : NULL,
     ];
   }
@@ -607,6 +610,34 @@ function joinup_group_form_views_exposed_form_alter(array &$form, FormStateInter
   ];
 }
 
+/**
+ * Group validation handler for autocomplete field.
+ *
+ * This function validates the input of an entity_autocomplete field,
+ * ensuring that only the title of the entity (e.g., node title) is stored,
+ * and the entity ID is removed from the value. This is useful when the ID
+ * is appended in the format "Title (ID)" by default, but you want to keep
+ * only the title.
+ *
+ * @param array $element
+ *   The form element to be validated. This is the autocomplete field definition.
+ * @param \Drupal\Core\Form\FormStateInterface $form_state
+ *   The current state of the form.
+ * @param array $form
+ *   The full form structure.
+ */
+function validateAutocompleteWithoutId(array &$element, FormStateInterface $form_state, array &$form): void {
+  $value = $form_state->getValue($element['#parents']);
+
+  // If value is a node, strip the ID.
+  if (!empty($value)) {
+    // Parse the title from the autocomplete value if in "Title (ID)" format.
+    if (preg_match('/^(.*?)\s*\(\d+\)$/', $value, $matches)) {
+      $form_state->setValue($element['#parents'], $matches[1]);
+    }
+  }
+}
+
 /**
  * Implements hook_views_query_alter().
  */
diff --git a/web/modules/custom/joinup_search/joinup_search.module b/web/modules/custom/joinup_search/joinup_search.module
index 400e2eeaed..92a7f865e7 100644
--- a/web/modules/custom/joinup_search/joinup_search.module
+++ b/web/modules/custom/joinup_search/joinup_search.module
@@ -19,7 +19,6 @@
 use Drupal\joinup_group\Entity\GroupInterface;
 use Drupal\search_api\IndexInterface;
 use Drupal\search_api\Query\ConditionGroupInterface;
-use Drupal\views\Plugin\views\query\QueryPluginBase;
 use Drupal\views\ViewExecutable;
 
 /**
@@ -132,39 +131,6 @@ function joinup_search_views_pre_execute(ViewExecutable $view): void {
   $view->getQuery()->sort('entity_created', 'DESC');
 }
 
-/**
- * Implements hook_views_query_alter().
- *
- * @todo This is a temporary workaround.
- * @see https://citnet.tech.ec.europa.eu/CITnet/jira/browse/ISAICP-9100
- */
-function joinup_search_views_query_alter(ViewExecutable $view, QueryPluginBase $query): void {
-  if (($view->id() !== 'announcements' || $view->current_display !== 'all') && ($view->id() !== 'media' || $view->current_display !== 'media_page_list')) {
-    return;
-  }
-
-  $field_mapping = [
-    // Test affected: announcements.feature.
-    'announcements' => 'message__group.group_target_id',
-    // Test affected: image_library.feature.
-    'media' => 'media__og_audience.og_audience_target_id',
-  ];
-
-  // Clean the group filter if it is empty.
-  $conditions = &$query->where;
-  foreach ($conditions as $key => $condition_group) {
-    if (empty($condition_group['conditions'])) {
-      continue;
-    }
-
-    foreach ($condition_group['conditions'] as $subkey => $condition) {
-      if ($condition['field'] === $field_mapping[$view->id()] && $condition['value'] === NULL) {
-        unset($conditions[$key]['conditions'][$subkey]);
-      }
-    }
-  }
-}
-
 /**
  * Implements hook_theme_suggestions_HOOK_alter() for the global search block.
  *
-- 
GitLab


From 38bd92699af3aa34fd1d11e2dfafaf315dc53a17 Mon Sep 17 00:00:00 2001
From: Alexandre Dias <alex.jm.dias@gmail.com>
Date: Tue, 19 Nov 2024 08:26:54 +0000
Subject: [PATCH 002/137] ISAICP-9100: Add title group as string.

---
 config/sync/views.view.announcements.yml      | 37 +++++++++++--------
 config/sync/views.view.media.yml              | 37 +++++++++++--------
 .../custom/joinup_group/joinup_group.module   |  6 +--
 3 files changed, 47 insertions(+), 33 deletions(-)

diff --git a/config/sync/views.view.announcements.yml b/config/sync/views.view.announcements.yml
index 07d4835d40..fc484e074e 100644
--- a/config/sync/views.view.announcements.yml
+++ b/config/sync/views.view.announcements.yml
@@ -11,6 +11,7 @@ dependencies:
   module:
     - joinup_group
     - message
+    - node
     - options
     - state_machine
     - user
@@ -1167,27 +1168,26 @@ display:
           expose:
             operator_limit_selection: false
             operator_list: {  }
-        group_target_id:
-          id: group_target_id
-          table: message__group
-          field: group_target_id
-          relationship: none
+        title:
+          id: title
+          table: node_field_data
+          field: title
+          relationship: group
           group_type: group
           admin_label: ''
-          plugin_id: numeric
+          entity_type: node
+          entity_field: title
+          plugin_id: string
           operator: '='
-          value:
-            min: ''
-            max: ''
-            value: ''
+          value: ''
           group: 1
           exposed: true
           expose:
-            operator_id: group_target_id_op
+            operator_id: title_op
             label: Group
             description: ''
             use_operator: false
-            operator: group_target_id_op
+            operator: title_op
             operator_limit_selection: false
             operator_list: {  }
             identifier: group
@@ -1202,8 +1202,6 @@ display:
               moderator: '0'
               administrator: '0'
               developer: '0'
-            min_placeholder: ''
-            max_placeholder: ''
             placeholder: ''
           is_grouped: false
           group_info:
@@ -1270,7 +1268,16 @@ display:
         arguments: false
         filters: false
         filter_groups: false
-      relationships: {  }
+      relationships:
+        group:
+          id: group
+          table: message__group
+          field: group
+          relationship: none
+          group_type: group
+          admin_label: 'group: Content'
+          plugin_id: standard
+          required: false
       display_description: ''
       display_extenders:
         metatag_display_extender:
diff --git a/config/sync/views.view.media.yml b/config/sync/views.view.media.yml
index ab9ab84c37..70036f24c1 100644
--- a/config/sync/views.view.media.yml
+++ b/config/sync/views.view.media.yml
@@ -7,6 +7,7 @@ dependencies:
     - image.style.thumbnail
   module:
     - media
+    - node
     - svg_image
     - user
 _core:
@@ -722,27 +723,26 @@ display:
                 title: Unpublished
                 operator: '='
                 value: '0'
-        og_audience_target_id:
-          id: og_audience_target_id
-          table: media__og_audience
-          field: og_audience_target_id
-          relationship: none
+        title:
+          id: title
+          table: node_field_data
+          field: title
+          relationship: og_audience
           group_type: group
           admin_label: ''
-          plugin_id: numeric
+          entity_type: node
+          entity_field: title
+          plugin_id: string
           operator: '='
-          value:
-            min: ''
-            max: ''
-            value: ''
+          value: ''
           group: 1
           exposed: true
           expose:
-            operator_id: og_audience_target_id_op
+            operator_id: title_op
             label: Group
             description: ''
             use_operator: false
-            operator: og_audience_target_id_op
+            operator: title_op
             operator_limit_selection: false
             operator_list: {  }
             identifier: group
@@ -757,8 +757,6 @@ display:
               moderator: '0'
               administrator: '0'
               developer: '0'
-            min_placeholder: ''
-            max_placeholder: ''
             placeholder: ''
           is_grouped: false
           group_info:
@@ -853,7 +851,16 @@ display:
           distinct: false
           replica: false
           query_tags: {  }
-      relationships: {  }
+      relationships:
+        og_audience:
+          id: og_audience
+          table: media__og_audience
+          field: og_audience
+          relationship: none
+          group_type: group
+          admin_label: 'og_audience: Content'
+          plugin_id: standard
+          required: false
       header: {  }
       footer: {  }
       display_extenders: {  }
diff --git a/web/modules/custom/joinup_group/joinup_group.module b/web/modules/custom/joinup_group/joinup_group.module
index 712a42d08c..bb78ebdc9a 100644
--- a/web/modules/custom/joinup_group/joinup_group.module
+++ b/web/modules/custom/joinup_group/joinup_group.module
@@ -527,7 +527,7 @@ function joinup_group_form_views_exposed_form_alter(array &$form, FormStateInter
       '#validate_reference' => FALSE,
       '#maxlength' => 1024,
       '#element_validate' => [
-        'validateAutocompleteWithoutId',
+        'joinup_group_validate_autocomplete_without_id',
       ],
       '#default_value' => !empty($form['group']['#default_value']) ? $storage->load($form['group']['#default_value']) : NULL,
     ];
@@ -620,13 +620,13 @@ function joinup_group_form_views_exposed_form_alter(array &$form, FormStateInter
  * only the title.
  *
  * @param array $element
- *   The form element to be validated. This is the autocomplete field definition.
+ *   The form element to be validated (autocomplete field definition).
  * @param \Drupal\Core\Form\FormStateInterface $form_state
  *   The current state of the form.
  * @param array $form
  *   The full form structure.
  */
-function validateAutocompleteWithoutId(array &$element, FormStateInterface $form_state, array &$form): void {
+function joinup_group_validate_autocomplete_without_id(array &$element, FormStateInterface $form_state, array &$form): void {
   $value = $form_state->getValue($element['#parents']);
 
   // If value is a node, strip the ID.
-- 
GitLab


From 269fd0a7fdeb029cd243b3b6c631cd33b4721515 Mon Sep 17 00:00:00 2001
From: Alexandre Dias <alex.jm.dias@gmail.com>
Date: Wed, 20 Nov 2024 14:14:04 +0000
Subject: [PATCH 003/137] ISAICP-9100: Add patch Views EntityReference filter.

---
 composer.json                                |    3 +-
 composer.lock                                |    2 +-
 resources/patch/php/drupal/core/3347343.diff | 2245 ++++++++++++++++++
 3 files changed, 2248 insertions(+), 2 deletions(-)
 create mode 100644 resources/patch/php/drupal/core/3347343.diff

diff --git a/composer.json b/composer.json
index 8c483030ca..343ef3802f 100644
--- a/composer.json
+++ b/composer.json
@@ -329,7 +329,8 @@
                 "Allow ChangedItem to skip updating the entity's \"changed\" timestamp when synchronizing @see https://drupal.org/i/2329253": "resources/patch/php/drupal/core/2329253-10.x.patch",
                 "Unserialize(): Passing null to parameter #1 ($data) of type string is deprecated @see https://drupal.org/i/3300404": "resources/patch/php/drupal/core/3300404.patch",
                 "JS errors from Drupal.dialog.resetSize when rapidly closing dialogs @see https://www.drupal.org/i/3472624": "resources/patch/php/drupal/core/3472624-4d97ff80.diff",
-                "Performance Degraded after update to twig 3.14.2 @see https://www.drupal.org/i/3487031": "resources/patch/php/drupal/core/3487031.diff"
+                "Performance Degraded after update to twig 3.14.2 @see https://www.drupal.org/i/3487031": "resources/patch/php/drupal/core/3487031.diff",
+                "Add Views EntityReference filter to support better UX for exposed filters @see https://www.drupal.org/i/3347343": "resources/patch/php/drupal/core/3347343.diff"
             },
             "drupal/default_content": {
                 "Allow manual imports @see https://www.drupal.org/i/2640734": "resources/patch/php/drupal/default_content/2640734.diff"
diff --git a/composer.lock b/composer.lock
index 4a12849c68..d5c5e1d240 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": "3dd620d8960063cdc3e5105b30f12a3e",
+    "content-hash": "4f4397e385089429b4f19087a9151a81",
     "packages": [
         {
             "name": "asm89/stack-cors",
diff --git a/resources/patch/php/drupal/core/3347343.diff b/resources/patch/php/drupal/core/3347343.diff
new file mode 100644
index 0000000000..91b0fda7b6
--- /dev/null
+++ b/resources/patch/php/drupal/core/3347343.diff
@@ -0,0 +1,2245 @@
+diff --git a/core/.phpstan-baseline.php b/core/.phpstan-baseline.php
+index 90c1fdeb7601a19b9bc8f3985cee621f9a47dbb4..7d0ec835dd24f29e08a0bfcac4bd0c6d980e66b2 100644
+--- a/core/.phpstan-baseline.php
++++ b/core/.phpstan-baseline.php
+@@ -560,12 +560,6 @@
+ 	'count' => 1,
+ 	'path' => __DIR__ . '/lib/Drupal/Core/Entity/KeyValueStore/KeyValueContentEntityStorage.php',
+ ];
+-$ignoreErrors[] = [
+-	// identifier: variable.undefined
+-	'message' => '#^Variable \\$selected_bundles might not be defined\\.$#',
+-	'count' => 2,
+-	'path' => __DIR__ . '/lib/Drupal/Core/Entity/Plugin/EntityReferenceSelection/DefaultSelection.php',
+-];
+ $ignoreErrors[] = [
+ 	// identifier: isset.variable
+ 	'message' => '#^Variable \\$value in isset\\(\\) always exists and is not nullable\\.$#',
+diff --git a/core/lib/Drupal/Core/Entity/Plugin/EntityReferenceSelection/DefaultSelection.php b/core/lib/Drupal/Core/Entity/Plugin/EntityReferenceSelection/DefaultSelection.php
+index a9772c81101e3754e1ea870f3b262f0c3d4d8424..3e20731c1d8926cbc74a87bb4e41d13dfd978415 100644
+--- a/core/lib/Drupal/Core/Entity/Plugin/EntityReferenceSelection/DefaultSelection.php
++++ b/core/lib/Drupal/Core/Entity/Plugin/EntityReferenceSelection/DefaultSelection.php
+@@ -164,6 +164,7 @@ public function buildConfigurationForm(array $form, FormStateInterface $form_sta
+     $entity_type_id = $configuration['target_type'];
+     $entity_type = $this->entityTypeManager->getDefinition($entity_type_id);
+     $bundles = $this->entityTypeBundleInfo->getBundleInfo($entity_type_id);
++    $selected_bundles = [];
+ 
+     if ($entity_type->hasKey('bundle')) {
+       $bundle_options = [];
+@@ -200,6 +201,7 @@ public function buildConfigurationForm(array $form, FormStateInterface $form_sta
+           'class' => ['js-hide'],
+         ],
+         '#submit' => [[EntityReferenceItem::class, 'settingsAjaxSubmit']],
++        '#element_validate' => [[static::class, 'validateTargetBundlesUpdate']],
+       ];
+     }
+     else {
+@@ -208,6 +210,7 @@ public function buildConfigurationForm(array $form, FormStateInterface $form_sta
+         '#value' => [],
+       ];
+     }
++    $form['target_bundles']['#element_validate'][] = [static::class, 'validateTargetBundles'];
+ 
+     if ($entity_type->entityClassImplements(FieldableEntityInterface::class)) {
+       $options = $entity_type->hasKey('bundle') ? $selected_bundles : $bundles;
+@@ -224,7 +227,11 @@ public function buildConfigurationForm(array $form, FormStateInterface $form_sta
+           // @todo Use property labels instead of the column name.
+           if (count($columns) > 1) {
+             foreach ($columns as $column_name => $column_info) {
+-              $fields[$field_name . '.' . $column_name] = $this->t('@label (@column)', ['@label' => $field_definition->getLabel(), '@column' => $column_name]);
++              $fields[$field_name . '.' . $column_name] = $this->t('@label (@column)',
++               [
++                 '@label' => $field_definition->getLabel(),
++                 '@column' => $column_name,
++               ]);
+             }
+           }
+           else {
+@@ -314,22 +321,25 @@ public function buildConfigurationForm(array $form, FormStateInterface $form_sta
+   }
+ 
+   /**
+-   * {@inheritdoc}
++   * Validates a target_bundles element.
+    */
+-  public function validateConfigurationForm(array &$form, FormStateInterface $form_state) {
+-    parent::validateConfigurationForm($form, $form_state);
+-
++  public static function validateTargetBundles($element, FormStateInterface $form_state, $form) {
+     // If no checkboxes were checked for 'target_bundles', store NULL ("all
+     // bundles are referenceable") rather than empty array ("no bundle is
+     // referenceable" - typically happens when all referenceable bundles have
+     // been deleted).
+-    if ($form_state->getValue(['settings', 'handler_settings', 'target_bundles']) === []) {
+-      $form_state->setValue(['settings', 'handler_settings', 'target_bundles'], NULL);
++    if ($form_state->getValue($element['#parents']) === []) {
++      $form_state->setValueForElement($element, NULL);
+     }
++  }
+ 
++  /**
++   * Validates a target_bundles_update element.
++   */
++  public static function validateTargetBundlesUpdate($element, FormStateInterface $form_state, $form) {
+     // Don't store the 'target_bundles_update' button value into the field
+     // config settings.
+-    $form_state->unsetValue(['settings', 'handler_settings', 'target_bundles_update']);
++    $form_state->unsetValue($element['#parents']);
+   }
+ 
+   /**
+@@ -341,7 +351,7 @@ public static function elementValidateFilter(&$element, FormStateInterface $form
+   }
+ 
+   /**
+-   * {@inheritdoc}
++   * Validates a target_bundles element.
+    */
+   public function getReferenceableEntities($match = NULL, $match_operator = 'CONTAINS', $limit = 0) {
+     $target_type = $this->getConfiguration()['target_type'];
+diff --git a/core/modules/views/config/schema/views.filter.schema.yml b/core/modules/views/config/schema/views.filter.schema.yml
+index 1eb09007aef9132ece61fb2ae58e25090ad5eb4f..6eb22b82f996175cba2ba2c1aad00048cc11019b 100644
+--- a/core/modules/views/config/schema/views.filter.schema.yml
++++ b/core/modules/views/config/schema/views.filter.schema.yml
+@@ -128,6 +128,26 @@ views.filter.many_to_one:
+       type: boolean
+       label: 'Reduce duplicate'
+ 
++views.filter.entity_reference:
++  type: views.filter.many_to_one
++  label: 'Entity reference'
++  constraints:
++    FullyValidatable: ~
++  mapping:
++    sub_handler:
++      type: string
++      label: 'Selection handler'
++      constraints:
++        PluginExists:
++          manager: plugin.manager.entity_reference_selection
++          interface: 'Drupal\Core\Entity\EntityReferenceSelection\SelectionInterface'
++    widget:
++      type: string
++      label: 'Selection type'
++    sub_handler_settings:
++      type: entity_reference_selection.[%parent.sub_handler]
++      label: 'Selection handler settings'
++
+ views.filter.standard:
+   type: views_filter
+   label: 'Standard'
+diff --git a/core/modules/views/src/Plugin/views/filter/EntityReference.php b/core/modules/views/src/Plugin/views/filter/EntityReference.php
+new file mode 100644
+index 0000000000000000000000000000000000000000..b46a398ef7343b5adf31911c1dee8bf2a6c29d2e
+--- /dev/null
++++ b/core/modules/views/src/Plugin/views/filter/EntityReference.php
+@@ -0,0 +1,707 @@
++<?php
++
++namespace Drupal\views\Plugin\views\filter;
++
++use Drupal\Component\Plugin\DependentPluginInterface;
++use Drupal\Component\Utility\NestedArray;
++use Drupal\Core\Entity\Element\EntityAutocomplete;
++use Drupal\Core\Entity\EntityReferenceSelection\SelectionInterface;
++use Drupal\Core\Entity\EntityReferenceSelection\SelectionPluginManagerInterface;
++use Drupal\Core\Entity\EntityTypeInterface;
++use Drupal\Core\Entity\EntityTypeManagerInterface;
++use Drupal\Core\Form\FormStateInterface;
++use Drupal\Core\Form\SubformState;
++use Drupal\Core\Messenger\MessengerInterface;
++use Drupal\Core\Render\Element;
++use Drupal\views\Attribute\ViewsFilter;
++use Drupal\views\FieldAPIHandlerTrait;
++use Drupal\views\Plugin\EntityReferenceSelection\ViewsSelection;
++use Drupal\views\Plugin\views\display\DisplayPluginBase;
++use Drupal\views\ViewExecutable;
++use Symfony\Component\DependencyInjection\ContainerInterface;
++
++/**
++ * Filters a view by entity references.
++ *
++ * @ingroup views_filter_handlers
++ */
++#[ViewsFilter("entity_reference")]
++class EntityReference extends ManyToOne {
++
++  use FieldAPIHandlerTrait;
++
++  /**
++   * Type for the autocomplete filter format.
++   */
++  const WIDGET_AUTOCOMPLETE = 'autocomplete';
++
++  /**
++   * Type for the select list filter format.
++   */
++  const WIDGET_SELECT = 'select';
++
++  /**
++   * Max number of entities in the select widget.
++   */
++  const WIDGET_SELECT_LIMIT = 100;
++
++  /**
++   * The subform prefix.
++   */
++  const SUBFORM_PREFIX = 'reference_';
++
++  /**
++   * The all value.
++   */
++  const ALL_VALUE = 'All';
++
++  /**
++   * The selection handlers available for the target entity ID of the filter.
++   *
++   * @var array|null
++   */
++  protected ?array $handlerOptions = NULL;
++
++  /**
++   * Validated exposed input that will be set as the input value.
++   *
++   * If the select list widget is chosen.
++   *
++   * @var array
++   */
++  protected array $validatedExposedInput;
++
++  /**
++   * {@inheritdoc}
++   */
++  public function init(ViewExecutable $view, DisplayPluginBase $display, ?array &$options = NULL): void {
++    parent::init($view, $display, $options);
++    if (empty($this->definition['field_name'])) {
++      $this->definition['field_name'] = $options['field'];
++    }
++
++    $this->definition['options callback'] = [$this, 'getValueOptionsCallback'];
++    $this->definition['options arguments'] = [$this->getSelectionHandler($this->options['sub_handler'])];
++  }
++
++  /**
++   * Constructs an EntityReference object.
++   */
++  public function __construct(
++    array $configuration,
++    $plugin_id,
++    $plugin_definition,
++    protected SelectionPluginManagerInterface $selectionPluginManager,
++    protected EntityTypeManagerInterface $entityTypeManager,
++    MessengerInterface $messenger,
++  ) {
++    parent::__construct($configuration, $plugin_id, $plugin_definition);
++    $this->setMessenger($messenger);
++
++    // @todo Unify 'entity field'/'field_name' instead of converting back and
++    // forth. https://www.drupal.org/node/2410779
++    if (isset($this->definition['entity field'])) {
++      $this->definition['field_name'] = $this->definition['entity field'];
++    }
++  }
++
++  /**
++   * {@inheritdoc}
++   */
++  public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition): EntityReference {
++    return new static(
++      $configuration,
++      $plugin_id,
++      $plugin_definition,
++      $container->get('plugin.manager.entity_reference_selection'),
++      $container->get('entity_type.manager'),
++      $container->get('messenger'),
++    );
++  }
++
++  /**
++   * Gets the entity reference selection handler.
++   *
++   * @param string|null $sub_handler
++   *   The sub handler to get an instance of or NULL for the current selection.
++   *
++   * @return \Drupal\Core\Entity\EntityReferenceSelection\SelectionInterface
++   *   The selection handler plugin instance.
++   */
++  protected function getSelectionHandler(?string $sub_handler = NULL): SelectionInterface {
++    // Default values for the handler.
++    $handler_settings = $this->options['sub_handler_settings'] ?? [];
++    $handler_settings['handler'] = $sub_handler;
++    $handler_settings['target_type'] = $this->getReferencedEntityType()->id();
++    /** @var \Drupal\Core\Entity\EntityReferenceSelection\SelectionInterface */
++    return $this->selectionPluginManager->getInstance($handler_settings);
++  }
++
++  /**
++   * {@inheritdoc}
++   */
++  protected function defineOptions(): array {
++    $options = parent::defineOptions();
++    $options['sub_handler'] = [
++      'default' => 'default:' . $this->getReferencedEntityType()->id(),
++    ];
++    $options['sub_handler_settings'] = ['default' => []];
++    $options['widget'] = ['default' => static::WIDGET_AUTOCOMPLETE];
++    return $options;
++  }
++
++  /**
++   * {@inheritdoc}
++   */
++  public function hasExtraOptions(): bool {
++    return TRUE;
++  }
++
++  /**
++   * Get all selection plugins for this entity type.
++   *
++   * @return string[]
++   *   The selection handlers available for the target entity ID of the filter.
++   */
++  protected function getSubHandlerOptions(): array {
++    if ($this->handlerOptions) {
++      return $this->handlerOptions;
++    }
++    $entity_type = $this->getReferencedEntityType();
++    $selection_plugins = $this->selectionPluginManager->getSelectionGroups($entity_type->id());
++    $this->handlerOptions = [];
++    foreach (array_keys($selection_plugins) as $selection_group_id) {
++      // We only display base plugins (e.g. 'default', 'views', ...).
++      if (array_key_exists($selection_group_id, $selection_plugins[$selection_group_id])) {
++        $this->handlerOptions[$selection_group_id] = (string) $selection_plugins[$selection_group_id][$selection_group_id]['label'];
++      }
++      elseif (array_key_exists($selection_group_id . ':' . $entity_type->id(), $selection_plugins[$selection_group_id])) {
++        $selection_group_plugin = $selection_group_id . ':' . $entity_type->id();
++        $this->handlerOptions[$selection_group_plugin] = (string) $selection_plugins[$selection_group_id][$selection_group_plugin]['base_plugin_label'];
++      }
++    }
++    return $this->handlerOptions;
++  }
++
++  /**
++   * {@inheritdoc}
++   */
++  public function buildExtraOptionsForm(&$form, FormStateInterface $form_state): void {
++    $form['sub_handler'] = [
++      '#type' => 'select',
++      '#title' => $this->t('Reference method'),
++      '#options' => $this->getSubHandlerOptions(),
++      '#default_value' => $this->options['sub_handler'],
++      '#required' => TRUE,
++    ];
++
++    // We store the settings from any sub handler in sub_handler_settings, but
++    // in this form, we have multiple sub handlers conditionally displayed.
++    // Copy the active sub_handler_settings into the handler specific settings
++    // to set the defaults to match the saved options on build.
++    if (!empty($this->options['sub_handler']) && !empty($this->options['sub_handler_settings'])) {
++      $this->options[static::SUBFORM_PREFIX . $this->options['sub_handler']] = $this->options['sub_handler_settings'];
++    }
++
++    foreach ($this->getSubHandlerOptions() as $sub_handler => $sub_handler_label) {
++      $subform_key = static::SUBFORM_PREFIX . $sub_handler;
++      $subform = [
++        '#type' => 'fieldset',
++        '#title' => $this->t('Reference type "@type"', [
++          '@type' => $sub_handler_label,
++        ]),
++        '#tree' => TRUE,
++        '#parents' => [
++          'options',
++          $subform_key,
++        ],
++        // Make the sub handler settings conditional on the selected selection
++        // handler.
++        '#states' => [
++          'visible' => [
++            'select[name="options[sub_handler]"]' => ['value' => $sub_handler],
++          ],
++        ],
++      ];
++
++      // Build the sub form and sub for state.
++      $selection_handler = $this->getSelectionHandler($sub_handler);
++      if (!empty($this->options[$subform_key])) {
++        $selection_config = $selection_handler->getConfiguration();
++        $selection_config = NestedArray::mergeDeepArray([
++          $selection_config,
++          $this->options[$subform_key],
++        ], TRUE);
++        $selection_handler->setConfiguration($selection_config);
++      }
++      $subform_state = SubformState::createForSubform($subform, $form, $form_state);
++      $sub_handler_settings = $selection_handler->buildConfigurationForm($subform, $subform_state);
++
++      if ($selection_handler instanceof ViewsSelection) {
++        if (isset($sub_handler_settings['view']['no_view_help'])) {
++          // If there are no views with entity reference displays,
++          // ViewsSelection still validates the view.
++          // This will prevent form config extra form submission,
++          // so we remove it here.
++          unset($sub_handler_settings['view']['#element_validate']);
++        }
++      }
++      else {
++        // Remove unnecessary and inappropriate handler settings from the
++        // filter config form.
++        $sub_handler_settings['target_bundles_update']['#access'] = FALSE;
++        $sub_handler_settings['auto_create']['#access'] = FALSE;
++        $sub_handler_settings['auto_create_bundle']['#access'] = FALSE;
++      }
++
++      $subform = NestedArray::mergeDeepArray([
++        $subform,
++        $sub_handler_settings,
++      ], TRUE);
++
++      $form[$subform_key] = $subform;
++      $this->cleanUpSubformChildren($form[$subform_key]);
++    }
++
++    $form['widget'] = [
++      '#type' => 'radios',
++      '#title' => $this->t('Selection type'),
++      '#default_value' => $this->options['widget'],
++      '#options' => [
++        static::WIDGET_SELECT => $this->t('Select list'),
++        static::WIDGET_AUTOCOMPLETE => $this->t('Autocomplete'),
++      ],
++      '#description' => $this->t('For performance and UX reasons, the maximum count of selectable entities for the "Select list" selection type is limited to @count. If more is expected, select "Autocomplete" instead.', [
++        '@count' => static::WIDGET_SELECT_LIMIT,
++      ]),
++    ];
++  }
++
++  /**
++   * Clean up subform children for properties that could cause problems.
++   *
++   * Views modal forms do not work with required or ajax elements.
++   *
++   * @param array $element
++   *   The form element.
++   */
++  protected function cleanUpSubformChildren(array &$element): void {
++    // Remove the required property to prevent focus errors.
++    if (isset($element['#required']) && $element['#required']) {
++      $element['#required'] = FALSE;
++      $element['#element_validate'][] = [static::class, 'validateRequired'];
++    }
++
++    // Remove the ajax property as it does not work.
++    if (!empty($element['#ajax'])) {
++      unset($element['#ajax']);
++    }
++
++    // Recursively apply to nested fields within the handler sub form.
++    foreach (Element::children($element) as $delta) {
++      $this->cleanUpSubformChildren($element[$delta]);
++    }
++  }
++
++  /**
++   * Validates that a required field for a sub handler has a value.
++   *
++   * @param array $element
++   *   The cardinality form render array.
++   * @param \Drupal\Core\Form\FormStateInterface $form_state
++   *   The form state.
++   */
++  public static function validateRequired(array &$element, FormStateInterface $form_state): void {
++    if (!empty($element['value'])) {
++      return;
++    }
++
++    // Config extra handler does not output validation messages and
++    // closes the modal with no feedback to the user.
++    // @todo https://www.drupal.org/project/drupal/issues/3163740.
++  }
++
++  /**
++   * {@inheritdoc}
++   */
++  public function validateExtraOptionsForm($form, FormStateInterface $form_state): void {
++    $options = $form_state->getValue('options');
++    $sub_handler = $options['sub_handler'];
++    $subform = $form[static::SUBFORM_PREFIX . $sub_handler];
++    $subform_state = SubformState::createForSubform($subform, $form, $form_state);
++
++    // Copy handler_settings from options to settings to be compatible with
++    // selection plugins.
++    $subform_options = $form_state->getValue([
++      'options',
++      static::SUBFORM_PREFIX . $sub_handler,
++    ]);
++    $subform_state->setValue([
++      'settings',
++    ], $subform_options);
++    $this->getSelectionHandler($sub_handler)
++      ->validateConfigurationForm($subform, $subform_state);
++
++    // Store the sub handler options in sub_handler_settings.
++    $form_state->setValue(['options', 'sub_handler_settings'], $subform_options);
++
++    // Remove options that are not from the selected sub_handler.
++    foreach (array_keys($this->getSubHandlerOptions()) as $sub_handler_option) {
++      if (isset($options[static::SUBFORM_PREFIX . $sub_handler_option])) {
++        $form_state->unsetValue(['options', static::SUBFORM_PREFIX . $sub_handler_option]);
++      }
++    }
++
++    parent::validateExtraOptionsForm($form, $form_state);
++  }
++
++  /**
++   * {@inheritdoc}
++   */
++  public function submitExtraOptionsForm($form, FormStateInterface $form_state): void {
++    $sub_handler = $form_state->getValue('options')['sub_handler'];
++
++    // Ensure that only the select sub handler option is saved.
++    foreach (array_keys($this->getSubHandlerOptions()) as $sub_handler_option) {
++      if ($sub_handler_option == $sub_handler) {
++        $this->options['sub_handler_settings'] = $this->options[static::SUBFORM_PREFIX . $sub_handler_option];
++      }
++      if (isset($this->options[static::SUBFORM_PREFIX . $sub_handler_option])) {
++        unset($this->options[static::SUBFORM_PREFIX . $sub_handler_option]);
++      }
++    }
++  }
++
++  /**
++   * Normalize values for widget switching.
++   *
++   * The saved values can differ in live preview if switching back and forth
++   * between the select and autocomplete widgets. This normalizes the values to
++   * avoid errors when making the switch.
++   *
++   * @param array $form
++   *   Associative array containing the structure of the form, passed by
++   *   reference.
++   * @param \Drupal\Core\Form\FormStateInterface $form_state
++   *   The current state of the form.
++   */
++  protected function alternateWidgetsDefaultNormalize(array &$form, FormStateInterface $form_state): void {
++    $field_id = '_' . $this->getFieldDefinition()->getName() . '-widget';
++    $form[$field_id] = [
++      '#type' => 'hidden',
++      '#value' => $this->options['widget'],
++    ];
++
++    $previous_widget = $form_state->getUserInput()[$field_id] ?? NULL;
++    if ($previous_widget && $previous_widget !== $this->options['widget']) {
++      $form['value']['#value_callback'] = function ($element) {
++        return $element['#default_value'] ?? '';
++      };
++    }
++  }
++
++  /**
++   * {@inheritdoc}
++   */
++  protected function valueForm(&$form, FormStateInterface $form_state) {
++    if (!isset($this->options['sub_handler'])) {
++      return;
++    }
++    switch ($this->options['widget']) {
++      case static::WIDGET_SELECT:
++        $this->valueFormAddSelect($form, $form_state);
++        break;
++
++      case static::WIDGET_AUTOCOMPLETE:
++        $this->valueFormAddAutocomplete($form, $form_state);
++        break;
++    }
++
++    if (!empty($this->view->live_preview)) {
++      $this->alternateWidgetsDefaultNormalize($form, $form_state);
++    }
++
++    // Show or hide the value field depending on the operator field.
++    $is_exposed = $this->options['exposed'];
++
++    $visible = [];
++    if ($is_exposed) {
++      $operator_field = ($this->options['expose']['use_operator'] && $this->options['expose']['operator_id']) ? $this->options['expose']['operator_id'] : NULL;
++    }
++    else {
++      $operator_field = 'options[operator]';
++      $visible[] = [
++        ':input[name="options[expose_button][checkbox][checkbox]"]' => ['checked' => TRUE],
++        ':input[name="options[expose][use_operator]"]' => ['checked' => TRUE],
++        ':input[name="options[expose][operator_id]"]' => ['empty' => FALSE],
++      ];
++    }
++    if ($operator_field) {
++      foreach ($this->operatorValues(1) as $operator) {
++        $visible[] = [
++          ':input[name="' . $operator_field . '"]' => ['value' => $operator],
++        ];
++      }
++      $form['value']['#states'] = ['visible' => $visible];
++    }
++
++    if (!$is_exposed) {
++      // Retain the helper option.
++      $this->helper->buildOptionsForm($form, $form_state);
++
++      // Show help text if not exposed to end users.
++      $form['value']['#description'] = $this->t('Leave blank for all. Otherwise, the first selected item will be the default instead of "Any".');
++    }
++  }
++
++  /**
++   * Adds an autocomplete element to the form.
++   *
++   * @param array $form
++   *   Associative array containing the structure of the form, passed by
++   *   reference.
++   * @param \Drupal\Core\Form\FormStateInterface $form_state
++   *   The current state of the form.
++   */
++  protected function valueFormAddAutocomplete(array &$form, FormStateInterface $form_state): void {
++    $referenced_type = $this->getReferencedEntityType();
++    $form['value'] = [
++      '#title' => $this->t('Select %entity_types', ['%entity_types' => $referenced_type->getPluralLabel()]),
++      '#type' => 'entity_autocomplete',
++      '#default_value' => EntityAutocomplete::getEntityLabels($this->getDefaultSelectedEntities()),
++      '#tags' => TRUE,
++      '#process_default_value' => FALSE,
++      '#target_type' => $referenced_type->id(),
++      '#selection_handler' => $this->options['sub_handler'],
++      '#selection_settings' => $this->options['sub_handler_settings'],
++      // Validation is done by validateExposed().
++      '#validate_reference' => FALSE,
++    ];
++  }
++
++  /**
++   * Adds a select element to the form.
++   *
++   * @param array $form
++   *   Associative array containing the structure of the form, passed by
++   *   reference.
++   * @param \Drupal\Core\Form\FormStateInterface $form_state
++   *   The current state of the form.
++   */
++  protected function valueFormAddSelect(array &$form, FormStateInterface $form_state): void {
++    $is_exposed = $form_state->get('exposed');
++
++    $options = $this->getValueOptions();
++    $default_value = (array) $this->value;
++
++    if ($is_exposed) {
++      $identifier = $this->options['expose']['identifier'];
++
++      if (!empty($this->options['expose']['reduce'])) {
++        $options = $this->reduceValueOptions($options);
++
++        if (!empty($this->options['expose']['multiple']) && empty($this->options['expose']['required'])) {
++          $default_value = [];
++        }
++      }
++
++      if (empty($this->options['expose']['multiple'])) {
++        if (empty($this->options['expose']['required']) && (empty($default_value) || !empty($this->options['expose']['reduce']))) {
++          $default_value = static::ALL_VALUE;
++        }
++        elseif (empty($default_value)) {
++          $keys = array_keys($options);
++          $default_value = array_shift($keys);
++        }
++        else {
++          // Set the default value to be the first element of the array.
++          $default_value = reset($default_value);
++        }
++      }
++    }
++
++    $referenced_type = $this->getReferencedEntityType();
++    $form['value'] = [
++      '#type' => 'select',
++      '#title' => $this->t('Select @entity_types', ['@entity_types' => $referenced_type->getPluralLabel()]),
++      '#multiple' => TRUE,
++      '#options' => $options,
++      // Set a minimum size to facilitate easier selection of entities.
++      '#size' => min(8, count($options)),
++      '#default_value' => $default_value,
++    ];
++
++    $user_input = $form_state->getUserInput();
++    if ($is_exposed && isset($identifier) && !isset($user_input[$identifier])) {
++      $user_input[$identifier] = $default_value;
++      $form_state->setUserInput($user_input);
++    }
++  }
++
++  /**
++   * Gets all entities selected by default.
++   *
++   * @return \Drupal\Core\Entity\EntityInterface[]
++   *   All entities selected by default, or an empty array, if none.
++   */
++  protected function getDefaultSelectedEntities(): array {
++    $referenced_type_id = $this->getReferencedEntityType()->id();
++    $entity_storage = $this->entityTypeManager->getStorage($referenced_type_id);
++
++    return !empty($this->value) && !isset($this->value[static::ALL_VALUE]) ? $entity_storage->loadMultiple($this->value) : [];
++  }
++
++  /**
++   * Returns the value options for a select widget.
++   *
++   * @param \Drupal\Core\Entity\EntityReferenceSelection\SelectionInterface $selection_handler
++   *   The selection handler.
++   *
++   * @return string[]
++   *   The options.
++   *
++   * @see \Drupal\views\Plugin\views\filter\InOperator::getValueOptions()
++   */
++  protected function getValueOptionsCallback(SelectionInterface $selection_handler): array {
++    $entity_data = [];
++    if ($this->options['widget'] === static::WIDGET_SELECT) {
++      $entity_data = $selection_handler->getReferenceableEntities(NULL, 'CONTAINS', static::WIDGET_SELECT_LIMIT);
++    }
++
++    $options = [];
++    foreach ($entity_data as $bundle) {
++      foreach ($bundle as $id => $entity_label) {
++        $options[$id] = $entity_label;
++      }
++    }
++
++    return $options;
++  }
++
++  /**
++   * {@inheritdoc}
++   */
++  public function validate(): array {
++    // InOperator validation logic is not appropriate for entity reference
++    // autocomplete or select, so prevent parent class validation from
++    // occurring.
++    return [];
++  }
++
++  /**
++   * {@inheritdoc}
++   */
++  public function acceptExposedInput($input): bool {
++    if (empty($this->options['exposed'])) {
++      return TRUE;
++    }
++
++    // We need to know the operator, which is normally set in
++    // \Drupal\views\Plugin\views\filter\FilterPluginBase::acceptExposedInput(),
++    // before we actually call the parent version of ourselves.
++    if (!empty($this->options['expose']['use_operator']) && !empty($this->options['expose']['operator_id']) && isset($input[$this->options['expose']['operator_id']])) {
++      $this->operator = $input[$this->options['expose']['operator_id']];
++    }
++
++    // If view is an attachment and is inheriting exposed filters, then assume
++    // exposed input has already been validated.
++    if (!empty($this->view->is_attachment) && $this->view->display_handler->usesExposed()) {
++      $this->validatedExposedInput = (array) $this->view->exposed_raw_input[$this->options['expose']['identifier']];
++    }
++
++    // If we're checking for EMPTY or NOT, we don't need any input, and we can
++    // say that our input conditions are met by just having the right operator.
++    if ($this->operator == 'empty' || $this->operator == 'not empty') {
++      return TRUE;
++    }
++
++    // If it's non-required and there's no value don't bother filtering.
++    if (!$this->options['expose']['required'] && empty($this->validatedExposedInput)) {
++      return FALSE;
++    }
++
++    $accept_exposed_input = parent::acceptExposedInput($input);
++    if ($accept_exposed_input) {
++      // If we have previously validated input, override.
++      if (isset($this->validatedExposedInput)) {
++        $this->value = $this->validatedExposedInput;
++      }
++    }
++
++    return $accept_exposed_input;
++  }
++
++  /**
++   * {@inheritdoc}
++   */
++  public function validateExposed(&$form, FormStateInterface $form_state): void {
++    if (empty($this->options['exposed'])) {
++      return;
++    }
++
++    $identifier = $this->options['expose']['identifier'];
++
++    // Set the validated exposed input from the select list when not the all
++    // value option.
++    if ($this->options['widget'] == static::WIDGET_SELECT) {
++      if ($form_state->getValue($identifier) != static::ALL_VALUE) {
++        $this->validatedExposedInput = (array) $form_state->getValue($identifier);
++      }
++      return;
++    }
++
++    if (empty($identifier)) {
++      return;
++    }
++
++    $values = $form_state->getValue($identifier);
++    if (!is_array($values)) {
++      return;
++    }
++
++    foreach ($values as $value) {
++      $this->validatedExposedInput[] = $value['target_id'];
++    }
++  }
++
++  /**
++   * {@inheritdoc}
++   */
++  protected function valueSubmit($form, FormStateInterface $form_state): void {
++    // Prevent the parent class InOperator from altering the array.
++    // @see \Drupal\views\Plugin\views\filter\InOperator::valueSubmit().
++  }
++
++  /**
++   * Gets the target entity type referenced by this field.
++   *
++   * @return \Drupal\Core\Entity\EntityTypeInterface
++   *   The entity type definition.
++   */
++  protected function getReferencedEntityType(): EntityTypeInterface {
++    $field_def = $this->getFieldDefinition();
++    $entity_type_id = $field_def->getItemDefinition()
++      ->getSetting('target_type');
++    return $this->entityTypeManager->getDefinition($entity_type_id);
++  }
++
++  /**
++   * {@inheritdoc}
++   */
++  public function calculateDependencies(): array {
++    $dependencies = parent::calculateDependencies();
++
++    $sub_handler = $this->options['sub_handler'];
++    $selection_handler = $this->getSelectionHandler($sub_handler);
++    if ($selection_handler instanceof DependentPluginInterface) {
++      $dependencies += $selection_handler->calculateDependencies();
++    }
++
++    foreach ($this->getDefaultSelectedEntities() as $entity) {
++      $dependencies[$entity->getConfigDependencyKey()][] = $entity->getConfigDependencyName();
++    }
++
++    return $dependencies;
++  }
++
++}
+diff --git a/core/modules/views/tests/modules/views_test_config/test_views/views.view.test_filter_entity_reference.yml b/core/modules/views/tests/modules/views_test_config/test_views/views.view.test_filter_entity_reference.yml
+new file mode 100644
+index 0000000000000000000000000000000000000000..5a15e68ed0c8c48c9c9b5cff9bcf32789e9a8b78
+--- /dev/null
++++ b/core/modules/views/tests/modules/views_test_config/test_views/views.view.test_filter_entity_reference.yml
+@@ -0,0 +1,268 @@
++langcode: en
++status: true
++dependencies:
++  config:
++    - node.type.page
++  module:
++    - node
++    - user
++id: test_filter_entity_reference
++label: test_filter_entity_reference
++module: views
++description: ''
++tag: ''
++base_table: node_field_data
++base_field: nid
++display:
++  default:
++    display_plugin: default
++    id: default
++    display_title: Master
++    position: 0
++    display_options:
++      access:
++        type: perm
++        options:
++          perm: 'access content'
++      cache:
++        type: none
++        options: {  }
++      query:
++        type: views_query
++        options:
++          disable_sql_rewrite: false
++          distinct: false
++          replica: false
++          query_comment: ''
++          query_tags: {  }
++      exposed_form:
++        type: basic
++        options:
++          submit_button: Apply
++          reset_button: false
++          reset_button_label: Reset
++          exposed_sorts_label: 'Sort by'
++          expose_sort_order: true
++          sort_asc_label: Asc
++          sort_desc_label: Desc
++      pager:
++        type: mini
++        options:
++          items_per_page: 10
++          offset: 0
++          id: 0
++          total_pages: null
++          expose:
++            items_per_page: false
++            items_per_page_label: 'Items per page'
++            items_per_page_options: '5, 10, 25, 50'
++            items_per_page_options_all: false
++            items_per_page_options_all_label: '- All -'
++            offset: false
++            offset_label: Offset
++          tags:
++            previous: ‹‹
++            next: ››
++      style:
++        type: default
++        options:
++          grouping: {  }
++          row_class: ''
++          default_row_class: true
++          uses_fields: false
++      row:
++        type: fields
++        options:
++          inline: {  }
++          separator: ''
++          hide_empty: false
++          default_field_elements: true
++      fields:
++        title:
++          id: title
++          table: node_field_data
++          field: title
++          entity_type: node
++          entity_field: title
++          label: ''
++          alter:
++            alter_text: false
++            make_link: false
++            absolute: false
++            trim: false
++            word_boundary: false
++            ellipsis: false
++            strip_tags: false
++            html: false
++          hide_empty: false
++          empty_zero: false
++          settings:
++            link_to_entity: true
++          plugin_id: field
++          relationship: none
++          group_type: group
++          admin_label: ''
++          exclude: false
++          element_type: ''
++          element_class: ''
++          element_label_type: ''
++          element_label_class: ''
++          element_label_colon: true
++          element_wrapper_type: ''
++          element_wrapper_class: ''
++          element_default_classes: true
++          empty: ''
++          hide_alter_empty: true
++          click_sort_column: value
++          type: string
++          group_column: value
++          group_columns: {  }
++          group_rows: true
++          delta_limit: 0
++          delta_offset: 0
++          delta_reversed: false
++          delta_first_last: false
++          multi_type: separator
++          separator: ', '
++          field_api_classes: false
++      filters:
++        status:
++          value: '1'
++          table: node_field_data
++          field: status
++          plugin_id: boolean
++          entity_type: node
++          entity_field: status
++          id: status
++          expose:
++            operator: ''
++          group: 1
++        type:
++          id: type
++          table: node_field_data
++          field: type
++          value:
++            page: page
++          entity_type: node
++          entity_field: type
++          plugin_id: bundle
++        field_test_target_id:
++          id: field_test_target_id
++          table: node__field_test
++          field: field_test_target_id
++          relationship: none
++          group_type: group
++          admin_label: ''
++          operator: or
++          value: {  }
++          group: 1
++          exposed: true
++          expose:
++            operator_id: field_test_target_id_op
++            label: 'Test (field_test)'
++            description: ''
++            use_operator: false
++            operator: field_test_target_id_op
++            identifier: field_test_target_id
++            required: false
++            remember: false
++            multiple: true
++            remember_roles:
++              authenticated: authenticated
++              anonymous: '0'
++              administrator: '0'
++            reduce: false
++          is_grouped: false
++          group_info:
++            label: ''
++            description: ''
++            identifier: ''
++            optional: true
++            widget: select
++            multiple: false
++            remember: false
++            default_group: All
++            default_group_multiple: {  }
++            group_items: {  }
++          reduce_duplicates: false
++          sub_handler: 'default:node'
++          sub_handler_settings:
++            target_bundles:
++              article: article
++            sort:
++              field: title
++              direction: ASC
++            auto_create: false
++            auto_create_bundle: ''
++          widget: select
++          plugin_id: entity_reference
++        field_test_config_target_id:
++          id: field_test_config_target_id
++          table: node__field_test_config
++          field: field_test_config_target_id
++          relationship: none
++          group_type: group
++          admin_label: ''
++          plugin_id: entity_reference
++          operator: or
++          value: { }
++          group: 1
++          exposed: true
++          expose:
++            operator_id: field_test_config_target_id_op
++            label: 'Test config (field_test_config)'
++            description: ''
++            use_operator: false
++            operator: field_test_config_target_id_op
++            operator_limit_selection: false
++            operator_list: { }
++            identifier: field_test_config_target_id
++            required: false
++            remember: false
++            multiple: false
++            remember_roles:
++              authenticated: authenticated
++              anonymous: '0'
++              content_editor: '0'
++              administrator: '0'
++            reduce: false
++          is_grouped: false
++          group_info:
++            label: ''
++            description: ''
++            identifier: ''
++            optional: true
++            widget: select
++            multiple: false
++            remember: false
++            default_group: All
++            default_group_multiple: { }
++            group_items: { }
++          reduce_duplicates: false
++          sub_handler: 'default:node_type'
++          widget: select
++          sub_handler_settings:
++            target_bundles: null
++            auto_create: false
++      sorts:
++        created:
++          id: created
++          table: node_field_data
++          field: created
++          order: DESC
++          entity_type: node
++          entity_field: created
++          plugin_id: date
++          relationship: none
++          group_type: group
++          admin_label: ''
++          exposed: false
++          expose:
++            label: ''
++          granularity: second
++      header: {  }
++      footer: {  }
++      empty: {  }
++      relationships: {  }
++      arguments: {  }
++      display_extenders: {  }
+diff --git a/core/modules/views/tests/modules/views_test_entity_reference/config/install/views.view.test_entity_reference.yml b/core/modules/views/tests/modules/views_test_entity_reference/config/install/views.view.test_entity_reference.yml
+new file mode 100644
+index 0000000000000000000000000000000000000000..4b37d55d492dcbcffeb88357b6cac472eca7bf45
+--- /dev/null
++++ b/core/modules/views/tests/modules/views_test_entity_reference/config/install/views.view.test_entity_reference.yml
+@@ -0,0 +1,269 @@
++langcode: en
++status: true
++dependencies:
++  module:
++    - node
++    - user
++id: test_entity_reference
++label: 'Test Entity Reference'
++module: views
++description: ''
++tag: ''
++base_table: node_field_data
++base_field: nid
++display:
++  default:
++    id: default
++    display_title: Default
++    display_plugin: default
++    position: 0
++    display_options:
++      fields:
++        title:
++          id: title
++          table: node_field_data
++          field: title
++          relationship: none
++          group_type: group
++          admin_label: ''
++          entity_type: node
++          entity_field: title
++          plugin_id: field
++          label: ''
++          exclude: false
++          alter:
++            alter_text: false
++            text: ''
++            make_link: false
++            path: ''
++            absolute: false
++            external: false
++            replace_spaces: false
++            path_case: none
++            trim_whitespace: false
++            alt: ''
++            rel: ''
++            link_class: ''
++            prefix: ''
++            suffix: ''
++            target: ''
++            nl2br: false
++            max_length: 0
++            word_boundary: false
++            ellipsis: false
++            more_link: false
++            more_link_text: ''
++            more_link_path: ''
++            strip_tags: false
++            trim: false
++            preserve_tags: ''
++            html: false
++          element_type: ''
++          element_class: ''
++          element_label_type: ''
++          element_label_class: ''
++          element_label_colon: false
++          element_wrapper_type: ''
++          element_wrapper_class: ''
++          element_default_classes: true
++          empty: ''
++          hide_empty: false
++          empty_zero: false
++          hide_alter_empty: true
++          click_sort_column: value
++          type: string
++          settings:
++            link_to_entity: true
++          group_column: value
++          group_columns: {  }
++          group_rows: true
++          delta_limit: 0
++          delta_offset: 0
++          delta_reversed: false
++          delta_first_last: false
++          multi_type: separator
++          separator: ', '
++          field_api_classes: false
++      pager:
++        type: mini
++        options:
++          offset: 0
++          items_per_page: 10
++          total_pages: null
++          id: 0
++          tags:
++            next: ››
++            previous: ‹‹
++          expose:
++            items_per_page: false
++            items_per_page_label: 'Items per page'
++            items_per_page_options: '5, 10, 25, 50'
++            items_per_page_options_all: false
++            items_per_page_options_all_label: '- All -'
++            offset: false
++            offset_label: Offset
++      exposed_form:
++        type: basic
++        options:
++          submit_button: Apply
++          reset_button: false
++          reset_button_label: Reset
++          exposed_sorts_label: 'Sort by'
++          expose_sort_order: true
++          sort_asc_label: Asc
++          sort_desc_label: Desc
++      access:
++        type: perm
++        options:
++          perm: 'access content'
++      cache:
++        type: tag
++        options: {  }
++      empty: {  }
++      sorts:
++        created:
++          id: created
++          table: node_field_data
++          field: created
++          relationship: none
++          group_type: group
++          admin_label: ''
++          entity_type: node
++          entity_field: created
++          plugin_id: date
++          order: DESC
++          expose:
++            label: ''
++            field_identifier: ''
++          exposed: false
++          granularity: second
++      arguments: {  }
++      filters:
++        status:
++          id: status
++          table: node_field_data
++          field: status
++          entity_type: node
++          entity_field: status
++          plugin_id: boolean
++          value: '1'
++          group: 1
++          expose:
++            operator: ''
++            operator_limit_selection: false
++            operator_list: {  }
++        type:
++          id: type
++          table: node_field_data
++          field: type
++          entity_type: node
++          entity_field: type
++          plugin_id: bundle
++          value:
++            article: article
++          expose:
++            operator_limit_selection: false
++            operator_list: {  }
++        title:
++          id: title
++          table: node_field_data
++          field: title
++          relationship: none
++          group_type: group
++          admin_label: ''
++          entity_type: node
++          entity_field: title
++          plugin_id: string
++          operator: '='
++          value: 'Article 0'
++          group: 1
++          exposed: false
++          expose:
++            operator_id: ''
++            label: ''
++            description: ''
++            use_operator: false
++            operator: ''
++            operator_limit_selection: false
++            operator_list: {  }
++            identifier: ''
++            required: false
++            remember: false
++            multiple: false
++            remember_roles:
++              authenticated: authenticated
++            placeholder: ''
++          is_grouped: false
++          group_info:
++            label: ''
++            description: ''
++            identifier: ''
++            optional: true
++            widget: select
++            multiple: false
++            remember: false
++            default_group: All
++            default_group_multiple: {  }
++            group_items: {  }
++      style:
++        type: default
++        options:
++          grouping: {  }
++          row_class: ''
++          default_row_class: true
++          uses_fields: false
++      row:
++        type: fields
++        options:
++          default_field_elements: true
++          inline: {  }
++          separator: ''
++          hide_empty: false
++      query:
++        type: views_query
++        options:
++          query_comment: ''
++          disable_sql_rewrite: false
++          distinct: false
++          replica: false
++          query_tags: {  }
++      relationships: {  }
++      header: {  }
++      footer: {  }
++      display_extenders: {  }
++    cache_metadata:
++      max-age: -1
++      contexts:
++        - 'languages:language_content'
++        - 'languages:language_interface'
++        - url.query_args
++        - 'user.node_grants:view'
++        - user.permissions
++      tags: {  }
++  entity_reference:
++    id: entity_reference
++    display_title: 'Entity Reference'
++    display_plugin: entity_reference
++    position: 1
++    display_options:
++      style:
++        type: entity_reference
++        options:
++          search_fields:
++            title: title
++      row:
++        type: entity_reference
++        options:
++          default_field_elements: true
++          inline: {  }
++          separator: '-'
++          hide_empty: false
++      display_extenders: {  }
++    cache_metadata:
++      max-age: -1
++      contexts:
++        - 'languages:language_content'
++        - 'languages:language_interface'
++        - 'user.node_grants:view'
++        - user.permissions
++      tags: {  }
+diff --git a/core/modules/views/tests/modules/views_test_entity_reference/views_test_entity_reference.info.yml b/core/modules/views/tests/modules/views_test_entity_reference/views_test_entity_reference.info.yml
+new file mode 100644
+index 0000000000000000000000000000000000000000..3bc975ea74781039f3cdb9bfe5395688c89387d3
+--- /dev/null
++++ b/core/modules/views/tests/modules/views_test_entity_reference/views_test_entity_reference.info.yml
+@@ -0,0 +1,8 @@
++name: 'Views Test Entity Reference'
++type: module
++description: 'Provides an entity reference view for use in a selection handler.'
++package: Testing
++version: VERSION
++dependencies:
++  - drupal:views
++  - drupal:field
+diff --git a/core/modules/views/tests/modules/views_test_entity_reference/views_test_entity_reference.module b/core/modules/views/tests/modules/views_test_entity_reference/views_test_entity_reference.module
+new file mode 100644
+index 0000000000000000000000000000000000000000..248a96757537291d4bbe6213f4c0cd6ffe5903d5
+--- /dev/null
++++ b/core/modules/views/tests/modules/views_test_entity_reference/views_test_entity_reference.module
+@@ -0,0 +1,28 @@
++<?php
++
++/**
++ * @file
++ * Views data altering to test use of the entity reference plugin.
++ */
++
++/**
++ * Implements hook_views_data_alter().
++ */
++function views_test_entity_reference_views_data_alter(&$data) {
++  $manager = \Drupal::entityTypeManager();
++  $field_config_storage = $manager->getStorage('field_config');
++  /** @var \Drupal\field\FieldConfigInterface[] $field_configs */
++  $field_configs = $field_config_storage->loadByProperties([
++    'field_type' => 'entity_reference',
++  ]);
++  foreach ($field_configs as $field_config) {
++    $table_name = $field_config->getTargetEntityTypeId() . '__' . $field_config->getName();
++    $column_name = $field_config->getName() . '_target_id';
++    if (
++      isset($data[$table_name][$column_name]['filter']['id'])
++      && in_array($data[$table_name][$column_name]['filter']['id'], ['numeric', 'string'])
++    ) {
++      $data[$table_name][$column_name]['filter']['id'] = 'entity_reference';
++    }
++  }
++}
+diff --git a/core/modules/views/tests/src/Kernel/Handler/FilterEntityReferenceTest.php b/core/modules/views/tests/src/Kernel/Handler/FilterEntityReferenceTest.php
+new file mode 100644
+index 0000000000000000000000000000000000000000..1fbf7cf3a9b46e42dff79927e309e56ec129d2aa
+--- /dev/null
++++ b/core/modules/views/tests/src/Kernel/Handler/FilterEntityReferenceTest.php
+@@ -0,0 +1,256 @@
++<?php
++
++declare(strict_types=1);
++
++namespace Drupal\Tests\views\Kernel\Handler;
++
++use Drupal\Core\Field\FieldStorageDefinitionInterface;
++use Drupal\Tests\field\Traits\EntityReferenceFieldCreationTrait;
++use Drupal\Tests\node\Traits\ContentTypeCreationTrait;
++use Drupal\Tests\node\Traits\NodeCreationTrait;
++use Drupal\Tests\user\Traits\UserCreationTrait;
++use Drupal\Tests\views\Kernel\ViewsKernelTestBase;
++use Drupal\user\UserInterface;
++use Drupal\views\Plugin\views\filter\EntityReference;
++use Drupal\views\Tests\ViewTestData;
++use Drupal\views\Views;
++
++/**
++ * Tests the core Drupal\views\Plugin\views\filter\EntityReference handler.
++ *
++ * @group views
++ */
++class FilterEntityReferenceTest extends ViewsKernelTestBase {
++
++  use ContentTypeCreationTrait;
++  use EntityReferenceFieldCreationTrait;
++  use NodeCreationTrait;
++  use UserCreationTrait;
++
++  /**
++   * {@inheritdoc}
++   */
++  public static $testViews = ['test_filter_entity_reference'];
++
++  /**
++   * {@inheritdoc}
++   */
++  protected static $modules = [
++    'system',
++    'node',
++    'user',
++    'field',
++    'text',
++    'filter',
++    'views',
++    'views_test_entity_reference',
++  ];
++
++  /**
++   * Test host nodes containing the entity reference.
++   *
++   * @var \Drupal\node\NodeInterface[]
++   */
++  protected array $hostNodes;
++
++  /**
++   * Test target nodes referenced by the entity reference.
++   *
++   * @var \Drupal\node\NodeInterface[]
++   */
++  protected array $targetNodes;
++
++  /**
++   * First test user as node author.
++   *
++   * @var \Drupal\user\UserInterface
++   */
++  protected UserInterface $user1;
++
++  /**
++   * Second test user as node author.
++   *
++   * @var \Drupal\user\UserInterface
++   */
++  protected UserInterface $user2;
++
++  /**
++   * {@inheritdoc}
++   */
++  protected function setUp($import_test_views = TRUE): void {
++    parent::setUp(FALSE);
++    $this->installEntitySchema('node');
++    $this->installEntitySchema('user');
++    $this->installConfig(['node', 'user', 'filter']);
++
++    ViewTestData::createTestViews(static::class, ['views_test_config']);
++    // Create two node types.
++    $this->createContentType(['type' => 'page']);
++    $this->createContentType(['type' => 'article']);
++
++    // Add an entity reference field to the page type referencing the article
++    // type.
++    $selection_handler_settings = [
++      'target_bundles' => [
++        'article' => 'article',
++      ],
++    ];
++    $this->createEntityReferenceField('node', 'page', 'field_test', 'Test reference', 'node', $selection_handler = 'default', $selection_handler_settings, FieldStorageDefinitionInterface::CARDINALITY_UNLIMITED);
++
++    // Create user 1.
++    $this->user1 = $this->createUser();
++    $this->user2 = $this->createUser();
++
++    // Create target nodes to be referenced.
++    foreach (range(0, 5) as $count) {
++      $this->targetNodes[$count] = $this->createNode([
++        'type' => 'article',
++        'title' => 'Article ' . $count,
++        'status' => 1,
++        'uid' => $this->user1,
++      ]);
++    }
++
++    // Create a page referencing Article 0 and Article 1.
++    $this->hostNodes[0] = $this->createNode([
++      'type' => 'page',
++      'title' => 'Page 0',
++      'status' => 1,
++      'created' => time(),
++      'field_test' => [
++        $this->targetNodes[0]->id(),
++        $this->targetNodes[1]->id(),
++      ],
++      'uid' => $this->user2,
++    ]);
++
++    // Create a page referencing Article 1, Article 2, and Article 3.
++    $this->hostNodes[1] = $this->createNode([
++      'type' => 'page',
++      'title' => 'Page 1',
++      'status' => 1,
++      'created' => time() - 100,
++      'field_test' => [
++        $this->targetNodes[1]->id(),
++        $this->targetNodes[2]->id(),
++        $this->targetNodes[3]->id(),
++      ],
++      'uid' => $this->user2,
++    ]);
++
++    // Create a page referencing nothing.
++    $this->hostNodes[2] = $this->createNode([
++      'type' => 'page',
++      'title' => 'Page 2',
++      'status' => 1,
++      'created' => time() - 200,
++      'uid' => $this->user2,
++    ]);
++  }
++
++  /**
++   * Tests that results are successfully filtered by the select list widget.
++   */
++  public function testViewEntityReferenceAsSelectList(): void {
++    $view = Views::getView('test_filter_entity_reference');
++    $view->setDisplay();
++    $view->preExecute([]);
++    $view->setExposedInput([
++      'field_test_target_id' => [$this->targetNodes[0]->id()],
++    ]);
++    $this->executeView($view);
++
++    // Expect to have only Page 0, with Article 0 referenced.
++    $expected = [
++      ['title' => 'Page 0'],
++    ];
++    $this->assertIdenticalResultset($view, $expected, [
++      'title' => 'title',
++    ]);
++
++    // Change to both Article 0 and Article 3.
++    $view = Views::getView('test_filter_entity_reference');
++    $view->setDisplay();
++    $view->setExposedInput([
++      'field_test_target_id' => [
++        $this->targetNodes[0]->id(),
++        $this->targetNodes[3]->id(),
++      ],
++    ]);
++    $this->executeView($view);
++
++    // Expect to have Page 0 and 1, with Article 0 and 3 referenced.
++    $expected = [
++      ['title' => 'Page 0'],
++      ['title' => 'Page 1'],
++    ];
++    $this->assertIdenticalResultset($view, $expected, [
++      'title' => 'title',
++    ]);
++  }
++
++  /**
++   * Tests that results are successfully filtered by the autocomplete widget.
++   */
++  public function testViewEntityReferenceAsAutocomplete(): void {
++    // Change the widget to autocomplete.
++    $view = Views::getView('test_filter_entity_reference');
++    $view->setDisplay();
++    $filters = $view->displayHandlers->get('default')->getOption('filters');
++    $filters['field_test_target_id']['widget'] = EntityReference::WIDGET_AUTOCOMPLETE;
++    $view->displayHandlers->get('default')->overrideOption('filters', $filters);
++    $view->setExposedInput([
++      'field_test_target_id' => [
++        ['target_id' => $this->targetNodes[0]->id()],
++        ['target_id' => $this->targetNodes[3]->id()],
++      ],
++    ]);
++    $this->executeView($view);
++
++    // Expect to have Page 0 and 1, with Article 0 and 3 referenced.
++    $expected = [
++      ['title' => 'Page 0'],
++      ['title' => 'Page 1'],
++    ];
++    $this->assertIdenticalResultset($view, $expected, [
++      'title' => 'title',
++    ]);
++  }
++
++  /**
++   * Tests that content dependencies are added to the view.
++   */
++  public function testViewContentDependencies(): void {
++    $view = Views::getView('test_filter_entity_reference');
++    $value = [
++      $this->targetNodes[0]->id(),
++      $this->targetNodes[3]->id(),
++    ];
++    $view->setHandlerOption(
++      'default',
++      'filter',
++      'field_test_target_id',
++      'value',
++      $value
++    );
++
++    // Dependencies are sorted.
++    $content_dependencies = [
++      $this->targetNodes[0]->getConfigDependencyName(),
++      $this->targetNodes[3]->getConfigDependencyName(),
++    ];
++    sort($content_dependencies);
++
++    $this->assertEquals([
++      'config' => [
++        'node.type.page',
++      ],
++      'content' => $content_dependencies,
++      'module' => [
++        'node',
++        'user',
++      ],
++    ], $view->getDependencies());
++  }
++
++}
+diff --git a/core/modules/views_ui/tests/src/Functional/FilterEntityReferenceWebTest.php b/core/modules/views_ui/tests/src/Functional/FilterEntityReferenceWebTest.php
+new file mode 100644
+index 0000000000000000000000000000000000000000..74cadc64d628f51169ed6f4fb2ab825badf7f12c
+--- /dev/null
++++ b/core/modules/views_ui/tests/src/Functional/FilterEntityReferenceWebTest.php
+@@ -0,0 +1,138 @@
++<?php
++
++declare(strict_types=1);
++
++namespace Drupal\Tests\views_ui\Functional;
++
++use Drupal\Component\Render\FormattableMarkup;
++use Drupal\Core\Entity\EntityInterface;
++use Drupal\Tests\views_ui\Traits\FilterEntityReferenceTrait;
++
++/**
++ * Tests the entity reference filter UI.
++ *
++ * @group views_ui
++ * @see \Drupal\views\Plugin\views\filter\EntityReference
++ */
++class FilterEntityReferenceWebTest extends UITestBase {
++
++  use FilterEntityReferenceTrait;
++
++  /**
++   * {@inheritdoc}
++   */
++  protected $defaultTheme = 'stark';
++
++  /**
++   * {@inheritdoc}
++   */
++  public static $testViews = ['test_filter_entity_reference'];
++
++  /**
++   * {@inheritdoc}
++   */
++  protected static $modules = [
++    'node',
++    'views_ui',
++    'block',
++    'taxonomy',
++    'views_test_entity_reference',
++  ];
++
++  /**
++   * {@inheritdoc}
++   */
++  protected function setUp($import_test_views = TRUE, $modules = []): void {
++    parent::setUp($import_test_views);
++    $this->setUpEntityTypes();
++  }
++
++  /**
++   * Tests the filter UI.
++   */
++  public function testFilterUi(): void {
++    $this->drupalGet('admin/structure/views/nojs/handler/test_filter_entity_reference/default/filter/field_test_target_id');
++
++    $options = $this->getUiOptions();
++    // Should be sorted by title ASC.
++    uasort($this->targetEntities, function (EntityInterface $a, EntityInterface $b) {
++      return strnatcasecmp($a->getTitle(), $b->getTitle());
++    });
++    $i = 0;
++    foreach ($this->targetEntities as $id => $entity) {
++      $message = (string) new FormattableMarkup('Expected target entity label found for option :option', [':option' => $i]);
++      $this->assertEquals($options[$i]['label'], $entity->label(), $message);
++      $i++;
++    }
++
++    // Change the sort field and direction.
++    $this->drupalGet('admin/structure/views/nojs/handler-extra/test_filter_entity_reference/default/filter/field_test_target_id');
++    $edit = [
++      'options[reference_default:node][sort][field]' => 'nid',
++      'options[reference_default:node][sort][direction]' => 'DESC',
++    ];
++    $this->submitForm($edit, 'Apply');
++
++    $this->drupalGet('admin/structure/views/nojs/handler/test_filter_entity_reference/default/filter/field_test_target_id');
++    // Items should now be in reverse id order.
++    krsort($this->targetEntities);
++    $options = $this->getUiOptions();
++    $i = 0;
++    foreach ($this->targetEntities as $entity) {
++      $message = (string) new FormattableMarkup('Expected target entity label found for option :option', [':option' => $i]);
++      $this->assertEquals($options[$i]['label'], $entity->label(), $message);
++      $i++;
++    }
++
++    // Change bundle types.
++    $this->drupalGet('admin/structure/views/nojs/handler-extra/test_filter_entity_reference/default/filter/field_test_target_id');
++    $edit = [
++      "options[reference_default:node][target_bundles][{$this->hostBundle->id()}]" => TRUE,
++      "options[reference_default:node][target_bundles][{$this->targetBundle->id()}]" => TRUE,
++    ];
++    $this->submitForm($edit, 'Apply');
++
++    $this->drupalGet('admin/structure/views/nojs/handler/test_filter_entity_reference/default/filter/field_test_target_id');
++    $options = $this->getUiOptions();
++    $i = 0;
++    foreach ($this->hostEntities + $this->targetEntities as $entity) {
++      $message = (string) new FormattableMarkup('Expected target entity label found for option :option', [':option' => $i]);
++      $this->assertEquals($options[$i]['label'], $entity->label(), $message);
++      $i++;
++    }
++  }
++
++  /**
++   * Tests the filter UI for config reference.
++   */
++  public function testFilterConfigUi(): void {
++    $this->drupalGet('admin/structure/views/nojs/handler/test_filter_entity_reference/default/filter/field_test_config_target_id');
++
++    $options = $this->getUiOptions();
++    // We should expect the content types defined as options.
++    $this->assertEquals(['article', 'page'], array_column($options, 'label'));
++  }
++
++  /**
++   * Helper method to parse options from the UI.
++   *
++   * @return array
++   *   Array of keyed arrays containing the id and label of each option.
++   */
++  protected function getUiOptions(): array {
++    /** @var \Behat\Mink\Element\TraversableElement[] $result */
++    $result = $this->xpath('//select[@name="options[value][]"]/option');
++    $this->assertNotEmpty($result, 'Options found');
++
++    $options = [];
++    foreach ($result as $option) {
++      $options[] = [
++        'id' => (int) $option->getValue(),
++        'label' => $option->getText(),
++      ];
++    }
++
++    return $options;
++  }
++
++}
+diff --git a/core/modules/views_ui/tests/src/FunctionalJavascript/FilterEntityReferenceTest.php b/core/modules/views_ui/tests/src/FunctionalJavascript/FilterEntityReferenceTest.php
+new file mode 100644
+index 0000000000000000000000000000000000000000..346816ce2eb9e3de546c75dc978780a976daebc3
+--- /dev/null
++++ b/core/modules/views_ui/tests/src/FunctionalJavascript/FilterEntityReferenceTest.php
+@@ -0,0 +1,251 @@
++<?php
++
++declare(strict_types=1);
++
++namespace Drupal\Tests\views_ui\FunctionalJavascript;
++
++use Drupal\Core\Url;
++use Drupal\FunctionalJavascriptTests\WebDriverTestBase;
++use Drupal\Tests\views_ui\Traits\FilterEntityReferenceTrait;
++
++/**
++ * Tests views creation wizard.
++ *
++ * @group views_ui
++ * @see \Drupal\views\Plugin\views\filter\EntityReference
++ */
++class FilterEntityReferenceTest extends WebDriverTestBase {
++
++  use FilterEntityReferenceTrait;
++
++  /**
++   * {@inheritdoc}
++   */
++  protected static $modules = [
++    'node',
++    'views',
++    'views_ui',
++    'views_test_entity_reference',
++  ];
++
++  /**
++   * {@inheritdoc}
++   */
++  protected $defaultTheme = 'stark';
++
++  /**
++   * Views used by this test.
++   *
++   * @var array
++   */
++  public static $testViews = ['test_entity_reference'];
++
++  /**
++   * {@inheritdoc}
++   */
++  public function setUp(): void {
++    parent::setUp();
++
++    $admin_user = $this->drupalCreateUser([
++      'administer views',
++    ]);
++    $this->drupalLogin($admin_user);
++
++    $this->setUpEntityTypes();
++  }
++
++  /**
++   * Tests end to end creation of a Content Entity Reference filter.
++   */
++  public function testAddEntityReferenceFieldWithDefaultSelectionHandler(): void {
++    $this->drupalGet('admin/structure/views/view/content');
++    $assert = $this->assertSession();
++    $page = $this->getSession()->getPage();
++
++    // Open the dialog.
++    $page->clickLink('views-add-filter');
++
++    // Wait for the popup to open and the search field to be available.
++    $assert->waitForField('override[controls][options_search]');
++
++    // Test that the both entity_reference and numeric options are visible.
++    $this->assertTrue($page->findField('name[node__field_test.field_test_target_id]')
++      ->isVisible());
++    $this->assertTrue($page->findField('name[node__field_test.field_test_target_id]')
++      ->isVisible());
++    $page->findField('name[node__field_test.field_test_target_id]')
++      ->click();
++    $this->assertTrue($page->find('css', 'button.button.button--primary.form-submit.ui-button')
++      ->isVisible());
++    $page->find('css', 'button.button.button--primary.form-submit.ui-button')
++      ->click();
++
++    // Wait for the selection handler to show up.
++    $assert->waitForField('options[sub_handler]');
++    $page->selectFieldOption('options[sub_handler]', 'default:node');
++
++    // Check that that default handler target bundles are available.
++    $this->assertTrue($page->findField('options[reference_default:node][target_bundles][article]')
++      ->isVisible());
++    $this->assertTrue($page->findField('options[reference_default:node][target_bundles][page]')
++      ->isVisible());
++    $this->assertTrue($page->findField('options[widget]')->isVisible());
++
++    // Ensure that disabled form elements from selection handler do not show up
++    // @see \Drupal\views\Plugin\views\filter\EntityReference method
++    // buildExtraOptionsForm.
++    $this->assertFalse($page->hasField('options[reference_default:node][target_bundles_update]'));
++    $this->assertFalse($page->hasField('options[reference_default:node][auto_create]'));
++    $this->assertFalse($page->hasField('options[reference_default:node][auto_create_bundle]'));
++
++    // Choose the default handler using the select widget with article type
++    // checked.
++    $page->checkField('options[reference_default:node][target_bundles][article]');
++    $page->selectFieldOption('options[widget]', 'select');
++    $this->assertSame($page->findField('options[widget]')
++      ->getValue(), 'select');
++    $page->find('xpath', "//*[contains(text(), 'Apply and continue')]")
++      ->press();
++
++    // Test the exposed filter options show up correctly.
++    $assert->waitForField('options[expose_button][checkbox][checkbox]');
++    $page->findField('options[expose_button][checkbox][checkbox]')->click();
++    $this->assertTrue($page->hasCheckedField('options[expose_button][checkbox][checkbox]'));
++
++    // Check the exposed filters multiple option.
++    $assert->waitForField('options[expose][multiple]');
++    $page->findField('options[expose][multiple]')->click();
++    $this->assertTrue($page->hasCheckedField('options[expose][multiple]'));
++    $page->find('css', '.ui-dialog .ui-dialog-buttonpane')->pressButton('Apply');
++    $assert->waitForElementRemoved('css', '.ui-dialog');
++
++    // Wait for the Views Preview to show up with the new reference field.
++    $assert->waitForField('field_test_config_target_id[]');
++    $this->assertTrue($page->findField('field_test_target_id[]')
++      ->isVisible());
++    $this->assertTrue($page->find('css', 'select[name="field_test_target_id[]"]')
++      ->hasAttribute('multiple'));
++
++    // Opening the settings form and change the handler to use an Entity
++    // Reference view.
++    // @see views.view.test_entity_reference.yml
++    $base_url = Url::fromRoute('entity.view.collection')->toString();
++    $url = $base_url . '/nojs/handler-extra/content/page_1/filter/field_test_target_id';
++    $extra_settings_selector = 'a[href="' . $url . '"]';
++    $element = $this->assertSession()->waitForElementVisible('css', $extra_settings_selector);
++    $this->assertNotNull($element);
++    $element->click();
++    $assert->waitForField('options[sub_handler]');
++    $page->selectFieldOption('options[sub_handler]', 'views');
++    $page->selectFieldOption('options[reference_views][view][view_and_display]', 'test_entity_reference:entity_reference');
++    $page->find('xpath', "//*[contains(text(), 'Apply')]")
++      ->press();
++    $assert->assertWaitOnAjaxRequest();
++
++    // The Views Reference filter has a title Filter to a single result, so
++    // ensure only that result is available as an option.
++    $assert->waitForElementRemoved('css', '.ui-dialog');
++
++    $this->assertCount(1, $page->findAll('css', 'select[name="field_test_target_id[]"] option'));
++
++    // Change to an autocomplete filter.
++    // Opening the settings form and change the handler to use an Entity
++    // Reference view.
++    // @see views.view.test_entity_reference.yml
++    $page->find('css', $extra_settings_selector)
++      ->click();
++    $assert->waitForElementVisible('named', [
++      'radio',
++      'options[widget]',
++    ]);
++    $page->selectFieldOption('options[widget]', 'autocomplete');
++    $this->assertSame($page->findField('options[widget]')
++      ->getValue(), 'autocomplete');
++    $this->getSession()
++      ->getPage()
++      ->find('xpath', "//*[contains(text(), 'Apply')]")
++      ->press();
++
++    // Check that it is now an autocomplete.
++    $assert->waitForField('field_test_target_id');
++    $page = $this->getSession()->getPage();
++    $this->assertTrue($page->findField('field_test_target_id')
++      ->isVisible());
++    $this->assertTrue($page->find('css', 'input[name="field_test_target_id"]')
++      ->hasAttribute('data-autocomplete-path'));
++  }
++
++  /**
++   * Tests end to end creation of a Config Entity Reference filter.
++   */
++  public function testAddConfigEntityReferenceFieldWithDefaultSelectionHandler(): void {
++    $this->drupalGet('admin/structure/views/view/content');
++    $assert = $this->assertSession();
++    $page = $this->getSession()->getPage();
++
++    // Open the 'Add filter dialog'.
++    $page->clickLink('views-add-filter');
++
++    // Wait for the popup to open and the search field to be available.
++    $assert->waitForField('override[controls][group]');
++
++    // Test that the entity_reference option is visible.
++    $this->assertTrue($page->findField('name[node__field_test_config.field_test_config_target_id]')->isVisible());
++    $page->findField('name[node__field_test_config.field_test_config_target_id]')->click();
++    $submitButton = $page->find('css', 'button.button.button--primary.form-submit.ui-button');
++    $this->assertTrue($submitButton->isVisible());
++    $submitButton->click();
++
++    // Wait for the selection handler to show up.
++    $assert->waitForField('options[sub_handler]');
++
++    $page->selectFieldOption('options[sub_handler]', 'default:node_type');
++
++    // Choose the default handler using the select widget with article type
++    // checked.
++    $page->selectFieldOption('options[widget]', 'select');
++    $this->assertSame('select', $page->findField('options[widget]')->getValue());
++    $page->find('xpath', "//*[contains(text(), 'Apply and continue')]")->press();
++
++    // Test the exposed filter options show up correctly.
++    $assert->waitForField('options[expose_button][checkbox][checkbox]');
++    $page->findField('options[expose_button][checkbox][checkbox]')->click();
++    $this->assertTrue($page->hasCheckedField('options[expose_button][checkbox][checkbox]'));
++
++    // Check the exposed filters multiple option.
++    $assert->waitForField('options[expose][multiple]');
++    $page->findField('options[expose][multiple]')->click();
++    $this->assertTrue($page->hasCheckedField('options[expose][multiple]'));
++    $page->find('css', '.ui-dialog .ui-dialog-buttonpane')->pressButton('Apply');
++    $assert->waitForElementRemoved('css', '.ui-dialog');
++
++    // Wait for the Views Preview to show up with the reference field.
++    $assert->waitForField('field_test_config_target_id[]');
++    $this->assertTrue($page->findField('field_test_config_target_id[]')->isVisible());
++    $this->assertTrue($page->find('css', 'select[name="field_test_config_target_id[]"]')->hasAttribute('multiple'));
++
++    // Check references config options.
++    $options = $page->findAll('css', 'select[name="field_test_config_target_id[]"] option');
++    $this->assertCount(2, $options);
++    $this->assertSame('article', $options[0]->getValue());
++    $this->assertSame('page', $options[1]->getValue());
++
++    $base_url = Url::fromRoute('entity.view.collection')->toString();
++    $url = $base_url . '/nojs/handler-extra/content/page_1/filter/field_test_config_target_id';
++    $extra_settings_selector = 'a[href="' . $url . '"]';
++
++    // Change to an autocomplete filter.
++    $page->find('css', $extra_settings_selector)->click();
++    $assert->waitForField('options[widget]');
++    $page->selectFieldOption('options[widget]', 'autocomplete');
++    $this->assertSame('autocomplete', $page->findField('options[widget]')->getValue());
++    $page->find('css', '.ui-dialog .ui-dialog-buttonpane')->pressButton('Apply');
++    $this->assertSession()->assertWaitOnAjaxRequest();
++
++    // Check that it is now an autocomplete input.
++    $assert->waitForField('field_test_config_target_id');
++    $this->assertTrue($page->findField('field_test_config_target_id')->isVisible());
++    $this->assertTrue($page->find('css', 'input[name="field_test_config_target_id"]')->hasAttribute('data-autocomplete-path'));
++  }
++
++}
+diff --git a/core/modules/views_ui/tests/src/Traits/FilterEntityReferenceTrait.php b/core/modules/views_ui/tests/src/Traits/FilterEntityReferenceTrait.php
+new file mode 100644
+index 0000000000000000000000000000000000000000..83e58fbaf49b5b8a92ee0c95447ff1ac17e63eae
+--- /dev/null
++++ b/core/modules/views_ui/tests/src/Traits/FilterEntityReferenceTrait.php
+@@ -0,0 +1,135 @@
++<?php
++
++declare(strict_types=1);
++
++namespace Drupal\Tests\views_ui\Traits;
++
++use Drupal\Core\Field\FieldStorageDefinitionInterface;
++use Drupal\field\Entity\FieldConfig;
++use Drupal\field\Entity\FieldStorageConfig;
++use Drupal\node\NodeTypeInterface;
++use Drupal\Tests\node\Traits\ContentTypeCreationTrait;
++use Drupal\Tests\node\Traits\NodeCreationTrait;
++
++/**
++ * Sets up the entity types and relationships for entity reference tests.
++ *
++ * This trait is meant to be used only by test classes.
++ */
++trait FilterEntityReferenceTrait {
++
++  use ContentTypeCreationTrait {
++    createContentType as drupalCreateContentType;
++  }
++  use NodeCreationTrait {
++    getNodeByTitle as drupalGetNodeByTitle;
++    createNode as drupalCreateNode;
++  }
++
++  /**
++   * The host content type to add the entity reference field to.
++   *
++   * @var \Drupal\node\NodeTypeInterface
++   */
++  protected NodeTypeInterface $hostBundle;
++
++  /**
++   * The content type to be referenced by the host content type.
++   *
++   * @var \Drupal\node\NodeTypeInterface
++   */
++  protected NodeTypeInterface $targetBundle;
++
++  /**
++   * Entities to be used as reference targets.
++   *
++   * @var \Drupal\node\NodeInterface[]
++   */
++  protected array $targetEntities;
++
++  /**
++   * Host entities which contain the reference fields to the target entities.
++   *
++   * @var \Drupal\node\NodeInterface[]
++   */
++  protected array $hostEntities;
++
++  /**
++   * Sets up the entity types and relationships.
++   */
++  protected function setUpEntityTypes(): void {
++    // Create an entity type, and a referenceable type. Since these are coded
++    // into the test view, they are not randomly named.
++    $this->hostBundle = $this->drupalCreateContentType(['type' => 'page']);
++    $this->targetBundle = $this->drupalCreateContentType(['type' => 'article']);
++
++    $field_storage = FieldStorageConfig::create([
++      'entity_type' => 'node',
++      'field_name' => 'field_test',
++      'type' => 'entity_reference',
++      'settings' => [
++        'target_type' => 'node',
++      ],
++      'cardinality' => FieldStorageDefinitionInterface::CARDINALITY_UNLIMITED,
++    ]);
++    $field_storage->save();
++
++    $field = FieldConfig::create([
++      'entity_type' => 'node',
++      'field_name' => 'field_test',
++      'bundle' => $this->hostBundle->id(),
++      'settings' => [
++        'handler' => 'default',
++        'handler_settings' => [
++          'target_bundles' => [
++            $this->targetBundle->id() => $this->targetBundle->label(),
++          ],
++        ],
++      ],
++    ]);
++    $field->save();
++
++    // Create 10 nodes for use as target entities.
++    for ($i = 0; $i < 10; $i++) {
++      $node = $this->drupalCreateNode([
++        'type' => $this->targetBundle->id(),
++        'title' => ucfirst($this->targetBundle->id()) . ' ' . $i,
++      ]);
++      $this->targetEntities[$node->id()] = $node;
++    }
++
++    // Create 1 host entity to reference target entities from.
++    $node = $this->drupalCreateNode([
++      'type' => $this->hostBundle->id(),
++      'title' => ucfirst($this->hostBundle->id()) . ' 0',
++    ]);
++    $this->hostEntities = [
++      $node->id() => $node,
++    ];
++
++    $field_storage = FieldStorageConfig::create([
++      'entity_type' => 'node',
++      'field_name' => 'field_test_config',
++      'type' => 'entity_reference',
++      'settings' => [
++        'target_type' => 'node_type',
++      ],
++      'cardinality' => FieldStorageDefinitionInterface::CARDINALITY_UNLIMITED,
++    ]);
++    $field_storage->save();
++
++    $field = FieldConfig::create([
++      'entity_type' => 'node',
++      'field_name' => 'field_test_config',
++      'bundle' => $this->hostBundle->id(),
++      'settings' => [
++        'handler' => 'default',
++        'handler_settings' => [
++          'sort' => ['field' => '_none'],
++        ],
++      ],
++    ]);
++    $field->save();
++  }
++
++}
-- 
GitLab


From 9dd0898422db9cfe4697d6abd8fb315d0b9c6740 Mon Sep 17 00:00:00 2001
From: Alexandre Dias <alex.jm.dias@gmail.com>
Date: Wed, 20 Nov 2024 15:54:18 +0000
Subject: [PATCH 004/137] ISAICP-9100: Use group target_id with
 entity_reference.

---
 config/sync/views.view.announcements.yml      | 51 ++++++++++---------
 config/sync/views.view.media.yml              | 49 +++++++++---------
 .../solution/manage_solutions.archive.feature |  4 --
 .../custom/joinup_group/joinup_group.module   | 51 -------------------
 .../joinup_search/joinup_search.views.inc     |  3 ++
 5 files changed, 56 insertions(+), 102 deletions(-)

diff --git a/config/sync/views.view.announcements.yml b/config/sync/views.view.announcements.yml
index fc484e074e..3f1bc3f3a7 100644
--- a/config/sync/views.view.announcements.yml
+++ b/config/sync/views.view.announcements.yml
@@ -11,7 +11,6 @@ dependencies:
   module:
     - joinup_group
     - message
-    - node
     - options
     - state_machine
     - user
@@ -1168,26 +1167,24 @@ display:
           expose:
             operator_limit_selection: false
             operator_list: {  }
-        title:
-          id: title
-          table: node_field_data
-          field: title
-          relationship: group
+        group_target_id:
+          id: group_target_id
+          table: message__group
+          field: group_target_id
+          relationship: none
           group_type: group
           admin_label: ''
-          entity_type: node
-          entity_field: title
-          plugin_id: string
-          operator: '='
-          value: ''
+          plugin_id: numeric
+          operator: or
+          value: null
           group: 1
           exposed: true
           expose:
-            operator_id: title_op
-            label: Group
+            operator_id: group_target_id_op
+            label: 'Group (group)'
             description: ''
             use_operator: false
-            operator: title_op
+            operator: group_target_id_op
             operator_limit_selection: false
             operator_list: {  }
             identifier: group
@@ -1202,7 +1199,10 @@ display:
               moderator: '0'
               administrator: '0'
               developer: '0'
+            min_placeholder: ''
+            max_placeholder: ''
             placeholder: ''
+            reduce: 0
           is_grouped: false
           group_info:
             label: ''
@@ -1215,6 +1215,18 @@ display:
             default_group: All
             default_group_multiple: {  }
             group_items: {  }
+          reduce_duplicates: false
+          sub_handler: 'default:node'
+          sub_handler_settings:
+            target_bundles:
+              collection: collection
+              solution: solution
+            sort:
+              field: title
+              direction: ASC
+            auto_create: false
+            auto_create_bundle: ''
+          widget: autocomplete
         state_value:
           id: state_value
           table: message__state
@@ -1268,16 +1280,7 @@ display:
         arguments: false
         filters: false
         filter_groups: false
-      relationships:
-        group:
-          id: group
-          table: message__group
-          field: group
-          relationship: none
-          group_type: group
-          admin_label: 'group: Content'
-          plugin_id: standard
-          required: false
+      relationships: {  }
       display_description: ''
       display_extenders:
         metatag_display_extender:
diff --git a/config/sync/views.view.media.yml b/config/sync/views.view.media.yml
index 70036f24c1..c88e9cda60 100644
--- a/config/sync/views.view.media.yml
+++ b/config/sync/views.view.media.yml
@@ -7,7 +7,6 @@ dependencies:
     - image.style.thumbnail
   module:
     - media
-    - node
     - svg_image
     - user
 _core:
@@ -723,26 +722,24 @@ display:
                 title: Unpublished
                 operator: '='
                 value: '0'
-        title:
-          id: title
-          table: node_field_data
-          field: title
-          relationship: og_audience
+        og_audience_target_id:
+          id: og_audience_target_id
+          table: media__og_audience
+          field: og_audience_target_id
+          relationship: none
           group_type: group
           admin_label: ''
-          entity_type: node
-          entity_field: title
-          plugin_id: string
-          operator: '='
-          value: ''
+          plugin_id: numeric
+          operator: or
+          value: null
           group: 1
           exposed: true
           expose:
-            operator_id: title_op
+            operator_id: og_audience_target_id_op
             label: Group
             description: ''
             use_operator: false
-            operator: title_op
+            operator: og_audience_target_id_op
             operator_limit_selection: false
             operator_list: {  }
             identifier: group
@@ -757,7 +754,10 @@ display:
               moderator: '0'
               administrator: '0'
               developer: '0'
+            min_placeholder: ''
+            max_placeholder: ''
             placeholder: ''
+            reduce: 0
           is_grouped: false
           group_info:
             label: ''
@@ -770,6 +770,18 @@ display:
             default_group: All
             default_group_multiple: {  }
             group_items: {  }
+          reduce_duplicates: false
+          sub_handler: 'default:node'
+          sub_handler_settings:
+            target_bundles:
+              collection: collection
+              solution: solution
+            sort:
+              field: title
+              direction: ASC
+            auto_create: false
+            auto_create_bundle: ''
+          widget: autocomplete
       filter_groups:
         operator: AND
         groups:
@@ -851,16 +863,7 @@ display:
           distinct: false
           replica: false
           query_tags: {  }
-      relationships:
-        og_audience:
-          id: og_audience
-          table: media__og_audience
-          field: og_audience
-          relationship: none
-          group_type: group
-          admin_label: 'og_audience: Content'
-          plugin_id: standard
-          required: false
+      relationships: {  }
       header: {  }
       footer: {  }
       display_extenders: {  }
diff --git a/tests/features/solution/manage_solutions.archive.feature b/tests/features/solution/manage_solutions.archive.feature
index 023f586816..e5a2b7cc79 100644
--- a/tests/features/solution/manage_solutions.archive.feature
+++ b/tests/features/solution/manage_solutions.archive.feature
@@ -66,10 +66,6 @@ Feature: When a solution is archived then its sub-content also should be archive
 
   # @covers \Drupal\joinup_group\Access\ArchivedGroupAccessCheck::access and the
   #   `_archived_group` route access requirement for solutions.
-  # @covers \joinup_search_views_query_alter but should be removed and fixed on
-  #   \joinup_group_form_views_exposed_form_alter where the default value forces
-  #   a wrong empty ID value to the query.
-  # @see \joinup_group_form_views_exposed_form_alter.
   @loggedErrors
   Scenario: Archiving / unarchiving a solution must archive / unarchive its sub-content.
     Given I am logged in as "John Moderator"
diff --git a/web/modules/custom/joinup_group/joinup_group.module b/web/modules/custom/joinup_group/joinup_group.module
index bb78ebdc9a..af3e1480e2 100644
--- a/web/modules/custom/joinup_group/joinup_group.module
+++ b/web/modules/custom/joinup_group/joinup_group.module
@@ -508,30 +508,7 @@ function joinup_group_og_user_access_alter(array &$permissions, CacheableMetadat
 function joinup_group_form_views_exposed_form_alter(array &$form, FormStateInterface $form_state): void {
   /** @var \Drupal\views\ViewExecutable $view */
   $view = $form_state->get('view');
-  $storage = \Drupal::entityTypeManager()->getStorage('node');
   $view_id = $view->id();
-  $display = $view->current_display;
-
-  // Replaces a group text exposed filter with a dropdown.
-  if (($view_id === 'announcements' && $display === 'all') || ($view_id === 'media' && $display === 'media_page_list')) {
-    $form['group'] = [
-      '#title' => t('Group'),
-      '#type' => 'entity_autocomplete',
-      '#target_type' => 'node',
-      '#selection_handler' => 'default:node',
-      '#selection_settings' => [
-        'target_bundles' => ['collection', 'solution'],
-        'match_operator' => 'CONTAINS',
-        'match_limit' => 10,
-      ],
-      '#validate_reference' => FALSE,
-      '#maxlength' => 1024,
-      '#element_validate' => [
-        'joinup_group_validate_autocomplete_without_id',
-      ],
-      '#default_value' => !empty($form['group']['#default_value']) ? $storage->load($form['group']['#default_value']) : NULL,
-    ];
-  }
 
   // Adds result counts to the role options on the membership overview for
   // collections and solutions.
@@ -610,34 +587,6 @@ function joinup_group_form_views_exposed_form_alter(array &$form, FormStateInter
   ];
 }
 
-/**
- * Group validation handler for autocomplete field.
- *
- * This function validates the input of an entity_autocomplete field,
- * ensuring that only the title of the entity (e.g., node title) is stored,
- * and the entity ID is removed from the value. This is useful when the ID
- * is appended in the format "Title (ID)" by default, but you want to keep
- * only the title.
- *
- * @param array $element
- *   The form element to be validated (autocomplete field definition).
- * @param \Drupal\Core\Form\FormStateInterface $form_state
- *   The current state of the form.
- * @param array $form
- *   The full form structure.
- */
-function joinup_group_validate_autocomplete_without_id(array &$element, FormStateInterface $form_state, array &$form): void {
-  $value = $form_state->getValue($element['#parents']);
-
-  // If value is a node, strip the ID.
-  if (!empty($value)) {
-    // Parse the title from the autocomplete value if in "Title (ID)" format.
-    if (preg_match('/^(.*?)\s*\(\d+\)$/', $value, $matches)) {
-      $form_state->setValue($element['#parents'], $matches[1]);
-    }
-  }
-}
-
 /**
  * Implements hook_views_query_alter().
  */
diff --git a/web/modules/custom/joinup_search/joinup_search.views.inc b/web/modules/custom/joinup_search/joinup_search.views.inc
index e56e34fe5b..28bf8c33bd 100644
--- a/web/modules/custom/joinup_search/joinup_search.views.inc
+++ b/web/modules/custom/joinup_search/joinup_search.views.inc
@@ -16,6 +16,9 @@
  * entities.
  */
 function joinup_search_views_data_alter(array &$data): void {
+  // Use entity reference for grouping fields within messages and media.
+  $data['message__group']['group_target_id']['filter']['id'] = 'entity_reference';
+  $data['media__og_audience']['og_audience_target_id']['filter']['id'] = 'entity_reference';
   // Create an empty alias tracker variable to mimic the alias generation from
   // search_api_views_data().
   $alias_tracker = [];
-- 
GitLab


From 576297f48547d50711ab2c46ea8e80bcb4b95c67 Mon Sep 17 00:00:00 2001
From: Alexandre Dias <alex.jm.dias@gmail.com>
Date: Thu, 21 Nov 2024 08:24:37 +0000
Subject: [PATCH 005/137] ISAICP-9100: Fix views export extra fields.

---
 config/sync/views.view.announcements.yml | 13 +++++--------
 config/sync/views.view.media.yml         | 11 ++++-------
 2 files changed, 9 insertions(+), 15 deletions(-)

diff --git a/config/sync/views.view.announcements.yml b/config/sync/views.view.announcements.yml
index 3f1bc3f3a7..9fb65761e8 100644
--- a/config/sync/views.view.announcements.yml
+++ b/config/sync/views.view.announcements.yml
@@ -1174,14 +1174,14 @@ display:
           relationship: none
           group_type: group
           admin_label: ''
-          plugin_id: numeric
+          plugin_id: entity_reference
           operator: or
-          value: null
+          value: {  }
           group: 1
           exposed: true
           expose:
             operator_id: group_target_id_op
-            label: 'Group (group)'
+            label: Group
             description: ''
             use_operator: false
             operator: group_target_id_op
@@ -1199,10 +1199,7 @@ display:
               moderator: '0'
               administrator: '0'
               developer: '0'
-            min_placeholder: ''
-            max_placeholder: ''
-            placeholder: ''
-            reduce: 0
+            reduce: false
           is_grouped: false
           group_info:
             label: ''
@@ -1217,6 +1214,7 @@ display:
             group_items: {  }
           reduce_duplicates: false
           sub_handler: 'default:node'
+          widget: autocomplete
           sub_handler_settings:
             target_bundles:
               collection: collection
@@ -1226,7 +1224,6 @@ display:
               direction: ASC
             auto_create: false
             auto_create_bundle: ''
-          widget: autocomplete
         state_value:
           id: state_value
           table: message__state
diff --git a/config/sync/views.view.media.yml b/config/sync/views.view.media.yml
index c88e9cda60..f9aa57c089 100644
--- a/config/sync/views.view.media.yml
+++ b/config/sync/views.view.media.yml
@@ -729,9 +729,9 @@ display:
           relationship: none
           group_type: group
           admin_label: ''
-          plugin_id: numeric
+          plugin_id: entity_reference
           operator: or
-          value: null
+          value: {  }
           group: 1
           exposed: true
           expose:
@@ -754,10 +754,7 @@ display:
               moderator: '0'
               administrator: '0'
               developer: '0'
-            min_placeholder: ''
-            max_placeholder: ''
-            placeholder: ''
-            reduce: 0
+            reduce: false
           is_grouped: false
           group_info:
             label: ''
@@ -772,6 +769,7 @@ display:
             group_items: {  }
           reduce_duplicates: false
           sub_handler: 'default:node'
+          widget: autocomplete
           sub_handler_settings:
             target_bundles:
               collection: collection
@@ -781,7 +779,6 @@ display:
               direction: ASC
             auto_create: false
             auto_create_bundle: ''
-          widget: autocomplete
       filter_groups:
         operator: AND
         groups:
-- 
GitLab


From 6e7e17dd790017bcc2ceeb25a78fe08c363f9d5f Mon Sep 17 00:00:00 2001
From: Alexandre Dias <alex.jm.dias@gmail.com>
Date: Thu, 21 Nov 2024 16:27:29 +0000
Subject: [PATCH 006/137] ISAICP-9100: Move entity_reference data alter.

---
 .../custom/joinup_group/joinup_group.views.inc  |  1 +
 .../custom/joinup_media/joinup_media.views.inc  | 17 +++++++++++++++++
 .../joinup_search/joinup_search.views.inc       |  3 ---
 3 files changed, 18 insertions(+), 3 deletions(-)
 create mode 100644 web/modules/custom/joinup_media/joinup_media.views.inc

diff --git a/web/modules/custom/joinup_group/joinup_group.views.inc b/web/modules/custom/joinup_group/joinup_group.views.inc
index 9115551b83..11917d9cab 100644
--- a/web/modules/custom/joinup_group/joinup_group.views.inc
+++ b/web/modules/custom/joinup_group/joinup_group.views.inc
@@ -18,4 +18,5 @@ function joinup_group_views_data_alter(array &$data): void {
       'id' => 'joinup_group_announcement_edit_link',
     ],
   ];
+  $data['message__group']['group_target_id']['filter']['id'] = 'entity_reference';
 }
diff --git a/web/modules/custom/joinup_media/joinup_media.views.inc b/web/modules/custom/joinup_media/joinup_media.views.inc
new file mode 100644
index 0000000000..7ff944cd48
--- /dev/null
+++ b/web/modules/custom/joinup_media/joinup_media.views.inc
@@ -0,0 +1,17 @@
+<?php
+
+/**
+ * @file
+ * Views integration for Joinup Media module.
+ */
+
+declare(strict_types=1);
+
+/**
+ * Implements hook_views_data_alter().
+ *
+ * Use entity reference for group field.
+ */
+function joinup_media_views_data_alter(array &$data): void {
+  $data['media__og_audience']['og_audience_target_id']['filter']['id'] = 'entity_reference';
+}
diff --git a/web/modules/custom/joinup_search/joinup_search.views.inc b/web/modules/custom/joinup_search/joinup_search.views.inc
index 28bf8c33bd..e56e34fe5b 100644
--- a/web/modules/custom/joinup_search/joinup_search.views.inc
+++ b/web/modules/custom/joinup_search/joinup_search.views.inc
@@ -16,9 +16,6 @@
  * entities.
  */
 function joinup_search_views_data_alter(array &$data): void {
-  // Use entity reference for grouping fields within messages and media.
-  $data['message__group']['group_target_id']['filter']['id'] = 'entity_reference';
-  $data['media__og_audience']['og_audience_target_id']['filter']['id'] = 'entity_reference';
   // Create an empty alias tracker variable to mimic the alias generation from
   // search_api_views_data().
   $alias_tracker = [];
-- 
GitLab


From 0d5bb5340a595bf7b25d48bc81d8cb846e65f130 Mon Sep 17 00:00:00 2001
From: Herve Donner <hervedonner@gmail.com>
Date: Fri, 22 Nov 2024 13:39:00 +0100
Subject: [PATCH 007/137] ISAICP-9100: Add short comments.

---
 web/modules/custom/joinup_group/joinup_group.views.inc | 3 +++
 web/modules/custom/joinup_media/joinup_media.views.inc | 2 ++
 2 files changed, 5 insertions(+)

diff --git a/web/modules/custom/joinup_group/joinup_group.views.inc b/web/modules/custom/joinup_group/joinup_group.views.inc
index 11917d9cab..ecbff74763 100644
--- a/web/modules/custom/joinup_group/joinup_group.views.inc
+++ b/web/modules/custom/joinup_group/joinup_group.views.inc
@@ -18,5 +18,8 @@ function joinup_group_views_data_alter(array &$data): void {
       'id' => 'joinup_group_announcement_edit_link',
     ],
   ];
+
+  // Enable entity_reference views filter plugin, used for exposed filter in
+  // announcements view.
   $data['message__group']['group_target_id']['filter']['id'] = 'entity_reference';
 }
diff --git a/web/modules/custom/joinup_media/joinup_media.views.inc b/web/modules/custom/joinup_media/joinup_media.views.inc
index 7ff944cd48..482d5361ce 100644
--- a/web/modules/custom/joinup_media/joinup_media.views.inc
+++ b/web/modules/custom/joinup_media/joinup_media.views.inc
@@ -13,5 +13,7 @@
  * Use entity reference for group field.
  */
 function joinup_media_views_data_alter(array &$data): void {
+  // Enable entity_reference views filter plugin, used for exposed filter in
+  // media view.
   $data['media__og_audience']['og_audience_target_id']['filter']['id'] = 'entity_reference';
 }
-- 
GitLab


From 85a5af82ddd7d01fbdc8e511b6599057a5ec7004 Mon Sep 17 00:00:00 2001
From: "micha.jakubowski" <micha.jakubowski@ffwagency.com>
Date: Tue, 26 Nov 2024 14:54:34 +0100
Subject: [PATCH 008/137] ISAICP-8780: add_comment.feature update

---
 tests/features/comments/add_comment.feature | 75 ++++++++++-----------
 1 file changed, 36 insertions(+), 39 deletions(-)

diff --git a/tests/features/comments/add_comment.feature b/tests/features/comments/add_comment.feature
index cf67485f01..586bd462c7 100644
--- a/tests/features/comments/add_comment.feature
+++ b/tests/features/comments/add_comment.feature
@@ -3,10 +3,7 @@ Feature: Add comments
   As a visitor of the website I can leave a comment on community content.
 
   Background:
-    Given collection content:
-      | title             | state     | closed |
-      | Gossip collection | published | no     |
-    And users:
+    Given users:
       | Username        | E-mail                 | Roles | First name | Family name |
       | Miss tell tales | tell.tales@example.com |       | Miss       | Tales       |
 
@@ -17,8 +14,8 @@ Feature: Add comments
   Scenario Outline: Make an authenticated comment, skips moderation.
 
     Given solution content:
-      | title                | collection        | state     |
-      | Gossip girl solution | Gossip collection | published |
+      | title                | collection | state     |
+      | Gossip girl solution | Joinup     | published |
     And users:
       | Username          | E-mail                        | Roles     | First name | Family name |
       | Comment moderator | comment.moderator@example.com | moderator | Comment    | Moderator   |
@@ -26,9 +23,9 @@ Feature: Add comments
       | Korma Salya       | korma.salya@example.com       |           | Korma      | Salya       |
       | Salma Coster      | salma.coster@example.com      |           | Salma      | Coster      |
     And the following collection user memberships:
-      | collection        | user          | roles                      |
-      | Gossip collection | Layonel Sarok | administrator, facilitator |
-      | Gossip collection | Korma Salya   | facilitator                |
+      | collection | user          | roles                      |
+      | Joinup     | Layonel Sarok | administrator, facilitator |
+      | Joinup     | Korma Salya   | facilitator                |
     And the following solution user memberships:
       | solution             | user          | roles                      |
       | Gossip girl solution | Layonel Sarok | administrator, facilitator |
@@ -87,14 +84,14 @@ Feature: Add comments
       | If you think this action is not clear or not due, please contact Portal Support at http |
     # The owner of the content does not receive a notification due to being the actor.
     And the following email should not have been sent:
-      | recipient | Salma Coster                            |
+      | recipient | Salma Coster                                                 |
       | subject   | Interoperable Europe Portal: A new comment has been created. |
-      | body      | Salma Coster posted a comment in        |
+      | body      | Salma Coster posted a comment in                             |
 
     Examples:
       | content type | title           | state     | parent     | parent title         |
-      | news         | Scandalous news | published | collection | Gossip collection    |
-      | discussion   | Is gossip bad?  | published | collection | Gossip collection    |
+      | news         | Scandalous news | published | collection | Joinup               |
+      | discussion   | Is gossip bad?  | published | collection | Joinup               |
       # Add an example also for solutions to ensure the variables are properly replaced.
       | news         | Scandalous news | published | solution   | Gossip girl solution |
 
@@ -105,8 +102,8 @@ Feature: Add comments
   Scenario Outline: Make an authenticated comment at a community content using layout paragraphs, skips moderation.
 
     Given solution content:
-      | title                | collection        | state     |
-      | Gossip girl solution | Gossip collection | published |
+      | title                | collection | state     |
+      | Gossip girl solution | Joinup     | published |
     And users:
       | Username          | E-mail                        | Roles     | First name | Family name |
       | Comment moderator | comment.moderator@example.com | moderator | Comment    | Moderator   |
@@ -114,9 +111,9 @@ Feature: Add comments
       | Korma Salya       | korma.salya@example.com       |           | Korma      | Salya       |
       | Salma Coster      | salma.coster@example.com      |           | Salma      | Coster      |
     And the following collection user memberships:
-      | collection        | user          | roles                      |
-      | Gossip collection | Layonel Sarok | administrator, facilitator |
-      | Gossip collection | Korma Salya   | facilitator                |
+      | collection | user          | roles                      |
+      | Joinup     | Layonel Sarok | administrator, facilitator |
+      | Joinup     | Korma Salya   | facilitator                |
     And the following solution user memberships:
       | solution             | user          | roles                      |
       | Gossip girl solution | Layonel Sarok | administrator, facilitator |
@@ -175,19 +172,19 @@ Feature: Add comments
       | If you think this action is not clear or not due, please contact Portal Support at http |
     # The owner of the content does not receive a notification due to being the actor.
     And the following email should not have been sent:
-      | recipient | Salma Coster                            |
+      | recipient | Salma Coster                                                 |
       | subject   | Interoperable Europe Portal: A new comment has been created. |
-      | body      | Salma Coster posted a comment in        |
+      | body      | Salma Coster posted a comment in                             |
 
     Examples:
-      | content type | title     | state     | parent     | parent title      |
-      | document     | Wikileaks | published | collection | Gossip collection |
-      | event        | Wikileaks | published | collection | Gossip collection |
+      | content type | title     | state     | parent     | parent title |
+      | document     | Wikileaks | published | collection | Joinup       |
+      | event        | Wikileaks | published | collection | Joinup       |
 
   Scenario Outline: Posting comments.
     Given <content type> content:
-      | title   | body                                                | collection        | state   |
-      | <title> | How could this ever happen? Moral panic on its way! | Gossip collection | <state> |
+      | title   | body                                                | collection | state   |
+      | <title> | How could this ever happen? Moral panic on its way! | Joinup     | <state> |
     Given I am logged in as "Miss tell tales"
     When I go to the content page of the type "<content type>" with the title "<title>"
     # Authenticated users can insert <p> and <br> tags in the comment body.
@@ -266,13 +263,13 @@ Feature: Add comments
     And I should see the button "Post comment"
 
     Examples:
-      | collection        | content type | title                     | state     |
-      | Shy collection    | news         | Scandalous news           | published |
-      | Shy collection    | discussion   | Is gossip bad?            | published |
-      | Shy collection    | document     | Wikileaks                 | published |
-      | Gossip collection | news         | Rihanna wears pope outfit | published |
-      | Gossip collection | discussion   | Is gossip good?           | published |
-      | Gossip collection | document     | Celebrity scandals 2019   | published |
+      | collection     | content type | title                     | state     |
+      | Shy collection | news         | Scandalous news           | published |
+      | Shy collection | discussion   | Is gossip bad?            | published |
+      | Shy collection | document     | Wikileaks                 | published |
+      | Joinup         | news         | Rihanna wears pope outfit | published |
+      | Joinup         | discussion   | Is gossip good?           | published |
+      | Joinup         | document     | Celebrity scandals 2019   | published |
 
   Scenario Outline: Anonymized comments
     Given collection content:
@@ -309,10 +306,10 @@ Feature: Add comments
     Then comment #2 should contain the markup "Anonymous user"
 
     Examples:
-      | collection        | content type | title                     | state     |
-      | Show collection   | news         | Scandalous busy           | published |
-      | Show collection   | discussion   | Is gossip bad or not?     | published |
-      | Show collection   | document     | Wikilikes                 | published |
-      | Gossip collection | news         | Bosinga wears pope outfit | published |
-      | Gossip collection | discussion   | Is gossip good or not?    | published |
-      | Gossip collection | document     | Celebrity scandals 2022   | published |
+      | collection      | content type | title                     | state     |
+      | Show collection | news         | Scandalous busy           | published |
+      | Show collection | discussion   | Is gossip bad or not?     | published |
+      | Show collection | document     | Wikilikes                 | published |
+      | Joinup          | news         | Bosinga wears pope outfit | published |
+      | Joinup          | discussion   | Is gossip good or not?    | published |
+      | Joinup          | document     | Celebrity scandals 2022   | published |
-- 
GitLab


From 1150cdb62c4960a45ff792a1df6b4c5e53f82877 Mon Sep 17 00:00:00 2001
From: "micha.jakubowski" <micha.jakubowski@ffwagency.com>
Date: Tue, 26 Nov 2024 15:01:44 +0100
Subject: [PATCH 009/137] ISAICP-8780: enable joinup_test

---
 config/sync/core.extension.yml | 1 +
 1 file changed, 1 insertion(+)

diff --git a/config/sync/core.extension.yml b/config/sync/core.extension.yml
index b77a0ebe6e..e018435aa9 100644
--- a/config/sync/core.extension.yml
+++ b/config/sync/core.extension.yml
@@ -127,6 +127,7 @@ module:
   joinup_stats: 0
   joinup_subscription: 0
   joinup_taxonomy: 0
+  joinup_test: 0
   joinup_tiles: 0
   joinup_tour: 0
   joinup_user: 0
-- 
GitLab


From 5e85ddcb51913d0b650436a18971d09f73274f0c Mon Sep 17 00:00:00 2001
From: "micha.jakubowski" <micha.jakubowski@ffwagency.com>
Date: Tue, 26 Nov 2024 15:09:52 +0100
Subject: [PATCH 010/137] ISAICP-8780: delete_comment.feature update

---
 tests/features/comments/delete_comment.feature | 17 +++++++----------
 1 file changed, 7 insertions(+), 10 deletions(-)

diff --git a/tests/features/comments/delete_comment.feature b/tests/features/comments/delete_comment.feature
index 5eeb3428ee..2bf66ac0c7 100644
--- a/tests/features/comments/delete_comment.feature
+++ b/tests/features/comments/delete_comment.feature
@@ -3,23 +3,20 @@ Feature: Delete comments
   As a visitor of the website I can leave a comment on community content.
 
   Background:
-    Given collection content:
-      | title                 | logo     | state     |
-      | Semantic web fanatics | logo.png | published |
-    And users:
+    Given users:
       | Username             | E-mail                        | First name  | Family name |
       | Tim Berners Lee      | tim.berners-lee@example.com   | Tim Berners | Lee         |
       | Vicky visitor        | vicky.visitor@example.com     | Vicky       | visitor     |
       | Do Re Mi Facilitator | doremifacilitator@example.com | Do Re Mi    | Facilitator |
     And news content:
-      | title                          | body                              | collection            | state     |
-      | RDF Schemas for government use | Home for DCAT, ADMS, and the like | Semantic web fanatics | published |
+      | title                          | body                              | collection | state     |
+      | RDF Schemas for government use | Home for DCAT, ADMS, and the like | Joinup     | published |
     And comments:
       | subject         | field_body       | author          | parent                         |
       | ADMS is awesome | Let's all use it | Tim Berners Lee | RDF Schemas for government use |
     And the following collection user memberships:
-      | collection            | user                 | roles       |
-      | Semantic web fanatics | Do Re Mi Facilitator | facilitator |
+      | collection | user                 | roles       |
+      | Joinup     | Do Re Mi Facilitator | facilitator |
 
   Scenario: Delete comments
     # As the creator of the comment I can delete the comment.
@@ -46,6 +43,6 @@ Feature: Delete comments
     Then I should see "Are you sure you want to delete the comment ADMS is awesome?"
     Then I press "Delete"
     Then the following email should have been sent:
-      | recipient | Tim Berners Lee                                                                                                                                                  |
-      | subject   | Interoperable Europe Portal: Your comment has been deleted.                                                                                                                            |
+      | recipient | Tim Berners Lee                                                                                                                                                   |
+      | subject   | Interoperable Europe Portal: Your comment has been deleted.                                                                                                       |
       | body      | Do Re Mi Facilitator deleted your comment in "RDF Schemas for government use". To avoid comment moderation in the future, please read our community guidelines at |
-- 
GitLab


From 6aee242e6d726284fbf1dafa9af9b1c581f3d14d Mon Sep 17 00:00:00 2001
From: "micha.jakubowski" <micha.jakubowski@ffwagency.com>
Date: Tue, 26 Nov 2024 15:17:11 +0100
Subject: [PATCH 011/137] ISAICP-8780: restore add_comment.feature and
 delete_comment.feature

---
 tests/features/comments/add_comment.feature   | 75 ++++++++++---------
 .../features/comments/delete_comment.feature  | 17 +++--
 2 files changed, 49 insertions(+), 43 deletions(-)

diff --git a/tests/features/comments/add_comment.feature b/tests/features/comments/add_comment.feature
index 586bd462c7..cf67485f01 100644
--- a/tests/features/comments/add_comment.feature
+++ b/tests/features/comments/add_comment.feature
@@ -3,7 +3,10 @@ Feature: Add comments
   As a visitor of the website I can leave a comment on community content.
 
   Background:
-    Given users:
+    Given collection content:
+      | title             | state     | closed |
+      | Gossip collection | published | no     |
+    And users:
       | Username        | E-mail                 | Roles | First name | Family name |
       | Miss tell tales | tell.tales@example.com |       | Miss       | Tales       |
 
@@ -14,8 +17,8 @@ Feature: Add comments
   Scenario Outline: Make an authenticated comment, skips moderation.
 
     Given solution content:
-      | title                | collection | state     |
-      | Gossip girl solution | Joinup     | published |
+      | title                | collection        | state     |
+      | Gossip girl solution | Gossip collection | published |
     And users:
       | Username          | E-mail                        | Roles     | First name | Family name |
       | Comment moderator | comment.moderator@example.com | moderator | Comment    | Moderator   |
@@ -23,9 +26,9 @@ Feature: Add comments
       | Korma Salya       | korma.salya@example.com       |           | Korma      | Salya       |
       | Salma Coster      | salma.coster@example.com      |           | Salma      | Coster      |
     And the following collection user memberships:
-      | collection | user          | roles                      |
-      | Joinup     | Layonel Sarok | administrator, facilitator |
-      | Joinup     | Korma Salya   | facilitator                |
+      | collection        | user          | roles                      |
+      | Gossip collection | Layonel Sarok | administrator, facilitator |
+      | Gossip collection | Korma Salya   | facilitator                |
     And the following solution user memberships:
       | solution             | user          | roles                      |
       | Gossip girl solution | Layonel Sarok | administrator, facilitator |
@@ -84,14 +87,14 @@ Feature: Add comments
       | If you think this action is not clear or not due, please contact Portal Support at http |
     # The owner of the content does not receive a notification due to being the actor.
     And the following email should not have been sent:
-      | recipient | Salma Coster                                                 |
+      | recipient | Salma Coster                            |
       | subject   | Interoperable Europe Portal: A new comment has been created. |
-      | body      | Salma Coster posted a comment in                             |
+      | body      | Salma Coster posted a comment in        |
 
     Examples:
       | content type | title           | state     | parent     | parent title         |
-      | news         | Scandalous news | published | collection | Joinup               |
-      | discussion   | Is gossip bad?  | published | collection | Joinup               |
+      | news         | Scandalous news | published | collection | Gossip collection    |
+      | discussion   | Is gossip bad?  | published | collection | Gossip collection    |
       # Add an example also for solutions to ensure the variables are properly replaced.
       | news         | Scandalous news | published | solution   | Gossip girl solution |
 
@@ -102,8 +105,8 @@ Feature: Add comments
   Scenario Outline: Make an authenticated comment at a community content using layout paragraphs, skips moderation.
 
     Given solution content:
-      | title                | collection | state     |
-      | Gossip girl solution | Joinup     | published |
+      | title                | collection        | state     |
+      | Gossip girl solution | Gossip collection | published |
     And users:
       | Username          | E-mail                        | Roles     | First name | Family name |
       | Comment moderator | comment.moderator@example.com | moderator | Comment    | Moderator   |
@@ -111,9 +114,9 @@ Feature: Add comments
       | Korma Salya       | korma.salya@example.com       |           | Korma      | Salya       |
       | Salma Coster      | salma.coster@example.com      |           | Salma      | Coster      |
     And the following collection user memberships:
-      | collection | user          | roles                      |
-      | Joinup     | Layonel Sarok | administrator, facilitator |
-      | Joinup     | Korma Salya   | facilitator                |
+      | collection        | user          | roles                      |
+      | Gossip collection | Layonel Sarok | administrator, facilitator |
+      | Gossip collection | Korma Salya   | facilitator                |
     And the following solution user memberships:
       | solution             | user          | roles                      |
       | Gossip girl solution | Layonel Sarok | administrator, facilitator |
@@ -172,19 +175,19 @@ Feature: Add comments
       | If you think this action is not clear or not due, please contact Portal Support at http |
     # The owner of the content does not receive a notification due to being the actor.
     And the following email should not have been sent:
-      | recipient | Salma Coster                                                 |
+      | recipient | Salma Coster                            |
       | subject   | Interoperable Europe Portal: A new comment has been created. |
-      | body      | Salma Coster posted a comment in                             |
+      | body      | Salma Coster posted a comment in        |
 
     Examples:
-      | content type | title     | state     | parent     | parent title |
-      | document     | Wikileaks | published | collection | Joinup       |
-      | event        | Wikileaks | published | collection | Joinup       |
+      | content type | title     | state     | parent     | parent title      |
+      | document     | Wikileaks | published | collection | Gossip collection |
+      | event        | Wikileaks | published | collection | Gossip collection |
 
   Scenario Outline: Posting comments.
     Given <content type> content:
-      | title   | body                                                | collection | state   |
-      | <title> | How could this ever happen? Moral panic on its way! | Joinup     | <state> |
+      | title   | body                                                | collection        | state   |
+      | <title> | How could this ever happen? Moral panic on its way! | Gossip collection | <state> |
     Given I am logged in as "Miss tell tales"
     When I go to the content page of the type "<content type>" with the title "<title>"
     # Authenticated users can insert <p> and <br> tags in the comment body.
@@ -263,13 +266,13 @@ Feature: Add comments
     And I should see the button "Post comment"
 
     Examples:
-      | collection     | content type | title                     | state     |
-      | Shy collection | news         | Scandalous news           | published |
-      | Shy collection | discussion   | Is gossip bad?            | published |
-      | Shy collection | document     | Wikileaks                 | published |
-      | Joinup         | news         | Rihanna wears pope outfit | published |
-      | Joinup         | discussion   | Is gossip good?           | published |
-      | Joinup         | document     | Celebrity scandals 2019   | published |
+      | collection        | content type | title                     | state     |
+      | Shy collection    | news         | Scandalous news           | published |
+      | Shy collection    | discussion   | Is gossip bad?            | published |
+      | Shy collection    | document     | Wikileaks                 | published |
+      | Gossip collection | news         | Rihanna wears pope outfit | published |
+      | Gossip collection | discussion   | Is gossip good?           | published |
+      | Gossip collection | document     | Celebrity scandals 2019   | published |
 
   Scenario Outline: Anonymized comments
     Given collection content:
@@ -306,10 +309,10 @@ Feature: Add comments
     Then comment #2 should contain the markup "Anonymous user"
 
     Examples:
-      | collection      | content type | title                     | state     |
-      | Show collection | news         | Scandalous busy           | published |
-      | Show collection | discussion   | Is gossip bad or not?     | published |
-      | Show collection | document     | Wikilikes                 | published |
-      | Joinup          | news         | Bosinga wears pope outfit | published |
-      | Joinup          | discussion   | Is gossip good or not?    | published |
-      | Joinup          | document     | Celebrity scandals 2022   | published |
+      | collection        | content type | title                     | state     |
+      | Show collection   | news         | Scandalous busy           | published |
+      | Show collection   | discussion   | Is gossip bad or not?     | published |
+      | Show collection   | document     | Wikilikes                 | published |
+      | Gossip collection | news         | Bosinga wears pope outfit | published |
+      | Gossip collection | discussion   | Is gossip good or not?    | published |
+      | Gossip collection | document     | Celebrity scandals 2022   | published |
diff --git a/tests/features/comments/delete_comment.feature b/tests/features/comments/delete_comment.feature
index 2bf66ac0c7..5eeb3428ee 100644
--- a/tests/features/comments/delete_comment.feature
+++ b/tests/features/comments/delete_comment.feature
@@ -3,20 +3,23 @@ Feature: Delete comments
   As a visitor of the website I can leave a comment on community content.
 
   Background:
-    Given users:
+    Given collection content:
+      | title                 | logo     | state     |
+      | Semantic web fanatics | logo.png | published |
+    And users:
       | Username             | E-mail                        | First name  | Family name |
       | Tim Berners Lee      | tim.berners-lee@example.com   | Tim Berners | Lee         |
       | Vicky visitor        | vicky.visitor@example.com     | Vicky       | visitor     |
       | Do Re Mi Facilitator | doremifacilitator@example.com | Do Re Mi    | Facilitator |
     And news content:
-      | title                          | body                              | collection | state     |
-      | RDF Schemas for government use | Home for DCAT, ADMS, and the like | Joinup     | published |
+      | title                          | body                              | collection            | state     |
+      | RDF Schemas for government use | Home for DCAT, ADMS, and the like | Semantic web fanatics | published |
     And comments:
       | subject         | field_body       | author          | parent                         |
       | ADMS is awesome | Let's all use it | Tim Berners Lee | RDF Schemas for government use |
     And the following collection user memberships:
-      | collection | user                 | roles       |
-      | Joinup     | Do Re Mi Facilitator | facilitator |
+      | collection            | user                 | roles       |
+      | Semantic web fanatics | Do Re Mi Facilitator | facilitator |
 
   Scenario: Delete comments
     # As the creator of the comment I can delete the comment.
@@ -43,6 +46,6 @@ Feature: Delete comments
     Then I should see "Are you sure you want to delete the comment ADMS is awesome?"
     Then I press "Delete"
     Then the following email should have been sent:
-      | recipient | Tim Berners Lee                                                                                                                                                   |
-      | subject   | Interoperable Europe Portal: Your comment has been deleted.                                                                                                       |
+      | recipient | Tim Berners Lee                                                                                                                                                  |
+      | subject   | Interoperable Europe Portal: Your comment has been deleted.                                                                                                                            |
       | body      | Do Re Mi Facilitator deleted your comment in "RDF Schemas for government use". To avoid comment moderation in the future, please read our community guidelines at |
-- 
GitLab


From bd2ddf4ba61564fc0946fccc9b493a00d94ec44a Mon Sep 17 00:00:00 2001
From: "micha.jakubowski" <micha.jakubowski@ffwagency.com>
Date: Tue, 26 Nov 2024 16:09:46 +0100
Subject: [PATCH 012/137] ISAICP-8780: adms_ap_compliance.feature update

---
 tests/features/adms_ap_compliance.feature | 17 +++++------------
 1 file changed, 5 insertions(+), 12 deletions(-)

diff --git a/tests/features/adms_ap_compliance.feature b/tests/features/adms_ap_compliance.feature
index 77c94c12d5..a0b97ed7d2 100644
--- a/tests/features/adms_ap_compliance.feature
+++ b/tests/features/adms_ap_compliance.feature
@@ -6,23 +6,16 @@ Feature: Interoperable Europe Portal should be ADMS-AP compliant.
       | Username         | E-mail                       |
       | Andre Munson     | andre.munson@example.com     |
       | Branson Winthrop | branson.winthrop@example.com |
-    And contact_information content:
-      | name           | email                    | website url            |
-      | Jocelyn Bass   | jocelyn.bass@example.com | http://www.example.org |
-      | Geoffrey Bryce | geoffrey.bryce@exam.com  |                        |
-    And owner content:
-      | name       | owner type |
-      | Teddy Bass | Company    |
     And licence content:
       | title       | description       | licence type  |
       | Foo licence | Some nice licence | Public domain |
     And collection content:
-      | title                       | author       | abstract  | description                    | access url                  | logo     | contact information | owner      | creation date    | modification date | closed | content creation         | moderation | topic      | spatial coverage | state     | featured |
-      | Morbid Scattered Microphone | Andre Munson | Abstract. | Description of the collection. | http://www.example.com/msm/ | logo.png | Jocelyn Bass        | Teddy Bass | 2016-07-13T13:00 | 2017-06-30T11:27  | no     | facilitators and authors | no         | Demography | Belgium          | published | no       |
+      | title                       | author       | abstract  | description                    | access url                  | logo     | contact information | owner | creation date    | modification date | closed | content creation         | moderation | topic      | spatial coverage | state     | featured |
+      | Morbid Scattered Microphone | Andre Munson | Abstract. | Description of the collection. | http://www.example.com/msm/ | logo.png | Contact name        | ISA²  | 2016-07-13T13:00 | 2017-06-30T11:27  | no     | facilitators and authors | no         | Demography | Belgium          | published | no       |
     Given solution content:
-      | title        | collection                  | author           | description    | logo     | owner      | contact information | creation date   | modification date | documentation | content creation | keywords         | landing page                    | language | metrics page                    | moderation | topic                    | related solutions | solution type                      | spatial coverage | status    | state     | featured |
-      | Early Omega  | Morbid Scattered Microphone | Andre Munson     | <p>content</p> | logo.png | Teddy Bass | Jocelyn Bass        | 2017-11-01T8:00 | 2017-12-01T8:43   | text.pdf      | registered users | ADMS, validation | http://www.example.com/landing1 | Flemish  | http://www.example.org/metrics1 | no         | EU and European Policies |                   | Networking Infrastructure Enablers | Belgium          | Completed | published | no       |
-      | Snake Timely | Morbid Scattered Microphone | Branson Winthrop | <p>content</p> | logo.png | Teddy Bass | Jocelyn Bass        | 2015-03-03T8:00 | 2018-02-14T18:43  | text.pdf      | registered users |                  | http://www.example.com/landing2 | English  | http://www.example.org/metrics2 | yes        | Demography               | Early Omega       | Networking Infrastructure Enablers | Belgium          | Completed | published | no       |
+      | title        | collection                  | author           | description    | logo     | owner | contact information | creation date   | modification date | documentation | content creation | keywords         | landing page                    | language | metrics page                    | moderation | topic                    | related solutions | solution type                      | spatial coverage | status    | state     | featured |
+      | Early Omega  | Morbid Scattered Microphone | Andre Munson     | <p>content</p> | logo.png | ISA²  | Contact name        | 2017-11-01T8:00 | 2017-12-01T8:43   | text.pdf      | registered users | ADMS, validation | http://www.example.com/landing1 | Flemish  | http://www.example.org/metrics1 | no         | EU and European Policies |                   | Networking Infrastructure Enablers | Belgium          | Completed | published | no       |
+      | Snake Timely | Morbid Scattered Microphone | Branson Winthrop | <p>content</p> | logo.png | ISA²  | Contact name        | 2015-03-03T8:00 | 2018-02-14T18:43  | text.pdf      | registered users |                  | http://www.example.com/landing2 | English  | http://www.example.org/metrics2 | yes        | Demography               | Early Omega       | Networking Infrastructure Enablers | Belgium          | Completed | published | no       |
     And release content:
       | title  | documentation | release number | release notes | creation date    | is version of | state     | status    | spatial coverage | keywords | language |
       | Omega3 | text.pdf      | 3.0.0          | New 3.0       | 2017-11-11T11:11 | Early Omega   | published | Completed | Belgium          | food     | English  |
-- 
GitLab


From 0e2cc0450ca13e176ddf78ee2c067e4cad78825d Mon Sep 17 00:00:00 2001
From: "micha.jakubowski" <micha.jakubowski@ffwagency.com>
Date: Tue, 26 Nov 2024 17:15:27 +0100
Subject: [PATCH 013/137] ISAICP-8780: solution.edit.feature update

---
 tests/features/solution/solution.edit.feature | 19 ++++++++-----------
 1 file changed, 8 insertions(+), 11 deletions(-)

diff --git a/tests/features/solution/solution.edit.feature b/tests/features/solution/solution.edit.feature
index 6fb8f3e4e2..7a0409bd63 100644
--- a/tests/features/solution/solution.edit.feature
+++ b/tests/features/solution/solution.edit.feature
@@ -5,15 +5,12 @@ Feature: Solution editing.
   I need to be able to edit solutions through UI.
 
   Background:
-    Given contact_information content:
-      | name         | email              |
-      | Seward Shawn | seward@example.com |
+    Given users:
+      | Username     | E-mail                   |
+      | Yancy Burton | yancy.burton@example.com |
     And owner content:
       | name      | owner type |
       | Acme inc. | Company    |
-    And users:
-      | Username     | E-mail                   |
-      | Yancy Burton | yancy.burton@example.com |
     And collection content:
       | title              | state     |
       | Collection example | published |
@@ -24,8 +21,8 @@ Feature: Solution editing.
       | collection         | user         | roles       |
       | Collection example | Yancy Burton | facilitator |
     And solution content:
-      | title            | description       | logo     | contact information | owner     | state     |
-      | Another solution | Just another one. | logo.png | Seward Shawn        | Acme inc. | published |
+      | title            | description       | logo     | state     |
+      | Another solution | Just another one. | logo.png | published |
 
   @uploadFiles:logo.png
   Scenario: A solution owner can edit only its own solutions.
@@ -43,7 +40,7 @@ Feature: Solution editing.
       | E-mail address | yancyb@example.com |
     And I attach the file "logo.png" to "Logo"
     And I select "Flemish" from "Language"
-    And I select "EU and European Policies" from "Topic"
+    And I select "Tools" from "Topic"
     And I select "Logging Service" from "Solution type"
 
     # Click the button to select an existing owner.
@@ -82,8 +79,8 @@ Feature: Solution editing.
 
   Scenario: A solution facilitator can edit only the solutions he's associated with.
     Given solution content:
-      | title      | description   | logo     | contact information | owner     | state     | solution type |
-      | Solution B | Second letter | logo.png | Seward Shawn        | Acme inc. | published | Citizen       |
+      | title      | description   | logo     | state     | solution type |
+      | Solution B | Second letter | logo.png | published | Citizen       |
     When I am logged in as a facilitator of the "Solution B" solution
     And I go to the homepage of the "Solution B" solution
     Then I should see the link "Edit"
-- 
GitLab


From cb83cc1dbb59d3d41652de609110a54840e37f8b Mon Sep 17 00:00:00 2001
From: "micha.jakubowski" <micha.jakubowski@ffwagency.com>
Date: Tue, 26 Nov 2024 17:23:27 +0100
Subject: [PATCH 014/137] ISAICP-8780: related_solution.feature update

---
 .../solution/related_solution.feature         | 20 +++++++------------
 1 file changed, 7 insertions(+), 13 deletions(-)

diff --git a/tests/features/solution/related_solution.feature b/tests/features/solution/related_solution.feature
index 5a19e2d713..e1d773fe19 100644
--- a/tests/features/solution/related_solution.feature
+++ b/tests/features/solution/related_solution.feature
@@ -4,20 +4,14 @@ Feature: Related solution
   solutions and present the related solutions to the users.
 
   Background:
-    Given contact_information content:
-      | name        | email       |
-      | Kalikatoura | bar@bar.com |
-    And owner content:
-      | name         | owner type |
-      | Kalikatoures | Company    |
     Given solution content:
-      | title      | related solutions | abstract                         | description                         | documentation | related by type | moderation | logo     | topic      | state     | solution type | owner        | contact information |
-      | C          |                   | Blazing fast segmentation faults | Blazing fast segmentation faults.   | text.pdf      | yes             | no         | logo.png | Demography | published |               | Kalikatoures | Kalikatoura         |
-      | Java       | C                 | Because inheritance is cool      | Because inheritance is cool.        | text.pdf      | yes             | no         | logo.png | Demography | published | Citizen       | Kalikatoures | Kalikatoura         |
-      | PHP        |                   | Make a site                      | Make a site.                        | text.pdf      | yes             | yes        | logo.png | Demography | published | Citizen       | Kalikatoures | Kalikatoura         |
-      | Golang     |                   | Concurrency for the masses       | Concurrency for the masses          | text.pdf      | yes             | yes        | logo.png | Demography | proposed  | Citizen       | Kalikatoures | Kalikatoura         |
-      | Python     |                   | Get stuff done                   | Get stuff done.                     | text.pdf      | yes             | no         | logo.png | Demography | published |               | Kalikatoures | Kalikatoura         |
-      | Javascript | Java, PHP         | Java is related to javascript    | Java is related to javascript. Huh? | text.pdf      | no              | no         | logo.png | Demography | published | Citizen       | Kalikatoures | Kalikatoura         |
+      | title      | related solutions | abstract                         | description                         | documentation | related by type | moderation | logo     | topic | state     | solution type |
+      | C          |                   | Blazing fast segmentation faults | Blazing fast segmentation faults.   | text.pdf      | yes             | no         | logo.png | Tools | published |               |
+      | Java       | C                 | Because inheritance is cool      | Because inheritance is cool.        | text.pdf      | yes             | no         | logo.png | Tools | published | Citizen       |
+      | PHP        |                   | Make a site                      | Make a site.                        | text.pdf      | yes             | yes        | logo.png | Tools | published | Citizen       |
+      | Golang     |                   | Concurrency for the masses       | Concurrency for the masses          | text.pdf      | yes             | yes        | logo.png | Tools | proposed  | Citizen       |
+      | Python     |                   | Get stuff done                   | Get stuff done.                     | text.pdf      | yes             | no         | logo.png | Tools | published |               |
+      | Javascript | Java, PHP         | Java is related to javascript    | Java is related to javascript. Huh? | text.pdf      | no              | no         | logo.png | Tools | published | Citizen       |
 
   # @covers \joinup_solution_get_related_solutions_ids.
   Scenario: Related solutions
-- 
GitLab


From cfac2e6f79baff70239a33aec408c81e542adfc6 Mon Sep 17 00:00:00 2001
From: "micha.jakubowski" <micha.jakubowski@ffwagency.com>
Date: Wed, 27 Nov 2024 16:16:28 +0100
Subject: [PATCH 015/137] ISAICP-8780: use default values for contact, owner
 and state, if missing in test tables

---
 tests/src/Context/CollectionContext.php       |  2 +-
 tests/src/Context/JoinupContext.php           | 19 +++++++++
 tests/src/Traits/NodeTrait.php                | 42 +++++++++++++++++++
 .../custom/joinup_test/joinup_test.install    |  2 +
 4 files changed, 64 insertions(+), 1 deletion(-)

diff --git a/tests/src/Context/CollectionContext.php b/tests/src/Context/CollectionContext.php
index bf5995e727..e022c6f34a 100644
--- a/tests/src/Context/CollectionContext.php
+++ b/tests/src/Context/CollectionContext.php
@@ -115,7 +115,7 @@ public function defaultCollectionValues(BeforeNodeCreateScope $scope): void {
     }
 
     $default_values = [
-      'state' => 'draft',
+      'state' => 'published',
       'abstract' => 'This is a test abstract.',
     ];
 
diff --git a/tests/src/Context/JoinupContext.php b/tests/src/Context/JoinupContext.php
index 317121b252..406189537c 100644
--- a/tests/src/Context/JoinupContext.php
+++ b/tests/src/Context/JoinupContext.php
@@ -23,6 +23,7 @@
 use Drupal\joinup\Traits\FormTrait;
 use Drupal\joinup\Traits\JavascriptTrait;
 use Drupal\joinup\Traits\KeyboardInteractionTrait;
+use Drupal\joinup\Traits\NodeTrait;
 use Drupal\joinup\Traits\OgTrait;
 use Drupal\joinup\Traits\TabledragTrait;
 use Drupal\joinup\Traits\TestingEntitiesTrait;
@@ -59,6 +60,7 @@ class JoinupContext extends RawDrupalContext {
   use JavascriptTrait;
   use KeyboardInteractionTrait;
   use OgTrait;
+  use NodeTrait;
   use StringTranslationTrait;
   use TabledragTrait;
   use TestingEntitiesTrait;
@@ -939,6 +941,9 @@ public function massageFieldsBeforeNodeCreate(BeforeNodeCreateScope $scope): voi
     if (!empty($node->field_state)) {
       $node->field_state = self::translateWorkflowStateAlias($node->field_state);
     }
+    else {
+      $node->field_state = 'published';
+    }
 
     if (property_exists($node, 'visit_count')) {
       $node->visit_count = MetaEntity::create([
@@ -1003,6 +1008,20 @@ public function massageFieldsBeforeNodeCreate(BeforeNodeCreateScope $scope): voi
       // to satisfy data integrity and prevent form validation errors.
       $node->field_topic = $this->getRandomTopic()->label();
     }
+    if (!empty($field_definitions['contact']) && empty($node->contact)) {
+      // For some tests, the node's contact has no relevance. Such tests are
+      // allowed to omit an explicit contact. We're assigning
+      // a default contact from joinup_test.install,
+      // to satisfy data integrity and prevent form validation errors.
+      $node->contact = $this->getDefaultContact()->label();
+    }
+    if (!empty($field_definitions['owner']) && empty($node->owner)) {
+      // For some tests, the node's owner has no relevance. Such tests are
+      // allowed to omit an explicit owner. We're assigning
+      // a default owner from joinup_test.install,
+      // to satisfy data integrity and prevent form validation errors.
+      $node->owner = $this->getDefaultOwner()->label();
+    }
 
     // Handle file URL fields.
     if (!empty($node->documentation)) {
diff --git a/tests/src/Traits/NodeTrait.php b/tests/src/Traits/NodeTrait.php
index 12ffdf9604..8b93c9707a 100644
--- a/tests/src/Traits/NodeTrait.php
+++ b/tests/src/Traits/NodeTrait.php
@@ -4,6 +4,8 @@
 
 namespace Drupal\joinup\Traits;
 
+use Drupal\node\Entity\Node;
+
 /**
  * Helper methods when dealing with Nodes.
  */
@@ -43,4 +45,44 @@ public function getNodeRevisionIdsList(string $title, string $bundle, ?bool $pub
     return empty($revisions) ? [] : array_keys($revisions);
   }
 
+  /**
+   * Returns contact_information entity referenced in Joinip collection.
+   *
+   *  @See \joinup_test_install()
+   *
+   * @throws \Drupal\Component\Plugin\Exception\InvalidPluginDefinitionException
+   * @throws \Drupal\Component\Plugin\Exception\PluginNotFoundException
+   *
+   * @return \Drupal\node\Entity\Node
+   *   contact_information entity from field "contact" in Joinup collection
+   */
+  protected function getDefaultContact(): Node {
+    $nodeStorage = \Drupal::entityTypeManager()->getStorage('node');
+    $node = $nodeStorage->loadByProperties([
+      'type' => 'contact_information',
+      'uuid' => 'a1b2c3d4-e5f6-7890-ab12-cd34ef567890',
+    ]);
+    return array_shift($node);
+  }
+
+  /**
+   * Returns owner entity referenced in Joinip collection.
+   *
+   *  @See \joinup_test_install()
+   *
+   * @throws \Drupal\Component\Plugin\Exception\InvalidPluginDefinitionException
+   * @throws \Drupal\Component\Plugin\Exception\PluginNotFoundException
+   *
+   * @return \Drupal\node\Entity\Node
+   *   owner entity from field "contact" in Joinup collection
+   */
+  protected function getDefaultOwner(): Node {
+    $nodeStorage = \Drupal::entityTypeManager()->getStorage('node');
+    $node = $nodeStorage->loadByProperties([
+      'type' => 'owner',
+      'uuid' => 'a1b2c3d4-e5f6-7890-ab12-cd34ef567891',
+    ]);
+    return array_shift($node);
+  }
+
 }
diff --git a/web/modules/custom/joinup_test/joinup_test.install b/web/modules/custom/joinup_test/joinup_test.install
index 9c227c268b..1f3ab5471c 100644
--- a/web/modules/custom/joinup_test/joinup_test.install
+++ b/web/modules/custom/joinup_test/joinup_test.install
@@ -99,11 +99,13 @@ function joinup_test_install($is_syncing): void {
       ],
       'contact' => $nodeStorage->create([
         'type' => 'contact_information',
+        'uuid' => 'a1b2c3d4-e5f6-7890-ab12-cd34ef567890',
         'title' => 'Contact name',
         'email' => 'contact.email@example.com',
       ]),
       'owner' => $nodeStorage->create([
         'type' => 'owner',
+        'uuid' => 'a1b2c3d4-e5f6-7890-ab12-cd34ef567891',
         'title' => 'ISA²',
       ]),
 
-- 
GitLab


From de551ac772570b147217cc02334b95fcdb1e87e0 Mon Sep 17 00:00:00 2001
From: "micha.jakubowski" <micha.jakubowski@ffwagency.com>
Date: Wed, 27 Nov 2024 16:18:39 +0100
Subject: [PATCH 016/137] ISAICP-8780: solution tests update part 1

---
 tests/features/solution/add_solution.feature  | 30 +++-----
 tests/features/solution/homepage.feature      | 77 +++++++++----------
 .../features/solution/id_with_spaces.feature  |  8 +-
 .../solution/solution.notifications.feature   | 39 ++++------
 4 files changed, 70 insertions(+), 84 deletions(-)

diff --git a/tests/features/solution/add_solution.feature b/tests/features/solution/add_solution.feature
index bcdf457a90..443a5939a4 100644
--- a/tests/features/solution/add_solution.feature
+++ b/tests/features/solution/add_solution.feature
@@ -6,8 +6,8 @@ Feature: "Add solution" visibility options.
 
   Scenario: Required fields should be filled in
     Given collection content:
-      | title            | state     |
-      | Language parsers | published |
+      | title            |
+      | Language parsers |
     And I am logged in as a facilitator of the "Language parsers" collection
     And I go to the homepage of the "Language parsers" collection
     And I click "Add solution"
@@ -54,8 +54,8 @@ Feature: "Add solution" visibility options.
   @uploadFiles:logo.png
   Scenario: Add solution as a collection facilitator.
     Given collection content:
-      | title             | logo     | state     |
-      | Belgian barista's | logo.png | published |
+      | title             | logo     |
+      | Belgian barista's | logo.png |
     And owner content:
       | name                 | owner type                   |
       | Organisation example | Company, Industry consortium |
@@ -106,7 +106,7 @@ Feature: "Add solution" visibility options.
     And I press "Propose"
     Then the email sent to "Ruth Lee" with subject "Interoperable Europe Portal: A new solution has been proposed" contains the following lines of text:
       | Wendell Silva has proposed a new Interoperability solution: "Espresso is the solution" on Interoperable Europe Portal. |
-      | If you think this action is not clear or not due, please contact Portal Support at                |
+      | If you think this action is not clear or not due, please contact Portal Support at                                     |
     And I should see "Thank you for proposing a solution. Your request is currently pending approval by the site administrator."
     And Log entry with the message "A new solution entity titled Espresso is the solution has been created by Wendell Silva in Belgian barista's." should exist.
 
@@ -131,7 +131,7 @@ Feature: "Add solution" visibility options.
     But I should see the link "Demography"
     And the following email should have been sent:
       | recipient | Wendell Silva                                                                                               |
-      | subject   | Interoperable Europe Portal: Your solution has been accepted                                                                     |
+      | subject   | Interoperable Europe Portal: Your solution has been accepted                                                |
       | body      | Your proposed interoperability solution: "Espresso is the solution" has been validated as per your request. |
 
     When I am logged in as a facilitator of the "Belgian barista's" collection
@@ -213,9 +213,9 @@ Feature: "Add solution" visibility options.
 
   Scenario: Create a solution with a name that already exists
     Given collection content:
-      | title              | state     |
-      | Ocean studies      | published |
-      | Glacier monitoring | published |
+      | title              |
+      | Ocean studies      |
+      | Glacier monitoring |
     And solution content:
       | title                  | abstract              | description                                       | collection    | state     |
       | Climate change tracker | Tracks climate change | Atlantic salmon arrived after the Little Ice Age. | Ocean studies | published |
@@ -275,15 +275,9 @@ Feature: "Add solution" visibility options.
 
   @javascript @generateMedia @generateMediaTypes:solution_logo
   Scenario: Tests the image library widget.
-    Given owner content:
-      | name                 | owner type |
-      | Organisation example | Company    |
-    And contact_information content:
-      | name          | email                     |
-      | Invisible Man | invisible.man@example.com |
-    And solution content:
-      | title             | abstract              | description            | owner                | state     | solution type          | topic                            | contact information |
-      | Cleaning solution | Cleans anything dirty | Use on metal surfaces. | Organisation example | published | Non-binding Instrument | Employment and Support Allowance | Invisible Man       |
+    Given solution content:
+      | title             | abstract              | description            | state     | solution type          |
+      | Cleaning solution | Cleans anything dirty | Use on metal surfaces. | published | Non-binding Instrument |
 
     Given I am logged in as a moderator
     When I go to the edit form of the "Cleaning solution" solution
diff --git a/tests/features/solution/homepage.feature b/tests/features/solution/homepage.feature
index 5d8ab30d7d..85f005b382 100644
--- a/tests/features/solution/homepage.feature
+++ b/tests/features/solution/homepage.feature
@@ -12,7 +12,7 @@ Feature: Solution homepage
       | name            | email                      | website url        |
       | Awesome contact | awesomecontact@example.com | http://example.com |
     Given solution content:
-      | title     | description                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          | state     | owner         | contact information | topic                   | solution type                           | spatial coverage | language | status    | published at    | modification date | abstract                   |
+      | title     | description                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      | state     | owner         | contact information | topic                   | solution type                           | spatial coverage | language | status    | published at    | modification date | abstract                   |
       | Petri net | "<p>A <b>Petri net</b>, also known as a <b>place/transition (PT) net</b>, is one of several <a href=\"#mathematical\">mathematical</a> modeling languages for the description of distributed systems. It is a class of discrete event dynamic system. A Petri net is a directed bipartite graph, in which the nodes represent transitions (i.e. events that may occur, represented by bars) and places (i.e. conditions, represented by circles). The directed arcs describe which places are pre- and/or postconditions for which transitions (signified by arrows). Some sources state that Petri nets were invented in August 1939 by Carl Adam Petri at the age of 13 for the purpose of describing chemical processes.</p>" | published | Awesome owner | Awesome contact     | Demography, E-inclusion | Non-binding Instrument, Logging Service | Greece, Belgium  | English  | Completed | 2012-12-01T8:43 | 2017-12-01T8:43   | Short abstract description |
     And release content:
       | title          | release notes    | documentation | release number | release notes   | is version of | state     | creation date    | published at     |
@@ -49,14 +49,14 @@ Feature: Solution homepage
 
   Scenario: Custom pages should not be visible on the solution homepage
     Given solution content:
-      | title           | description                 | documentation | content creation | landing page                   | state     |
-      | Jira restarters | Rebooting solves all issues | text.pdf      | registered users | http://foo-example.com/landing | published |
+      | title           | description                 | documentation | content creation | landing page                   |
+      | Jira restarters | Rebooting solves all issues | text.pdf      | registered users | http://foo-example.com/landing |
     And news content:
-      | title                             | body                             | solution        | topic                   | spatial coverage | state     |
-      | Jira will be down for maintenance | As always, during business hours | Jira restarters | Statistics and Analysis | Luxembourg       | published |
+      | title                             | body                             | solution        | topic                   | spatial coverage |
+      | Jira will be down for maintenance | As always, during business hours | Jira restarters | Statistics and Analysis | Luxembourg       |
     And custom_page content:
-      | title            | body                                       | solution        | state     |
-      | Maintenance page | Jira is re-indexing. Go and drink a coffee | Jira restarters | published |
+      | title            | body                                       | solution        |
+      | Maintenance page | Jira is re-indexing. Go and drink a coffee | Jira restarters |
     When I go to the homepage of the "Jira restarters" solution
     Then a tour should be available
     And I should see the "Jira will be down for maintenance" tile
@@ -66,31 +66,28 @@ Feature: Solution homepage
     Given owner content:
       | name                  | owner type |
       | Chiricahua Foundation | Company    |
-    And contact_information content:
-      | name     | email                |
-      | Geronimo | geronimo@example.com |
     Given solution content:
-      | title             | description     | logo     | state     | owner                 | contact information | solution type | topic       |
-      | Chiricahua Server | Serving the web | logo.png | published | Chiricahua Foundation | Geronimo            | Business      | E-inclusion |
+      | title             | description     | logo     | state     | owner                 | solution type |
+      | Chiricahua Server | Serving the web | logo.png | published | Chiricahua Foundation | Business      |
     # There should not be a pager when the solution is empty.
     When I go to the homepage of the "Chiricahua Server" solution
     Then I should not see the "Pager" region
 
     # The pager should only appear when there are more than 12 items.
     Given distribution content:
-      | title           | description    | solution          | state     |
-      | Distribution 1  | Description 1  | Chiricahua Server | published |
-      | Distribution 2  | Description 2  | Chiricahua Server | published |
-      | Distribution 3  | Description 3  | Chiricahua Server | published |
-      | Distribution 4  | Description 4  | Chiricahua Server | published |
-      | Distribution 5  | Description 5  | Chiricahua Server | published |
-      | Distribution 6  | Description 6  | Chiricahua Server | published |
-      | Distribution 7  | Description 7  | Chiricahua Server | published |
-      | Distribution 8  | Description 8  | Chiricahua Server | published |
-      | Distribution 9  | Description 9  | Chiricahua Server | published |
-      | Distribution 10 | Description 10 | Chiricahua Server | published |
-      | Distribution 11 | Description 11 | Chiricahua Server | published |
-      | Distribution 12 | Description 12 | Chiricahua Server | published |
+      | title           | description    | solution          |
+      | Distribution 1  | Description 1  | Chiricahua Server |
+      | Distribution 2  | Description 2  | Chiricahua Server |
+      | Distribution 3  | Description 3  | Chiricahua Server |
+      | Distribution 4  | Description 4  | Chiricahua Server |
+      | Distribution 5  | Description 5  | Chiricahua Server |
+      | Distribution 6  | Description 6  | Chiricahua Server |
+      | Distribution 7  | Description 7  | Chiricahua Server |
+      | Distribution 8  | Description 8  | Chiricahua Server |
+      | Distribution 9  | Description 9  | Chiricahua Server |
+      | Distribution 10 | Description 10 | Chiricahua Server |
+      | Distribution 11 | Description 11 | Chiricahua Server |
+      | Distribution 12 | Description 12 | Chiricahua Server |
     When I go to the homepage of the "Chiricahua Server" solution
     Then I should not see the "Pager" region
     And I should not see the "Distribution 13" tile
@@ -123,19 +120,19 @@ Feature: Solution homepage
     And I should not see the "Distribution 12" tile
 
     Given distribution content:
-      | title           | description    | solution          | state     |
-      | Distribution 14 | Description 14 | Chiricahua Server | published |
-      | Distribution 15 | Description 15 | Chiricahua Server | published |
-      | Distribution 16 | Description 16 | Chiricahua Server | published |
-      | Distribution 17 | Description 17 | Chiricahua Server | published |
-      | Distribution 18 | Description 18 | Chiricahua Server | published |
-      | Distribution 19 | Description 19 | Chiricahua Server | published |
-      | Distribution 20 | Description 20 | Chiricahua Server | published |
-      | Distribution 21 | Description 21 | Chiricahua Server | published |
-      | Distribution 22 | Description 22 | Chiricahua Server | published |
-      | Distribution 23 | Description 23 | Chiricahua Server | published |
-      | Distribution 24 | Description 24 | Chiricahua Server | published |
-      | Distribution 25 | Description 25 | Chiricahua Server | published |
+      | title           | description    | solution          |
+      | Distribution 14 | Description 14 | Chiricahua Server |
+      | Distribution 15 | Description 15 | Chiricahua Server |
+      | Distribution 16 | Description 16 | Chiricahua Server |
+      | Distribution 17 | Description 17 | Chiricahua Server |
+      | Distribution 18 | Description 18 | Chiricahua Server |
+      | Distribution 19 | Description 19 | Chiricahua Server |
+      | Distribution 20 | Description 20 | Chiricahua Server |
+      | Distribution 21 | Description 21 | Chiricahua Server |
+      | Distribution 22 | Description 22 | Chiricahua Server |
+      | Distribution 23 | Description 23 | Chiricahua Server |
+      | Distribution 24 | Description 24 | Chiricahua Server |
+      | Distribution 25 | Description 25 | Chiricahua Server |
 
     When I go to the homepage of the "Chiricahua Server" solution
     Then I should see the following links:
@@ -192,8 +189,8 @@ Feature: Solution homepage
       | title           | description          | state     | owner                 |
       | Chiricahua Solr | Searching your datas | published | Chiricahua Foundation |
     And distribution content:
-      | title               | description   | solution        | state     |
-      | Solr distribution 1 | Description 1 | Chiricahua Solr | published |
+      | title               | description   | solution        |
+      | Solr distribution 1 | Description 1 | Chiricahua Solr |
     When I go to the homepage of the "Chiricahua Solr" solution
     Then I should not see the "Pager" region
 
diff --git a/tests/features/solution/id_with_spaces.feature b/tests/features/solution/id_with_spaces.feature
index 598557924b..da09ea76cf 100644
--- a/tests/features/solution/id_with_spaces.feature
+++ b/tests/features/solution/id_with_spaces.feature
@@ -6,8 +6,8 @@ Feature: Solution API
 
   Scenario: Programmatically create a solution
     Given solution content:
-      | uri                                    | title                | description       | logo     | documentation | content creation | landing page                   | state     |
-      | http://example.com/this%20has%20spaces | Solution with spaces | A sample solution | logo.png | text.pdf      | registered users | http://foo-example.com/landing | published |
+      | uri                                    | title                | description       | logo     | documentation | content creation | landing page                   |
+      | http://example.com/this%20has%20spaces | Solution with spaces | A sample solution | logo.png | text.pdf      | registered users | http://foo-example.com/landing |
     And solution content:
-      | uri                                                                                                      | title                 | description       | logo     | documentation | content creation | landing page                   | state     |
-      | http://www.it-planungsrat.de/DE/Projekte/Koordinierungsprojekte/OsiP/Online_Sicherheitspr%C3%BCfung.html | Solution with unicode | A sample solution | logo.png | text.pdf      | registered users | http://foo-example.com/landing | published |
+      | uri                                                                                                      | title                 | description       | logo     | documentation | content creation | landing page                   |
+      | http://www.it-planungsrat.de/DE/Projekte/Koordinierungsprojekte/OsiP/Online_Sicherheitspr%C3%BCfung.html | Solution with unicode | A sample solution | logo.png | text.pdf      | registered users | http://foo-example.com/landing |
diff --git a/tests/features/solution/solution.notifications.feature b/tests/features/solution/solution.notifications.feature
index 459ba4efee..4e07349ece 100644
--- a/tests/features/solution/solution.notifications.feature
+++ b/tests/features/solution/solution.notifications.feature
@@ -8,29 +8,24 @@ Feature: Solution notifications
 
   Scenario: Notifications are sent every time a related transition is applied to a solution.
     Given collection content:
-      | title                          | logo     | state     |
-      | Collection of random solutions | logo.png | published |
-    And owner content:
-      | name               | owner type |
-      | Karanikolas Kitsos | Company    |
-    And contact_information content:
-      | name             | email                        |
-      | Information Desk | information.desk@example.com |
+      | title                          | logo     |
+      | Collection of random solutions | logo.png |
+    And I break
     And users:
       | Username     | Roles     | First name | Family name | E-mail                   |
-      | Pat Harper   | moderator | Pat        | Harper      | pat.harper@example.com   |
+      | Pat Harper   | moderator | Pat        | Harper      | pat.harper@example.com    |
       | Jack Harper  | moderator | Jack       | Harper      | jack.harper@example.com  |
       | Ramiro Myers |           | Ramiro     | Myers       | ramiro.myers@example.com |
       | Edith Poole  |           | Edith      | Poole       | edith.poole@example.com  |
     Given solution content:
-      | title                                                 | author       | abstract       | description | logo     | owner              | contact information | state        | topic       | solution type | collection                     |
-      | Solution notification to propose changes              | Ramiro Myers | Short abstract | Sample text | logo.png | Karanikolas Kitsos | Information Desk    | published    | E-inclusion | Business      | Collection of random solutions |
-      | Solution notification to blacklist                    | Ramiro Myers | Short abstract | Sample text | logo.png | Karanikolas Kitsos | Information Desk    | published    | E-inclusion | Business      | Collection of random solutions |
-      | Solution notification to publish from blacklisted     | Ramiro Myers | Short abstract | Sample text | logo.png | Karanikolas Kitsos | Information Desk    | blacklisted  | E-inclusion | Business      | Collection of random solutions |
-      | Solution notification to request changes              | Ramiro Myers | Short abstract | Sample text | logo.png | Karanikolas Kitsos | Information Desk    | published    | E-inclusion | Business      | Collection of random solutions |
-      | Solution notification to propose from request changes | Ramiro Myers | Short abstract | Sample text | logo.png | Karanikolas Kitsos | Information Desk    | needs update | E-inclusion | Business      | Collection of random solutions |
-      | Solution notification to delete by moderator team     | Ramiro Myers | Short abstract | Sample text | logo.png | Karanikolas Kitsos | Information Desk    | published    | E-inclusion | Business      | Collection of random solutions |
-      | Solution notification to delete by owner              | Ramiro Myers | Short abstract | Sample text | logo.png | Karanikolas Kitsos | Information Desk    | published    | E-inclusion | Business      | Collection of random solutions |
+      | title                                                 | author       | abstract       | description | logo     | state        | solution type | collection                     |
+      | Solution notification to propose changes              | Ramiro Myers | Short abstract | Sample text | logo.png | published    | Business      | Collection of random solutions |
+      | Solution notification to blacklist                    | Ramiro Myers | Short abstract | Sample text | logo.png | published    | Business      | Collection of random solutions |
+      | Solution notification to publish from blacklisted     | Ramiro Myers | Short abstract | Sample text | logo.png | blacklisted  | Business      | Collection of random solutions |
+      | Solution notification to request changes              | Ramiro Myers | Short abstract | Sample text | logo.png | published    | Business      | Collection of random solutions |
+      | Solution notification to propose from request changes | Ramiro Myers | Short abstract | Sample text | logo.png | needs update | Business      | Collection of random solutions |
+      | Solution notification to delete by moderator team     | Ramiro Myers | Short abstract | Sample text | logo.png | published    | Business      | Collection of random solutions |
+      | Solution notification to delete by owner              | Ramiro Myers | Short abstract | Sample text | logo.png | published    | Business      | Collection of random solutions |
 
     When I am logged in as "Pat Harper"
 
@@ -52,7 +47,7 @@ Feature: Solution notifications
     And I press "Blacklist"
     Then the following email should have been sent:
       | recipient | Ramiro Myers                                                                                                                                                 |
-      | subject   | Interoperable Europe Portal: Your interoperability solution is blacklisted                                                                                                        |
+      | subject   | Interoperable Europe Portal: Your interoperability solution is blacklisted                                                                                   |
       | body      | the moderator has blacklisted your interoperability solution - Solution notification to blacklist, you can contact the moderation team to resolve the issue. |
 
     # Template 14. The moderation team restores a solution from blacklisted.
@@ -61,7 +56,7 @@ Feature: Solution notifications
     And I press "Publish"
     Then the following email should have been sent:
       | recipient | Ramiro Myers                                                                                                                              |
-      | subject   | Interoperable Europe Portal: Your interoperability solution is published again                                                                                 |
+      | subject   | Interoperable Europe Portal: Your interoperability solution is published again                                                            |
       | body      | the moderator has published back your interoperability solution - Solution notification to publish from blacklisted that was blacklisted. |
 
     # Template 15. The moderation team requests changes.
@@ -74,7 +69,7 @@ Feature: Solution notifications
     And I press "Request changes"
     Then the following email should have been sent:
       | recipient | Ramiro Myers                                                                                                                                                              |
-      | subject   | Interoperable Europe Portal: You are requested to update your solution                                                                                                                         |
+      | subject   | Interoperable Europe Portal: You are requested to update your solution                                                                                                    |
       | body      | the moderator has requested you to modify the interoperability solution - Solution notification to request changes following the following advises: Can you change this?. |
       | bcc       | pat.harper@example.com,jack.harper@example.com                                                                                                                            |
     And the email sent to "Ramiro Myers" with subject "Interoperable Europe Portal: You are requested to update your solution" contains the following lines of text:
@@ -87,7 +82,7 @@ Feature: Solution notifications
     And I click "Delete"
     And I press "Delete"
     Then the following email should have been sent:
-      | recipient | Ramiro Myers                                                                                                        |
+      | recipient | Ramiro Myers                                                                                                                             |
       | subject   | Interoperable Europe Portal: Your solution has been deleted by the moderation team                                                       |
       | body      | The Interoperable Europe Portal moderation team deleted the interoperability solution Solution notification to delete by moderator team. |
 
@@ -99,7 +94,7 @@ Feature: Solution notifications
     And I press "Propose"
     Then the email sent to "Pat Harper" with subject "Interoperable Europe Portal: An update of a solution has been proposed" contains the following lines of text:
       | Ramiro Myers has proposed an update of the Interoperability solution: "Solution notification to propose from request changes" on Interoperable Europe Portal. |
-      | If you think this action is not clear or not due, please contact Portal Support at                                                       |
+      | If you think this action is not clear or not due, please contact Portal Support at                                                                            |
 
     # The owner deletes their own solution. No email should be sent to the owner
     # since we do not send notifications to the actor.
-- 
GitLab


From 8548fdf3fddea4d0cbf3dec9a1f8dc841c8e08e6 Mon Sep 17 00:00:00 2001
From: "micha.jakubowski" <micha.jakubowski@ffwagency.com>
Date: Wed, 27 Nov 2024 16:33:12 +0100
Subject: [PATCH 017/137] ISAICP-8780: adms_ap_compliance.feature update

---
 tests/features/adms_ap_compliance.feature | 20 ++++++++++----------
 1 file changed, 10 insertions(+), 10 deletions(-)

diff --git a/tests/features/adms_ap_compliance.feature b/tests/features/adms_ap_compliance.feature
index a0b97ed7d2..d62b1d497f 100644
--- a/tests/features/adms_ap_compliance.feature
+++ b/tests/features/adms_ap_compliance.feature
@@ -10,19 +10,19 @@ Feature: Interoperable Europe Portal should be ADMS-AP compliant.
       | title       | description       | licence type  |
       | Foo licence | Some nice licence | Public domain |
     And collection content:
-      | title                       | author       | abstract  | description                    | access url                  | logo     | contact information | owner | creation date    | modification date | closed | content creation         | moderation | topic      | spatial coverage | state     | featured |
-      | Morbid Scattered Microphone | Andre Munson | Abstract. | Description of the collection. | http://www.example.com/msm/ | logo.png | Contact name        | ISA²  | 2016-07-13T13:00 | 2017-06-30T11:27  | no     | facilitators and authors | no         | Demography | Belgium          | published | no       |
+      | title                       | author       | abstract  | description                    | access url                  | logo     | creation date    | modification date | closed | content creation         | moderation | topic      | spatial coverage | featured |
+      | Morbid Scattered Microphone | Andre Munson | Abstract. | Description of the collection. | http://www.example.com/msm/ | logo.png | 2016-07-13T13:00 | 2017-06-30T11:27  | no     | facilitators and authors | no         | Demography | Belgium          | no       |
     Given solution content:
-      | title        | collection                  | author           | description    | logo     | owner | contact information | creation date   | modification date | documentation | content creation | keywords         | landing page                    | language | metrics page                    | moderation | topic                    | related solutions | solution type                      | spatial coverage | status    | state     | featured |
-      | Early Omega  | Morbid Scattered Microphone | Andre Munson     | <p>content</p> | logo.png | ISA²  | Contact name        | 2017-11-01T8:00 | 2017-12-01T8:43   | text.pdf      | registered users | ADMS, validation | http://www.example.com/landing1 | Flemish  | http://www.example.org/metrics1 | no         | EU and European Policies |                   | Networking Infrastructure Enablers | Belgium          | Completed | published | no       |
-      | Snake Timely | Morbid Scattered Microphone | Branson Winthrop | <p>content</p> | logo.png | ISA²  | Contact name        | 2015-03-03T8:00 | 2018-02-14T18:43  | text.pdf      | registered users |                  | http://www.example.com/landing2 | English  | http://www.example.org/metrics2 | yes        | Demography               | Early Omega       | Networking Infrastructure Enablers | Belgium          | Completed | published | no       |
+      | title        | collection                  | author           | description    | logo     | creation date   | modification date | documentation    | content creation | keywords         | landing page                    | language | metrics page                    | moderation | related solutions | solution type                      | spatial coverage | status    | featured |
+      | Early Omega  | Morbid Scattered Microphone | Andre Munson     | <p>content</p> | logo.png | 2017-11-01T8:00 | 2017-12-01T8:43   | text.pdf         | registered users | ADMS, validation | http://www.example.com/landing1 | Flemish  | http://www.example.org/metrics1 | no         |                   | Networking Infrastructure Enablers | Belgium          | Completed | no       |
+      | Snake Timely | Morbid Scattered Microphone | Branson Winthrop | <p>content</p> | logo.png |                 | 2015-03-03T8:00   | 2018-02-14T18:43 | text.pdf         | registered users | http://www.example.com/landing2 | English  | http://www.example.org/metrics2 | yes        | Early Omega       | Networking Infrastructure Enablers | Belgium          | Completed | no       |
     And release content:
-      | title  | documentation | release number | release notes | creation date    | is version of | state     | status    | spatial coverage | keywords | language |
-      | Omega3 | text.pdf      | 3.0.0          | New 3.0       | 2017-11-11T11:11 | Early Omega   | published | Completed | Belgium          | food     | English  |
+      | title  | documentation | release number | release notes | creation date    | is version of | status    | spatial coverage | keywords | language |
+      | Omega3 | text.pdf      | 3.0.0          | New 3.0       | 2017-11-11T11:11 | Early Omega   | Completed | Belgium          | food     | English  |
     # The two cases cover the two possible access URL types extracted.
     # @see \Drupal\joinup_distribution\EventSubscriber\DistributionParentRdfSyncSubscriber::addDistributionParentRelation().
     And distribution content:
-      | title      | description                    | creation date    | access url                        | release | downloads | licence     | format | status    | representation technique | state     |
-      | Omega3.zip | The zipped version of Omega 3. | 2017-11-11T11:20 | http://www.example.org/omega3.zip | Omega3  | 232       | Foo licence | ZIP    | Completed | Datalog                  | published |
-      | Omega3.rdf | The RDF version of Omega 3.    | 2017-11-11T11:20 | empty.rdf                         | Omega3  | 232       | Foo licence | ZIP    | Completed | Datalog                  | published |
+      | title      | description                    | creation date    | access url                        | release | downloads | licence     | format | status    | representation technique |
+      | Omega3.zip | The zipped version of Omega 3. | 2017-11-11T11:20 | http://www.example.org/omega3.zip | Omega3  | 232       | Foo licence | ZIP    | Completed | Datalog                  |
+      | Omega3.rdf | The RDF version of Omega 3.    | 2017-11-11T11:20 | empty.rdf                         | Omega3  | 232       | Foo licence | ZIP    | Completed | Datalog                  |
     Then the ADMS-AP data of the published entities in Interoperable Europe Portal is valid
-- 
GitLab


From e5331b92c2ba6fef8cb7134bfbcca9eca75130e4 Mon Sep 17 00:00:00 2001
From: "micha.jakubowski" <micha.jakubowski@ffwagency.com>
Date: Wed, 27 Nov 2024 16:33:27 +0100
Subject: [PATCH 018/137] ISAICP-8780: related_solution.feature update

---
 tests/features/solution/related_solution.feature | 14 +++++++-------
 1 file changed, 7 insertions(+), 7 deletions(-)

diff --git a/tests/features/solution/related_solution.feature b/tests/features/solution/related_solution.feature
index e1d773fe19..7f4075aaf9 100644
--- a/tests/features/solution/related_solution.feature
+++ b/tests/features/solution/related_solution.feature
@@ -5,13 +5,13 @@ Feature: Related solution
 
   Background:
     Given solution content:
-      | title      | related solutions | abstract                         | description                         | documentation | related by type | moderation | logo     | topic | state     | solution type |
-      | C          |                   | Blazing fast segmentation faults | Blazing fast segmentation faults.   | text.pdf      | yes             | no         | logo.png | Tools | published |               |
-      | Java       | C                 | Because inheritance is cool      | Because inheritance is cool.        | text.pdf      | yes             | no         | logo.png | Tools | published | Citizen       |
-      | PHP        |                   | Make a site                      | Make a site.                        | text.pdf      | yes             | yes        | logo.png | Tools | published | Citizen       |
-      | Golang     |                   | Concurrency for the masses       | Concurrency for the masses          | text.pdf      | yes             | yes        | logo.png | Tools | proposed  | Citizen       |
-      | Python     |                   | Get stuff done                   | Get stuff done.                     | text.pdf      | yes             | no         | logo.png | Tools | published |               |
-      | Javascript | Java, PHP         | Java is related to javascript    | Java is related to javascript. Huh? | text.pdf      | no              | no         | logo.png | Tools | published | Citizen       |
+      | title      | related solutions | abstract                         | description                         | documentation | related by type | moderation | logo     | solution type |
+      | C          |                   | Blazing fast segmentation faults | Blazing fast segmentation faults.   | text.pdf      | yes             | no         | logo.png | Citizen       |
+      | Java       | C                 | Because inheritance is cool      | Because inheritance is cool.        | text.pdf      | yes             | no         | logo.png | Citizen       |
+      | PHP        |                   | Make a site                      | Make a site.                        | text.pdf      | yes             | yes        | logo.png | Citizen       |
+      | Golang     |                   | Concurrency for the masses       | Concurrency for the masses          | text.pdf      | yes             | yes        | logo.png | Citizen       |
+      | Python     |                   | Get stuff done                   | Get stuff done.                     | text.pdf      | yes             | no         | logo.png | Citizen       |
+      | Javascript | Java, PHP         | Java is related to javascript    | Java is related to javascript. Huh? | text.pdf      | no              | no         | logo.png | Citizen       |
 
   # @covers \joinup_solution_get_related_solutions_ids.
   Scenario: Related solutions
-- 
GitLab


From 88d9a916e75e182020fb8b3b20e468727e488e96 Mon Sep 17 00:00:00 2001
From: "micha.jakubowski" <micha.jakubowski@ffwagency.com>
Date: Thu, 28 Nov 2024 17:01:50 +0100
Subject: [PATCH 019/137] ISAICP-8780: set default abstract, description and
 solution_type if missing in test table

---
 tests/src/Context/JoinupContext.php       | 19 +++++++++++--------
 tests/src/Traits/RandomGeneratorTrait.php | 22 ++++++++++++++++++++++
 2 files changed, 33 insertions(+), 8 deletions(-)

diff --git a/tests/src/Context/JoinupContext.php b/tests/src/Context/JoinupContext.php
index 406189537c..3ac32e6913 100644
--- a/tests/src/Context/JoinupContext.php
+++ b/tests/src/Context/JoinupContext.php
@@ -13,6 +13,7 @@
 use Drupal\Core\Utility\Error;
 use Drupal\DrupalExtension\Context\RawDrupalContext;
 use Drupal\DrupalExtension\Hook\Scope\BeforeNodeCreateScope;
+use Drupal\joinup\Traits\RandomGeneratorTrait;
 use Drupal\User\Entity\User;
 use Drupal\comment\CommentInterface;
 use Drupal\comment\Entity\Comment;
@@ -61,6 +62,7 @@ class JoinupContext extends RawDrupalContext {
   use KeyboardInteractionTrait;
   use OgTrait;
   use NodeTrait;
+  use RandomGeneratorTrait;
   use StringTranslationTrait;
   use TabledragTrait;
   use TestingEntitiesTrait;
@@ -1009,19 +1011,20 @@ public function massageFieldsBeforeNodeCreate(BeforeNodeCreateScope $scope): voi
       $node->field_topic = $this->getRandomTopic()->label();
     }
     if (!empty($field_definitions['contact']) && empty($node->contact)) {
-      // For some tests, the node's contact has no relevance. Such tests are
-      // allowed to omit an explicit contact. We're assigning
-      // a default contact from joinup_test.install,
-      // to satisfy data integrity and prevent form validation errors.
       $node->contact = $this->getDefaultContact()->label();
     }
     if (!empty($field_definitions['owner']) && empty($node->owner)) {
-      // For some tests, the node's owner has no relevance. Such tests are
-      // allowed to omit an explicit owner. We're assigning
-      // a default owner from joinup_test.install,
-      // to satisfy data integrity and prevent form validation errors.
       $node->owner = $this->getDefaultOwner()->label();
     }
+    if (!empty($field_definitions['abstract']) && empty($node->abstract)) {
+      $node->abstract = 'default abstract';
+    }
+    if (!empty($field_definitions['description']) && empty($node->descritpion)) {
+      $node->description = 'default description';
+    }
+    if (!empty($field_definitions['solution_type']) && empty($node->solution_type)) {
+      $node->solution_type = $this->getRandomTerm('eira')->label();
+    }
 
     // Handle file URL fields.
     if (!empty($node->documentation)) {
diff --git a/tests/src/Traits/RandomGeneratorTrait.php b/tests/src/Traits/RandomGeneratorTrait.php
index 6f8e6c7807..064a84e69b 100644
--- a/tests/src/Traits/RandomGeneratorTrait.php
+++ b/tests/src/Traits/RandomGeneratorTrait.php
@@ -5,6 +5,7 @@
 namespace Drupal\joinup\Traits;
 
 use Drupal\Component\Uuid\Php;
+use Drupal\Core\Entity\EntityInterface;
 
 /**
  * Helper methods for generating random data in tests.
@@ -22,4 +23,25 @@ public function getRandomUri(): string {
     return 'http://example.com/' . $php->generate();
   }
 
+  /**
+   * Returns random taxonomy term from vocabulary.
+   *
+   * @param string $vocabulary
+   *   Vocabulary id.
+   *
+   * @return \Drupal\Core\Entity\EntityInterface
+   *   Random term.
+   *
+   * @throws \Drupal\Component\Plugin\Exception\InvalidPluginDefinitionException
+   * @throws \Drupal\Component\Plugin\Exception\PluginNotFoundException
+   */
+  protected function getRandomTerm(string $vocabulary): EntityInterface {
+    $storage = \Drupal::entityTypeManager()->getStorage('taxonomy_term');
+
+    $tids = array_values($storage->getQuery()->accessCheck(FALSE)
+      ->condition('vid', $vocabulary)
+      ->execute());
+    return $storage->load($tids[array_rand($tids)]);
+  }
+
 }
-- 
GitLab


From 73b14b45f23b33b44427b7e9dc5fcba42cd0f3c1 Mon Sep 17 00:00:00 2001
From: "micha.jakubowski" <micha.jakubowski@ffwagency.com>
Date: Thu, 28 Nov 2024 17:03:33 +0100
Subject: [PATCH 020/137] ISAICP-8780: solution tests complete update

---
 tests/features/solution/add_solution.feature  | 19 ++--
 .../solution/downloads_counter.feature        | 18 ++--
 tests/features/solution/homepage.feature      | 90 +++++++++----------
 .../features/solution/id_with_spaces.feature  |  8 +-
 tests/features/solution/interoperable.feature | 10 +--
 .../solution/manage_solutions.archive.feature | 31 +++----
 .../solution/manage_solutions.feature         |  6 +-
 .../solution/related_solution.feature         | 14 +--
 .../solution/solution.contact.feature         |  8 +-
 tests/features/solution/solution.edit.feature | 12 +--
 .../solution.member_administration.feature    | 12 +--
 .../solution/solution.member_overview.feature |  8 +-
 ...solution.member_overview_filtering.feature |  8 +-
 .../solution/solution.notifications.feature   | 23 +++--
 .../features/solution/solution.owner.feature  | 14 +--
 .../solution/solution_moderation.feature      | 28 +++---
 .../solution/solution_overview.feature        | 34 +++----
 .../solution_pager_regression.feature         | 42 ++++-----
 .../solution/solution_sharing.feature         | 12 +--
 tests/features/solution/tca.feature           |  4 +-
 20 files changed, 188 insertions(+), 213 deletions(-)

diff --git a/tests/features/solution/add_solution.feature b/tests/features/solution/add_solution.feature
index 443a5939a4..30c64b979b 100644
--- a/tests/features/solution/add_solution.feature
+++ b/tests/features/solution/add_solution.feature
@@ -29,8 +29,8 @@ Feature: "Add solution" visibility options.
 
   Scenario: "Add solution" button should only be shown to moderators and facilitators.
     Given collection content:
-      | title                    | logo     | state     |
-      | Collection solution test | logo.png | published |
+      | title                    |
+      | Collection solution test |
 
     When I am logged in as a moderator
     And I go to the homepage of the "Collection solution test" collection
@@ -178,8 +178,8 @@ Feature: "Add solution" visibility options.
     # when an invalid state button was pressed.
     # @see issue ISAICP-3209
     Given collection content:
-      | title            | state     |
-      | Language parsers | published |
+      | title            |
+      | Language parsers |
     When I am logged in as a facilitator of the "Language parsers" collection
     And I go to the homepage of the "Language parsers" collection
     And I click "Add solution"
@@ -217,8 +217,8 @@ Feature: "Add solution" visibility options.
       | Ocean studies      |
       | Glacier monitoring |
     And solution content:
-      | title                  | abstract              | description                                       | collection    | state     |
-      | Climate change tracker | Tracks climate change | Atlantic salmon arrived after the Little Ice Age. | Ocean studies | published |
+      | title                  | abstract              | description                                       | collection    |
+      | Climate change tracker | Tracks climate change | Atlantic salmon arrived after the Little Ice Age. | Ocean studies |
     And owner content:
       | name                | owner type          |
       | University of Basel | Industry consortium |
@@ -275,9 +275,12 @@ Feature: "Add solution" visibility options.
 
   @javascript @generateMedia @generateMediaTypes:solution_logo
   Scenario: Tests the image library widget.
+    Given collection content:
+      | title         |
+      | Ocean studies |
     Given solution content:
-      | title             | abstract              | description            | state     | solution type          |
-      | Cleaning solution | Cleans anything dirty | Use on metal surfaces. | published | Non-binding Instrument |
+      | title             | collection    |
+      | Cleaning solution | Ocean studies |
 
     Given I am logged in as a moderator
     When I go to the edit form of the "Cleaning solution" solution
diff --git a/tests/features/solution/downloads_counter.feature b/tests/features/solution/downloads_counter.feature
index ab21db0860..21ed7fa545 100644
--- a/tests/features/solution/downloads_counter.feature
+++ b/tests/features/solution/downloads_counter.feature
@@ -5,15 +5,15 @@ Feature:
   Scenario: Check solution downloads counter
     # Create the dummy data to work with.
     Given collection content:
-      | title         | state     |
-      | Ocean studies | published |
+      | title         |
+      | Ocean studies |
     Given solution content:
-      | title                  | description                                       | collection    | state     |
-      | Climate change tracker | Atlantic salmon arrived after the Little Ice Age. | Ocean studies | published |
+      | title                  | collection    |
+      | Climate change tracker | Ocean studies |
     Given distribution content:
-      | title                 | description          | solution               | downloads | state     |
-      | Sample distribution   | Sample description   | Climate change tracker | 10        | published |
-      | Sample distribution 2 | Sample description 2 | Climate change tracker | 0         | published |
+      | title                 | solution               | downloads |
+      | Sample distribution   | Climate change tracker | 10        |
+      | Sample distribution 2 | Climate change tracker | 0         |
     # Checks solutions tiles to we have the correct numbers.
     When I visit the solution overview
     Then I should see the "Climate change tracker" tile
@@ -29,7 +29,7 @@ Feature:
     When I visit the solution overview
     Then the download icon should not be shown in the "Climate change tracker" tile
     Given distribution content:
-      | title                 | description          | solution               | downloads | state     |
-      | Sample distribution 3 | Sample description 3 | Climate change tracker | 20        | published |
+      | title                 | solution               | downloads |
+      | Sample distribution 3 | Climate change tracker | 20        |
     When I reload the page
     Then the "Climate change tracker" tile should show 20 downloads
diff --git a/tests/features/solution/homepage.feature b/tests/features/solution/homepage.feature
index 85f005b382..9af6713ca7 100644
--- a/tests/features/solution/homepage.feature
+++ b/tests/features/solution/homepage.feature
@@ -8,12 +8,9 @@ Feature: Solution homepage
     Given owner content:
       | name          |
       | Awesome owner |
-    And contact_information content:
-      | name            | email                      | website url        |
-      | Awesome contact | awesomecontact@example.com | http://example.com |
     Given solution content:
-      | title     | description                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      | state     | owner         | contact information | topic                   | solution type                           | spatial coverage | language | status    | published at    | modification date | abstract                   |
-      | Petri net | "<p>A <b>Petri net</b>, also known as a <b>place/transition (PT) net</b>, is one of several <a href=\"#mathematical\">mathematical</a> modeling languages for the description of distributed systems. It is a class of discrete event dynamic system. A Petri net is a directed bipartite graph, in which the nodes represent transitions (i.e. events that may occur, represented by bars) and places (i.e. conditions, represented by circles). The directed arcs describe which places are pre- and/or postconditions for which transitions (signified by arrows). Some sources state that Petri nets were invented in August 1939 by Carl Adam Petri at the age of 13 for the purpose of describing chemical processes.</p>" | published | Awesome owner | Awesome contact     | Demography, E-inclusion | Non-binding Instrument, Logging Service | Greece, Belgium  | English  | Completed | 2012-12-01T8:43 | 2017-12-01T8:43   | Short abstract description |
+      | title     | description                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      | owner         | topic                   | solution type                           | spatial coverage | language | status    | published at    | modification date | abstract                   |
+      | Petri net | "<p>A <b>Petri net</b>, also known as a <b>place/transition (PT) net</b>, is one of several <a href=\"#mathematical\">mathematical</a> modeling languages for the description of distributed systems. It is a class of discrete event dynamic system. A Petri net is a directed bipartite graph, in which the nodes represent transitions (i.e. events that may occur, represented by bars) and places (i.e. conditions, represented by circles). The directed arcs describe which places are pre- and/or postconditions for which transitions (signified by arrows). Some sources state that Petri nets were invented in August 1939 by Carl Adam Petri at the age of 13 for the purpose of describing chemical processes.</p>" | Awesome owner | Demography, E-inclusion | Non-binding Instrument, Logging Service | Greece, Belgium  | English  | Completed | 2012-12-01T8:43 | 2017-12-01T8:43   | Short abstract description |
     And release content:
       | title          | release notes    | documentation | release number | release notes   | is version of | state     | creation date    | published at     |
       | Petri net v1.1 | A sample release | text.pdf      | 1.1            | Changed release | Petri net     | published | 2022-12-21T13:00 | 2022-12-21T13:00 |
@@ -49,11 +46,11 @@ Feature: Solution homepage
 
   Scenario: Custom pages should not be visible on the solution homepage
     Given solution content:
-      | title           | description                 | documentation | content creation | landing page                   |
-      | Jira restarters | Rebooting solves all issues | text.pdf      | registered users | http://foo-example.com/landing |
+      | title           | content creation | landing page                   |
+      | Jira restarters | registered users | http://foo-example.com/landing |
     And news content:
-      | title                             | body                             | solution        | topic                   | spatial coverage |
-      | Jira will be down for maintenance | As always, during business hours | Jira restarters | Statistics and Analysis | Luxembourg       |
+      | title                             | solution        |
+      | Jira will be down for maintenance | Jira restarters |
     And custom_page content:
       | title            | body                                       | solution        |
       | Maintenance page | Jira is re-indexing. Go and drink a coffee | Jira restarters |
@@ -63,38 +60,35 @@ Feature: Solution homepage
     And I should not see the "Maintenance page" tile
 
   Scenario: Test that a pager is shown on the solution page when needed.
-    Given owner content:
-      | name                  | owner type |
-      | Chiricahua Foundation | Company    |
     Given solution content:
-      | title             | description     | logo     | state     | owner                 | solution type |
-      | Chiricahua Server | Serving the web | logo.png | published | Chiricahua Foundation | Business      |
+      | title             |
+      | Chiricahua Server |
     # There should not be a pager when the solution is empty.
     When I go to the homepage of the "Chiricahua Server" solution
     Then I should not see the "Pager" region
 
     # The pager should only appear when there are more than 12 items.
     Given distribution content:
-      | title           | description    | solution          |
-      | Distribution 1  | Description 1  | Chiricahua Server |
-      | Distribution 2  | Description 2  | Chiricahua Server |
-      | Distribution 3  | Description 3  | Chiricahua Server |
-      | Distribution 4  | Description 4  | Chiricahua Server |
-      | Distribution 5  | Description 5  | Chiricahua Server |
-      | Distribution 6  | Description 6  | Chiricahua Server |
-      | Distribution 7  | Description 7  | Chiricahua Server |
-      | Distribution 8  | Description 8  | Chiricahua Server |
-      | Distribution 9  | Description 9  | Chiricahua Server |
-      | Distribution 10 | Description 10 | Chiricahua Server |
-      | Distribution 11 | Description 11 | Chiricahua Server |
-      | Distribution 12 | Description 12 | Chiricahua Server |
+      | title           | solution          |
+      | Distribution 1  | Chiricahua Server |
+      | Distribution 2  | Chiricahua Server |
+      | Distribution 3  | Chiricahua Server |
+      | Distribution 4  | Chiricahua Server |
+      | Distribution 5  | Chiricahua Server |
+      | Distribution 6  | Chiricahua Server |
+      | Distribution 7  | Chiricahua Server |
+      | Distribution 8  | Chiricahua Server |
+      | Distribution 9  | Chiricahua Server |
+      | Distribution 10 | Chiricahua Server |
+      | Distribution 11 | Chiricahua Server |
+      | Distribution 12 | Chiricahua Server |
     When I go to the homepage of the "Chiricahua Server" solution
     Then I should not see the "Pager" region
     And I should not see the "Distribution 13" tile
 
     Given distribution content:
-      | title           | description    | solution          | state     |
-      | Distribution 13 | Description 13 | Chiricahua Server | published |
+      | title           | solution          |
+      | Distribution 13 | Chiricahua Server |
     When I go to the homepage of the "Chiricahua Server" solution
     Then I should see the following links:
       | Current page    |
@@ -120,19 +114,19 @@ Feature: Solution homepage
     And I should not see the "Distribution 12" tile
 
     Given distribution content:
-      | title           | description    | solution          |
-      | Distribution 14 | Description 14 | Chiricahua Server |
-      | Distribution 15 | Description 15 | Chiricahua Server |
-      | Distribution 16 | Description 16 | Chiricahua Server |
-      | Distribution 17 | Description 17 | Chiricahua Server |
-      | Distribution 18 | Description 18 | Chiricahua Server |
-      | Distribution 19 | Description 19 | Chiricahua Server |
-      | Distribution 20 | Description 20 | Chiricahua Server |
-      | Distribution 21 | Description 21 | Chiricahua Server |
-      | Distribution 22 | Description 22 | Chiricahua Server |
-      | Distribution 23 | Description 23 | Chiricahua Server |
-      | Distribution 24 | Description 24 | Chiricahua Server |
-      | Distribution 25 | Description 25 | Chiricahua Server |
+      | title           | solution          |
+      | Distribution 14 | Chiricahua Server |
+      | Distribution 15 | Chiricahua Server |
+      | Distribution 16 | Chiricahua Server |
+      | Distribution 17 | Chiricahua Server |
+      | Distribution 18 | Chiricahua Server |
+      | Distribution 19 | Chiricahua Server |
+      | Distribution 20 | Chiricahua Server |
+      | Distribution 21 | Chiricahua Server |
+      | Distribution 22 | Chiricahua Server |
+      | Distribution 23 | Chiricahua Server |
+      | Distribution 24 | Chiricahua Server |
+      | Distribution 25 | Chiricahua Server |
 
     When I go to the homepage of the "Chiricahua Server" solution
     Then I should see the following links:
@@ -186,19 +180,19 @@ Feature: Solution homepage
 
     # The pager being visible in one solution should not affect other solutions.
     Given solution content:
-      | title           | description          | state     | owner                 |
-      | Chiricahua Solr | Searching your datas | published | Chiricahua Foundation |
+      | title           |
+      | Chiricahua Solr |
     And distribution content:
-      | title               | description   | solution        |
-      | Solr distribution 1 | Description 1 | Chiricahua Solr |
+      | title               | solution        |
+      | Solr distribution 1 | Chiricahua Solr |
     When I go to the homepage of the "Chiricahua Solr" solution
     Then I should not see the "Pager" region
 
   @javascript
   Scenario: Test that up to 7 topic terms are visible in the solution overview header.
     Given solution content:
-      | title      | description        | logo     | state     | topic                                                                                                                              |
-      | All topics | Bring in EVERYONE! | logo.png | published | Finance in EU, Supplier exchange, E-health, HR, Employment and Support Allowance, Statistics and Analysis, E-inclusion, Demography |
+      | title      | topic                                                                                                                              |
+      | All topics | Finance in EU, Supplier exchange, E-health, HR, Employment and Support Allowance, Statistics and Analysis, E-inclusion, Demography |
 
     When I go to the "All topics" solution
     Then I should see the text "Topic" in the "Header"
diff --git a/tests/features/solution/id_with_spaces.feature b/tests/features/solution/id_with_spaces.feature
index da09ea76cf..a5bfffb6e9 100644
--- a/tests/features/solution/id_with_spaces.feature
+++ b/tests/features/solution/id_with_spaces.feature
@@ -6,8 +6,8 @@ Feature: Solution API
 
   Scenario: Programmatically create a solution
     Given solution content:
-      | uri                                    | title                | description       | logo     | documentation | content creation | landing page                   |
-      | http://example.com/this%20has%20spaces | Solution with spaces | A sample solution | logo.png | text.pdf      | registered users | http://foo-example.com/landing |
+      | uri                                    | title                | content creation | landing page                   |
+      | http://example.com/this%20has%20spaces | Solution with spaces | registered users | http://foo-example.com/landing |
     And solution content:
-      | uri                                                                                                      | title                 | description       | logo     | documentation | content creation | landing page                   |
-      | http://www.it-planungsrat.de/DE/Projekte/Koordinierungsprojekte/OsiP/Online_Sicherheitspr%C3%BCfung.html | Solution with unicode | A sample solution | logo.png | text.pdf      | registered users | http://foo-example.com/landing |
+      | uri                                                                                                      | title                 | content creation | landing page                   |
+      | http://www.it-planungsrat.de/DE/Projekte/Koordinierungsprojekte/OsiP/Online_Sicherheitspr%C3%BCfung.html | Solution with unicode | registered users | http://foo-example.com/landing |
diff --git a/tests/features/solution/interoperable.feature b/tests/features/solution/interoperable.feature
index 3aa81e33ee..37b36f5f10 100644
--- a/tests/features/solution/interoperable.feature
+++ b/tests/features/solution/interoperable.feature
@@ -4,12 +4,12 @@ Feature: Interoperable solution flag
   @javascript
   Scenario: Flag/un-flag solution as interoperable.
     Given collection content:
-      | title        | state     |
-      | Derby County | published |
+      | title        |
+      | Derby County |
     Given solution content:
-      | title            | collection   | description                                                                      | state     |
-      | Crest identity   | Derby County | The badge consisted of a circular shield split into three equally sized sections | published |
-      | Colours identity | Derby County | Derby County's original colours (right) were amber, chocolate and blue           | published |
+      | title            | collection   |
+      | Crest identity   | Derby County |
+      | Colours identity | Derby County |
 
     Given I am logged in as a user with the "interoperability_validator" role
     When I go to the homepage of the "Crest identity" solution
diff --git a/tests/features/solution/manage_solutions.archive.feature b/tests/features/solution/manage_solutions.archive.feature
index 023f586816..7ad25bc0c1 100644
--- a/tests/features/solution/manage_solutions.archive.feature
+++ b/tests/features/solution/manage_solutions.archive.feature
@@ -3,18 +3,15 @@ Feature: When a solution is archived then its sub-content also should be archive
 
   Background:
     Given collection content:
-      | title      | state     |
-      | Collection | published |
-    And owner content:
-      | name        | owner type |
-      | The Company | Company    |
+      | title      |
+      | Collection |
     And contact_information content:
       | name                 | email                      |
       | Liam Smith           | liam.smith@example.com     |
       | Jennifer Unconfirmed | jennifer.smith@example.com |
     And solution content:
-      | title    | collection | state     | abstract | description | topic      | solution type | creation date    | modification date | owner       | contact information              |
-      | Solution | Collection | published | Abstract | Description | Demography | Innovation    | 2018-11-19T10:00 | 2018-12-19T10:00  | The Company | Jennifer Unconfirmed, Liam Smith |
+      | title    | collection | creation date    | modification date | owner       | contact information              |
+      | Solution | Collection | 2018-11-19T10:00 | 2018-12-19T10:00  | The Company | Jennifer Unconfirmed, Liam Smith |
     And users:
       | Username           | E-mail                     | First name | Family name | Roles     |
       | Anne Group Admin   | anne.smith@example.com     | Anne       | Smith       |           |
@@ -22,12 +19,12 @@ Feature: When a solution is archived then its sub-content also should be archive
       | Blahman            | ferners-lee@example.com    |            |             |           |
       | John Moderator     | john.moderator@example.com | John       | Moderator   | moderator |
     And the following solution user memberships:
-      | solution | user               | roles                      |
-      | Solution | Anne Group Admin   | owner                      |
-      | Solution | Andrew Facilitator | facilitator                |
+      | solution | user               | roles       |
+      | Solution | Anne Group Admin   | owner       |
+      | Solution | Andrew Facilitator | facilitator |
     And "event" content:
-      | title          | solution | state     |
-      | Solution Event | Solution | published |
+      | title          | solution |
+      | Solution Event | Solution |
     And "news" content:
       | title           | solution | state     |
       | Solution News 1 | Solution | published |
@@ -42,8 +39,8 @@ Feature: When a solution is archived then its sub-content also should be archive
       | Weird Solution Document | Solution   | draft     | 200 |
     And the workflow state of the "Weird Solution Document" content is changed to "archived"
     And "discussion" content:
-      | title               | collection | state     |
-      | Solution Discussion | Solution   | published |
+      | title               | collection |
+      | Solution Discussion | Solution   |
     And "custom_page" content:
       | title                  | solution | state     |
       | Solution Custom page 1 | Solution | published |
@@ -51,8 +48,8 @@ Feature: When a solution is archived then its sub-content also should be archive
       | Solution Custom page 3 | Solution | published |
     And the workflow state of the "Solution Custom page 3" content is changed to "archived"
     And distribution content:
-      | title                 | solution | state     |
-      | Solution Distribution | Solution | published |
+      | title                 | solution |
+      | Solution Distribution | Solution |
     And release content:
       | title              | is version of | state     |
       | Solution Release 1 | Solution      | published |
@@ -106,7 +103,7 @@ Feature: When a solution is archived then its sub-content also should be archive
     And the string value of the "revision_log" field in "Solution Discussion" content should be "Updated state to 'archived' by 'solution_archive_related_content' queue, from revision ID '<placeholder>' with state 'published'."
     And 2 e-mails should have been sent
     And the following email should have been sent:
-      | recipient | John Moderator                     |
+      | recipient | John Moderator                                          |
       | subject   | Interoperable Europe Portal: Solution has been archived |
     And the email sent to "John Moderator" with subject "Interoperable Europe Portal: Solution has been archived" contains the following lines of text:
       | Dear John,                                                           |
diff --git a/tests/features/solution/manage_solutions.feature b/tests/features/solution/manage_solutions.feature
index e4d70f70b5..ea6a42b819 100644
--- a/tests/features/solution/manage_solutions.feature
+++ b/tests/features/solution/manage_solutions.feature
@@ -3,9 +3,9 @@ Feature: As a moderator I want to be able to move solutions to other collection.
 
   Background:
     Given collection content:
-      | uri                            | title       | state     |
-      | http://example.com/source      | Source      | published |
-      | http://example.com/destination | Destination | published |
+      | uri                            | title       |
+      | http://example.com/source      | Source      |
+      | http://example.com/destination | Destination |
     Given solution content:
       | title      | collection | state     | creation date    | modification date |
       | Solution 1 | Source     | published | 2017-11-18T10:00 | 2017-12-18T10:00  |
diff --git a/tests/features/solution/related_solution.feature b/tests/features/solution/related_solution.feature
index 7f4075aaf9..40cd5d6489 100644
--- a/tests/features/solution/related_solution.feature
+++ b/tests/features/solution/related_solution.feature
@@ -5,13 +5,13 @@ Feature: Related solution
 
   Background:
     Given solution content:
-      | title      | related solutions | abstract                         | description                         | documentation | related by type | moderation | logo     | solution type |
-      | C          |                   | Blazing fast segmentation faults | Blazing fast segmentation faults.   | text.pdf      | yes             | no         | logo.png | Citizen       |
-      | Java       | C                 | Because inheritance is cool      | Because inheritance is cool.        | text.pdf      | yes             | no         | logo.png | Citizen       |
-      | PHP        |                   | Make a site                      | Make a site.                        | text.pdf      | yes             | yes        | logo.png | Citizen       |
-      | Golang     |                   | Concurrency for the masses       | Concurrency for the masses          | text.pdf      | yes             | yes        | logo.png | Citizen       |
-      | Python     |                   | Get stuff done                   | Get stuff done.                     | text.pdf      | yes             | no         | logo.png | Citizen       |
-      | Javascript | Java, PHP         | Java is related to javascript    | Java is related to javascript. Huh? | text.pdf      | no              | no         | logo.png | Citizen       |
+      | title      | related solutions | related by type | moderation |
+      | C          |                   | yes             | no         |
+      | Java       | C                 | yes             | no         |
+      | PHP        |                   | yes             | yes        |
+      | Golang     |                   | yes             | yes        |
+      | Python     |                   | yes             | no         |
+      | Javascript | Java, PHP         | no              | no         |
 
   # @covers \joinup_solution_get_related_solutions_ids.
   Scenario: Related solutions
diff --git a/tests/features/solution/solution.contact.feature b/tests/features/solution/solution.contact.feature
index 6b6b1e0a21..85f755913c 100644
--- a/tests/features/solution/solution.contact.feature
+++ b/tests/features/solution/solution.contact.feature
@@ -15,11 +15,11 @@ Feature: Contact form for solution
       | john@example.com         | confirmed |
       | deleted@example.com      | confirmed |
     And collection content:
-      | title                | state     |
-      | Antibody development | published |
+      | title                |
+      | Antibody development |
     And solution content:
-      | title                    | description                     | state     | contact information | collection           |
-      | Six exclusion advantages | Separating molecules by weight. | published | John Revoked        | Antibody development |
+      | title                    | contact information | collection           |
+      | Six exclusion advantages | John Revoked        | Antibody development |
     And user:
       | Username | Joe Hard             |
       | E-mail   | joe.hard@example.com |
diff --git a/tests/features/solution/solution.edit.feature b/tests/features/solution/solution.edit.feature
index 7a0409bd63..18d7393044 100644
--- a/tests/features/solution/solution.edit.feature
+++ b/tests/features/solution/solution.edit.feature
@@ -12,8 +12,8 @@ Feature: Solution editing.
       | name      | owner type |
       | Acme inc. | Company    |
     And collection content:
-      | title              | state     |
-      | Collection example | published |
+      | title              |
+      | Collection example |
     # Assign facilitator role in order to allow creation of a solution.
     # In UAT this can be done by creating the collection through the UI
     # with the related user.
@@ -21,8 +21,8 @@ Feature: Solution editing.
       | collection         | user         | roles       |
       | Collection example | Yancy Burton | facilitator |
     And solution content:
-      | title            | description       | logo     | state     |
-      | Another solution | Just another one. | logo.png | published |
+      | title            | logo     |
+      | Another solution | logo.png |
 
   @uploadFiles:logo.png
   Scenario: A solution owner can edit only its own solutions.
@@ -79,8 +79,8 @@ Feature: Solution editing.
 
   Scenario: A solution facilitator can edit only the solutions he's associated with.
     Given solution content:
-      | title      | description   | logo     | state     | solution type |
-      | Solution B | Second letter | logo.png | published | Citizen       |
+      | title      |
+      | Solution B |
     When I am logged in as a facilitator of the "Solution B" solution
     And I go to the homepage of the "Solution B" solution
     Then I should see the link "Edit"
diff --git a/tests/features/solution/solution.member_administration.feature b/tests/features/solution/solution.member_administration.feature
index 3203b2887f..9fb41e2f1f 100644
--- a/tests/features/solution/solution.member_administration.feature
+++ b/tests/features/solution/solution.member_administration.feature
@@ -5,20 +5,14 @@ Feature: Solution membership administration
   I need to be able to manage solution members
 
   Background:
-    Given owner content:
-      | name                 |
-      | James Wilson the 2nd |
-    And contact_information content:
-      | name                                     | email                         |
-      | Princeton-Plainsboro Teaching University | info@princeton-plainsboro.edu |
-    And users:
+    Given users:
       | Username         | E-mail                       | First name | Family name |
       # Authenticated user.
       | Guadalupe Norman | guadalupe_norman@example.com | Guadalupe  | Norman      |
       | Marcia Garcia    | marcia_garcia@example.com    | Marcia     | Garcia      |
     And solution content:
-      | title            | related solutions | description                       | documentation | moderation | logo     | state     | solution type | owner                | contact information                      |
-      | The Missing Sons |                   | Blazing fast segmentation faults. | text.pdf      | no         | logo.png | published |               | James Wilson the 2nd | Princeton-Plainsboro Teaching University |
+      | title            | moderation |
+      | The Missing Sons | no         |
     And the following solution user memberships:
       | solution         | user             | roles       |
       | The Missing Sons | Guadalupe Norman | facilitator |
diff --git a/tests/features/solution/solution.member_overview.feature b/tests/features/solution/solution.member_overview.feature
index 11436dcd41..3ec997d66d 100644
--- a/tests/features/solution/solution.member_overview.feature
+++ b/tests/features/solution/solution.member_overview.feature
@@ -26,11 +26,11 @@ Feature: Solution membership overview
       | Pocahontas Mathieu  | Pocahontas | Mathieu     | blaise.jpg   | Chief Communications Officer    |
       | Callista Wronski    | Callista   | Wronski     | richard.jpg  | Founder                         |
     And collection content:
-      | title              | state     |
-      | Growing collection | published |
+      | title              |
+      | Growing collection |
     And solution content:
-      | title        | description     | state     | collection         |
-      | Growing zone | Soil and gravel | published | Growing collection |
+      | title        | collection         |
+      | Growing zone | Growing collection |
     And the following solution user memberships:
       | solution     | user                | roles       | state   |
       | Growing zone | Ariadna Astrauskas  | owner       |         |
diff --git a/tests/features/solution/solution.member_overview_filtering.feature b/tests/features/solution/solution.member_overview_filtering.feature
index 8dbabcd254..26608234cb 100644
--- a/tests/features/solution/solution.member_overview_filtering.feature
+++ b/tests/features/solution/solution.member_overview_filtering.feature
@@ -15,11 +15,11 @@ Feature: Type something to filter the listing the member list
       | brighty      | Lavonne    | Atkins      |           |
       | scanner      | Pucky      | Muck        |           |
     And collection content:
-      | title         | state     |
-      | Coffee lovers | published |
+      | title         |
+      | Coffee lovers |
     And solution content:
-      | title           | description                          | state     | collection    |
-      | Coffee grinders | Grind more coffee, make more coffee. | published | Coffee lovers |
+      | title           | collection    |
+      | Coffee grinders | Coffee lovers |
     And the following solution user memberships:
       | solution        | user         | roles       |
       | Coffee grinders | ledge        | owner       |
diff --git a/tests/features/solution/solution.notifications.feature b/tests/features/solution/solution.notifications.feature
index 4e07349ece..b2acd9acbd 100644
--- a/tests/features/solution/solution.notifications.feature
+++ b/tests/features/solution/solution.notifications.feature
@@ -8,24 +8,23 @@ Feature: Solution notifications
 
   Scenario: Notifications are sent every time a related transition is applied to a solution.
     Given collection content:
-      | title                          | logo     |
-      | Collection of random solutions | logo.png |
-    And I break
+      | title                          |
+      | Collection of random solutions |
     And users:
       | Username     | Roles     | First name | Family name | E-mail                   |
-      | Pat Harper   | moderator | Pat        | Harper      | pat.harper@example.com    |
+      | Pat Harper   | moderator | Pat        | Harper      | pat.harper@example.com   |
       | Jack Harper  | moderator | Jack       | Harper      | jack.harper@example.com  |
       | Ramiro Myers |           | Ramiro     | Myers       | ramiro.myers@example.com |
       | Edith Poole  |           | Edith      | Poole       | edith.poole@example.com  |
     Given solution content:
-      | title                                                 | author       | abstract       | description | logo     | state        | solution type | collection                     |
-      | Solution notification to propose changes              | Ramiro Myers | Short abstract | Sample text | logo.png | published    | Business      | Collection of random solutions |
-      | Solution notification to blacklist                    | Ramiro Myers | Short abstract | Sample text | logo.png | published    | Business      | Collection of random solutions |
-      | Solution notification to publish from blacklisted     | Ramiro Myers | Short abstract | Sample text | logo.png | blacklisted  | Business      | Collection of random solutions |
-      | Solution notification to request changes              | Ramiro Myers | Short abstract | Sample text | logo.png | published    | Business      | Collection of random solutions |
-      | Solution notification to propose from request changes | Ramiro Myers | Short abstract | Sample text | logo.png | needs update | Business      | Collection of random solutions |
-      | Solution notification to delete by moderator team     | Ramiro Myers | Short abstract | Sample text | logo.png | published    | Business      | Collection of random solutions |
-      | Solution notification to delete by owner              | Ramiro Myers | Short abstract | Sample text | logo.png | published    | Business      | Collection of random solutions |
+      | title                                                 | author       | collection                     | state        |
+      | Solution notification to propose changes              | Ramiro Myers | Collection of random solutions | published    |
+      | Solution notification to blacklist                    | Ramiro Myers | Collection of random solutions | published    |
+      | Solution notification to publish from blacklisted     | Ramiro Myers | Collection of random solutions | blacklisted  |
+      | Solution notification to request changes              | Ramiro Myers | Collection of random solutions | published    |
+      | Solution notification to propose from request changes | Ramiro Myers | Collection of random solutions | needs update |
+      | Solution notification to delete by moderator team     | Ramiro Myers | Collection of random solutions | published    |
+      | Solution notification to delete by owner              | Ramiro Myers | Collection of random solutions | published    |
 
     When I am logged in as "Pat Harper"
 
diff --git a/tests/features/solution/solution.owner.feature b/tests/features/solution/solution.owner.feature
index add89733f9..db3bd83c6d 100644
--- a/tests/features/solution/solution.owner.feature
+++ b/tests/features/solution/solution.owner.feature
@@ -6,11 +6,11 @@ Feature:
 
   Scenario Outline: Authors can add content regardless of group settings.
     Given collection content:
-      | title             | state     |
-      | Author collection | published |
+      | title             |
+      | Author collection |
     And solution content:
-      | title           | moderation   | content creation   | state     | collection        |
-      | Author solution | <moderation> | <content creation> | published | Author collection |
+      | title           | moderation   | content creation   | collection        |
+      | Author solution | <moderation> | <content creation> | Author collection |
 
     When I am logged in as an "author" of the "Author solution" solution
     And I go to the "Author solution" solution
@@ -36,8 +36,8 @@ Feature:
       | Username          |
       | Solution API user |
     And collection content:
-      | title                    | logo     | moderation | content creation         | state     |
-      | This is a klm collection | logo.png | no         | facilitators and authors | published |
+      | title                    | logo     | moderation | content creation         |
+      | This is a klm collection | logo.png | no         | facilitators and authors |
     And the following collection user memberships:
       | user              | collection               | roles       |
       | Solution API user | This is a klm collection | facilitator |
@@ -58,7 +58,7 @@ Feature:
     And I press "Add existing" at the "Owner" field
     And I fill in "Owner" with "Leechidna"
     And I select "Flemish" from "Language"
-    And I select "EU and European Policies" from "Topic"
+    And I select "Tools" from "Topic"
     And I select "Logging Service" from "Solution type"
     And I press "Add owner"
     And I press "Save"
diff --git a/tests/features/solution/solution_moderation.feature b/tests/features/solution/solution_moderation.feature
index 1ddf5066d3..82df11ccdb 100644
--- a/tests/features/solution/solution_moderation.feature
+++ b/tests/features/solution/solution_moderation.feature
@@ -7,8 +7,8 @@ Feature: Solution moderation
   # Access checks are not being made here. They are run in the solution add feature.
   Scenario: 'Save as draft' and 'Propose' states are available but moderators should also see 'Publish' state.
     Given collection content:
-      | title                         | logo     | state     |
-      | Collection propose state test | logo.png | published |
+      | title                         |
+      | Collection propose state test |
 
     When I am logged in as a member of the "Collection propose state test" collection
     And I go to the add solution form of the "Collection propose state test" collection
@@ -32,13 +32,7 @@ Feature: Solution moderation
     And I should not see the link "Delete"
 
   Scenario: Test the moderation workflow available states.
-    Given owner content:
-      | name           | owner type |
-      | Angelos Agathe | Company    |
-    And contact_information content:
-      | name    | email               |
-      | Placide | Placide@example.com |
-    And users:
+    Given users:
       | Username         | Roles     |
       # Authenticated user.
       | Isabel Banks     |           |
@@ -49,14 +43,14 @@ Feature: Solution moderation
       # Facilitator of all the solutions.
       | William Curtis   |           |
     Given solution content:
-      | title                      | description                | logo     | owner          | contact information | state                 |
-      | Azure Ship                 | Azure ship                 | logo.png | Angelos Agathe | Placide             | draft                 |
-      | The Last Illusion          | The Last Illusion          | logo.png | Angelos Agathe | Placide             | proposed              |
-      | Rose of Doors              | Rose of Doors              | logo.png | Angelos Agathe | Placide             | published             |
-      | Time Bandit                | Time Bandit                | logo.png | Angelos Agathe | Placide             | draft_after_published |
-      | Fire Swords                | Fire Swords                | logo.png | Angelos Agathe | Placide             | archived              |
-      | The Guardian of the Stream | The Guardian of the Stream | logo.png | Angelos Agathe | Placide             | needs update          |
-      | Flames in the Swords       | Flames in the Swords       | logo.png | Angelos Agathe | Placide             | blacklisted           |
+      | title                      | description                | state                 |
+      | Azure Ship                 | Azure ship                 | draft                 |
+      | The Last Illusion          | The Last Illusion          | proposed              |
+      | Rose of Doors              | Rose of Doors              | published             |
+      | Time Bandit                | Time Bandit                | draft_after_published |
+      | Fire Swords                | Fire Swords                | archived              |
+      | The Guardian of the Stream | The Guardian of the Stream | needs update          |
+      | Flames in the Swords       | Flames in the Swords       | blacklisted           |
     And the following solution user memberships:
       | solution                   | user            | roles       |
       | Azure Ship                 | Franklin Walker | owner       |
diff --git a/tests/features/solution/solution_overview.feature b/tests/features/solution/solution_overview.feature
index 791ae3012a..e896f45e8e 100644
--- a/tests/features/solution/solution_overview.feature
+++ b/tests/features/solution/solution_overview.feature
@@ -6,21 +6,21 @@ Feature: Solutions Overview
 
   Scenario: Solution overview paging
     Given solution content:
-      | title      | creation date     | state     |
-      | Arctic fox | 2018-10-04 8:21am | published |
-      | Alpaca     | 2018-10-04 8:31am | published |
-      | Boomalope  | 2018-10-04 8:28am | published |
-      | Boomrat    | 2018-10-04 8:35am | published |
-      | Megasloth  | 2018-10-04 8:01am | published |
-      | Thrumbo    | 2018-10-04 8:07am | published |
-      | Spelopede  | 2018-10-04 8:18am | published |
-      | Muffalo    | 2018-10-04 8:59am | published |
-      | Husky      | 2018-10-04 8:00am | published |
-      | Gazelle    | 2018-10-04 8:43am | published |
-      | Cow        | 2018-10-04 8:27am | published |
-      | Panther    | 2018-10-04 8:22am | published |
-      | Tortoise   | 2018-10-04 8:34am | published |
-      | Warg       | 2018-10-04 8:39am | published |
+      | title      | creation date     |
+      | Arctic fox | 2018-10-04 8:21am |
+      | Alpaca     | 2018-10-04 8:31am |
+      | Boomalope  | 2018-10-04 8:28am |
+      | Boomrat    | 2018-10-04 8:35am |
+      | Megasloth  | 2018-10-04 8:01am |
+      | Thrumbo    | 2018-10-04 8:07am |
+      | Spelopede  | 2018-10-04 8:18am |
+      | Muffalo    | 2018-10-04 8:59am |
+      | Husky      | 2018-10-04 8:00am |
+      | Gazelle    | 2018-10-04 8:43am |
+      | Cow        | 2018-10-04 8:27am |
+      | Panther    | 2018-10-04 8:22am |
+      | Tortoise   | 2018-10-04 8:34am |
+      | Warg       | 2018-10-04 8:39am |
     And I am an anonymous user
     When I visit the solution overview
     Then I should see the following tiles in the correct order:
@@ -59,8 +59,8 @@ Feature: Solutions Overview
       | Username      | E-mail                            |
       | Madam Shirley | i.dont.see.the.future@example.com |
     And collection content:
-      | title                 | logo     | state     |
-      | Pikachu, I choose you | logo.png | published |
+      | title                 | logo     |
+      | Pikachu, I choose you | logo.png |
     Given solution content:
     # As of ISAICP-3618 descriptions should not be visible in regular tiles.
       | title                 | description                    | state     |
diff --git a/tests/features/solution/solution_pager_regression.feature b/tests/features/solution/solution_pager_regression.feature
index 1d38a75ac0..cf1ca3ad05 100644
--- a/tests/features/solution/solution_pager_regression.feature
+++ b/tests/features/solution/solution_pager_regression.feature
@@ -2,31 +2,25 @@
 Feature: Test for a 'facets' regression on the solution overview page.
   # @see ISAICP-4188
   Scenario: Test that no pager is shown on the solution page when not needed.
-    Given owner content:
-      | name              | owner type |
-      | Apache Foundation | Company    |
-    And contact_information content:
-      | name           | email                      |
-      | Pierre Plezant | pierre.plezant@example.com |
     Given solution content:
-      | title                | description                | logo     | state     | owner             | contact information | solution type | topic       |
-      | Apache               | Serving the web            | logo.png | published | Apache Foundation | Pierre Plezant      | Business      | E-inclusion |
-      | Security audit tools | Automated test of security | logo.png | published | Apache Foundation | Pierre Plezant      | Business      | E-inclusion |
-      | Drupal               | Content management         | logo.png | published | Apache Foundation | Pierre Plezant      | Business      | E-inclusion |
-      | MongoDB              | Free for all in box        | logo.png | published | Apache Foundation | Pierre Plezant      | Business      | E-inclusion |
-      | NodeJS               | Download all the packages  | logo.png | published | Apache Foundation | Pierre Plezant      | Business      | E-inclusion |
-      | Solution 1           | More solution              | logo.png | published | Apache Foundation | Pierre Plezant      | Business      | E-inclusion |
-      | Solution 2           | More solution              | logo.png | published | Apache Foundation | Pierre Plezant      | Business      | E-inclusion |
-      | Solution 3           | More solution              | logo.png | published | Apache Foundation | Pierre Plezant      | Business      | E-inclusion |
-      | Solution 4           | More solution              | logo.png | published | Apache Foundation | Pierre Plezant      | Business      | E-inclusion |
-      | Solution 5           | More solution              | logo.png | published | Apache Foundation | Pierre Plezant      | Business      | E-inclusion |
-      | Solution 6           | More solution              | logo.png | published | Apache Foundation | Pierre Plezant      | Business      | E-inclusion |
-      | Solution 7           | More solution              | logo.png | published | Apache Foundation | Pierre Plezant      | Business      | E-inclusion |
-      | Solution 8           | More solution              | logo.png | published | Apache Foundation | Pierre Plezant      | Business      | E-inclusion |
-      | Solution 9           | More solution              | logo.png | published | Apache Foundation | Pierre Plezant      | Business      | E-inclusion |
-      | Solution 10          | More solution              | logo.png | published | Apache Foundation | Pierre Plezant      | Business      | E-inclusion |
+      | title                |
+      | Apache               |
+      | Security audit tools |
+      | Drupal               |
+      | MongoDB              |
+      | NodeJS               |
+      | Solution 1           |
+      | Solution 2           |
+      | Solution 3           |
+      | Solution 4           |
+      | Solution 5           |
+      | Solution 6           |
+      | Solution 7           |
+      | Solution 8           |
+      | Solution 9           |
+      | Solution 10          |
     And distribution content:
-      | title    | description         | access url | solution | state     |
-      | test.zip | Apache distribution | test.zip   | Apache   | published |
+      | title    | access url | solution |
+      | test.zip | test.zip   | Apache   |
     And I go to the homepage of the "Apache" solution
     Then I should not see the "Pager" region
diff --git a/tests/features/solution/solution_sharing.feature b/tests/features/solution/solution_sharing.feature
index 6761a061a0..666bd965ae 100644
--- a/tests/features/solution/solution_sharing.feature
+++ b/tests/features/solution/solution_sharing.feature
@@ -11,13 +11,13 @@ Feature: As a privileged user
       | kleev_elant | kleev_elant@example.com | Kleev      | Elant       |           |
       | sand_beach  | sand_beach@example.com  | Sand       | Beach       | moderator |
     And collection content:
-      | title                        | logo     | state     |
-      | Collection share original    | logo.png | published |
-      | Collection share candidate 1 | logo.png | published |
-      | Collection share candidate 2 | logo.png | published |
+      | title                        |
+      | Collection share original    |
+      | Collection share candidate 1 |
+      | Collection share candidate 2 |
     Given solution content:
-      | title                 | description         | logo     | state     | collection                |
-      | Solution to be shared | Doesn't affect test | logo.png | published | Collection share original |
+      | title                 | collection                |
+      | Solution to be shared | Collection share original |
     And the following solution user memberships:
       | solution              | user        | roles       |
       | Solution to be shared | joe_dare    | owner       |
diff --git a/tests/features/solution/tca.feature b/tests/features/solution/tca.feature
index 996f0b74b3..4f89d0acb4 100644
--- a/tests/features/solution/tca.feature
+++ b/tests/features/solution/tca.feature
@@ -6,8 +6,8 @@ Feature: Solution TCA agreement
 
   Scenario: Authenticated users can access the solution TCA agreement page.
     Given collection content:
-      | title             | state     |
-      | Agreed collection | published |
+      | title             |
+      | Agreed collection |
 
     When I am logged in as a facilitator of the "Agreed collection" collection
     And I go to the "Agreed collection" collection
-- 
GitLab


From 2d531796638863755bfa7d7432a4fdb0eac16c32 Mon Sep 17 00:00:00 2001
From: "micha.jakubowski" <micha.jakubowski@ffwagency.com>
Date: Fri, 29 Nov 2024 13:41:58 +0100
Subject: [PATCH 021/137] ISAICP-8780: collection tests complete update

---
 tests/features/collection/author_role.feature |  4 +-
 .../collection/collection.archived.feature    | 39 +++++++-----------
 .../collection/collection.edit.feature        | 36 +++++------------
 .../collection/collection.event.feature       |  4 +-
 .../collection.member_administration.feature  | 22 ++++------
 .../collection.member_count.feature           |  9 ++---
 .../collection.member_overview.feature        | 14 ++-----
 ...llection.member_overview_filtering.feature |  4 +-
 .../collection.membership_management.feature  |  4 +-
 .../collection/collection.moderation.feature  | 30 +++++---------
 .../collection/collection_content.feature     | 40 +++++++++----------
 .../collection/collection_overview.feature    | 20 +++++-----
 .../collection/export_metadata.feature        |  8 ++--
 tests/features/collection/homepage.feature    | 18 ++++-----
 .../collection/join-as-anonymous.feature      |  8 ++--
 .../collection/last_update_time.feature       | 28 +++++--------
 .../newsletter_subscription.feature           | 14 ++-----
 .../notification.collection.feature           | 31 +++++++-------
 tests/features/collection/tca.feature         |  4 +-
 19 files changed, 134 insertions(+), 203 deletions(-)

diff --git a/tests/features/collection/author_role.feature b/tests/features/collection/author_role.feature
index 25196bf0a6..81e86a34ed 100644
--- a/tests/features/collection/author_role.feature
+++ b/tests/features/collection/author_role.feature
@@ -6,8 +6,8 @@ Feature:
 
   Scenario Outline: Authors can add content regardless of group settings.
     Given collection content:
-      | title             | moderation   | content creation   | state     |
-      | Author collection | <moderation> | <content creation> | published |
+      | title             | moderation   | content creation   |
+      | Author collection | <moderation> | <content creation> |
 
     When I am logged in as an "author" of the "Author collection" collection
     And I go to the "Author collection" collection
diff --git a/tests/features/collection/collection.archived.feature b/tests/features/collection/collection.archived.feature
index dd5a97330d..b85bf9d4d3 100644
--- a/tests/features/collection/collection.archived.feature
+++ b/tests/features/collection/collection.archived.feature
@@ -7,37 +7,28 @@ Feature: Creating content and commenting on archived collection
   Background: Check access to the Post comment form
     Given users:
       | Username    | Roles     |
-      | Flora Hunt  | moderator |
-      | Lee Reeves  |           |
-      | Karl Fields |           |
-    And contact_information content:
-      | name           | email                 |
-      | Jody Rodriquez | JodyRodriquez@bar.com |
-    And owner content:
-      | name          |
-      | April Hawkins |
-    And collection content:
-      | title               | abstract            | description         | logo     | owner         | contact information | state     | topic                   |
-      | The Willing Consort | The Willing Consort | The Willing Consort | logo.png | April Hawkins | Jody Rodriquez      | published | Statistics and Analysis |
+      | Flora_Hunt  | moderator |
+      | Lee_Reeves  |           |
+      | Karl_Fields |           |
     And the following collection user memberships:
       | collection          | user        | roles              |
-      | The Willing Consort | Karl Fields | owner, facilitator |
+      | Joinup              | Karl_Fields | owner, facilitator |
 
   Scenario: 'Comment form' should not be accessible on an archived collection content.
     Given discussion content:
-      | title               | collection          | state     |
-      | The Weeping's Stars | The Willing Consort | published |
-    When I am logged in as "Lee Reeves"
+      | title               | collection          |
+      | The Weeping's Stars | Joinup              |
+    When I am logged in as "Lee_Reeves"
     And I go to the "The Weeping's Stars" discussion
     Then the following fields should be present "Create comment"
     And I should see the button "Post comment"
 
-    When I am logged in as "Karl Fields"
-    And I go to the "The Willing Consort" collection
+    When I am logged in as "Karl_Fields"
+    And I go to the "Joinup" collection
     And I click "Edit"
     And I press "Request archival"
     And I am logged in as a moderator
-    And I go to the "The Willing Consort" collection
+    And I go to the "Joinup" collection
     And I click "Edit"
     When I fill in "Motivation" with "As you wish."
     And I press "Archive"
@@ -45,7 +36,7 @@ Feature: Creating content and commenting on archived collection
     Then the following fields should not be present "Create comment"
     And I should not see the button "Post comment"
 
-    When I am logged in as "Lee Reeves"
+    When I am logged in as "Lee_Reeves"
     And I go to the "The Weeping's Stars" discussion
     Then the following fields should not be present "Create comment"
     And I should not see the button "Post comment"
@@ -56,17 +47,17 @@ Feature: Creating content and commenting on archived collection
     And I should not see the button "Post comment"
 
   Scenario: 'Add community content' menu items should not be visible in the archived connection.
-    When I am logged in as "Karl Fields"
-    And I go to the "The Willing Consort" collection
+    When I am logged in as "Karl_Fields"
+    And I go to the "Joinup" collection
     And I click "Edit"
     And I press "Request archival"
     And I am logged in as a moderator
-    And I go to the "The Willing Consort" collection
+    And I go to the "Joinup" collection
     And I click "Edit"
     When I fill in "Motivation" with "As you wish."
     And I press "Archive"
 
     # We only need to check that privileged users do not have access anymore.
     And I am logged in as a facilitator of the "The Willing Consort" collection
-    And I go to the "The Willing Consort" collection
+    And I go to the "Joinup" collection
     Then I should not see the plus button menu
diff --git a/tests/features/collection/collection.edit.feature b/tests/features/collection/collection.edit.feature
index 664430da4e..96e3d9da16 100644
--- a/tests/features/collection/collection.edit.feature
+++ b/tests/features/collection/collection.edit.feature
@@ -5,15 +5,9 @@ Feature: Editing collections
   I need to be able to edit collections through the UI
 
   Scenario: Edit a collection
-    Given owner content:
-      | name                 | owner type |
-      | Organisation example | Company    |
-    And contact_information content:
-      | name                 | email                            |
-      | Collection editorial | collection.editorial@example.com |
-    And collection content:
-      | title                 | logo     | abstract                                   | access url                             | closed | creation date    | description                               | content creation         | moderation | topic             | owner                | contact information  | state |
-      | Überwaldean Land Eels | logo.png | Read up on all about <strong>dogs</strong> | http://dogtime.com/dog-breeds/profiles | yes    | 28-01-1995 12:05 | The Afghan Hound is elegance personified. | facilitators and authors | yes        | Supplier exchange | Organisation example | Collection editorial | draft |
+    Given collection content:
+      | title                 | access url                             | closed | creation date    | content creation         | moderation | state |
+      | Überwaldean Land Eels | http://dogtime.com/dog-breeds/profiles | yes    | 28-01-1995 12:05 | facilitators and authors | yes        | draft |
 
     When I am logged in as a facilitator of the "Überwaldean Land Eels" collection
     And I go to the homepage of the "Überwaldean Land Eels" collection
@@ -37,15 +31,9 @@ Feature: Editing collections
   @javascript
   Scenario: Edit a collection wysiwyg modal should close.
     # Regression test for ticket ISAICP-7181 and ISAICP-8355.
-    Given owner content:
-      | name            | owner type |
-      | wysiwyg example | Company    |
-    And contact_information content:
-      | name              | email                         |
-      | wysiwyg editorial | wysiwyg.editorial@example.com |
-    And collection content:
-      | title           | logo     | abstract                                   | access url                             | closed | creation date    | description                    | content creation         | moderation | topic             | owner           | contact information | state |
-      | Rhyme Land Eels | logo.png | Read up on all about <strong>dogs</strong> | http://dogtime.com/dog-breeds/profiles | yes    | 28-01-1995 12:05 | Hound is elegance personified. | facilitators and authors | yes        | Supplier exchange | wysiwyg example | wysiwyg editorial   | draft |
+    Given collection content:
+      | title           | access url                             | closed | creation date    | content creation         | moderation | state |
+      | Rhyme Land Eels | http://dogtime.com/dog-breeds/profiles | yes    | 28-01-1995 12:05 | facilitators and authors | yes        | draft |
     When I am logged in as a facilitator of the "Rhyme Land Eels" collection
     And I go to the homepage of the "Rhyme Land Eels" collection
 
@@ -67,15 +55,9 @@ Feature: Editing collections
   @javascript
   Scenario: Regression test wysiwyg add file shows a 0 bytes limit.
     # Regression test for ticket ISAICP-7177.
-    Given owner content:
-      | name                       | owner type |
-      | Regression wysiwyg example | Company    |
-    And contact_information content:
-      | name            | email                       |
-      | bytes editorial | bytes.editorial@example.com |
-    And collection content:
-      | title                   | logo     | abstract                                   | access url                             | closed | creation date    | description                    | content creation         | moderation | topic             | owner                      | contact information | state |
-      | Rhyme Land wysiwyg Eels | logo.png | Read up on all about <strong>dogs</strong> | http://dogtime.com/dog-breeds/profiles | yes    | 28-01-1995 12:05 | Hound is elegance personified. | facilitators and authors | yes        | Supplier exchange | Regression wysiwyg example | bytes editorial     | draft |
+    Given collection content:
+      | title                   | access url                             | closed | creation date    | content creation         | moderation | state |
+      | Rhyme Land wysiwyg Eels | http://dogtime.com/dog-breeds/profiles | yes    | 28-01-1995 12:05 | facilitators and authors | yes        | draft |
     When I am logged in as a facilitator of the "Rhyme Land wysiwyg Eels" collection
     And I go to the homepage of the "Rhyme Land wysiwyg Eels" collection
 
diff --git a/tests/features/collection/collection.event.feature b/tests/features/collection/collection.event.feature
index fa14401f80..24976a706d 100644
--- a/tests/features/collection/collection.event.feature
+++ b/tests/features/collection/collection.event.feature
@@ -11,8 +11,8 @@ Feature: As a user of the website
       | katerpillar    | kater.pillar@example.com    |
       | trustysidekick | trusty.sidekick@example.com |
     And collection content:
-      | title      | state     |
-      | Fairy Tail | published |
+      | title      |
+      | Fairy Tail |
     And event content:
       | title                     | collection | start date   | end date            | created    | state     | author         |
       | Sweet Palm                | Fairy Tail | now -1 years | now -1 years +1 day | now -5 day | published | katerpillar    |
diff --git a/tests/features/collection/collection.member_administration.feature b/tests/features/collection/collection.member_administration.feature
index 8e4825fff5..96dfdddf24 100644
--- a/tests/features/collection/collection.member_administration.feature
+++ b/tests/features/collection/collection.member_administration.feature
@@ -5,12 +5,6 @@ Feature: Collection membership administration
   I need to be able to manage collection members
 
   Background:
-    Given owner content:
-      | name         |
-      | James Wilson |
-    And contact_information content:
-      | name                                   | email                        |
-      | Princeton-Plainsboro Teaching Hospital | info@princeton-plainsboro.us |
     And users:
       | Username          | Roles     | E-mail                        | First name | Family name |
       # Authenticated user.
@@ -23,8 +17,8 @@ Feature: Collection membership administration
       # Moderator.
       | Daniel Moder      | moderator | daniel_moder@example.com      | Daniel     | Moder       |
     And collection content:
-      | title             | description               | logo     | owner        | contact information                    | closed | state     |
-      | Medical diagnosis | 10 patients in 10 minutes | logo.png | James Wilson | Princeton-Plainsboro Teaching Hospital | yes    | published |
+      | title | closed |
+      | z     | yes    |
     And the following collection user memberships:
       | collection        | user              | roles                      | state   |
       | Medical diagnosis | Lisa Cuddy        | administrator, facilitator | active  |
@@ -50,7 +44,7 @@ Feature: Collection membership administration
       | /collection/medical-diagnosis/members                                              |
     And the following email should have been sent:
       | recipient | Turkey Ham                                                                         |
-      | subject   | Interoperable Europe Portal: A user has requested to join your collection                               |
+      | subject   | Interoperable Europe Portal: A user has requested to join your collection          |
       | body      | Donald Duck has requested to join your collection "Medical diagnosis" as a member. |
 
   Scenario: Approve a membership
@@ -159,9 +153,9 @@ Feature: Collection membership administration
       | success messages                                                                       |
       | The member Kathie Cumbershot has been deleted from the 'Medical diagnosis' collection. |
     And the following email should have been sent:
-      | recipient | Kathie Cumbershot                                                               |
-      | subject   | Interoperable Europe Portal: Your request to join the collection Medical diagnosis was rejected      |
-      | body      | Lisa Cuddy has rejected your request to join the "Medical diagnosis" collection |
+      | recipient | Kathie Cumbershot                                                                               |
+      | subject   | Interoperable Europe Portal: Your request to join the collection Medical diagnosis was rejected |
+      | body      | Lisa Cuddy has rejected your request to join the "Medical diagnosis" collection                 |
 
     # Delete multiple members from collection.
     Given I check the box "Update the member Gregory House"
@@ -407,8 +401,8 @@ Feature: Collection membership administration
 
   Scenario: User needs to accept code of conduct on the confirmation form.
     Given custom_page content:
-      | title                 | collection        | state     |
-      | Medical diagnosis CoC | Medical diagnosis | published |
+      | title                 | collection        |
+      | Medical diagnosis CoC | Medical diagnosis |
     And the "code of conduct" setting of the "Medical diagnosis" collection is set to "Medical diagnosis CoC" "custom page"
 
     When I am logged in as "Lisa Cuddy"
diff --git a/tests/features/collection/collection.member_count.feature b/tests/features/collection/collection.member_count.feature
index 95ec34029c..f0b7d8337c 100644
--- a/tests/features/collection/collection.member_count.feature
+++ b/tests/features/collection/collection.member_count.feature
@@ -12,13 +12,10 @@ Feature: Collection homepage
       | Kili        | active  |
       | Bilbo       | blocked |
       | Some goblin | active  |
-    Given owner content:
-      | name         |
-      | Hobbit owner |
     And collection content:
-      | title                                   | description        | owner        | logo     | moderation | closed | state     |
-      | Under the mountain                      | Under the mountain | Hobbit owner | logo.png | yes        | no     | published |
-      | Exactly the same collection, but closed | Under the mountain | Hobbit owner | logo.png | yes        | yes    | published |
+      | title                                   | moderation | closed |
+      | Under the mountain                      | yes        | no     |
+      | Exactly the same collection, but closed | yes        | yes    |
     And the following collection user memberships:
       | collection                              | user   | roles       |
       | Under the mountain                      | Thorin | facilitator |
diff --git a/tests/features/collection/collection.member_overview.feature b/tests/features/collection/collection.member_overview.feature
index b60d29c458..326efd5168 100644
--- a/tests/features/collection/collection.member_overview.feature
+++ b/tests/features/collection/collection.member_overview.feature
@@ -5,13 +5,7 @@ Feature: Collection membership overview
   I need to be able to see an overview of my fellow members
 
   Scenario: Show the collection members as a list of tiles
-    Given owner content:
-      | name           |
-      | Ayodele Sommer |
-    And contact_information content:
-      | name      | email                 |
-      | Nita Yang | supernita@yahoo.co.uk |
-    And users:
+    Given users:
       # We're adding many users so we can test the different roles and states,
       #  as well as the pager. 12 users are shown per page.
       | Username              | First name | Family name | Photo        | Business title                  |
@@ -32,9 +26,9 @@ Feature: Collection membership overview
       | Aniruddha Kováts      | Aniruddha  | Kováts      | blaise.jpg   | Chief Communications Officer    |
       | Aali Dalton           | Aali       | Dalton      | richard.jpg  | Founder                         |
     And collection content:
-      | title           | description        | logo     | owner          | contact information | state     |
-      | Jubilant Robots | Fresh oil harvest! | logo.png | Ayodele Sommer | Nita Yang           | published |
-      | Jubilant Rabits | Fresh oil harvest! | logo.png | Ayodele Sommer | Nita Yang           | draft     |
+      | title           | state     |
+      | Jubilant Robots | published |
+      | Jubilant Rabits | draft     |
     And the following collection user memberships:
       | collection      | user                  | roles       | state   |
       | Jubilant Robots | Ruby Valenta          | owner       |         |
diff --git a/tests/features/collection/collection.member_overview_filtering.feature b/tests/features/collection/collection.member_overview_filtering.feature
index d8126a7766..138abba319 100644
--- a/tests/features/collection/collection.member_overview_filtering.feature
+++ b/tests/features/collection/collection.member_overview_filtering.feature
@@ -15,8 +15,8 @@ Feature: Type something to filter the listing the member list
       | iambroke   | Nell       | Gibb        |           | iambroke@example.com   |
       | queenson   | Queen      | Emerson     |           | queenson@example.com   |
     And collection content:
-      | title         | description                    | state     | creation date |
-      | Coffee makers | Coffee is needed for survival. | published | 01-01-2018    |
+      | title         | creation date |
+      | Coffee makers | 01-01-2018    |
     And the following collection user memberships:
       | collection    | user       | roles       | created          | state   |
       | Coffee makers | emeritous  | owner       | 01-01-2018 00:00 | active  |
diff --git a/tests/features/collection/collection.membership_management.feature b/tests/features/collection/collection.membership_management.feature
index e5019f2fd1..e12447df52 100644
--- a/tests/features/collection/collection.membership_management.feature
+++ b/tests/features/collection/collection.membership_management.feature
@@ -3,8 +3,8 @@ Feature: Tests membership to Interoperable Europe Portal collection.
 
   Background:
     Given collection content:
-      | title                   | state     |
-      | An arbitrary collection | published |
+      | title                   |
+      | An arbitrary collection |
 
   Scenario: As a newly registered user, I'm automatically member of the 'Joinup'
     collection and I cannot leave.
diff --git a/tests/features/collection/collection.moderation.feature b/tests/features/collection/collection.moderation.feature
index 0e0c4fbe6f..1b60c54b6c 100644
--- a/tests/features/collection/collection.moderation.feature
+++ b/tests/features/collection/collection.moderation.feature
@@ -19,13 +19,7 @@ Feature: Collection moderation
     And I should not see the link "Delete"
 
   Scenario: Test the available buttons in every stage of the editorial workflow
-    Given owner content:
-      | name           |
-      | Simon Sandoval |
-    And contact_information content:
-      | name    | email               |
-      | Francis | Francis@example.com |
-    And users:
+    Given users:
       | Username        | Roles     |
       # Authenticated user.
       | Velma Smith     |           |
@@ -36,12 +30,12 @@ Feature: Collection moderation
       # Facilitator of all the collections.
       | Carole James    |           |
     And collection content:
-      | title               | description         | logo     | owner          | contact information | state            |
-      | Deep Past           | Azure ship          | logo.png | Simon Sandoval | Francis             | draft            |
-      | The Licking Silence | The Licking Silence | logo.png | Simon Sandoval | Francis             | proposed         |
-      | Person of Wizards   | Person of Wizards   | logo.png | Simon Sandoval | Francis             | published        |
-      | The Shard's Hunter  | The Shard's Hunter  | logo.png | Simon Sandoval | Francis             | archival request |
-      | Luck in the Abyss   | Luck in the Abyss   | logo.png | Simon Sandoval | Francis             | archived         |
+      | title               | state            |
+      | Deep Past           | draft            |
+      | The Licking Silence | proposed         |
+      | Person of Wizards   | published        |
+      | The Shard's Hunter  | archival request |
+      | Luck in the Abyss   | archived         |
     And the following collection user memberships:
       | collection          | user         | roles       |
       | Deep Past           | Erika Reid   | owner       |
@@ -169,15 +163,9 @@ Feature: Collection moderation
   # for collections.
   Scenario: Published collections should be shown in the collections overview page.
     # Regression test for ticket ISAICP-2889.
-    Given owner content:
-      | name             | owner type |
-      | Carpet Sandation | Company    |
-    And contact_information content:
-      | name        | email                   |
-      | Partyanimal | partyanimal@example.com |
     And collection content:
-      | title          | description        | abstract           | logo     | owner            | contact information | topic             | state    |
-      | Some berry pie | Berries are tasty. | Berries are tasty. | logo.png | Carpet Sandation | Partyanimal         | Supplier exchange | proposed |
+      | title          | logo     | topic             | state    |
+      | Some berry pie | logo.png | Supplier exchange | proposed |
     When I visit the collection overview
     Then I should not see the heading "Some berry pie"
     When I am logged in as a moderator
diff --git a/tests/features/collection/collection_content.feature b/tests/features/collection/collection_content.feature
index 189510bee3..1795818388 100644
--- a/tests/features/collection/collection_content.feature
+++ b/tests/features/collection/collection_content.feature
@@ -6,20 +6,20 @@ Feature: Collection content
 
   Background:
     Given collection content:
-      | title                     | state     |
-      | Turin Egyptian Collection | published |
+      | title                     |
+      | Turin Egyptian Collection |
     And solution content:
-      | title                       | collection                | state     | creation date    | modification date | topic |
-      | Tomb Of Unknown Restoration | Turin Egyptian Collection | published | 2017-11-11T11:11 | 2017-11-30T11:11  | HR    |
+      | title                       | collection                | creation date    | modification date | topic |
+      | Tomb Of Unknown Restoration | Turin Egyptian Collection | 2017-11-11T11:11 | 2017-11-30T11:11  | HR    |
     And discussion content:
-      | title                                 | body                                                                    | state     | collection                | topic                                                 | created          | changed                   |
-      | Bigger than Egyptian Museum of Cairo? | <p><a href="#link">Link to the museum</a> web<strong>site</strong>.</p> | published | Turin Egyptian Collection | Finance in EU, Supplier exchange, E-health, E-justice | 2017-11-11T11:11 | Wed, 25 Dec 2019 15:00:00 |
+      | title                                 | body                                                                    | collection                | topic                                                 | created          | changed                   |
+      | Bigger than Egyptian Museum of Cairo? | <p><a href="#link">Link to the museum</a> web<strong>site</strong>.</p> | Turin Egyptian Collection | Finance in EU, Supplier exchange, E-health, E-justice | 2017-11-11T11:11 | Wed, 25 Dec 2019 15:00:00 |
     And document content:
-      | title           | field_paragraphs_body                            | state     | collection                | creation date    | changed          | topic    |
-      | Upper Floor Map | <p>A sample <a href="#link">map</a> example.</p> | published | Turin Egyptian Collection | 2017-11-11T11:11 | 2017-11-30T11:11 | E-health |
+      | title           | field_paragraphs_body                            | collection                | creation date    | changed          | topic    |
+      | Upper Floor Map | <p>A sample <a href="#link">map</a> example.</p> | Turin Egyptian Collection | 2017-11-11T11:11 | 2017-11-30T11:11 | E-health |
     And event content:
-      | title                                     | state     | collection                | start date          | end date            | topic             |
-      | Opening of the Hellenistic Period Section | published | Turin Egyptian Collection | 2016-03-15T11:12:12 | 2016-03-15T11:12:12 | Supplier exchange |
+      | title                                     | collection                | start date          | end date            | topic             |
+      | Opening of the Hellenistic Period Section | Turin Egyptian Collection | 2016-03-15T11:12:12 | 2016-03-15T11:12:12 | Supplier exchange |
     And news content:
       | title                          | body                                                           | state     | collection                | changed    | topic             |
       | Turin Egyptian Museum Reopened | <p>After <em>more than</em> <a href="#link">two years</a>.</p> | published | Turin Egyptian Collection | 2019-11-19 | Supplier exchange |
@@ -98,20 +98,20 @@ Feature: Collection content
     And I should see the link "1 Solution"
 
     Given solution content:
-      | title                | collection                | state     |
-      | Protecting Artifacts | Turin Egyptian Collection | published |
+      | title                | collection                |
+      | Protecting Artifacts | Turin Egyptian Collection |
     And discussion content:
-      | title                              | state     | collection                |
-      | Is the entrance free for children? | published | Turin Egyptian Collection |
+      | title                              | collection                |
+      | Is the entrance free for children? | Turin Egyptian Collection |
     And document content:
-      | title                   | state     | collection                |
-      | Fire Safety Regulations | published | Turin Egyptian Collection |
+      | title                   | collection                |
+      | Fire Safety Regulations | Turin Egyptian Collection |
     And event content:
-      | title                        | state     | collection                |
-      | Cleopatra Jewelry Exhibition | published | Turin Egyptian Collection |
+      | title                        | collection                |
+      | Cleopatra Jewelry Exhibition | Turin Egyptian Collection |
     And news content:
-      | title                                  | state     | collection                |
-      | Museum Temporary Closed Next Wednesday | published | Turin Egyptian Collection |
+      | title                                  | collection                |
+      | Museum Temporary Closed Next Wednesday | Turin Egyptian Collection |
 
     Given I reload the page
     Then the "Discussions" content tab is not displayed
diff --git a/tests/features/collection/collection_overview.feature b/tests/features/collection/collection_overview.feature
index 43b37200aa..d862f009c6 100644
--- a/tests/features/collection/collection_overview.feature
+++ b/tests/features/collection/collection_overview.feature
@@ -8,10 +8,10 @@ Feature: Collections Overview
       | Madam Shirley | i.see.the.future@example.com |
     And collection content:
     # As of ISAICP-3618 descriptions should not be visible in regular tiles.
-      | title             | description                    | creation date     | state     |
-      | E-health          | Supports health-related fields | 2018-10-04 8:31am | published |
-      | Open Data         | Facilitate access to data sets | 2018-10-04 8:33am | published |
-      | Connecting Europe | Reusable tools and services    | 2018-10-04 8:32am | published |
+      | title             | description                    | creation date     |
+      | E-health          | Supports health-related fields | 2018-10-04 8:31am |
+      | Open Data         | Facilitate access to data sets | 2018-10-04 8:33am |
+      | Connecting Europe | Reusable tools and services    | 2018-10-04 8:32am |
     And owner content:
       | name                 | owner type |
       | Organisation example | Company    |
@@ -83,14 +83,14 @@ Feature: Collections Overview
 
   Scenario: Custom pages should not be visible on the overview page
     Given collection content:
-      | title | logo     | moderation | topic      | spatial coverage | state     |
-      | Jira  | logo.png | no         | Demography | Belgium          | published |
+      | title | logo     | moderation |
+      | Jira  | logo.png | no         |
     And news content:
-      | title                             | body                             | collection | topic                   | spatial coverage | state     |
-      | Jira will be down for maintenance | As always, during business hours | Jira       | Statistics and Analysis | Luxembourg       | published |
+      | title                             | body                             | collection |
+      | Jira will be down for maintenance | As always, during business hours | Jira       |
     And custom_page content:
-      | title            | body                                       | collection | state     |
-      | Maintenance page | Jira is re-indexing. Go and drink a coffee | Jira       | published |
+      | title            | body                                       | collection |
+      | Maintenance page | Jira is re-indexing. Go and drink a coffee | Jira       |
     When I go to the homepage of the "Jira" collection
     Then I should see the "Jira will be down for maintenance" tile
     And I should not see the "Maintenance page" tile
diff --git a/tests/features/collection/export_metadata.feature b/tests/features/collection/export_metadata.feature
index 787d79988a..caca2ceb08 100644
--- a/tests/features/collection/export_metadata.feature
+++ b/tests/features/collection/export_metadata.feature
@@ -14,11 +14,11 @@ Feature: Export collection metadata
 
   Scenario: Distribution nodes can be exported as RDF.
     Given solution content:
-      | title      | state     |
-      | Solution 1 | published |
+      | title      |
+      | Solution 1 |
     Given distribution content:
-      | title          | description   | access_url        | state     | solution   |
-      | Distribution 1 | Description 1 | http://access.url | published | Solution 1 |
+      | title          | description   | access_url        | solution   |
+      | Distribution 1 | Description 1 | http://access.url | Solution 1 |
     When I go to the "Distribution 1" distribution
     When I click "Metadata"
     Then I should see the heading "Download the Distribution 1 content item as:"
diff --git a/tests/features/collection/homepage.feature b/tests/features/collection/homepage.feature
index 1d418cb3e4..1052670315 100644
--- a/tests/features/collection/homepage.feature
+++ b/tests/features/collection/homepage.feature
@@ -19,23 +19,23 @@ Feature: Collection homepage
       | name        | email                   |
       | Kalikatoura | kalikatoura@example.com |
     And collection content:
-      | title              | description        | owner         | contact information | logo     | moderation | content creation | state     | topic                            | published at      | modification date |
-      | Middle earth daily | Middle earth daily | Bilbo Baggins | Kalikatoura         | logo.png | yes        | members          | published | Employment and Support Allowance | 2012-12-01 9:00am | 2017-12-01 9:00am |
+      | title              | description        | owner         | contact information | moderation | content creation | published at      | modification date |
+      | Middle earth daily | Middle earth daily | Bilbo Baggins | Kalikatoura         | yes        | members          | 2012-12-01 9:00am | 2017-12-01 9:00am |
     And solution content:
-      | title        | collection         | description           | content creation | creation date     | state     | topic |
-      | Bilbo's book | Middle earth daily | Bilbo's autobiography | registered users | 2014-10-17 8:32am | published | Info  |
+      | title        | collection         | description           | content creation | creation date     | topic |
+      | Bilbo's book | Middle earth daily | Bilbo's autobiography | registered users | 2014-10-17 8:32am | Info  |
     And the following collection user memberships:
       | collection         | user    | roles       |
       | Middle earth daily | Frodo   | facilitator |
       | Middle earth daily | Boromir |             |
       | Middle earth daily | Legolas |             |
     And news content:
-      | title                                             | body                | topic             | collection         | state     | created           | changed  |
-      | Rohirrim make extraordinary deal                  | Horse prices drops  | Finance in EU     | Middle earth daily | published | 2014-10-17 8:34am | 2017-7-5 |
-      | Breaking: Gandalf supposedly plans his retirement | A new white wizard? | Supplier exchange | Middle earth daily | published | 2014-10-17 8:31am | 2017-7-5 |
+      | title                                             | body                | topic             | collection         | created           | changed  |
+      | Rohirrim make extraordinary deal                  | Horse prices drops  | Finance in EU     | Middle earth daily | 2014-10-17 8:34am | 2017-7-5 |
+      | Breaking: Gandalf supposedly plans his retirement | A new white wizard? | Supplier exchange | Middle earth daily | 2014-10-17 8:31am | 2017-7-5 |
     And event content:
-      | title                                    | short title      | field_paragraphs_body                     | collection         | created           | start date          | end date            | state     | topic             | changed  |
-      | Big hobbit feast - fireworks at midnight | Big hobbit feast | Barbecue followed by dance and fireworks. | Middle earth daily | 2014-10-17 8:33am | 2016-03-15T11:12:12 | 2016-03-15T11:12:12 | published | Supplier exchange | 2017-7-5 |
+      | title                                    | short title      | field_paragraphs_body                     | collection         | created           | start date          | end date            | topic             | changed  |
+      | Big hobbit feast - fireworks at midnight | Big hobbit feast | Barbecue followed by dance and fireworks. | Middle earth daily | 2014-10-17 8:33am | 2016-03-15T11:12:12 | 2016-03-15T11:12:12 | Supplier exchange | 2017-7-5 |
 
   Scenario: The collection homepage shows the collection metrics.
     When I go to the homepage of the "Middle earth daily" collection
diff --git a/tests/features/collection/join-as-anonymous.feature b/tests/features/collection/join-as-anonymous.feature
index 2ea2fa5b5d..6c5e5dfbbb 100644
--- a/tests/features/collection/join-as-anonymous.feature
+++ b/tests/features/collection/join-as-anonymous.feature
@@ -6,10 +6,10 @@ Feature: Joining a collection as an anonymous user
 
   Background:
     Given collection content:
-      | title           | abstract                          | closed | state     |
-      | Reannual plants | Harvested before they are planted | no     | published |
-      | Vul nuts        | Used to brew Ghlen Livid          | yes    | published |
-      | CoC collection  | We have a Code of Conduct         | yes    | published |
+      | title           | closed |
+      | Reannual plants | no     |
+      | Vul nuts        | yes    |
+      | CoC collection  | yes    |
     And users:
       | Username         |
       | Hepzibah Whitlow |
diff --git a/tests/features/collection/last_update_time.feature b/tests/features/collection/last_update_time.feature
index 1665f77c5e..5ca6db79d9 100644
--- a/tests/features/collection/last_update_time.feature
+++ b/tests/features/collection/last_update_time.feature
@@ -8,19 +8,13 @@ Feature: Tests the collection last update time.
     Given users:
       | Username    | Roles     |
       | The Cleaner | moderator |
-    And contact_information content:
-      | name                  | email       |
-      | Your Cleaning Company | foo@bar.com |
-    And owner content:
-      | name | owner type |
-      | Sean | Company    |
     And collection content:
       | title            | state     | modification date | creation date | author      |
       | Household Wizard | published | 2011-05-06T21:56  | 2001-01-03    | The Cleaner |
     Given solution content:
-      | title           | collection       | state     | modification date | creation date | author      | contact information   | owner | description                    |
-      | Roof Hole Cover | Household Wizard | published | 2010-07-05T23:03  | 2001-01-01    | The Cleaner | Your Cleaning Company | Sean  | Keep your roof in a good shape |
-      | Mosquito Killer | Household Wizard | proposed  | 2017-05-03T11:45  | 2001-01-02    | The Cleaner | Your Cleaning Company | Sean  | Quiet nights                   |
+      | title           | collection       | state     | modification date | creation date | author      |
+      | Roof Hole Cover | Household Wizard | published | 2010-07-05T23:03  | 2001-01-01    | The Cleaner |
+      | Mosquito Killer | Household Wizard | proposed  | 2017-05-03T11:45  | 2001-01-02    | The Cleaner |
     And I am logged in as "The Cleaner"
 
     Given I go to the homepage of the "Household Wizard" collection
@@ -30,24 +24,24 @@ Feature: Tests the collection last update time.
     Then the response should contain "2011-05-06T21:56"
 
     Given document content:
-      | title           | document type | state     | changed          | created    | collection       | field_paragraphs_body |
-      | Get Rid of Rats | Document      | published | 2012-01-17T07:38 | 2001-01-04 | Household Wizard | Rats everywhere...    |
+      | title           | document type | changed          | created    | collection       | field_paragraphs_body |
+      | Get Rid of Rats | Document      | 2012-01-17T07:38 | 2001-01-04 | Household Wizard | Rats everywhere...    |
 
     And I reload the page
     # The document is the newest thus will give the collection updated time.
     Then the response should contain "2012-01-17T07:38"
 
     Given discussion content:
-      | title           | state     | changed          | created    | collection       |
-      | Household Forum | published | 2013-04-19T15:18 | 2001-01-05 | Household Wizard |
+      | title           | changed          | created    | collection       |
+      | Household Forum | 2013-04-19T15:18 | 2001-01-05 | Household Wizard |
 
     And I reload the page
     # The discussion is the newest thus will give the collection updated time.
     Then the response should contain "2013-04-19T15:18"
 
     Given event content:
-      | title        | state     | changed          | created    | collection       |
-      | Cleaning Day | published | 2014-06-06T22:46 | 2001-01-06 | Household Wizard |
+      | title        | changed          | created    | collection       |
+      | Cleaning Day | 2014-06-06T22:46 | 2001-01-06 | Household Wizard |
 
     And I reload the page
     # The event is the newest thus will give the collection updated time.
@@ -64,8 +58,8 @@ Feature: Tests the collection last update time.
     But the response should contain "2014-06-06T22:46"
 
     Given custom_page content:
-      | title          | changed          | created    | collection       | state     |
-      | The Kids Space | 2016-05-06T05:29 | 2001-01-07 | Household Wizard | published |
+      | title          | changed          | created    | collection       |
+      | The Kids Space | 2016-05-06T05:29 | 2001-01-07 | Household Wizard |
 
     And I reload the page
     # The custom page is the newest thus will give the collection updated time.
diff --git a/tests/features/collection/newsletter_subscription.feature b/tests/features/collection/newsletter_subscription.feature
index a146343a36..31d7cf26fd 100644
--- a/tests/features/collection/newsletter_subscription.feature
+++ b/tests/features/collection/newsletter_subscription.feature
@@ -10,18 +10,12 @@ Feature: Subscribing to collection newsletters
       | Filippos Demetriou | filippos.demetriou@example.com |           |
       | Tatiana Andreas    | tatiandri@example.com          |           |
       | Magdalini Kokinos  | m.kokinos@example.com          | moderator |
-    And contact_information content:
-      | name                  | email                             |
-      | Charalambos Demetriou | charalambos.demetriou@example.com |
-    And owner content:
-      | name              |
-      | Antonios Katsaros |
     And collection content:
-      | title    | description             | logo     | owner             | contact information   | state     | topic                   |
-      | Volkor X | We do not come in peace | logo.png | Antonios Katsaros | Charalambos Demetriou | published | Statistics and Analysis |
+      | title    |
+      | Volkor X |
     And "news" content:
-      | title      | collection | state     | author          |
-      | Hypersleep | Volkor X   | published | Tatiana Andreas |
+      | title      | collection | author          |
+      | Hypersleep | Volkor X   | Tatiana Andreas |
     And the following collection user memberships:
       | collection | user               | roles       |
       | Volkor X   | Filippos Demetriou | owner       |
diff --git a/tests/features/collection/notification.collection.feature b/tests/features/collection/notification.collection.feature
index 9c1e009915..b83822463d 100644
--- a/tests/features/collection/notification.collection.feature
+++ b/tests/features/collection/notification.collection.feature
@@ -8,9 +8,6 @@ Feature: Notification test for the collection transitions.
     Given owner content:
       | name       | owner type |
       | NC for all | Company    |
-    And contact_information content:
-      | name                       | email                             |
-      | Notificationous absolutous | absolute.notification@example.com |
     And users:
       | Username       | Roles     | E-mail                  | First name | Family name |
       | NC moderator   | moderator | nc_moderator@test.com   | NC         | Moderator   |
@@ -21,21 +18,21 @@ Feature: Notification test for the collection transitions.
       | NC member2     |           | nc_member2@test.com     | NC         | Member2     |
       | NCS owner      |           | ncs_owner@test.com      | NC         | Owner       |
     And collection content:
-      | title                  | state            | abstract     | description   | topic             | owner      | contact information        |
-      | NC to propose          | draft            | No one cares | No one cares. | Supplier exchange | NC for all | Notificationous absolutous |
-      | NC to publish          | proposed         | No one cares | No one cares. | Supplier exchange | NC for all | Notificationous absolutous |
+      | title                  | state            | abstract     | description   | owner      |
+      | NC to propose          | draft            | No one cares | No one cares. | NC for all |
+      | NC to publish          | proposed         | No one cares | No one cares. | NC for all |
       # The following will also cover the validate edited notification.
-      | NC to propose edit     | published        | No one cares | No one cares. | Supplier exchange | NC for all | Notificationous absolutous |
-      | NC to publish edit     | published        | No one cares | No one cares. | Supplier exchange | NC for all | Notificationous absolutous |
-      | NC to request archival | published        | No one cares | No one cares. | Supplier exchange | NC for all | Notificationous absolutous |
-      | NC to reject archival  | archival request | No one cares | No one cares. | Supplier exchange | NC for all | Notificationous absolutous |
-      | NC to archive          | archival request | No one cares | No one cares. | Supplier exchange | NC for all | Notificationous absolutous |
-      | NC to delete           | published        | No one cares | No one cares. | Supplier exchange | NC for all | Notificationous absolutous |
-      | NC to delete by mod    | published        | No one cares | No one cares. | Supplier exchange | NC for all | Notificationous absolutous |
+      | NC to propose edit     | published        | No one cares | No one cares. | NC for all |
+      | NC to publish edit     | published        | No one cares | No one cares. | NC for all |
+      | NC to request archival | published        | No one cares | No one cares. | NC for all |
+      | NC to reject archival  | archival request | No one cares | No one cares. | NC for all |
+      | NC to archive          | archival request | No one cares | No one cares. | NC for all |
+      | NC to delete           | published        | No one cares | No one cares. | NC for all |
+      | NC to delete by mod    | published        | No one cares | No one cares. | NC for all |
     Given solution content:
-      | title        | collection    | logo     | state     |
-      | NC Solution1 | NC to archive | logo.png | published |
-      | NC Solution2 | NC to archive | logo.png | published |
+      | title        | collection    |
+      | NC Solution1 | NC to archive |
+      | NC Solution2 | NC to archive |
     And the following solution user memberships:
       | solution     | user      | roles |
       | NC Solution1 | NCS owner | owner |
@@ -207,6 +204,6 @@ Feature: Notification test for the collection transitions.
       | subject   | The collection NC to delete by mod was deleted.                                    |
       | body      | The collection "NC to delete by mod", of which you are a member, has been deleted. |
     And the following email should have been sent:
-      | recipient | NC owner                                                              |
+      | recipient | NC owner                                                                                   |
       | subject   | Interoperable Europe Portal: Your collection has been deleted by the moderation team       |
       | body      | The Interoperable Europe Portal moderation team deleted the collection NC to delete by mod |
diff --git a/tests/features/collection/tca.feature b/tests/features/collection/tca.feature
index bdbcb9ff81..8d6ef021a0 100644
--- a/tests/features/collection/tca.feature
+++ b/tests/features/collection/tca.feature
@@ -7,8 +7,8 @@ Feature: Collection TCA agreement
   Background:
     # The 'Create collection' button is not shown if there is no collection available.
     Given collection content:
-      | title                    | logo     | state     |
-      | TCA Agreement collection | logo.png | published |
+      | title                    |
+      | TCA Agreement collection |
 
   Scenario: TCA agreement page is not accessible by anonymous users.
     When I am not logged in
-- 
GitLab


From 3f83d64e5c5c9571ac4631eeda6421bb96bcd37e Mon Sep 17 00:00:00 2001
From: "micha.jakubowski" <micha.jakubowski@ffwagency.com>
Date: Fri, 29 Nov 2024 13:53:23 +0100
Subject: [PATCH 022/137] ISAICP-8780: joinup_release tests complete update

---
 .../features/joinup_release/release.edit.feature | 16 +++++-----------
 .../joinup_release/release.moderation.feature    | 12 +++---------
 .../joinup_release/release.overview.feature      |  8 ++++----
 3 files changed, 12 insertions(+), 24 deletions(-)

diff --git a/tests/features/joinup_release/release.edit.feature b/tests/features/joinup_release/release.edit.feature
index 32ce3f6c64..14ae452b1e 100644
--- a/tests/features/joinup_release/release.edit.feature
+++ b/tests/features/joinup_release/release.edit.feature
@@ -5,18 +5,12 @@ Feature: "Edit" visibility options.
   I need to be able to edit "Release" rdf entities through UI.
 
   Scenario: "Edit" button should only be shown to solution facilitators and moderators.
-    Given owner content:
-      | name           |
-      | Awesome person |
-    And contact_information content:
-      | name            | email                      | website url        |
-      | Awesome contact | awesomecontact@example.com | http://example.com |
-    And solution content:
-      | title                   | description         | documentation | owner          | contact information | state     |
-      | My awesome solution abc | My awesome solution | text.pdf      | Awesome person | Awesome contact     | published |
+    Given solution content:
+      | title                   | description         | documentation |
+      | My awesome solution abc | My awesome solution | text.pdf      |
     And release content:
-      | title                      | release notes | documentation | release number | release notes | is version of           | state     | creation date    | modification date | published at     |
-      | My awesome solution abc v1 | A sample      | text.pdf      | 1              | Changed       | My awesome solution abc | published | 2020-11-19 20:45 | 2022-11-19 20:45  | 2020-11-19 20:45 |
+      | title                      | release notes | documentation | release number | release notes | is version of           | creation date    | modification date | published at     |
+      | My awesome solution abc v1 | A sample      | text.pdf      | 1              | Changed       | My awesome solution abc | 2020-11-19 20:45 | 2022-11-19 20:45  | 2020-11-19 20:45 |
 
     When I am logged in as a "facilitator" of the "My awesome solution abc" solution
     And I go to the homepage of the "My awesome solution abc v1" release
diff --git a/tests/features/joinup_release/release.moderation.feature b/tests/features/joinup_release/release.moderation.feature
index 1f937b6aa9..ebbcb5b03c 100644
--- a/tests/features/joinup_release/release.moderation.feature
+++ b/tests/features/joinup_release/release.moderation.feature
@@ -5,21 +5,15 @@ Feature: Asset release moderation
   I need to be able to transit the releases from one state to another.
 
   Scenario: Publish, Update, request changes, publish again and delete a release.
-    Given owner content:
-      | name        | owner type |
-      | Kenny Logan | Company    |
-    And contact_information content:
-      | name       | email                  |
-      | SheriMoore | SheriMoore@example.com |
-    And users:
+    Given users:
       | Username        | E-mail                      | First name | Family name | Roles     |
       | Bonnie Holloway | bonnie.holloway@example.com | Bonnie     | Holloway    |           |
       | Felix Russell   | Felix.Russell@example.com   | Felix      | Russell     |           |
       | Wilson Mendoza  | Wilson.Mendoza@example.com  | Wilson     | Mendoza     | moderator |
       | Patric Sereira  | Patric.Sereira@example.com  | Patric     | Sereira     | moderator |
     And solution content:
-      | title     | description | logo     | owner       | contact information | state     |
-      | Dark Ship | Dark ship   | logo.png | Kenny Logan | SheriMoore          | published |
+      | title     | description |
+      | Dark Ship | Dark ship   |
     And the following solution user membership:
       | solution  | user            | roles       |
       | Dark Ship | Bonnie Holloway | owner       |
diff --git a/tests/features/joinup_release/release.overview.feature b/tests/features/joinup_release/release.overview.feature
index c24a8821e5..bd7856d1df 100644
--- a/tests/features/joinup_release/release.overview.feature
+++ b/tests/features/joinup_release/release.overview.feature
@@ -6,11 +6,11 @@ Feature: Asset distribution overview on solution.
 
   Scenario: Releases should be available in the overview page.
     Given collection content:
-      | title       | state     |
-      | End of Past | published |
+      | title       |
+      | End of Past |
     Given solution content:
-      | title            | collection  | description        | state     |
-      | Lovely Butterfly | End of Past | Sample description | published |
+      | title            | collection  |
+      | Lovely Butterfly | End of Past |
 
     # A solution with no releases or standalone distributions has no button.
     When I go to the homepage of the "Lovely Butterfly" solution
-- 
GitLab


From a57234809e5c7f8a91b49fda30bd52bcc6b3db67 Mon Sep 17 00:00:00 2001
From: "micha.jakubowski" <micha.jakubowski@ffwagency.com>
Date: Fri, 29 Nov 2024 18:11:27 +0100
Subject: [PATCH 023/137] ISAICP-8780: joinup_group tests complete update

---
 .../archive.content_overview.feature          | 32 ++++++-------------
 tests/features/joinup_group/settings.feature  | 18 ++++-------
 2 files changed, 16 insertions(+), 34 deletions(-)

diff --git a/tests/features/joinup_group/archive.content_overview.feature b/tests/features/joinup_group/archive.content_overview.feature
index 71f925f170..648b26b0de 100644
--- a/tests/features/joinup_group/archive.content_overview.feature
+++ b/tests/features/joinup_group/archive.content_overview.feature
@@ -2,22 +2,16 @@
 Feature: Global search with archive content
 
   Scenario Outline: Group content has an 'Show archived' facet.
-    Given owner content:
-      | name       | owner type |
-      | Some owner | Company    |
-    And contact_information content:
-      | name         | email                    |
-      | Some contact | some-contact@example.com |
-    And <group type> content:
+    Given <group type> content:
       | title             | description | state     |
       | Some <group type> | Description | published |
       | Rare <group type> | Description | published |
     And event content:
-      | title   | short title | field_paragraphs_body | spatial coverage | agenda      | location   | organisation        | scope         | <group type>      | state     |
-      | Event 1 | Event 1     | Some body             | Greece           | Some agenta | Some place | European Commission | International | Some <group type> | published |
-      | Event 2 | Event 2     | Some body             | Greece           | Some agenta | Some place | European Commission | International | Rare <group type> | published |
-      | Event 3 | Event 3     | Some body             | Greece           | Some agenta | Some place | European Commission | International | Rare <group type> | published |
-      | Event 4 | Event 4     | Some body             | Greece           | Some agenta | Some place | European Commission | International | Rare <group type> | published |
+      | title   | short title | field_paragraphs_body | spatial coverage | agenda      | location   | organisation        | scope         | <group type>      |
+      | Event 1 | Event 1     | Some body             | Greece           | Some agenta | Some place | European Commission | International | Some <group type> |
+      | Event 2 | Event 2     | Some body             | Greece           | Some agenta | Some place | European Commission | International | Rare <group type> |
+      | Event 3 | Event 3     | Some body             | Greece           | Some agenta | Some place | European Commission | International | Rare <group type> |
+      | Event 4 | Event 4     | Some body             | Greece           | Some agenta | Some place | European Commission | International | Rare <group type> |
     And document content:
       | title           | document type | short title     | field_paragraphs_body | spatial coverage | <group type>      | state     |
       | Some document 1 | Document      | Some document 1 | Some body             | Luxembourg       | Some <group type> | published |
@@ -128,16 +122,10 @@ Feature: Global search with archive content
     And I should not see the "Some zip distribution" tile
 
   Scenario: Group content supports archived solutions.
-    Given owner content:
-      | name       |
-      | Erno Rubik |
-    And contact_information content:
-      | name       |
-      | Tom Kremer |
-    And collection content:
-      | title      | description                | topic             | owner      | contact information | state     |
-      | Rubik Cube | combination puzzle         | Supplier exchange | Erno Rubik | Tom Kremer          | published |
-      | Speed cube | also known as speedsolving | Supplier exchange | Erno Rubik | Tom Kremer          | published |
+    Given collection content:
+      | title      |
+      | Rubik Cube |
+      | Speed cube |
     Given solution content:
       | title    | state     | collection | shared on  |
       | Megaminx | published | Rubik Cube | Speed cube |
diff --git a/tests/features/joinup_group/settings.feature b/tests/features/joinup_group/settings.feature
index d91d198e81..a3c9f33342 100644
--- a/tests/features/joinup_group/settings.feature
+++ b/tests/features/joinup_group/settings.feature
@@ -11,15 +11,9 @@ Feature: Collections/Solutions settings
 
   @uploadFiles:logo.png
   Scenario: Edit settings in a collection
-    Given owner content:
-      | name          | owner type |
-      | Chico example | Company    |
-    And contact_information content:
-      | name            | email                       |
-      | Chico editorial | chico.editorial@example.com |
     And collection content:
-      | title             | logo     | abstract                                    | access url        | closed | creation date    | description                     | content creation         | moderation | topic             | owner         | contact information | state     |
-      | Jillian Land Eels | logo.png | Read up on all about <strong>spice</strong> | http://spice.com/ | yes    | 28-01-1995 12:05 | The spice elegance personified. | facilitators and authors | yes        | Supplier exchange | Chico example | Chico editorial     | published |
+      | title             | access url        | closed | creation date    | content creation         | moderation |
+      | Jillian Land Eels | http://spice.com/ | yes    | 28-01-1995 12:05 | facilitators and authors | yes        |
     When I am logged in as a owner of the "Jillian Land Eels" collection
     And I go to the homepage of the "Jillian Land Eels" collection
     And I should not see the link "Settings" in the "Entity actions" region
@@ -79,11 +73,11 @@ Feature: Collections/Solutions settings
 
   Scenario: Testing group settings permissions
     Given collection content:
-      | title          | logo     | state     |
-      | Rally fanatics | logo.png | published |
+      | title          |
+      | Rally fanatics |
     And solution content:
-      | title        | state     | collection     |
-      | Klop mirubes | published | Rally fanatics |
+      | title        | collection     |
+      | Klop mirubes | Rally fanatics |
     And users:
       | Username         | E-mail                     | First name | Family name |
       | Ferners Lee      | ferners-lee@example.com    | Ferners    | Lee         |
-- 
GitLab


From 0fbf79c441c250d27bdcb2937cfacf3b2bb6978e Mon Sep 17 00:00:00 2001
From: "micha.jakubowski" <micha.jakubowski@ffwagency.com>
Date: Fri, 29 Nov 2024 18:13:27 +0100
Subject: [PATCH 024/137] ISAICP-8780: remaining tests (owner and
 contact_information) update

---
 tests/features/adms_ap_compliance.feature     | 10 ++--
 tests/features/ckeditor5.feature              | 44 ++++++-----------
 .../contact_form/fill_page_url.feature        | 10 +---
 .../contact_information/access.feature        |  7 +--
 .../email_confirmation.feature                | 21 ++++----
 .../joinup_core/contextual_links.feature      | 18 +++----
 .../document.moderation.feature               | 10 +---
 .../publication_date.feature                  | 23 +++------
 .../joinup_search/group_search.feature        | 48 ++++++++-----------
 tests/features/menus/quick_links.feature      | 32 +++++--------
 tests/features/security/antispam.feature      | 16 +++----
 tests/features/svg.feature                    | 12 ++---
 12 files changed, 93 insertions(+), 158 deletions(-)

diff --git a/tests/features/adms_ap_compliance.feature b/tests/features/adms_ap_compliance.feature
index d62b1d497f..e0a69a6756 100644
--- a/tests/features/adms_ap_compliance.feature
+++ b/tests/features/adms_ap_compliance.feature
@@ -10,12 +10,12 @@ Feature: Interoperable Europe Portal should be ADMS-AP compliant.
       | title       | description       | licence type  |
       | Foo licence | Some nice licence | Public domain |
     And collection content:
-      | title                       | author       | abstract  | description                    | access url                  | logo     | creation date    | modification date | closed | content creation         | moderation | topic      | spatial coverage | featured |
-      | Morbid Scattered Microphone | Andre Munson | Abstract. | Description of the collection. | http://www.example.com/msm/ | logo.png | 2016-07-13T13:00 | 2017-06-30T11:27  | no     | facilitators and authors | no         | Demography | Belgium          | no       |
+      | title                       | author       | access url                  | creation date    | modification date | closed | content creation         | moderation | featured |
+      | Morbid Scattered Microphone | Andre Munson | http://www.example.com/msm/ | 2016-07-13T13:00 | 2017-06-30T11:27  | no     | facilitators and authors | no         | no       |
     Given solution content:
-      | title        | collection                  | author           | description    | logo     | creation date   | modification date | documentation    | content creation | keywords         | landing page                    | language | metrics page                    | moderation | related solutions | solution type                      | spatial coverage | status    | featured |
-      | Early Omega  | Morbid Scattered Microphone | Andre Munson     | <p>content</p> | logo.png | 2017-11-01T8:00 | 2017-12-01T8:43   | text.pdf         | registered users | ADMS, validation | http://www.example.com/landing1 | Flemish  | http://www.example.org/metrics1 | no         |                   | Networking Infrastructure Enablers | Belgium          | Completed | no       |
-      | Snake Timely | Morbid Scattered Microphone | Branson Winthrop | <p>content</p> | logo.png |                 | 2015-03-03T8:00   | 2018-02-14T18:43 | text.pdf         | registered users | http://www.example.com/landing2 | English  | http://www.example.org/metrics2 | yes        | Early Omega       | Networking Infrastructure Enablers | Belgium          | Completed | no       |
+      | title        | collection                  | author           | creation date   | modification date | documentation | content creation | keywords         | landing page                    | language | metrics page                    | moderation | related solutions | status    | featured |
+      | Early Omega  | Morbid Scattered Microphone | Andre Munson     | 2017-11-01T8:00 | 2017-12-01T8:43   | text.pdf      | registered users | ADMS, validation | http://www.example.com/landing1 | Flemish  | http://www.example.org/metrics1 | no         |                   | Completed | no       |
+      | Snake Timely | Morbid Scattered Microphone | Branson Winthrop | 2015-03-03T8:00 | 2018-02-14T18:43  | text.pdf      | registered users | ADMS, validation | http://www.example.com/landing2 | English  | http://www.example.org/metrics2 | yes        | Early Omega       | Completed | no       |
     And release content:
       | title  | documentation | release number | release notes | creation date    | is version of | status    | spatial coverage | keywords | language |
       | Omega3 | text.pdf      | 3.0.0          | New 3.0       | 2017-11-11T11:11 | Early Omega   | Completed | Belgium          | food     | English  |
diff --git a/tests/features/ckeditor5.feature b/tests/features/ckeditor5.feature
index 3f2d6ad6a9..71310cfeb0 100644
--- a/tests/features/ckeditor5.feature
+++ b/tests/features/ckeditor5.feature
@@ -2,19 +2,13 @@
 Feature: CKEditor5
 
   Background:
-    Given owner content:
-      | name     | owner type |
-      | Landlord | Company    |
-    And contact_information content:
-      | name    | email                |
-      | ReachMe | reach.me@example.com |
-    And collection content:
-      | title                 | state     | topic                   | owner    | contact information |
-      | Shaping of disruption | published | Supplier exchange       | Landlord | ReachMe             |
-      | The Other Collection  | published | Statistics and Analysis | Landlord | ReachMe             |
+    Given collection content:
+      | title                 |
+      | Shaping of disruption |
+      | The Other Collection  |
     Given solution content:
-      | title       | collection            | state     | topic             | owner    | contact information |
-      | Angry Birds | Shaping of disruption | published | Supplier exchange | Landlord | ReachMe             |
+      | title       | collection            |
+      | Angry Birds | Shaping of disruption |
 
   Scenario: CKE5 textarea do not respect any configurable sizes.
     Given glossary content:
@@ -244,35 +238,27 @@ Feature: CKEditor5
 
   @casMockServer
   Scenario: Add test coverage for 'Contact us' wysiwyg button.
-
-    And owner content:
-      | name  | owner type |
-      | Lotte | Company    |
-    And user:
+    Given user:
       | Username    | Pally Rapamichael      |
       | First name  | Pally                  |
       | Family name | Rapamichael            |
       | E-mail      | p.papamichael@pally.de |
-    And contact_information content:
-      | name                 | email                      |
-      | Klim Smith           | klim.smith@example.com     |
-      | Raul Timon           | raul.timon@example.com     |
     And the following email confirmation request:
       | email                  | status    |
       | klim.smith@example.com | confirmed |
       | raul.timon@example.com | confirmed |
     And collection content:
-      | title                | state     | contact information |
-      | Antiruin development | published | Raul Timon          |
+      | title                |
+      | Antiruin development |
     And solution content:
-      | title                    | abstract                        | description                     | state     | topic                   | owner | solution type                      | collection           | contact information |
-      | One exclusion advantages | Separating molecules by height. | Separating molecules by weight. | published | Demography, E-inclusion | Lotte | Non-binding Instrument, Data Owner | Antiruin development | Klim Smith          |
+      | title                    | collection           |
+      | One exclusion advantages | Antiruin development |
     And users:
       | Username    | E-mail         | First name | Family name |
       | jmacc_local | jodine@ankh.am | John       | Maccalariat |
     And CAS users:
-      | First name | Last name   | Username  | E-mail         | Password | Local username |
-      | John       | Maccalariat | jmacc     | jodine@ankh.am | 10d1ne   | jmacc_local    |
+      | First name | Last name   | Username | E-mail         | Password | Local username |
+      | John       | Maccalariat | jmacc    | jodine@ankh.am | 10d1ne   | jmacc_local    |
 
     Given I am logged in as a moderator
     Then I go to "/collection/antiruin-development/solution/one-exclusion-advantages/contact"
@@ -316,8 +302,8 @@ Feature: CKEditor5
 
     # Check layout paragraphs.
     Given custom_page content:
-      | title                             | collection            | state     | abstract |
-      | Contact us text check             | Antiruin development  | published | N/A      |
+      | title                 | collection           | state     | abstract |
+      | Contact us text check | Antiruin development | published | N/A      |
     And I append "layout" to "field_paragraphs_body" field in "node" entity with following "Contact us text check" title:
       | behavior_settings | a:3:{s:17:"layout_paragraphs";a:4:{s:6:"layout";s:13:"layout_onecol";s:6:"config";a:1:{s:5:"label";s:0:"";}s:11:"parent_uuid";N;s:6:"region";N;}s:16:"background_theme";a:0:{}s:11:"extra_class";a:0:{}} |
 
diff --git a/tests/features/contact_form/fill_page_url.feature b/tests/features/contact_form/fill_page_url.feature
index 0259af3ca0..55b58c6a1e 100644
--- a/tests/features/contact_form/fill_page_url.feature
+++ b/tests/features/contact_form/fill_page_url.feature
@@ -42,15 +42,9 @@ Feature: Fill Page URL field in Technical problem / bug report on contact form
     Given users:
       | Username      | E-mail                    |
       | Julian Munson | julian.munson@example.com |
-    And contact_information content:
-      | name         | email                |
-      | Rarty Kelley | rmartykelley@bar.com |
-    And owner content:
-      | name              |
-      | Martinez Gonzalez |
     And collection content:
-      | title | description          | owner             | contact information | state     |
-      | Rumba | Destruction of Rumba | Martinez Gonzalez | Rarty Kelley        | published |
+      | title |
+      | Rumba |
     And news content:
       | title         | headline | body | collection | field_state |
       | Tumba spatial | headline | body | Rumba      | published   |
diff --git a/tests/features/contact_information/access.feature b/tests/features/contact_information/access.feature
index d64f6b8992..dad8d9fb3b 100644
--- a/tests/features/contact_information/access.feature
+++ b/tests/features/contact_information/access.feature
@@ -14,9 +14,6 @@ Feature: Contact information access
     Then I should see the heading "Sign in to continue"
 
   Scenario: Facilitator can edit contact information
-    Given owner content:
-      | name         | owner type |
-      | Ausy BENELUX | Company    |
     Given users:
       | Username      | Roles | E-mail                      | First name | Family name |
       | Michiel Lucas |       | michiel.lucas@one-agency.be | Michiel    | Lucas       |
@@ -24,8 +21,8 @@ Feature: Contact information access
       | name | email            | author        |
       | info | info@dataflow.be | Michiel Lucas |
     And collection content:
-      | title                   | description        | logo     | owner        | contact information | state     |
-      | Ausy software solutions | A software company | logo.png | Ausy BENELUX | info                | published |
+      | title                   | contact information |
+      | Ausy software solutions | info                |
     And the following collection user memberships:
       | collection              | user          | roles       |
       | Ausy software solutions | Michiel Lucas | facilitator |
diff --git a/tests/features/contact_information/email_confirmation.feature b/tests/features/contact_information/email_confirmation.feature
index 825197dab7..b9331af71e 100644
--- a/tests/features/contact_information/email_confirmation.feature
+++ b/tests/features/contact_information/email_confirmation.feature
@@ -4,15 +4,12 @@ Feature: Resend validation email from collection/solution about page
   then a message must be displayed under the about page
 
   Scenario: Scenario for Collection and Solution
-    Given owner content:
-      | name      | owner type |
-      | Rotterdam | Company    |
-    And collection content:
-      | title          | state     | description         | topic                   | owner     |
-      | Rally fanatics | published | Rally fanatics desc | Demography, E-inclusion | Rotterdam |
+    Given collection content:
+      | title          |
+      | Rally fanatics |
     And solution content:
-      | title        | state     | abstract             | description       | topic                   | owner     | solution type                           | spatial coverage | collection     |
-      | Klop mirubes | published | Klop mirubes abstact | Klop mirubes desc | Demography, E-inclusion | Rotterdam | Non-binding Instrument, Logging Service | Belgium, Greece  | Rally fanatics |
+      | title        | collection     |
+      | Klop mirubes | Rally fanatics |
     And users:
       | Username         | E-mail                     | First name | Family name |
       | Ferners Lee      | ferners-lee@example.com    | Ferners    | Lee         |
@@ -120,8 +117,8 @@ Feature: Resend validation email from collection/solution about page
       | name               | email               |
       | Existing to resend | existing@resend.com |
     Given solution content:
-      | title                       | description          | state     | contact information |
-      | Existing to resend solution | Default description. | published | Existing to resend  |
+      | title                       | contact information |
+      | Existing to resend solution | Existing to resend  |
 
     When I am logged in as a user with the authenticated role
     And I go to the "Existing to resend solution" solution
@@ -155,8 +152,8 @@ Feature: Resend validation email from collection/solution about page
       | name        | email                   |
       | Some Resend | some.resend@example.com |
     Given solution content:
-      | title                       | description          | state     | contact information |
-      | Existing to resend solution | Default description. | published | Some Resend         |
+      | title                       | contact information |
+      | Existing to resend solution | Some Resend         |
     And the following email confirmation requests:
       | email                   | status  |
       | some.resend@example.com | pending |
diff --git a/tests/features/joinup_core/contextual_links.feature b/tests/features/joinup_core/contextual_links.feature
index a0c4ce9861..c9db536f10 100644
--- a/tests/features/joinup_core/contextual_links.feature
+++ b/tests/features/joinup_core/contextual_links.feature
@@ -6,8 +6,8 @@ Feature:
 
   Scenario: Revisions link availability.
     Given collection content:
-      | title                | state     |
-      | Revisions collection | published |
+      | title                |
+      | Revisions collection |
     When I am logged in as a moderator
     And I go to the "Revisions collection" collection
     And I click "Add news" in the plus button menu
@@ -40,17 +40,11 @@ Feature:
 
   Scenario: Only solutions should have the share contextual link available.
     Given collection content:
-      | title            | state     |
-      | Share collection | published |
-    And contact_information content:
-      | name     | email                |
-      | Somebody | somebody@example.com |
-    And owner content:
-      | name       |
-      | Some owner |
+      | title            |
+      | Share collection |
     And solution content:
-      | title          | state     | collection       | contact information | owner      |
-      | Share solution | published | Share collection | Somebody            | Some owner |
+      | title          | collection       |
+      | Share solution | Share collection |
 
     When I am logged in as a user with the "moderator" role
     And I go to the "Share solution" solution
diff --git a/tests/features/joinup_document/document.moderation.feature b/tests/features/joinup_document/document.moderation.feature
index 08ff9a1e3e..d73963ce3e 100644
--- a/tests/features/joinup_document/document.moderation.feature
+++ b/tests/features/joinup_document/document.moderation.feature
@@ -10,15 +10,9 @@ Feature: Document moderation
       | Crab y Patties  |
       | Gretchen Greene |
       | Kirk Collier    |
-    And owner content:
-      | name          |
-      | thisisanowner |
-    And contact_information content:
-      | name        | email                   |
-      | Dis contact | dis.contact@example.com |
     And collection content:
-      | title           | description                     | logo     | content creation | moderation | state     | owner         | contact information | topic       |
-      | The Naked Ashes | The wolverine is a Marvel hero. | logo.png | registered users | no         | published | thisisanowner | Dis contact         | E-inclusion |
+      | title           | content creation | moderation |
+      | The Naked Ashes | registered users | no         |
     And the following collection user membership:
       | collection      | user            | roles       |
       | The Naked Ashes | Gretchen Greene | member      |
diff --git a/tests/features/joinup_publication_date/publication_date.feature b/tests/features/joinup_publication_date/publication_date.feature
index 9968687db5..49a74c580c 100644
--- a/tests/features/joinup_publication_date/publication_date.feature
+++ b/tests/features/joinup_publication_date/publication_date.feature
@@ -2,23 +2,14 @@
 Feature: Publication date works as expected on RDF entities
 
   Background:
-    Given owner content:
-      | name  |
-      | Owner |
-    And contact_information content:
-      | name     |
-      | Contact1 |
-      | Contact2 |
-      | Contact3 |
-      | Contact4 |
-    And collection content:
-      | title                 | state     | description | owner | contact information |
-      | Collection to publish | draft     | Description | Owner | Contact1            |
-      | Published collection  | published | Description | Owner | Contact2            |
+    Given collection content:
+      | title                 | state     |
+      | Collection to publish | draft     |
+      | Published collection  | published |
     Given solution content:
-      | title               | state     | collection           | solution type | abstract | description | moderation | owner | contact information |
-      | Solution to publish | draft     | Published collection | Business      | Abstract | Description | no         | Owner | Contact3            |
-      | Published solution  | published | Published collection | Business      | Abstract | Description | no         | Owner | Contact4            |
+      | title               | state | collection           |
+      | Solution to publish | draft | Published collection |
+      | Published solution  |       | Published collection |
     And release content:
       | title              | state | release number | release notes              | is version of      |
       | Release to publish | draft | 1.0.0          | Only works on flat ground. | Published solution |
diff --git a/tests/features/joinup_search/group_search.feature b/tests/features/joinup_search/group_search.feature
index 4c0bc36311..eb4ac1f063 100644
--- a/tests/features/joinup_search/group_search.feature
+++ b/tests/features/joinup_search/group_search.feature
@@ -5,44 +5,38 @@ Feature: Search inside groups
   I want to be able to launch a search limited to my current collection or solution
 
   Background:
-    Given contact_information content:
-      | name                | email                           |
-      | Charalambos Katsumi | charalambos.katsumi@example.com |
-    And owner content:
-      | name             |
-      | Antonios Katsumi |
-    And collection content:
-      | title               | description       | logo     | moderation | topic      | spatial coverage | state     | owner            | contact information |
-      | Chalet construction | Lorem Ipsum ipsum | logo.png | no         | Demography | Belgium          | published | Antonios Katsumi | Charalambos Katsumi |
+    Given collection content:
+      | title               | moderation |
+      | Chalet construction | no         |
     And solution content:
-      | title                | description                                           | logo     | collection          | state     |
-      | Inclined foundations | Ways to construct foundations on hills and mountains. | logo.png | Chalet construction | published |
+      | title                | collection          |
+      | Inclined foundations | Chalet construction |
     And discussion content:
-      | title      | body                           | state     | collection          | solution             |
-      | Room sizes | What are the ideal dimensions? | published | Chalet construction |                      |
-      | Terrace?   | Want a decent sized terrace    | published |                     | Inclined foundations |
+      | title      | collection          | solution             |
+      | Room sizes | Chalet construction |                      |
+      | Terrace?   |                     | Inclined foundations |
     And document content:
-      | title       | field_paragraphs_body | state     | collection          | solution             |
-      | Ground plan | A classic design      | published | Chalet construction |                      |
-      | Rock types  | Ranked by hardness    | published |                     | Inclined foundations |
+      | title       | field_paragraphs_body | collection          | solution             |
+      | Ground plan | A classic design      | Chalet construction |                      |
+      | Rock types  | Ranked by hardness    |                     | Inclined foundations |
     And event content:
-      | title                        | field_paragraphs_body             | state     | collection          | solution             |
-      | Opening of the winter season | Ski resorts will open in December | published | Chalet construction |                      |
-      | Presenting DrillMaster X88   | Our most finely ground drill bit  | published |                     | Inclined foundations |
+      | title                        | field_paragraphs_body             | collection          | solution             |
+      | Opening of the winter season | Ski resorts will open in December | Chalet construction |                      |
+      | Presenting DrillMaster X88   | Our most finely ground drill bit  |                     | Inclined foundations |
     And news content:
-      | title             | headline          | abstract                      | field_paragraphs_body | collection          | solution             | topic                   | spatial coverage | state     |
-      | Natural materials | Materials natural | Abstract of natural materials | Ground feel           | Chalet construction |                      | Statistics and Analysis | Belgium          | published |
-      | Still frozen      | Frozen still      |                               | Maybe next week       |                     | Inclined foundations |                         | Greece           | published |
+      | title             | headline          | field_paragraphs_body | collection          | solution             |
+      | Natural materials | Materials natural | Ground feel           | Chalet construction |                      |
+      | Still frozen      | Frozen still      | Maybe next week       |                     | Inclined foundations |
     And custom_page content:
       | title     | body                             | collection          | solution             | state     |
       | Resources | Here are some interesting links. | Chalet construction |                      | published |
       | Geography | A collection of height maps.     |                     | Inclined foundations | published |
     And release content:
-      | title     | release number | release notes              | is version of        | state     |
-      | Pre-alpha | 0.0-alpha0     | Only works on flat ground. | Inclined foundations | published |
+      | title     | release number | release notes              | is version of        |
+      | Pre-alpha | 0.0-alpha0     | Only works on flat ground. | Inclined foundations |
     And distribution content:
-      | title       | description          | release   | access url | state     |
-      | Zip archive | It has files inside. | Pre-alpha | test.zip   | published |
+      | title       | release   | access url |
+      | Zip archive | Pre-alpha | test.zip   |
 
   @javascript
   Scenario: Group filters are shown as chips
diff --git a/tests/features/menus/quick_links.feature b/tests/features/menus/quick_links.feature
index a2131209b2..4e70034f01 100644
--- a/tests/features/menus/quick_links.feature
+++ b/tests/features/menus/quick_links.feature
@@ -2,15 +2,9 @@
 Feature: Test the visibility of the quick links menu.
 
   Background:
-    Given owner content:
-      | name                 | owner type |
-      | Organisation example | Company    |
-    And contact_information content:
-      | name                 | email                            |
-      | Collection editorial | collection.editorial@example.com |
-    And collection content:
-      | title           | abstract      | description      | content creation         | moderation | topic             | owner                | contact information  | state     |
-      | Some collection | Some abstract | Some description | facilitators and authors | yes        | Supplier exchange | Organisation example | Collection editorial | published |
+    Given collection content:
+      | title           | content creation         | moderation |
+      | Some collection | facilitators and authors | yes        |
 
   Scenario: Test visibility for collections.
     When I am not logged in
@@ -60,8 +54,8 @@ Feature: Test the visibility of the quick links menu.
 
   Scenario: Test visibility for solutions.
     Given solution content:
-      | title         | abstract      | description      | topic             | solution type    | owner                | contact information  | state     |
-      | Some solution | Some abstract | Some description | Supplier exchange | Digital Solution | Organisation example | Collection editorial | published |
+      | title         |
+      | Some solution |
     When I am not logged in
     And I go to the "Some solution" solution
     Then I should not see the heading "Quick links"
@@ -114,15 +108,15 @@ Feature: Test the visibility of the quick links menu.
   @javascript
   Scenario: Test quick links menu structure.
     Given collection content:
-      | title           | state     |
-      | Some collection | published |
+      | title           |
+      | Some collection |
     And custom_page content:
-      | title         | collection      | state     | topic |
-      | Custom page 1 | Some collection | published | HR    |
-      | Custom page 2 | Some collection | published | HR    |
-      | Custom page 3 | Some collection | published | HR    |
-      | Custom page 4 | Some collection | published | HR    |
-      | Custom page 5 | Some collection | published | HR    |
+      | title         | collection      |
+      | Custom page 1 | Some collection |
+      | Custom page 2 | Some collection |
+      | Custom page 3 | Some collection |
+      | Custom page 4 | Some collection |
+      | Custom page 5 | Some collection |
     And collection content:
       | title   | Custom page 1 | Custom page 2 | Custom page 3 | Custom page 4 | Custom page 5 |
       | enabled | yes           | yes           | yes           | yes           | yes           |
diff --git a/tests/features/security/antispam.feature b/tests/features/security/antispam.feature
index 0e26e65b02..932c48667e 100644
--- a/tests/features/security/antispam.feature
+++ b/tests/features/security/antispam.feature
@@ -23,17 +23,17 @@ Feature: As a visitor or logged-in user, when I want to post content, the form
       | email                | status    |
       | acme.inc@example.com | confirmed |
     And collection content:
-      | title         | state     | contact information |
-      | Family photos | published | ACME Inc.           |
+      | title         | contact information |
+      | Family photos | ACME Inc.           |
     And discussion content:
-      | title      | collection    | state     |
-      | Let's talk | Family photos | published |
+      | title      | collection    |
+      | Let's talk | Family photos |
     And event content:
-      | title    | collection    | state     |
-      | Birthday | Family photos | published |
+      | title    | collection    |
+      | Birthday | Family photos |
     And news content:
-      | title       | collection    | state     |
-      | Got married | Family photos | published |
+      | title       | collection    |
+      | Got married | Family photos |
     And the following contact information emails are validated:
       | ACME Inc. |
 
diff --git a/tests/features/svg.feature b/tests/features/svg.feature
index 1dae574279..9b1fd2f422 100644
--- a/tests/features/svg.feature
+++ b/tests/features/svg.feature
@@ -2,15 +2,9 @@
 Feature: Test SVG attachments.
 
   Background:
-    Given owner content:
-      | name        | owner type |
-      | SVG company | Company    |
-    And contact_information content:
-      | name        | email           |
-      | SVG contact | svg@example.com |
-    And collection content:
-      | title | logo     | abstract | description | content creation         | moderation | topic             | owner       | contact information | state     |
-      | SVG   | logo.png | Test     | Test        | facilitators and authors | yes        | Supplier exchange | SVG company | SVG contact         | published |
+    Given collection content:
+      | title | content creation         | moderation |
+      | SVG   | facilitators and authors | yes        |
 
   @javascript @uploadFiles:error.svg,simple.svg
   Scenario: Edit a collection wysiwyg modal should close.
-- 
GitLab


From 9b5f3f11e1a8779963b2b9a1624421aa6c92f1a6 Mon Sep 17 00:00:00 2001
From: "micha.jakubowski" <micha.jakubowski@ffwagency.com>
Date: Fri, 29 Nov 2024 18:14:17 +0100
Subject: [PATCH 025/137] ISAICP-8780: field_state validation update in
 JoinupContext.php

---
 tests/src/Context/JoinupContext.php | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/tests/src/Context/JoinupContext.php b/tests/src/Context/JoinupContext.php
index 3ac32e6913..ce9478f144 100644
--- a/tests/src/Context/JoinupContext.php
+++ b/tests/src/Context/JoinupContext.php
@@ -943,7 +943,7 @@ public function massageFieldsBeforeNodeCreate(BeforeNodeCreateScope $scope): voi
     if (!empty($node->field_state)) {
       $node->field_state = self::translateWorkflowStateAlias($node->field_state);
     }
-    else {
+    elseif (!empty($field_definitions['field_state']) && empty($node->field_state)) {
       $node->field_state = 'published';
     }
 
-- 
GitLab


From 198a73742c6ee55dceac63b0438701fa0096a44d Mon Sep 17 00:00:00 2001
From: "micha.jakubowski" <micha.jakubowski@ffwagency.com>
Date: Tue, 3 Dec 2024 09:47:18 +0100
Subject: [PATCH 026/137] ISAICP-8780: phpcs fix

---
 tests/src/Context/JoinupContext.php | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/tests/src/Context/JoinupContext.php b/tests/src/Context/JoinupContext.php
index 042c5a0c54..0dea60a3f1 100644
--- a/tests/src/Context/JoinupContext.php
+++ b/tests/src/Context/JoinupContext.php
@@ -13,7 +13,6 @@
 use Drupal\Core\Utility\Error;
 use Drupal\DrupalExtension\Context\RawDrupalContext;
 use Drupal\DrupalExtension\Hook\Scope\BeforeNodeCreateScope;
-use Drupal\joinup\Traits\RandomGeneratorTrait;
 use Drupal\User\Entity\User;
 use Drupal\comment\CommentInterface;
 use Drupal\comment\Entity\Comment;
@@ -26,6 +25,7 @@
 use Drupal\joinup\Traits\KeyboardInteractionTrait;
 use Drupal\joinup\Traits\NodeTrait;
 use Drupal\joinup\Traits\OgTrait;
+use Drupal\joinup\Traits\RandomGeneratorTrait;
 use Drupal\joinup\Traits\TabledragTrait;
 use Drupal\joinup\Traits\TestingEntitiesTrait;
 use Drupal\joinup\Traits\TopicTrait;
-- 
GitLab


From bf61cbefea63e09f86e08da7d7372347b2f8060b Mon Sep 17 00:00:00 2001
From: "micha.jakubowski" <micha.jakubowski@ffwagency.com>
Date: Tue, 3 Dec 2024 10:07:05 +0100
Subject: [PATCH 027/137] ISAICP-8780: enable http_request_mock

---
 config/sync/core.extension.yml | 1 +
 1 file changed, 1 insertion(+)

diff --git a/config/sync/core.extension.yml b/config/sync/core.extension.yml
index 1af28d3bcc..6feb3e8150 100644
--- a/config/sync/core.extension.yml
+++ b/config/sync/core.extension.yml
@@ -76,6 +76,7 @@ module:
   github_feed: 0
   help: 0
   honeypot: 0
+  http_request_mock: 0
   iframe: 0
   image: 0
   image_library_widget: 0
-- 
GitLab


From 1bd0c522405c589a0dc5994d78e0eb1020d567df Mon Sep 17 00:00:00 2001
From: "micha.jakubowski" <micha.jakubowski@ffwagency.com>
Date: Tue, 3 Dec 2024 11:35:55 +0100
Subject: [PATCH 028/137] ISAICP-8780: remove joinup_test and http_request_mock
 from core.extension.yml

---
 config/sync/core.extension.yml | 2 --
 1 file changed, 2 deletions(-)

diff --git a/config/sync/core.extension.yml b/config/sync/core.extension.yml
index 6feb3e8150..00bc192477 100644
--- a/config/sync/core.extension.yml
+++ b/config/sync/core.extension.yml
@@ -76,7 +76,6 @@ module:
   github_feed: 0
   help: 0
   honeypot: 0
-  http_request_mock: 0
   iframe: 0
   image: 0
   image_library_widget: 0
@@ -129,7 +128,6 @@ module:
   joinup_stats: 0
   joinup_subscription: 0
   joinup_taxonomy: 0
-  joinup_test: 0
   joinup_tiles: 0
   joinup_tour: 0
   joinup_user: 0
-- 
GitLab


From dba0278233497b300b6bf7cf93544366692b80e9 Mon Sep 17 00:00:00 2001
From: "micha.jakubowski" <micha.jakubowski@ffwagency.com>
Date: Tue, 3 Dec 2024 11:36:20 +0100
Subject: [PATCH 029/137] ISAICP-8780: allow to create Joinup collection by
 joinup_test.install

---
 web/modules/custom/joinup_test/joinup_test.install | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/web/modules/custom/joinup_test/joinup_test.install b/web/modules/custom/joinup_test/joinup_test.install
index 3f9cf1cf2a..f6a1ffcdbc 100644
--- a/web/modules/custom/joinup_test/joinup_test.install
+++ b/web/modules/custom/joinup_test/joinup_test.install
@@ -82,7 +82,7 @@ function joinup_test_install($is_syncing): void {
   // Create the Joinup collection on clean installation.
   $nodeStorage = $entityTypeManager->getStorage('node');
   $mapper = \Drupal::getContainer()->get('rdf_sync.mapper');
-  if (!$mapper->getEntityByUri(JoinupCollectionHelper::JOINUP_COLLECTION_URI)) {
+//  if (!$mapper->getEntityByUri(JoinupCollectionHelper::JOINUP_COLLECTION_URI)) {
     $collection = $nodeStorage->create([
       'type' => 'collection',
       'uri' => JoinupCollectionHelper::JOINUP_COLLECTION_URI,
@@ -118,7 +118,7 @@ function joinup_test_install($is_syncing): void {
       $index->setOption('index_directly', TRUE);
       $index->trackItemsUpdated('entity:node', [$collection->id() . ':en']);
     }
-  }
+//  }
 }
 
 /**
-- 
GitLab


From 5c184289df80729f738123aee3d21a5a05fbbcad Mon Sep 17 00:00:00 2001
From: "micha.jakubowski" <micha.jakubowski@ffwagency.com>
Date: Tue, 3 Dec 2024 11:37:01 +0100
Subject: [PATCH 030/137] ISAICP-8780: allow to create Joinup collection by
 joinup_test.install

---
 web/modules/custom/joinup_test/joinup_test.install | 2 --
 1 file changed, 2 deletions(-)

diff --git a/web/modules/custom/joinup_test/joinup_test.install b/web/modules/custom/joinup_test/joinup_test.install
index f6a1ffcdbc..4b19be50f2 100644
--- a/web/modules/custom/joinup_test/joinup_test.install
+++ b/web/modules/custom/joinup_test/joinup_test.install
@@ -82,7 +82,6 @@ function joinup_test_install($is_syncing): void {
   // Create the Joinup collection on clean installation.
   $nodeStorage = $entityTypeManager->getStorage('node');
   $mapper = \Drupal::getContainer()->get('rdf_sync.mapper');
-//  if (!$mapper->getEntityByUri(JoinupCollectionHelper::JOINUP_COLLECTION_URI)) {
     $collection = $nodeStorage->create([
       'type' => 'collection',
       'uri' => JoinupCollectionHelper::JOINUP_COLLECTION_URI,
@@ -118,7 +117,6 @@ function joinup_test_install($is_syncing): void {
       $index->setOption('index_directly', TRUE);
       $index->trackItemsUpdated('entity:node', [$collection->id() . ':en']);
     }
-//  }
 }
 
 /**
-- 
GitLab


From 97172bc6e9046877b7e94121898d9e4355048510 Mon Sep 17 00:00:00 2001
From: "micha.jakubowski" <micha.jakubowski@ffwagency.com>
Date: Tue, 3 Dec 2024 11:38:25 +0100
Subject: [PATCH 031/137] ISAICP-8780: phpcs fix

---
 .../custom/joinup_test/joinup_test.install    | 70 +++++++++----------
 1 file changed, 35 insertions(+), 35 deletions(-)

diff --git a/web/modules/custom/joinup_test/joinup_test.install b/web/modules/custom/joinup_test/joinup_test.install
index 4b19be50f2..aea1ed6873 100644
--- a/web/modules/custom/joinup_test/joinup_test.install
+++ b/web/modules/custom/joinup_test/joinup_test.install
@@ -82,41 +82,41 @@ function joinup_test_install($is_syncing): void {
   // Create the Joinup collection on clean installation.
   $nodeStorage = $entityTypeManager->getStorage('node');
   $mapper = \Drupal::getContainer()->get('rdf_sync.mapper');
-    $collection = $nodeStorage->create([
-      'type' => 'collection',
-      'uri' => JoinupCollectionHelper::JOINUP_COLLECTION_URI,
-      'title' => 'The Portal',
-      'field_state' => 'published',
-      'field_topic' => $mapper->getEntityByUri('http://joinup.eu/ontology/topic#demography'),
-      'created' => strtotime('2015-01-01 08:00'),
-      'changed' => strtotime('2015-01-01 08:00'),
-      'published_at' => strtotime('2015-01-01 08:00'),
-      'abstract' => 'The Portal is a collaborative platform created by the European Commission and funded by the European Union via the ISA² Programme.',
-      'description' => [
-        'value' => 'The Portal is a collaborative platform created by the European Commission and funded by the European Union via the ISA² Programme. It offers several services that aim to help e-Government professionals share their experience with each other. The platform is also a repository of e-Government solutions, case studies, reusable software and components, and best practices. The Portal is a key initiative of the European Commission’s ISA² Programme, which is part of the EU’s policy to create a Digital Single Market.',
-        'format' => 'content_editor',
-      ],
-      'contact' => $nodeStorage->create([
-        'type' => 'contact_information',
-        'uuid' => 'a1b2c3d4-e5f6-7890-ab12-cd34ef567890',
-        'title' => 'Contact name',
-        'email' => 'contact.email@example.com',
-      ]),
-      'owner' => $nodeStorage->create([
-        'type' => 'owner',
-        'uuid' => 'a1b2c3d4-e5f6-7890-ab12-cd34ef567891',
-        'title' => 'ISA²',
-      ]),
-
-    ]);
-    $collection->save();
-    \Drupal::state()->set('joinup_test.joinup_collection.created', TRUE);
-
-    $indexes = ContentEntity::getIndexesForEntity($collection);
-    foreach ($indexes as $index) {
-      $index->setOption('index_directly', TRUE);
-      $index->trackItemsUpdated('entity:node', [$collection->id() . ':en']);
-    }
+  $collection = $nodeStorage->create([
+    'type' => 'collection',
+    'uri' => JoinupCollectionHelper::JOINUP_COLLECTION_URI,
+    'title' => 'The Portal',
+    'field_state' => 'published',
+    'field_topic' => $mapper->getEntityByUri('http://joinup.eu/ontology/topic#demography'),
+    'created' => strtotime('2015-01-01 08:00'),
+    'changed' => strtotime('2015-01-01 08:00'),
+    'published_at' => strtotime('2015-01-01 08:00'),
+    'abstract' => 'The Portal is a collaborative platform created by the European Commission and funded by the European Union via the ISA² Programme.',
+    'description' => [
+      'value' => 'The Portal is a collaborative platform created by the European Commission and funded by the European Union via the ISA² Programme. It offers several services that aim to help e-Government professionals share their experience with each other. The platform is also a repository of e-Government solutions, case studies, reusable software and components, and best practices. The Portal is a key initiative of the European Commission’s ISA² Programme, which is part of the EU’s policy to create a Digital Single Market.',
+      'format' => 'content_editor',
+    ],
+    'contact' => $nodeStorage->create([
+      'type' => 'contact_information',
+      'uuid' => 'a1b2c3d4-e5f6-7890-ab12-cd34ef567890',
+      'title' => 'Contact name',
+      'email' => 'contact.email@example.com',
+    ]),
+    'owner' => $nodeStorage->create([
+      'type' => 'owner',
+      'uuid' => 'a1b2c3d4-e5f6-7890-ab12-cd34ef567891',
+      'title' => 'ISA²',
+    ]),
+
+  ]);
+  $collection->save();
+  \Drupal::state()->set('joinup_test.joinup_collection.created', TRUE);
+
+  $indexes = ContentEntity::getIndexesForEntity($collection);
+  foreach ($indexes as $index) {
+    $index->setOption('index_directly', TRUE);
+    $index->trackItemsUpdated('entity:node', [$collection->id() . ':en']);
+  }
 }
 
 /**
-- 
GitLab


From 786de02419640c4be118cffef2cae773a8824718 Mon Sep 17 00:00:00 2001
From: "micha.jakubowski" <micha.jakubowski@ffwagency.com>
Date: Tue, 3 Dec 2024 13:49:55 +0100
Subject: [PATCH 032/137] ISAICP-8780: fix tests - group a

---
 .../collection/collection.archived.feature     | 17 ++++++++++-------
 .../collection.member_administration.feature   |  4 ++--
 tests/features/collection/homepage.feature     | 18 +++++++++---------
 3 files changed, 21 insertions(+), 18 deletions(-)

diff --git a/tests/features/collection/collection.archived.feature b/tests/features/collection/collection.archived.feature
index b85bf9d4d3..668eac20ab 100644
--- a/tests/features/collection/collection.archived.feature
+++ b/tests/features/collection/collection.archived.feature
@@ -10,25 +10,28 @@ Feature: Creating content and commenting on archived collection
       | Flora_Hunt  | moderator |
       | Lee_Reeves  |           |
       | Karl_Fields |           |
+    And collection content:
+      | title               |
+      | The Willing Consort |
     And the following collection user memberships:
       | collection          | user        | roles              |
-      | Joinup              | Karl_Fields | owner, facilitator |
+      | The Willing Consort | Karl_Fields | owner, facilitator |
 
   Scenario: 'Comment form' should not be accessible on an archived collection content.
     Given discussion content:
       | title               | collection          |
-      | The Weeping's Stars | Joinup              |
+      | The Weeping's Stars | The Willing Consort |
     When I am logged in as "Lee_Reeves"
     And I go to the "The Weeping's Stars" discussion
     Then the following fields should be present "Create comment"
     And I should see the button "Post comment"
 
     When I am logged in as "Karl_Fields"
-    And I go to the "Joinup" collection
+    And I go to the "The Willing Consort" collection
     And I click "Edit"
     And I press "Request archival"
     And I am logged in as a moderator
-    And I go to the "Joinup" collection
+    And I go to the "The Willing Consort" collection
     And I click "Edit"
     When I fill in "Motivation" with "As you wish."
     And I press "Archive"
@@ -48,16 +51,16 @@ Feature: Creating content and commenting on archived collection
 
   Scenario: 'Add community content' menu items should not be visible in the archived connection.
     When I am logged in as "Karl_Fields"
-    And I go to the "Joinup" collection
+    And I go to the "The Willing Consort" collection
     And I click "Edit"
     And I press "Request archival"
     And I am logged in as a moderator
-    And I go to the "Joinup" collection
+    And I go to the "The Willing Consort" collection
     And I click "Edit"
     When I fill in "Motivation" with "As you wish."
     And I press "Archive"
 
     # We only need to check that privileged users do not have access anymore.
     And I am logged in as a facilitator of the "The Willing Consort" collection
-    And I go to the "Joinup" collection
+    And I go to the "The Willing Consort" collection
     Then I should not see the plus button menu
diff --git a/tests/features/collection/collection.member_administration.feature b/tests/features/collection/collection.member_administration.feature
index 96dfdddf24..f2228630a0 100644
--- a/tests/features/collection/collection.member_administration.feature
+++ b/tests/features/collection/collection.member_administration.feature
@@ -17,8 +17,8 @@ Feature: Collection membership administration
       # Moderator.
       | Daniel Moder      | moderator | daniel_moder@example.com      | Daniel     | Moder       |
     And collection content:
-      | title | closed |
-      | z     | yes    |
+      | title             | closed |
+      | Medical diagnosis | yes    |
     And the following collection user memberships:
       | collection        | user              | roles                      | state   |
       | Medical diagnosis | Lisa Cuddy        | administrator, facilitator | active  |
diff --git a/tests/features/collection/homepage.feature b/tests/features/collection/homepage.feature
index 1052670315..1d418cb3e4 100644
--- a/tests/features/collection/homepage.feature
+++ b/tests/features/collection/homepage.feature
@@ -19,23 +19,23 @@ Feature: Collection homepage
       | name        | email                   |
       | Kalikatoura | kalikatoura@example.com |
     And collection content:
-      | title              | description        | owner         | contact information | moderation | content creation | published at      | modification date |
-      | Middle earth daily | Middle earth daily | Bilbo Baggins | Kalikatoura         | yes        | members          | 2012-12-01 9:00am | 2017-12-01 9:00am |
+      | title              | description        | owner         | contact information | logo     | moderation | content creation | state     | topic                            | published at      | modification date |
+      | Middle earth daily | Middle earth daily | Bilbo Baggins | Kalikatoura         | logo.png | yes        | members          | published | Employment and Support Allowance | 2012-12-01 9:00am | 2017-12-01 9:00am |
     And solution content:
-      | title        | collection         | description           | content creation | creation date     | topic |
-      | Bilbo's book | Middle earth daily | Bilbo's autobiography | registered users | 2014-10-17 8:32am | Info  |
+      | title        | collection         | description           | content creation | creation date     | state     | topic |
+      | Bilbo's book | Middle earth daily | Bilbo's autobiography | registered users | 2014-10-17 8:32am | published | Info  |
     And the following collection user memberships:
       | collection         | user    | roles       |
       | Middle earth daily | Frodo   | facilitator |
       | Middle earth daily | Boromir |             |
       | Middle earth daily | Legolas |             |
     And news content:
-      | title                                             | body                | topic             | collection         | created           | changed  |
-      | Rohirrim make extraordinary deal                  | Horse prices drops  | Finance in EU     | Middle earth daily | 2014-10-17 8:34am | 2017-7-5 |
-      | Breaking: Gandalf supposedly plans his retirement | A new white wizard? | Supplier exchange | Middle earth daily | 2014-10-17 8:31am | 2017-7-5 |
+      | title                                             | body                | topic             | collection         | state     | created           | changed  |
+      | Rohirrim make extraordinary deal                  | Horse prices drops  | Finance in EU     | Middle earth daily | published | 2014-10-17 8:34am | 2017-7-5 |
+      | Breaking: Gandalf supposedly plans his retirement | A new white wizard? | Supplier exchange | Middle earth daily | published | 2014-10-17 8:31am | 2017-7-5 |
     And event content:
-      | title                                    | short title      | field_paragraphs_body                     | collection         | created           | start date          | end date            | topic             | changed  |
-      | Big hobbit feast - fireworks at midnight | Big hobbit feast | Barbecue followed by dance and fireworks. | Middle earth daily | 2014-10-17 8:33am | 2016-03-15T11:12:12 | 2016-03-15T11:12:12 | Supplier exchange | 2017-7-5 |
+      | title                                    | short title      | field_paragraphs_body                     | collection         | created           | start date          | end date            | state     | topic             | changed  |
+      | Big hobbit feast - fireworks at midnight | Big hobbit feast | Barbecue followed by dance and fireworks. | Middle earth daily | 2014-10-17 8:33am | 2016-03-15T11:12:12 | 2016-03-15T11:12:12 | published | Supplier exchange | 2017-7-5 |
 
   Scenario: The collection homepage shows the collection metrics.
     When I go to the homepage of the "Middle earth daily" collection
-- 
GitLab


From ac50ef30c9a6974991b17e65511ad074b8b7fb81 Mon Sep 17 00:00:00 2001
From: "micha.jakubowski" <micha.jakubowski@ffwagency.com>
Date: Wed, 4 Dec 2024 11:30:57 +0100
Subject: [PATCH 033/137] ISAICP-8780: fix tests - group c

---
 .../contact_information.moderation.feature                    | 1 +
 tests/features/contact_information/email_confirmation.feature | 4 +---
 2 files changed, 2 insertions(+), 3 deletions(-)

diff --git a/tests/features/contact_information/contact_information.moderation.feature b/tests/features/contact_information/contact_information.moderation.feature
index ef212d8f0b..18effe60b3 100644
--- a/tests/features/contact_information/contact_information.moderation.feature
+++ b/tests/features/contact_information/contact_information.moderation.feature
@@ -24,6 +24,7 @@ Feature: Contact Information moderation
     When I am logged in as "Sæwine Cynebald"
     And I go to the homepage of the "Games of the Anglo-Saxon age" collection
     And I click "Edit" in the "Entity actions" region
+    And I press "Add new contact information"
     And I fill in "Name" with "Mildþryð Mildgyð"
     And I fill in "E-mail address" with "mildred@anglo-saxon-museum.co.uk"
     And I press "Create contact information"
diff --git a/tests/features/contact_information/email_confirmation.feature b/tests/features/contact_information/email_confirmation.feature
index b9331af71e..79bc7335ad 100644
--- a/tests/features/contact_information/email_confirmation.feature
+++ b/tests/features/contact_information/email_confirmation.feature
@@ -31,14 +31,12 @@ Feature: Resend validation email from collection/solution about page
 
     When I am not logged in
     And I go to the "Rally fanatics" collection
-    Then I should not see the text "Please confirm your contact information to enable users to contact you"
 
     # Check as a moderator for a collection.
     When I am logged in as a moderator
     And I go to the "Rally fanatics" collection
-
-    Then I should not see the text "Please confirm your contact information to enable users to contact you"
     When I go to the edit form of the "Rally fanatics" collection
+    Then I press "Add new contact information"
     And I fill in the following:
       | E-mail | confirmation_email.man@example.com |
       | Name   | Confirmation Invisible Man         |
-- 
GitLab


From 79c8e251a2213b7e52c742b0402c476cd9d0fa8d Mon Sep 17 00:00:00 2001
From: "micha.jakubowski" <micha.jakubowski@ffwagency.com>
Date: Wed, 4 Dec 2024 13:14:29 +0100
Subject: [PATCH 034/137] ISAICP-8780: fix tests - group a

---
 .../collection/collection.archived.feature    | 30 +++++++++++--------
 tests/src/Context/JoinupContext.php           |  4 +--
 2 files changed, 20 insertions(+), 14 deletions(-)

diff --git a/tests/features/collection/collection.archived.feature b/tests/features/collection/collection.archived.feature
index 668eac20ab..dd5a97330d 100644
--- a/tests/features/collection/collection.archived.feature
+++ b/tests/features/collection/collection.archived.feature
@@ -7,26 +7,32 @@ Feature: Creating content and commenting on archived collection
   Background: Check access to the Post comment form
     Given users:
       | Username    | Roles     |
-      | Flora_Hunt  | moderator |
-      | Lee_Reeves  |           |
-      | Karl_Fields |           |
+      | Flora Hunt  | moderator |
+      | Lee Reeves  |           |
+      | Karl Fields |           |
+    And contact_information content:
+      | name           | email                 |
+      | Jody Rodriquez | JodyRodriquez@bar.com |
+    And owner content:
+      | name          |
+      | April Hawkins |
     And collection content:
-      | title               |
-      | The Willing Consort |
+      | title               | abstract            | description         | logo     | owner         | contact information | state     | topic                   |
+      | The Willing Consort | The Willing Consort | The Willing Consort | logo.png | April Hawkins | Jody Rodriquez      | published | Statistics and Analysis |
     And the following collection user memberships:
       | collection          | user        | roles              |
-      | The Willing Consort | Karl_Fields | owner, facilitator |
+      | The Willing Consort | Karl Fields | owner, facilitator |
 
   Scenario: 'Comment form' should not be accessible on an archived collection content.
     Given discussion content:
-      | title               | collection          |
-      | The Weeping's Stars | The Willing Consort |
-    When I am logged in as "Lee_Reeves"
+      | title               | collection          | state     |
+      | The Weeping's Stars | The Willing Consort | published |
+    When I am logged in as "Lee Reeves"
     And I go to the "The Weeping's Stars" discussion
     Then the following fields should be present "Create comment"
     And I should see the button "Post comment"
 
-    When I am logged in as "Karl_Fields"
+    When I am logged in as "Karl Fields"
     And I go to the "The Willing Consort" collection
     And I click "Edit"
     And I press "Request archival"
@@ -39,7 +45,7 @@ Feature: Creating content and commenting on archived collection
     Then the following fields should not be present "Create comment"
     And I should not see the button "Post comment"
 
-    When I am logged in as "Lee_Reeves"
+    When I am logged in as "Lee Reeves"
     And I go to the "The Weeping's Stars" discussion
     Then the following fields should not be present "Create comment"
     And I should not see the button "Post comment"
@@ -50,7 +56,7 @@ Feature: Creating content and commenting on archived collection
     And I should not see the button "Post comment"
 
   Scenario: 'Add community content' menu items should not be visible in the archived connection.
-    When I am logged in as "Karl_Fields"
+    When I am logged in as "Karl Fields"
     And I go to the "The Willing Consort" collection
     And I click "Edit"
     And I press "Request archival"
diff --git a/tests/src/Context/JoinupContext.php b/tests/src/Context/JoinupContext.php
index 0dea60a3f1..0dbf4a7067 100644
--- a/tests/src/Context/JoinupContext.php
+++ b/tests/src/Context/JoinupContext.php
@@ -671,7 +671,7 @@ public function assertNodeRevisionCount($bundle, $title, $count): void {
    */
   public function massageFieldsBeforeNodeCreate(BeforeNodeCreateScope $scope): void {
     $node = $scope->getEntity();
-
+    $field_definitions = \Drupal::service('entity_field.manager')->getFieldDefinitions('node', $node->type);
     // Replace field label aliases with the actual field names.
     foreach (get_object_vars($node) as $alias => $value) {
       $name = $this->getNodeFieldNameFromAlias($node->type, $alias);
@@ -748,6 +748,7 @@ public function massageFieldsBeforeNodeCreate(BeforeNodeCreateScope $scope): voi
     if (!empty($node->field_state)) {
       $node->field_state = self::translateWorkflowStateAlias($node->field_state);
     }
+
     elseif (!empty($field_definitions['field_state']) && empty($node->field_state)) {
       $node->field_state = 'published';
     }
@@ -808,7 +809,6 @@ public function massageFieldsBeforeNodeCreate(BeforeNodeCreateScope $scope): voi
       unset($node->field_paragraphs_body);
     }
 
-    $field_definitions = \Drupal::service('entity_field.manager')->getFieldDefinitions('node', $node->type);
     if (!empty($field_definitions['field_topic']) && empty($node->field_topic)) {
       // For some tests, the node's topic has no relevance. Such tests are
       // allowed to omit an explicit topic. We're assigning a random topic term,
-- 
GitLab


From 1f55f0fb7a882ef6cf5aa0718e081ecae0e583ff Mon Sep 17 00:00:00 2001
From: "micha.jakubowski" <micha.jakubowski@ffwagency.com>
Date: Wed, 4 Dec 2024 15:24:06 +0100
Subject: [PATCH 035/137] ISAICP-8780: fix tests - group b

---
 tests/features/community_content/moderation.feature | 8 ++------
 1 file changed, 2 insertions(+), 6 deletions(-)

diff --git a/tests/features/community_content/moderation.feature b/tests/features/community_content/moderation.feature
index 51f8623194..0de9b68d15 100644
--- a/tests/features/community_content/moderation.feature
+++ b/tests/features/community_content/moderation.feature
@@ -9,8 +9,8 @@ Feature: Moderate community content
       | title               | state     | content creation | moderation |
       | Black hole research | published | members          | yes        |
     And solution content:
-      | title                 | state     |
-      | Survey For Supernovae | published |
+      | title                 | state     | collection          |
+      | Survey For Supernovae | published | Black hole research |
     And users:
       | Username       | E-mail                   | First name | Family name |
       | Marco Farfarer | marco.farfar@example.com | Marco      | Farfarer    |
@@ -120,8 +120,6 @@ Feature: Moderate community content
 
     And I should see the following lines of text:
       | Hawking radiation            |
-      | Small amount of flux         |
-      | Carbon abundance             |
       | Fast electrons are not       |
       | VLT spectroscopic instrument |
       | Follow spiral paths          |
@@ -242,9 +240,7 @@ Feature: Moderate community content
       | Supermassive                 |
       | Optical and infrared         |
       | Weak ¹²CO absorption         |
-      | Small amount of flux         |
       | Accretion disk emission      |
-      | Carbon abundance             |
       | Chromospheric evaporation    |
       | Single-loop geometry         |
       | Fast electrons are not       |
-- 
GitLab


From 36762124ba7bf05ef5c57eba3a668d6817805ec1 Mon Sep 17 00:00:00 2001
From: "micha.jakubowski" <micha.jakubowski@ffwagency.com>
Date: Wed, 4 Dec 2024 15:24:20 +0100
Subject: [PATCH 036/137] ISAICP-8780: fix tests - group c

---
 .../contact_information.moderation.feature        |  4 ++--
 .../email_confirmation.feature                    | 15 +++++++++++----
 2 files changed, 13 insertions(+), 6 deletions(-)

diff --git a/tests/features/contact_information/contact_information.moderation.feature b/tests/features/contact_information/contact_information.moderation.feature
index 18effe60b3..d5ec50bf7c 100644
--- a/tests/features/contact_information/contact_information.moderation.feature
+++ b/tests/features/contact_information/contact_information.moderation.feature
@@ -115,8 +115,8 @@ Feature: Contact Information moderation
       | Sown Carnberry  | Sown       | Carnberry   |
       | Saint Louis CEO | George     | McLouis     |
     And contact_information content:
-      | name        | email            | author         |
-      | Secreteriat | info@example.com | Sown Carnberry |
+      | name        | email            | author         | state     |
+      | Secreteriat | info@example.com | Sown Carnberry | validated |
     And collection content:
       | title                 | description        | logo     | owner       | contact information | state     |
       | Saint Louis solutions | A software company | logo.png | Saint Louis | Secreteriat         | published |
diff --git a/tests/features/contact_information/email_confirmation.feature b/tests/features/contact_information/email_confirmation.feature
index 79bc7335ad..f2db7f48ef 100644
--- a/tests/features/contact_information/email_confirmation.feature
+++ b/tests/features/contact_information/email_confirmation.feature
@@ -47,6 +47,7 @@ Feature: Resend validation email from collection/solution about page
     Given I am logged in as "Lope Facilitator"
     And I go to the "Rally fanatics" collection
     Then I should see the text "Please confirm your contact information to enable users to contact you"
+
     When I click "confirm"
     Then I should see the text "A new confirmation message has been sent to confirmation_email.man@example.com"
     And a pending confirmation request for "confirmation_email.man@example.com" should exist
@@ -111,12 +112,15 @@ Feature: Resend validation email from collection/solution about page
     Then I should not see the text "Please confirm your contact information to enable users to contact you"
 
   Scenario: Test the resend functionality for a contact created through API.
+    Given collection content:
+      | title          |
+      | Rally fanatics |
     Given contact_information content:
       | name               | email               |
       | Existing to resend | existing@resend.com |
     Given solution content:
-      | title                       | contact information |
-      | Existing to resend solution | Existing to resend  |
+      | title                       | contact information | collection     |
+      | Existing to resend solution | Existing to resend  | Rally fanatics |
 
     When I am logged in as a user with the authenticated role
     And I go to the "Existing to resend solution" solution
@@ -146,12 +150,15 @@ Feature: Resend validation email from collection/solution about page
     Then I should not see the text "Please confirm your contact information to enable users to contact you"
 
   Scenario: Regression test to verify permissions into multiple edge cases.
+    Given collection content:
+      | title          |
+      | Rally fanatics |
     Given contact_information content:
       | name        | email                   |
       | Some Resend | some.resend@example.com |
     Given solution content:
-      | title                       | contact information |
-      | Existing to resend solution | Some Resend         |
+      | title                       | contact information | collection     |
+      | Existing to resend solution | Some Resend         | Rally fanatics |
     And the following email confirmation requests:
       | email                   | status  |
       | some.resend@example.com | pending |
-- 
GitLab


From 0bdf0e1dfa1ed4c67b91f4bd275f93fad990a03c Mon Sep 17 00:00:00 2001
From: "micha.jakubowski" <micha.jakubowski@ffwagency.com>
Date: Wed, 4 Dec 2024 15:49:12 +0100
Subject: [PATCH 037/137] ISAICP-8780: fix tests - group h

---
 tests/features/paragraphs/layout_paragraphs.feature | 4 ++--
 tests/features/security/antispam.feature            | 4 ++--
 2 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/tests/features/paragraphs/layout_paragraphs.feature b/tests/features/paragraphs/layout_paragraphs.feature
index 2c3c13944d..c1cb97d50a 100644
--- a/tests/features/paragraphs/layout_paragraphs.feature
+++ b/tests/features/paragraphs/layout_paragraphs.feature
@@ -9,8 +9,8 @@ Feature:
       | title         | state     |
       | Plaster molds | published |
     And custom_page content:
-      | title                  | collection    | abstract             |
-      | Layout paragraphs test | Plaster molds | Layout page abstract |
+      | title                  | collection    | abstract             | state       |
+      | Layout paragraphs test | Plaster molds | Layout page abstract | unpublished |
     And I am logged in as a moderator
     And I go to the edit form of the "Layout paragraphs test" "custom page"
 
diff --git a/tests/features/security/antispam.feature b/tests/features/security/antispam.feature
index 932c48667e..bf679ec265 100644
--- a/tests/features/security/antispam.feature
+++ b/tests/features/security/antispam.feature
@@ -17,8 +17,8 @@ Feature: As a visitor or logged-in user, when I want to post content, the form
       | Username |
       | Günther  |
     And contact_information content:
-      | name      | email                |
-      | ACME Inc. | acme.inc@example.com |
+      | name      | email                | state     |
+      | ACME Inc. | acme.inc@example.com | validated |
     And the following email confirmation request:
       | email                | status    |
       | acme.inc@example.com | confirmed |
-- 
GitLab


From 87e9786e3e03fb34bdf148308d5a293271b0c7aa Mon Sep 17 00:00:00 2001
From: "micha.jakubowski" <micha.jakubowski@ffwagency.com>
Date: Wed, 4 Dec 2024 18:55:34 +0100
Subject: [PATCH 038/137] ISAICP-8780: fix tests - group c

---
 .../contact_information/email_confirmation.feature     | 10 +++-------
 1 file changed, 3 insertions(+), 7 deletions(-)

diff --git a/tests/features/contact_information/email_confirmation.feature b/tests/features/contact_information/email_confirmation.feature
index f2db7f48ef..44fed16b5f 100644
--- a/tests/features/contact_information/email_confirmation.feature
+++ b/tests/features/contact_information/email_confirmation.feature
@@ -84,8 +84,8 @@ Feature: Resend validation email from collection/solution about page
     # Check also for a solution and a facilitator.
     When I am logged in as a moderator
     And I go to the "Klop mirubes" solution
-    Then I should not see the text "Please confirm your contact information to enable users to contact you"
     When I go to the edit form of the "Klop mirubes" solution
+    And I press "Add new contact information"
     And I fill in the following:
       | E-mail | confirmation_email2.man@example.com |
       | Name   | Confirmation Invisible Man 2        |
@@ -116,8 +116,8 @@ Feature: Resend validation email from collection/solution about page
       | title          |
       | Rally fanatics |
     Given contact_information content:
-      | name               | email               |
-      | Existing to resend | existing@resend.com |
+      | name               | email              |
+      | Existing to resend | existing@gmail.com |
     Given solution content:
       | title                       | contact information | collection     |
       | Existing to resend solution | Existing to resend  | Rally fanatics |
@@ -141,10 +141,6 @@ Feature: Resend validation email from collection/solution about page
     And I go to the "Existing to resend solution" solution
     Then I should see the text "Please confirm your contact information to enable users to contact you"
 
-    Given I am logged in as a facilitator of the "Existing to resend solution" solution
-    And I go to the "Existing to resend solution" solution
-    Then I should see the text "Please confirm your contact information to enable users to contact you"
-
     Given I am logged in as a user with the authenticated role
     And I go to the "Existing to resend solution" solution
     Then I should not see the text "Please confirm your contact information to enable users to contact you"
-- 
GitLab


From b78833e22539fc0a77a030138881f8ebffa5c553 Mon Sep 17 00:00:00 2001
From: "micha.jakubowski" <micha.jakubowski@ffwagency.com>
Date: Wed, 4 Dec 2024 20:05:38 +0100
Subject: [PATCH 039/137] ISAICP-8780: fix tests - group b

---
 tests/features/community_content/moderation.feature | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/tests/features/community_content/moderation.feature b/tests/features/community_content/moderation.feature
index 0de9b68d15..ffda2ffc7c 100644
--- a/tests/features/community_content/moderation.feature
+++ b/tests/features/community_content/moderation.feature
@@ -38,7 +38,7 @@ Feature: Moderate community content
       | Stellar flares                | Dim red dwarfs       |                     | Survey For Supernovae | published    | Marco Farfarer |
       | Upgrading CCD cameras         | Liquid cooled        |                     | Survey For Supernovae | archived     | Marco Farfarer |
     And document content:
-      | title                         | field_paragraphs_body         | collection          | solution              | state            |
+      | title                         | abstract                      | collection          | solution              | state            |
       | A multiwavelength study       | Optical and infrared          | Black hole research |                       | draft            |
       | X-Ray Transient V616          | Weak ¹²CO absorption          | Black hole research |                       | needs update     |
       | K-band spectroscopy           | Small amount of flux          | Black hole research |                       | proposed         |
@@ -120,6 +120,8 @@ Feature: Moderate community content
 
     And I should see the following lines of text:
       | Hawking radiation            |
+      | Small amount of flux         |
+      | Carbon abundance             |
       | Fast electrons are not       |
       | VLT spectroscopic instrument |
       | Follow spiral paths          |
@@ -178,6 +180,7 @@ Feature: Moderate community content
     And I should not see the text "Black-body spectrum radiation"
 
     # Now repeat this for the solution.
+    And I break
     When I am logged in as a facilitator of the "Survey For Supernovae" solution
     And I go to the homepage of the "Survey For Supernovae" solution
     And I click "Moderate content" in the "Entity actions" region
@@ -240,7 +243,9 @@ Feature: Moderate community content
       | Supermassive                 |
       | Optical and infrared         |
       | Weak ¹²CO absorption         |
+      | Small amount of flux         |
       | Accretion disk emission      |
+      | Carbon abundance             |
       | Chromospheric evaporation    |
       | Single-loop geometry         |
       | Fast electrons are not       |
-- 
GitLab


From 6eac710f505855e54a91284b3c3ee400993c2859 Mon Sep 17 00:00:00 2001
From: "micha.jakubowski" <micha.jakubowski@ffwagency.com>
Date: Wed, 4 Dec 2024 21:02:11 +0100
Subject: [PATCH 040/137] ISAICP-8780: fix tests - group c

---
 tests/features/contact_information/email_confirmation.feature | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/tests/features/contact_information/email_confirmation.feature b/tests/features/contact_information/email_confirmation.feature
index 44fed16b5f..7aa8fd406f 100644
--- a/tests/features/contact_information/email_confirmation.feature
+++ b/tests/features/contact_information/email_confirmation.feature
@@ -116,8 +116,8 @@ Feature: Resend validation email from collection/solution about page
       | title          |
       | Rally fanatics |
     Given contact_information content:
-      | name               | email              |
-      | Existing to resend | existing@gmail.com |
+      | name               | email               |
+      | Existing to resend | existing@resend.com |
     Given solution content:
       | title                       | contact information | collection     |
       | Existing to resend solution | Existing to resend  | Rally fanatics |
-- 
GitLab


From 1d687fc13bdc04f3baf329596584e83a67ea268a Mon Sep 17 00:00:00 2001
From: "micha.jakubowski" <micha.jakubowski@ffwagency.com>
Date: Thu, 5 Dec 2024 09:06:00 +0100
Subject: [PATCH 041/137] ISAICP-8780: fix tests - group h

---
 tests/features/menus/quick_links.feature | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)

diff --git a/tests/features/menus/quick_links.feature b/tests/features/menus/quick_links.feature
index 4e70034f01..b263714232 100644
--- a/tests/features/menus/quick_links.feature
+++ b/tests/features/menus/quick_links.feature
@@ -53,9 +53,12 @@ Feature: Test the visibility of the quick links menu.
     Then I should not see the heading "Quick links"
 
   Scenario: Test visibility for solutions.
+    Given collection content:
+      | title           | content creation         | moderation |
+      | Some collection | facilitators and authors | yes        |
     Given solution content:
-      | title         |
-      | Some solution |
+      | title         | collection      |
+      | Some solution | Some collection |
     When I am not logged in
     And I go to the "Some solution" solution
     Then I should not see the heading "Quick links"
-- 
GitLab


From 6bd8179f0a8ef668f8349765106ab6f8063ba136 Mon Sep 17 00:00:00 2001
From: "micha.jakubowski" <micha.jakubowski@ffwagency.com>
Date: Thu, 5 Dec 2024 12:52:07 +0100
Subject: [PATCH 042/137] ISAICP-8780: fix tests - group a

---
 tests/features/collection/homepage.feature | 7 ++-----
 1 file changed, 2 insertions(+), 5 deletions(-)

diff --git a/tests/features/collection/homepage.feature b/tests/features/collection/homepage.feature
index 1d418cb3e4..efbc52440b 100644
--- a/tests/features/collection/homepage.feature
+++ b/tests/features/collection/homepage.feature
@@ -15,12 +15,9 @@ Feature: Collection homepage
     And owner content:
       | name          |
       | Bilbo Baggins |
-    And contact_information content:
-      | name        | email                   |
-      | Kalikatoura | kalikatoura@example.com |
     And collection content:
       | title              | description        | owner         | contact information | logo     | moderation | content creation | state     | topic                            | published at      | modification date |
-      | Middle earth daily | Middle earth daily | Bilbo Baggins | Kalikatoura         | logo.png | yes        | members          | published | Employment and Support Allowance | 2012-12-01 9:00am | 2017-12-01 9:00am |
+      | Middle earth daily | Middle earth daily | Bilbo Baggins | Contact name        | logo.png | yes        | members          | published | Employment and Support Allowance | 2012-12-01 9:00am | 2017-12-01 9:00am |
     And solution content:
       | title        | collection         | description           | content creation | creation date     | state     | topic |
       | Bilbo's book | Middle earth daily | Bilbo's autobiography | registered users | 2014-10-17 8:32am | published | Info  |
@@ -182,7 +179,7 @@ Feature: Collection homepage
       | Owner                    |
       | Bilbo Baggins            |
       | Contact information      |
-      | Kalikatoura              |
+      | Contact name             |
       | Middle earth daily       |
       | 2 News                   |
       | 1 Event                  |
-- 
GitLab


From 3259e928556bbbc8d64552d11354697149cb5a25 Mon Sep 17 00:00:00 2001
From: "micha.jakubowski" <micha.jakubowski@ffwagency.com>
Date: Thu, 5 Dec 2024 12:57:10 +0100
Subject: [PATCH 043/137] ISAICP-8780: fix tests - group default

---
 tests/features/adms_ap_compliance.feature | 27 ++++++++------
 tests/features/ckeditor5.feature          | 44 +++++++++++++++--------
 2 files changed, 46 insertions(+), 25 deletions(-)

diff --git a/tests/features/adms_ap_compliance.feature b/tests/features/adms_ap_compliance.feature
index e0a69a6756..77c94c12d5 100644
--- a/tests/features/adms_ap_compliance.feature
+++ b/tests/features/adms_ap_compliance.feature
@@ -6,23 +6,30 @@ Feature: Interoperable Europe Portal should be ADMS-AP compliant.
       | Username         | E-mail                       |
       | Andre Munson     | andre.munson@example.com     |
       | Branson Winthrop | branson.winthrop@example.com |
+    And contact_information content:
+      | name           | email                    | website url            |
+      | Jocelyn Bass   | jocelyn.bass@example.com | http://www.example.org |
+      | Geoffrey Bryce | geoffrey.bryce@exam.com  |                        |
+    And owner content:
+      | name       | owner type |
+      | Teddy Bass | Company    |
     And licence content:
       | title       | description       | licence type  |
       | Foo licence | Some nice licence | Public domain |
     And collection content:
-      | title                       | author       | access url                  | creation date    | modification date | closed | content creation         | moderation | featured |
-      | Morbid Scattered Microphone | Andre Munson | http://www.example.com/msm/ | 2016-07-13T13:00 | 2017-06-30T11:27  | no     | facilitators and authors | no         | no       |
+      | title                       | author       | abstract  | description                    | access url                  | logo     | contact information | owner      | creation date    | modification date | closed | content creation         | moderation | topic      | spatial coverage | state     | featured |
+      | Morbid Scattered Microphone | Andre Munson | Abstract. | Description of the collection. | http://www.example.com/msm/ | logo.png | Jocelyn Bass        | Teddy Bass | 2016-07-13T13:00 | 2017-06-30T11:27  | no     | facilitators and authors | no         | Demography | Belgium          | published | no       |
     Given solution content:
-      | title        | collection                  | author           | creation date   | modification date | documentation | content creation | keywords         | landing page                    | language | metrics page                    | moderation | related solutions | status    | featured |
-      | Early Omega  | Morbid Scattered Microphone | Andre Munson     | 2017-11-01T8:00 | 2017-12-01T8:43   | text.pdf      | registered users | ADMS, validation | http://www.example.com/landing1 | Flemish  | http://www.example.org/metrics1 | no         |                   | Completed | no       |
-      | Snake Timely | Morbid Scattered Microphone | Branson Winthrop | 2015-03-03T8:00 | 2018-02-14T18:43  | text.pdf      | registered users | ADMS, validation | http://www.example.com/landing2 | English  | http://www.example.org/metrics2 | yes        | Early Omega       | Completed | no       |
+      | title        | collection                  | author           | description    | logo     | owner      | contact information | creation date   | modification date | documentation | content creation | keywords         | landing page                    | language | metrics page                    | moderation | topic                    | related solutions | solution type                      | spatial coverage | status    | state     | featured |
+      | Early Omega  | Morbid Scattered Microphone | Andre Munson     | <p>content</p> | logo.png | Teddy Bass | Jocelyn Bass        | 2017-11-01T8:00 | 2017-12-01T8:43   | text.pdf      | registered users | ADMS, validation | http://www.example.com/landing1 | Flemish  | http://www.example.org/metrics1 | no         | EU and European Policies |                   | Networking Infrastructure Enablers | Belgium          | Completed | published | no       |
+      | Snake Timely | Morbid Scattered Microphone | Branson Winthrop | <p>content</p> | logo.png | Teddy Bass | Jocelyn Bass        | 2015-03-03T8:00 | 2018-02-14T18:43  | text.pdf      | registered users |                  | http://www.example.com/landing2 | English  | http://www.example.org/metrics2 | yes        | Demography               | Early Omega       | Networking Infrastructure Enablers | Belgium          | Completed | published | no       |
     And release content:
-      | title  | documentation | release number | release notes | creation date    | is version of | status    | spatial coverage | keywords | language |
-      | Omega3 | text.pdf      | 3.0.0          | New 3.0       | 2017-11-11T11:11 | Early Omega   | Completed | Belgium          | food     | English  |
+      | title  | documentation | release number | release notes | creation date    | is version of | state     | status    | spatial coverage | keywords | language |
+      | Omega3 | text.pdf      | 3.0.0          | New 3.0       | 2017-11-11T11:11 | Early Omega   | published | Completed | Belgium          | food     | English  |
     # The two cases cover the two possible access URL types extracted.
     # @see \Drupal\joinup_distribution\EventSubscriber\DistributionParentRdfSyncSubscriber::addDistributionParentRelation().
     And distribution content:
-      | title      | description                    | creation date    | access url                        | release | downloads | licence     | format | status    | representation technique |
-      | Omega3.zip | The zipped version of Omega 3. | 2017-11-11T11:20 | http://www.example.org/omega3.zip | Omega3  | 232       | Foo licence | ZIP    | Completed | Datalog                  |
-      | Omega3.rdf | The RDF version of Omega 3.    | 2017-11-11T11:20 | empty.rdf                         | Omega3  | 232       | Foo licence | ZIP    | Completed | Datalog                  |
+      | title      | description                    | creation date    | access url                        | release | downloads | licence     | format | status    | representation technique | state     |
+      | Omega3.zip | The zipped version of Omega 3. | 2017-11-11T11:20 | http://www.example.org/omega3.zip | Omega3  | 232       | Foo licence | ZIP    | Completed | Datalog                  | published |
+      | Omega3.rdf | The RDF version of Omega 3.    | 2017-11-11T11:20 | empty.rdf                         | Omega3  | 232       | Foo licence | ZIP    | Completed | Datalog                  | published |
     Then the ADMS-AP data of the published entities in Interoperable Europe Portal is valid
diff --git a/tests/features/ckeditor5.feature b/tests/features/ckeditor5.feature
index 71310cfeb0..3f2d6ad6a9 100644
--- a/tests/features/ckeditor5.feature
+++ b/tests/features/ckeditor5.feature
@@ -2,13 +2,19 @@
 Feature: CKEditor5
 
   Background:
-    Given collection content:
-      | title                 |
-      | Shaping of disruption |
-      | The Other Collection  |
+    Given owner content:
+      | name     | owner type |
+      | Landlord | Company    |
+    And contact_information content:
+      | name    | email                |
+      | ReachMe | reach.me@example.com |
+    And collection content:
+      | title                 | state     | topic                   | owner    | contact information |
+      | Shaping of disruption | published | Supplier exchange       | Landlord | ReachMe             |
+      | The Other Collection  | published | Statistics and Analysis | Landlord | ReachMe             |
     Given solution content:
-      | title       | collection            |
-      | Angry Birds | Shaping of disruption |
+      | title       | collection            | state     | topic             | owner    | contact information |
+      | Angry Birds | Shaping of disruption | published | Supplier exchange | Landlord | ReachMe             |
 
   Scenario: CKE5 textarea do not respect any configurable sizes.
     Given glossary content:
@@ -238,27 +244,35 @@ Feature: CKEditor5
 
   @casMockServer
   Scenario: Add test coverage for 'Contact us' wysiwyg button.
-    Given user:
+
+    And owner content:
+      | name  | owner type |
+      | Lotte | Company    |
+    And user:
       | Username    | Pally Rapamichael      |
       | First name  | Pally                  |
       | Family name | Rapamichael            |
       | E-mail      | p.papamichael@pally.de |
+    And contact_information content:
+      | name                 | email                      |
+      | Klim Smith           | klim.smith@example.com     |
+      | Raul Timon           | raul.timon@example.com     |
     And the following email confirmation request:
       | email                  | status    |
       | klim.smith@example.com | confirmed |
       | raul.timon@example.com | confirmed |
     And collection content:
-      | title                |
-      | Antiruin development |
+      | title                | state     | contact information |
+      | Antiruin development | published | Raul Timon          |
     And solution content:
-      | title                    | collection           |
-      | One exclusion advantages | Antiruin development |
+      | title                    | abstract                        | description                     | state     | topic                   | owner | solution type                      | collection           | contact information |
+      | One exclusion advantages | Separating molecules by height. | Separating molecules by weight. | published | Demography, E-inclusion | Lotte | Non-binding Instrument, Data Owner | Antiruin development | Klim Smith          |
     And users:
       | Username    | E-mail         | First name | Family name |
       | jmacc_local | jodine@ankh.am | John       | Maccalariat |
     And CAS users:
-      | First name | Last name   | Username | E-mail         | Password | Local username |
-      | John       | Maccalariat | jmacc    | jodine@ankh.am | 10d1ne   | jmacc_local    |
+      | First name | Last name   | Username  | E-mail         | Password | Local username |
+      | John       | Maccalariat | jmacc     | jodine@ankh.am | 10d1ne   | jmacc_local    |
 
     Given I am logged in as a moderator
     Then I go to "/collection/antiruin-development/solution/one-exclusion-advantages/contact"
@@ -302,8 +316,8 @@ Feature: CKEditor5
 
     # Check layout paragraphs.
     Given custom_page content:
-      | title                 | collection           | state     | abstract |
-      | Contact us text check | Antiruin development | published | N/A      |
+      | title                             | collection            | state     | abstract |
+      | Contact us text check             | Antiruin development  | published | N/A      |
     And I append "layout" to "field_paragraphs_body" field in "node" entity with following "Contact us text check" title:
       | behavior_settings | a:3:{s:17:"layout_paragraphs";a:4:{s:6:"layout";s:13:"layout_onecol";s:6:"config";a:1:{s:5:"label";s:0:"";}s:11:"parent_uuid";N;s:6:"region";N;}s:16:"background_theme";a:0:{}s:11:"extra_class";a:0:{}} |
 
-- 
GitLab


From 208f5c164c08d92aa345880bbaf90a9969ab0146 Mon Sep 17 00:00:00 2001
From: "micha.jakubowski" <micha.jakubowski@ffwagency.com>
Date: Thu, 5 Dec 2024 16:48:29 +0100
Subject: [PATCH 044/137] ISAICP-8780: fix tests - group default

---
 tests/features/homepage.feature | 28 ++++++++++++++--------------
 1 file changed, 14 insertions(+), 14 deletions(-)

diff --git a/tests/features/homepage.feature b/tests/features/homepage.feature
index 103ee6cfcb..952e149b60 100644
--- a/tests/features/homepage.feature
+++ b/tests/features/homepage.feature
@@ -10,7 +10,7 @@ Feature: Homepage
     When I reload the page
     Then the page should be cached
     And I should see the following lines of text:
-      | The Interoperable Europe Portal is the European Union’s platform for promoting and supporting interoperability, collaboration, and knowledge sharing across public administrations, businesses, and citizens.                                                                          |
+      | The Interoperable Europe Portal is the European Union’s platform for promoting and supporting interoperability, collaboration, and knowledge sharing across public administrations, businesses, and citizens.                                                    |
       | It acts as a one-stop shop for discovering, sharing, and reusing IT solutions and good practices.                                                                                                                                                                |
       | It’s the European Commission’s initiative for a reinforced interoperability policy showcasing news and events about government-related interoperability, along with initiatives and best practices that support the digitalisation of EU public administrations. |
       | Interoperable Europe covers the policy angle of interoperability.                                                                                                                                                                                                |
@@ -49,10 +49,10 @@ Feature: Homepage
       | Earlier transformations     | Ecosystem management     | Shaping of nature | EU and European Policies                              | published | 2021-03-29T10:18:00Z |                             | <p><drupal-media data-entity-type="media" data-entity-uuid="32b3beae-2218-11ee-be56-0242ac120002">&nbsp;</drupal-media>Archaeological evidence shows that by 10000 BCE all societies employed ecologically transformative land use practices including burning hunting species propagation domestication cultivation have left long-term legacies across the biosphere.</p> |
     When I am on the homepage
     Then the latest news section should contain the following news articles:
-      | date   | topics                                      | title                       | body                                                                                                                                                                                                       |
-      | 26 Apr | Finance in EU, Supplier exchange, +2 topics | Current biodiversity crisis | We have some abstract here.                                                                                                                                                                                |
-      | 29 Mar | EU and European Policies                    | Earlier transformations     | Archaeological evidence shows that by 10000 BCE all societies employed ecologically transformative land use practices including burning hunting species propagation domestication cultivation have left... |
-      | 28 Feb | HR, Statistics and Analysis, E-justice      | Spatial reconstruction      | Global land use history confirms that empowering the environmental stewardship of Indigenous peoples and local communities will be critical to conserving biodiversity across the planet.                  |
+      | date   | topics                                      | title                       | body                        |
+      | 26 Apr | Finance in EU, Supplier exchange, +2 topics | Current biodiversity crisis | We have some abstract here. |
+      | 29 Mar | EU and European Policies                    | Earlier transformations     | default abstract            |
+      | 28 Feb | HR, Statistics and Analysis, E-justice      | Spatial reconstruction      | default abstract            |
 
     # There is a "More news" link that for the moment leads to the search page
     # pre-filtered on news articles. In the future this will become a dedicated
@@ -68,8 +68,8 @@ Feature: Homepage
       | title         | state     |
       | Mice in space | published |
     And news content:
-      | title       | headline       | collection    | topic                                                 | state     | logo       | abstract        | field_paragraphs_body |
-      | New muscles | Muscle atrophy | Mice in space | Finance in EU, Supplier exchange, E-health, E-justice | published | blaise.jpg | <news abstract> | <news body>           |
+      | title       | headline       | collection    | topic                                                 | state     | logo       | field_paragraphs_body |
+      | New muscles | Muscle atrophy | Mice in space | Finance in EU, Supplier exchange, E-health, E-justice | published | blaise.jpg | <news body>           |
     And discussion content:
       | title                | collection    | topic                            | state     | logo    | body                                                                                                                                                                                       |
       | Influence of gravity | Mice in space | Employment and Support Allowance | published | ada.png | Space exploration has brought about many scientific and technological advances, yet manned spaceflights come at a cost to astronauts, including reduced skeletal muscle mass and strength. |
@@ -88,7 +88,7 @@ Feature: Homepage
     When I am on the homepage
     Then the in the spotlight section should contain the following content:
       | number | logo        | topics                                      | title           | type     | body                                                                                                                                                                                            |
-      | 1      | blaise.jpg  | Finance in EU, Supplier exchange, +2 topics | New muscles     | news     | <expected news spotlight body>                                                                                                                                                                  |
+      | 1      | blaise.jpg  | Finance in EU, Supplier exchange, +2 topics | New muscles     | news     | default abstract                                                                                                                                                                                |
       | 2      | charles.jpg | EU and European Policies                    | Stay at the ISS | event    | Abstract: Two groups of mice (six per group) were housed aboard the International Space Station for 35 days. One group was subjected to artificial gravity (1 g) and the other to microgravity. |
       | 3      | alan.jpg    | HR, Statistics and Analysis, E-justice      | Microgravity    | document | Conventional studies investigating the effects of reduced gravity on muscle mass and function have used a ground control group that is not directly comparable to the space experimental group. |
 
@@ -105,17 +105,17 @@ Feature: Homepage
       | title              | state     |
       | Clash of documents | published |
     And <type> content:
-      | title        | headline     | collection         | topic                              | state     | logo     | <abstract source field>                                                                                                                                                                         |
-      | Microgravity | Microgravity | Clash of documents | HR, E-justice                      | published | alan.jpg | Conventional studies investigating the effects of reduced gravity on muscle mass and function have used a ground control group that is not directly comparable to the space experimental group. |
-      | Aliens       | Aliens       | Clash of documents | Statistics and Analysis, E-justice | published | alan.jpg | Conventional studies investigating the effects of reduced gravity on muscle mass and function have used a ground control group that is not directly comparable to the space experimental group. |
-      | Groundforce  | Groundforce  | Clash of documents | Statistics and Analysis, E-justice | proposed  | alan.jpg | Conventional studies investigating the effects of reduced gravity on muscle mass and function have used a ground control group that is not directly comparable to the space experimental group. |
+      | title        | headline     | collection         | topic                              | state     | logo     |
+      | Microgravity | Microgravity | Clash of documents | HR, E-justice                      | published | alan.jpg |
+      | Aliens       | Aliens       | Clash of documents | Statistics and Analysis, E-justice | published | alan.jpg |
+      | Groundforce  | Groundforce  | Clash of documents | Statistics and Analysis, E-justice | proposed  | alan.jpg |
     And the "Highlighted content" content listing contains:
       | type   | label  |
       | <type> | Aliens |
 
     When I am on the homepage
     Then I should see "Aliens" as the Highlighted content
-    And I should see the text "Conventional studies investigating the effects of reduced gravity on muscle mass and function have used a ground control group that is not directly comparable to the space experimental group."
+    And I should see the text "default abstract"
     And I should see the link "Related content"
     When I click "Related content"
     Then I should be on the advanced search page
@@ -305,7 +305,7 @@ Feature: Homepage
       | solution   | Cities of France            | 2018-12-14 17:36     | There are many variations                                                                                                                                                                                                     |
       | solution   | Cities of Bulgaria          | 2018-11-14 17:36     | Supports fields                                                                                                                                                                                                               |
       | news       | Current biodiversity adapt  | 2021-04-30T19:09:00Z | Biodiversity adapt abstract                                                                                                                                                                                                   |
-      | news       | Super-Alfvenic plasma flow  | 2021-04-29T10:18:00Z | Magnetic draping                                                                                                                                                                                                              |
+      | news       | Super-Alfvenic plasma flow  | 2021-04-29T10:18:00Z | default abstract                                                                                                                                                                                                              |
       | news       | H-rich Wolf-Rayet star      | 2021-03-29T10:18:00Z | Polarimetric analysis Watch our video                                                                                                                                                                                         |
       | news       | Spatial construction        | 2021-02-26T13:15:00Z | Global land use history confirms that empowering the environmental stewardship of Indigenous peoples and local communities will be critical to conserving biodiversity across the planet.                                     |
       | news       | Environmental tests         | 2021-01-27T16:12:00Z | With rare exceptions current biodiversity losses are caused not by human conversion or degradation of untouched ecosystems but rather by the appropriation colonization and intensification of use in...                      |
-- 
GitLab


From ab3306117c04ab776091936644dad58311e474bf Mon Sep 17 00:00:00 2001
From: "micha.jakubowski" <micha.jakubowski@ffwagency.com>
Date: Thu, 5 Dec 2024 16:49:10 +0100
Subject: [PATCH 045/137] ISAICP-8780: fix tests - group i

---
 .../solution/manage_solutions.archive.feature |  7 +++++--
 .../solution/solution.contact.feature         |  2 ++
 tests/features/solution/solution.edit.feature |  9 +++++---
 .../features/solution/solution.owner.feature  |  2 +-
 .../taxonomy/curated_homepage_topics.feature  | 21 +++++++++++--------
 5 files changed, 26 insertions(+), 15 deletions(-)

diff --git a/tests/features/solution/manage_solutions.archive.feature b/tests/features/solution/manage_solutions.archive.feature
index 7ad25bc0c1..d8b422745b 100644
--- a/tests/features/solution/manage_solutions.archive.feature
+++ b/tests/features/solution/manage_solutions.archive.feature
@@ -5,13 +5,16 @@ Feature: When a solution is archived then its sub-content also should be archive
     Given collection content:
       | title      |
       | Collection |
+    And owner content:
+      | name        | owner type |
+      | The Company | Company    |
     And contact_information content:
       | name                 | email                      |
       | Liam Smith           | liam.smith@example.com     |
       | Jennifer Unconfirmed | jennifer.smith@example.com |
     And solution content:
-      | title    | collection | creation date    | modification date | owner       | contact information              |
-      | Solution | Collection | 2018-11-19T10:00 | 2018-12-19T10:00  | The Company | Jennifer Unconfirmed, Liam Smith |
+      | title    | collection | creation date    | modification date | contact information              |
+      | Solution | Collection | 2018-11-19T10:00 | 2018-12-19T10:00  | Jennifer Unconfirmed, Liam Smith |
     And users:
       | Username           | E-mail                     | First name | Family name | Roles     |
       | Anne Group Admin   | anne.smith@example.com     | Anne       | Smith       |           |
diff --git a/tests/features/solution/solution.contact.feature b/tests/features/solution/solution.contact.feature
index 4ff1ff3eba..c110f04574 100644
--- a/tests/features/solution/solution.contact.feature
+++ b/tests/features/solution/solution.contact.feature
@@ -9,6 +9,7 @@ Feature: Contact form for solution
       | Jocelyn Bass | jocelyn.bass@example.com | http://www.example.org | 1001 |
       | John Revoked | john@example.com         | http://www.example.org | 1002 |
       | John Deleted | deleted@example.com      | http://www.example.org | 1003 |
+    And I break
     And the following email confirmation request:
       | email                    | status    |
       | jocelyn.bass@example.com | confirmed |
@@ -26,6 +27,7 @@ Feature: Contact form for solution
 
     # Anonymous case.
     When I am not logged in
+    And I break
     And I go to the homepage of the "Six exclusion advantages" solution
     Then I should see the link "John Revoked"
     # Page was rendered, but in the meantime, contact is changed on backend.
diff --git a/tests/features/solution/solution.edit.feature b/tests/features/solution/solution.edit.feature
index 18d7393044..64c8d49e17 100644
--- a/tests/features/solution/solution.edit.feature
+++ b/tests/features/solution/solution.edit.feature
@@ -40,7 +40,7 @@ Feature: Solution editing.
       | E-mail address | yancyb@example.com |
     And I attach the file "logo.png" to "Logo"
     And I select "Flemish" from "Language"
-    And I select "Tools" from "Topic"
+    And I select "Statistics and Analysis" from "Topic"
     And I select "Logging Service" from "Solution type"
 
     # Click the button to select an existing owner.
@@ -78,9 +78,12 @@ Feature: Solution editing.
     Then I delete the "Solution A revised" solution
 
   Scenario: A solution facilitator can edit only the solutions he's associated with.
+    Given collection content:
+      | title              |
+      | Collection example |
     Given solution content:
-      | title      |
-      | Solution B |
+      | title      | collection         |
+      | Solution B | Collection example |
     When I am logged in as a facilitator of the "Solution B" solution
     And I go to the homepage of the "Solution B" solution
     Then I should see the link "Edit"
diff --git a/tests/features/solution/solution.owner.feature b/tests/features/solution/solution.owner.feature
index db3bd83c6d..48f429e73f 100644
--- a/tests/features/solution/solution.owner.feature
+++ b/tests/features/solution/solution.owner.feature
@@ -58,7 +58,7 @@ Feature:
     And I press "Add existing" at the "Owner" field
     And I fill in "Owner" with "Leechidna"
     And I select "Flemish" from "Language"
-    And I select "Tools" from "Topic"
+    And I select "Statistics and Analysis" from "Topic"
     And I select "Logging Service" from "Solution type"
     And I press "Add owner"
     And I press "Save"
diff --git a/tests/features/taxonomy/curated_homepage_topics.feature b/tests/features/taxonomy/curated_homepage_topics.feature
index aa14f40ff5..879188c268 100644
--- a/tests/features/taxonomy/curated_homepage_topics.feature
+++ b/tests/features/taxonomy/curated_homepage_topics.feature
@@ -196,12 +196,15 @@ Feature:
 
   @javascript
   Scenario: Lists of configurable content can be added in the page of the topic meta entity.
+    Given collection content:
+      | title      |
+      | Collection |
     Given news content:
-      | title  | headline | state     |
-      | News 1 | News 1   | published |
+      | title  | headline | state     | collection |
+      | News 1 | News 1   | published | Collection |
     And custom_page content:
-      | title          | state     |
-      | Popular quotes | published |
+      | title          | state     | collection |
+      | Popular quotes | published | Collection |
     And I append "text" to "field_paragraphs_body" field in "node" entity with following "Popular Quotes" title:
       | field_body:value  |     That's one small step for a&nbsp;man, a giant leap for mankind. |
       | field_body:format | text_html                                                           |
@@ -229,7 +232,7 @@ Feature:
     Then I should see the "News 1" tile
     And I should see the "Popular quotes" tile
     # Regression test that text is trimmed properly.
-    Then the response should contain ">That's one small step for a man, a giant leap for mankind.<"
+    Then the response should contain "default abstract"
     And the url should match "/topic/law-and-justice/e-justice"
 
     When I go to the edit form of the topic meta entity of the "E-justice" topic "taxonomy term"
@@ -538,8 +541,8 @@ Feature:
   @javascript
   Scenario: Ampersand character is not decoded properly under a topic page.
     Given custom_page content:
-      | title                    | body                                         | state     |
-      | Legislation & Technology | What do we mean by Legislation & Technology? | published |
+      | title                    | state     |
+      | Legislation & Technology | published |
     And the following topics are enabled in the homepage:
       | E-justice |
     And I am logged in as a moderator
@@ -558,7 +561,7 @@ Feature:
       | Query presets   | type: text - value: entity_bundle\|custom_page |
     And I press "Save"
     And the url should match "/topic/law-and-justice/e-justice"
-    And I should see the text "What do we mean by Legislation & Technology?" in the "Legislation & Technology" tile
+    And I should see the text "default abstract" in the "Legislation & Technology" tile
     And I should not see the text "What do we mean by Legislation &amp; Technology?" in the "Legislation & Technology" tile
 
   @javascript
@@ -592,5 +595,5 @@ Feature:
     And the url should match "/topic/law-and-justice/e-justice"
     And I should see the text "Magic abstract" in the "Col with abstract" tile
     And I should see the text "Another abstract" in the "Col without abstract" tile
-    And I should see the text "Lorem description issum" in the "Another rough day" tile
+    And I should see the text "default abstract" in the "Another rough day" tile
     And I should see the text "This is an soltion with abstract" in the "Just another solt" tile
-- 
GitLab


From 6d7e516d5c9487ab8a84d253fdd188bac52bd4a6 Mon Sep 17 00:00:00 2001
From: "micha.jakubowski" <micha.jakubowski@ffwagency.com>
Date: Thu, 5 Dec 2024 19:18:05 +0100
Subject: [PATCH 046/137] ISAICP-8780: fix tests - group default

---
 tests/features/homepage.feature | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/tests/features/homepage.feature b/tests/features/homepage.feature
index 952e149b60..dc289acacc 100644
--- a/tests/features/homepage.feature
+++ b/tests/features/homepage.feature
@@ -306,7 +306,7 @@ Feature: Homepage
       | solution   | Cities of Bulgaria          | 2018-11-14 17:36     | Supports fields                                                                                                                                                                                                               |
       | news       | Current biodiversity adapt  | 2021-04-30T19:09:00Z | Biodiversity adapt abstract                                                                                                                                                                                                   |
       | news       | Super-Alfvenic plasma flow  | 2021-04-29T10:18:00Z | default abstract                                                                                                                                                                                                              |
-      | news       | H-rich Wolf-Rayet star      | 2021-03-29T10:18:00Z | Polarimetric analysis Watch our video                                                                                                                                                                                         |
+      | news       | H-rich Wolf-Rayet star      | 2021-03-29T10:18:00Z | default abstract                                                                                                                                                                                         |
       | news       | Spatial construction        | 2021-02-26T13:15:00Z | Global land use history confirms that empowering the environmental stewardship of Indigenous peoples and local communities will be critical to conserving biodiversity across the planet.                                     |
       | news       | Environmental tests         | 2021-01-27T16:12:00Z | With rare exceptions current biodiversity losses are caused not by human conversion or degradation of untouched ecosystems but rather by the appropriation colonization and intensification of use in...                      |
       | news       | Easier transformations      | 2021-01-09T10:18:00Z | Archaeological evidence shows that by 10000 BCE all societies employed ecologically transformative land use practices including burning hunting species propagation domestication cultivation have left...                    |
-- 
GitLab


From 8485613a6ce72a8dd9bcb1ba9f11fb13bd86008d Mon Sep 17 00:00:00 2001
From: "micha.jakubowski" <micha.jakubowski@ffwagency.com>
Date: Thu, 5 Dec 2024 23:14:22 +0100
Subject: [PATCH 047/137] ISAICP-8780: fix tests - group i

---
 .../solution/related_solution.feature         | 20 ++++++++++++-------
 .../solution/solution.contact.feature         |  3 +--
 tests/src/Context/JoinupContext.php           |  3 +--
 3 files changed, 15 insertions(+), 11 deletions(-)

diff --git a/tests/features/solution/related_solution.feature b/tests/features/solution/related_solution.feature
index 40cd5d6489..5a19e2d713 100644
--- a/tests/features/solution/related_solution.feature
+++ b/tests/features/solution/related_solution.feature
@@ -4,14 +4,20 @@ Feature: Related solution
   solutions and present the related solutions to the users.
 
   Background:
+    Given contact_information content:
+      | name        | email       |
+      | Kalikatoura | bar@bar.com |
+    And owner content:
+      | name         | owner type |
+      | Kalikatoures | Company    |
     Given solution content:
-      | title      | related solutions | related by type | moderation |
-      | C          |                   | yes             | no         |
-      | Java       | C                 | yes             | no         |
-      | PHP        |                   | yes             | yes        |
-      | Golang     |                   | yes             | yes        |
-      | Python     |                   | yes             | no         |
-      | Javascript | Java, PHP         | no              | no         |
+      | title      | related solutions | abstract                         | description                         | documentation | related by type | moderation | logo     | topic      | state     | solution type | owner        | contact information |
+      | C          |                   | Blazing fast segmentation faults | Blazing fast segmentation faults.   | text.pdf      | yes             | no         | logo.png | Demography | published |               | Kalikatoures | Kalikatoura         |
+      | Java       | C                 | Because inheritance is cool      | Because inheritance is cool.        | text.pdf      | yes             | no         | logo.png | Demography | published | Citizen       | Kalikatoures | Kalikatoura         |
+      | PHP        |                   | Make a site                      | Make a site.                        | text.pdf      | yes             | yes        | logo.png | Demography | published | Citizen       | Kalikatoures | Kalikatoura         |
+      | Golang     |                   | Concurrency for the masses       | Concurrency for the masses          | text.pdf      | yes             | yes        | logo.png | Demography | proposed  | Citizen       | Kalikatoures | Kalikatoura         |
+      | Python     |                   | Get stuff done                   | Get stuff done.                     | text.pdf      | yes             | no         | logo.png | Demography | published |               | Kalikatoures | Kalikatoura         |
+      | Javascript | Java, PHP         | Java is related to javascript    | Java is related to javascript. Huh? | text.pdf      | no              | no         | logo.png | Demography | published | Citizen       | Kalikatoures | Kalikatoura         |
 
   # @covers \joinup_solution_get_related_solutions_ids.
   Scenario: Related solutions
diff --git a/tests/features/solution/solution.contact.feature b/tests/features/solution/solution.contact.feature
index c110f04574..ab50ddce6e 100644
--- a/tests/features/solution/solution.contact.feature
+++ b/tests/features/solution/solution.contact.feature
@@ -9,7 +9,6 @@ Feature: Contact form for solution
       | Jocelyn Bass | jocelyn.bass@example.com | http://www.example.org | 1001 |
       | John Revoked | john@example.com         | http://www.example.org | 1002 |
       | John Deleted | deleted@example.com      | http://www.example.org | 1003 |
-    And I break
     And the following email confirmation request:
       | email                    | status    |
       | jocelyn.bass@example.com | confirmed |
@@ -27,8 +26,8 @@ Feature: Contact form for solution
 
     # Anonymous case.
     When I am not logged in
-    And I break
     And I go to the homepage of the "Six exclusion advantages" solution
+    And I break
     Then I should see the link "John Revoked"
     # Page was rendered, but in the meantime, contact is changed on backend.
     Given there are no preexisting log records on the site
diff --git a/tests/src/Context/JoinupContext.php b/tests/src/Context/JoinupContext.php
index 0dbf4a7067..39c7f5b573 100644
--- a/tests/src/Context/JoinupContext.php
+++ b/tests/src/Context/JoinupContext.php
@@ -748,8 +748,7 @@ public function massageFieldsBeforeNodeCreate(BeforeNodeCreateScope $scope): voi
     if (!empty($node->field_state)) {
       $node->field_state = self::translateWorkflowStateAlias($node->field_state);
     }
-
-    elseif (!empty($field_definitions['field_state']) && empty($node->field_state)) {
+    elseif (!empty($field_definitions['field_state']) && empty($node->field_state) && $node->type != 'contact_information') {
       $node->field_state = 'published';
     }
 
-- 
GitLab


From 27660a8d8fd1ce2cddad1b86915728fb21bd42cc Mon Sep 17 00:00:00 2001
From: "micha.jakubowski" <micha.jakubowski@ffwagency.com>
Date: Thu, 5 Dec 2024 23:51:02 +0100
Subject: [PATCH 048/137] ISAICP-8780: fix tests - group default

---
 tests/features/homepage.feature | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/tests/features/homepage.feature b/tests/features/homepage.feature
index dc289acacc..cd96f08843 100644
--- a/tests/features/homepage.feature
+++ b/tests/features/homepage.feature
@@ -306,10 +306,10 @@ Feature: Homepage
       | solution   | Cities of Bulgaria          | 2018-11-14 17:36     | Supports fields                                                                                                                                                                                                               |
       | news       | Current biodiversity adapt  | 2021-04-30T19:09:00Z | Biodiversity adapt abstract                                                                                                                                                                                                   |
       | news       | Super-Alfvenic plasma flow  | 2021-04-29T10:18:00Z | default abstract                                                                                                                                                                                                              |
-      | news       | H-rich Wolf-Rayet star      | 2021-03-29T10:18:00Z | default abstract                                                                                                                                                                                         |
-      | news       | Spatial construction        | 2021-02-26T13:15:00Z | Global land use history confirms that empowering the environmental stewardship of Indigenous peoples and local communities will be critical to conserving biodiversity across the planet.                                     |
-      | news       | Environmental tests         | 2021-01-27T16:12:00Z | With rare exceptions current biodiversity losses are caused not by human conversion or degradation of untouched ecosystems but rather by the appropriation colonization and intensification of use in...                      |
-      | news       | Easier transformations      | 2021-01-09T10:18:00Z | Archaeological evidence shows that by 10000 BCE all societies employed ecologically transformative land use practices including burning hunting species propagation domestication cultivation have left...                    |
+      | news       | H-rich Wolf-Rayet star      | 2021-03-29T10:18:00Z | default abstract                                                                                                                                                                                                              |
+      | news       | Spatial construction        | 2021-02-26T13:15:00Z | default abstract                                                                                                                                                                                                              |
+      | news       | Environmental tests         | 2021-01-27T16:12:00Z | default abstract                                                                                                                                                                                                              |
+      | news       | Easier transformations      | 2021-01-09T10:18:00Z | default abstract                                                                                                                                                                                                              |
       | event      | SXR plasma supply           | 2021-05-30T10:18:00Z |                                                                                                                                                                                                                               |
       | event      | Dark material               | 2021-04-30T10:18:00Z | The presence of a relatively large magnetic field is acting as a quenching agent. The authors say the observations confirm their hypothesis that there is a strong active magnetic field interacting...                       |
       | event      | Thick-target news           | 2021-04-27T19:05:00Z | Abstract: Evaporation                                                                                                                                                                                                         |
-- 
GitLab


From f9a6f04583b80fc7355c7093a89342519f6b984c Mon Sep 17 00:00:00 2001
From: "micha.jakubowski" <micha.jakubowski@ffwagency.com>
Date: Fri, 6 Dec 2024 08:49:08 +0100
Subject: [PATCH 049/137] ISAICP-8780: fix tests - group default

---
 tests/features/homepage.feature | 12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)

diff --git a/tests/features/homepage.feature b/tests/features/homepage.feature
index cd96f08843..b6d078b6f1 100644
--- a/tests/features/homepage.feature
+++ b/tests/features/homepage.feature
@@ -310,13 +310,13 @@ Feature: Homepage
       | news       | Spatial construction        | 2021-02-26T13:15:00Z | default abstract                                                                                                                                                                                                              |
       | news       | Environmental tests         | 2021-01-27T16:12:00Z | default abstract                                                                                                                                                                                                              |
       | news       | Easier transformations      | 2021-01-09T10:18:00Z | default abstract                                                                                                                                                                                                              |
-      | event      | SXR plasma supply           | 2021-05-30T10:18:00Z |                                                                                                                                                                                                                               |
-      | event      | Dark material               | 2021-04-30T10:18:00Z | The presence of a relatively large magnetic field is acting as a quenching agent. The authors say the observations confirm their hypothesis that there is a strong active magnetic field interacting...                       |
+      | event      | SXR plasma supply           | 2021-05-30T10:18:00Z | default abstract                                                                                                                                                                                                              |
+      | event      | Dark material               | 2021-04-30T10:18:00Z | default abstract                                                                                                                                                                                                              |
       | event      | Thick-target news           | 2021-04-27T19:05:00Z | Abstract: Evaporation                                                                                                                                                                                                         |
-      | event      | Cooling losses              | 2021-03-20T10:18:00Z | Single-loop                                                                                                                                                                                                                   |
-      | event      | Source of SXR plasma supply | 2021-02-27T13:15:00Z | Fast electrons                                                                                                                                                                                                                |
-      | event      | Plasma supply               | 2021-01-30T10:18:00Z | Fast electrons                                                                                                                                                                                                                |
-      | event      | Stars material              | 2021-01-10T10:18:00Z | Colossal material! Read our greypaper.                                                                                                                                                                                        |
+      | event      | Cooling losses              | 2021-03-20T10:18:00Z | default abstract                                                                                                                                                                                                              |
+      | event      | Source of SXR plasma supply | 2021-02-27T13:15:00Z | default abstract                                                                                                                                                                                                              |
+      | event      | Plasma supply               | 2021-01-30T10:18:00Z | default abstract                                                                                                                                                                                                              |
+      | event      | Stars material              | 2021-01-10T10:18:00Z | default abstract                                                                                                                                                                                                              |
 
     And I should see the button "Solutions" in the "Explore block"
     And I should see the button "Collections" in the "Explore block"
-- 
GitLab


From c59957cd231bd3602d2765498485dbcb17de3c71 Mon Sep 17 00:00:00 2001
From: "micha.jakubowski" <micha.jakubowski@ffwagency.com>
Date: Fri, 6 Dec 2024 10:42:38 +0100
Subject: [PATCH 050/137] ISAICP-8780: fix tests - group g

---
 tests/features/joinup_seo/document.feature             | 10 +++++-----
 tests/features/joinup_seo/event.feature                |  5 ++---
 .../joinup_rdf/src/Entity/RdfSyncEntityTrait.php       |  2 +-
 3 files changed, 8 insertions(+), 9 deletions(-)

diff --git a/tests/features/joinup_seo/document.feature b/tests/features/joinup_seo/document.feature
index d03b87ee9f..99962361a0 100644
--- a/tests/features/joinup_seo/document.feature
+++ b/tests/features/joinup_seo/document.feature
@@ -6,19 +6,19 @@ Feature: SEO for document content.
 
   Background:
     Given collection content:
-      | title                          | state     |
+      | title                                               | state     |
       | Interoperable Europe Portal SEO document collection | published |
     And licence content:
       | uri                          | title        | licence type  |
       | https://example.com/license1 | Some license | Public domain |
     And users:
-      | Username          | E-mail                 | First name | Family name |
+      | Username                               | E-mail                 | First name | Family name |
       | Interoperable Europe Portal SEO author | portal.seo@example.com | Scrapper   | Jedi        |
 
   Scenario: Basic metatags are attached as JSON schema on the page.
     Given document content:
-      | title        | author            | document type | document publication date | changed                   | keywords         | short title | file type | file     | field_paragraphs_body | licence      | state     | collection                     |
-      | SEO document | Interoperable Europe Portal SEO author | document      | Wed, 25 Dec 2019 13:00:00 | Wed, 01 Jan 2020 13:00:00 | key1, key2, key3 | SEO         | upload    | test.zip | Document test1.zip    | Some license | published | Interoperable Europe Portal SEO document collection |
+      | title        | author                                 | document type | document publication date | changed                   | keywords         | short title | file type | file     | field_paragraphs_body | licence      | state     | collection                                          | abstract |
+      | SEO document | Interoperable Europe Portal SEO author | document      | Wed, 25 Dec 2019 13:00:00 | Wed, 01 Jan 2020 13:00:00 | key1, key2, key3 | SEO         | upload    | test.zip | Document test1.zip    | Some license | published | Interoperable Europe Portal SEO document collection |          |
 
     When I visit the "SEO document" document
     Then the metatag JSON should be attached in the page
@@ -75,7 +75,7 @@ Feature: SEO for document content.
 
   Scenario: Metatags for remote URL in documents.
     Given document content:
-      | title        | author            | document publication date | changed                   | file type | file                                       | abstract                    | field_paragraphs_body   | state     | collection                     |
+      | title        | author                                 | document publication date | changed                   | file type | file                                       | abstract                    | field_paragraphs_body   | state     | collection                                          |
       | SEO document | Interoperable Europe Portal SEO author | Wed, 25 Dec 2019 13:00:00 | Wed, 01 Jan 2020 13:00:00 | remote    | http://example.com/some-file-url.extension | Remote url example abstract | Remote url example body | published | Interoperable Europe Portal SEO document collection |
 
     When I visit the "SEO document" document
diff --git a/tests/features/joinup_seo/event.feature b/tests/features/joinup_seo/event.feature
index 50df553551..1942cf7881 100644
--- a/tests/features/joinup_seo/event.feature
+++ b/tests/features/joinup_seo/event.feature
@@ -12,9 +12,8 @@ Feature: SEO for news articles.
       | Username          | E-mail                 | First name | Family name |
       | Joinup SEO author | joinup.seo@example.com | Patrick    | Stewart     |
     And "event" content:
-      | title            | short title   | web url   | start date                | end date                  | body           | logo     | agenda        | location   | online location                                          | organisation        | scope         | keywords | collection                  | state     |
-      | Joinup SEO event | JOINUPSEO2020 | <web url> | Wed, 25 Dec 2019 13:00:00 | Wed, 01 Jan 2020 13:00:00 | Body of event. | logo.png | Event agenda. | <location> | 0: Some title - 1: http://example.com/some-online-meetup | European Commission | International | Alphabet | Joinup SEO event collection | published |
-
+      | title            | short title   | web url   | start date                | end date                  | body           | logo     | agenda        | location   | online location                                          | organisation        | scope         | keywords | collection                  | state     | abstract |
+      | Joinup SEO event | JOINUPSEO2020 | <web url> | Wed, 25 Dec 2019 13:00:00 | Wed, 01 Jan 2020 13:00:00 | Body of event. | logo.png | Event agenda. | <location> | 0: Some title - 1: http://example.com/some-online-meetup | European Commission | International | Alphabet | Joinup SEO event collection | published |          |
     When I visit the "Joinup SEO event" event
     Then the metatag JSON should be attached in the page
     And 1 metatag graph of type "http://schema.org/Event" should exist in the page
diff --git a/web/modules/custom/joinup_rdf/src/Entity/RdfSyncEntityTrait.php b/web/modules/custom/joinup_rdf/src/Entity/RdfSyncEntityTrait.php
index 9354eac112..58672f6732 100644
--- a/web/modules/custom/joinup_rdf/src/Entity/RdfSyncEntityTrait.php
+++ b/web/modules/custom/joinup_rdf/src/Entity/RdfSyncEntityTrait.php
@@ -15,7 +15,7 @@ trait RdfSyncEntityTrait {
   public function getUri(): string {
     assert($this instanceof RdfSyncEntityInterface);
     $fieldName = \Drupal::getContainer()->get('rdf_sync.mapper')->getRdfUriFieldName(entity: $this);
-    return $this->get($fieldName)->value;
+    return $this->get($fieldName)->value ?? '';
   }
 
   /**
-- 
GitLab


From aa660c9a00de804e5060279b4d7e9a72b04e5822 Mon Sep 17 00:00:00 2001
From: "micha.jakubowski" <micha.jakubowski@ffwagency.com>
Date: Fri, 6 Dec 2024 10:43:19 +0100
Subject: [PATCH 051/137] ISAICP-8780: fix tests - group g

---
 tests/features/joinup_seo/news.feature | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/tests/features/joinup_seo/news.feature b/tests/features/joinup_seo/news.feature
index 911f250030..70a85033c0 100644
--- a/tests/features/joinup_seo/news.feature
+++ b/tests/features/joinup_seo/news.feature
@@ -12,8 +12,8 @@ Feature: SEO for news articles.
       | Username                               | E-mail                 | First name | Family name |
       | Interoperable Europe Portal SEO author | joinup.seo@example.com | Kurk       | Smith       |
     And news content:
-      | title                                | headline                                         | logo     | field_paragraphs_body | created                   | published at              | changed                   | state     | author                                 | collection                                      |
-      | Interoperable Europe Portal SEO news | Headline of Interoperable Europe Portal SEO news | logo.png | Body of news.         | Sun, 01 Dec 2019 13:00:00 | Wed, 25 Dec 2019 13:00:00 | Wed, 01 Jan 2020 13:00:00 | published | Interoperable Europe Portal SEO author | Interoperable Europe Portal SEO news collection |
+      | title                                | headline                                         | logo     | field_paragraphs_body | created                   | published at              | changed                   | state     | author                                 | collection                                      | abstract |
+      | Interoperable Europe Portal SEO news | Headline of Interoperable Europe Portal SEO news | logo.png | Body of news.         | Sun, 01 Dec 2019 13:00:00 | Wed, 25 Dec 2019 13:00:00 | Wed, 01 Jan 2020 13:00:00 | published | Interoperable Europe Portal SEO author | Interoperable Europe Portal SEO news collection |          |
 
     When I visit the "Interoperable Europe Portal SEO news" news
     Then the metatag JSON should be attached in the page
-- 
GitLab


From e8016b1218156391add4e50a9cd8347985a10cd1 Mon Sep 17 00:00:00 2001
From: "micha.jakubowski" <micha.jakubowski@ffwagency.com>
Date: Fri, 6 Dec 2024 10:44:34 +0100
Subject: [PATCH 052/137] ISAICP-8780: general fix

---
 tests/src/Context/JoinupContext.php           | 184 ++++++++++++------
 .../custom/joinup_test/joinup_test.install    |  87 +++++----
 2 files changed, 172 insertions(+), 99 deletions(-)

diff --git a/tests/src/Context/JoinupContext.php b/tests/src/Context/JoinupContext.php
index 39c7f5b573..12a29b568f 100644
--- a/tests/src/Context/JoinupContext.php
+++ b/tests/src/Context/JoinupContext.php
@@ -138,7 +138,8 @@ public function assertTextCount(string $text, int $count): void {
    * @throws \Exception
    *   Thrown when a collection or solution with the given label doesn't exist.
    *
-   * @Given I am logged in as a user with the :role role(s) of the :group_label :group_bundle
+   * @Given I am logged in as a user with the :role role(s) of the :group_label
+   *   :group_bundle
    * @Given I am logged in as a/an :role of the :group_label :group_bundle
    *
    * @see \Drupal\DrupalExtension\Context\DrupalContext::assertAuthenticatedByRole()
@@ -218,7 +219,8 @@ public function updateGroupRoles(string $group_label, string $group_bundle, stri
    * @throws \Exception
    *   Thrown when a collection or solution with the given label doesn't exist.
    *
-   * @Given my membership state in the :group_label :group_bundle changes to :state
+   * @Given my membership state in the :group_label :group_bundle changes to
+   *   :state
    */
   public function updateGroupState(string $group_label, string $group_bundle, string $state): void {
     $entity = $this->getEntityByLabel('node', $group_label, $group_bundle);
@@ -250,16 +252,19 @@ public function updateGroupState(string $group_label, string $group_bundle, stri
    * @see \Drupal\DrupalExtension\Context\RawDrupalContext::loggedInWithRole
    */
   protected function loggedInWithOgRoles(array $roles, GroupInterface $group): bool {
-    if ($this->getUserManager()->currentUserIsAnonymous() || !$this->loggedIn()) {
+    if ($this->getUserManager()
+        ->currentUserIsAnonymous() || !$this->loggedIn()) {
       return FALSE;
     }
     $current_user = $this->getUserManager()->getCurrentUser();
-    $user = \Drupal::entityTypeManager()->getStorage('user')->loadUnchanged($current_user->uid);
+    $user = \Drupal::entityTypeManager()
+      ->getStorage('user')
+      ->loadUnchanged($current_user->uid);
     $membership = $group->getMembership((int) $user->id());
     if (empty($membership)) {
       return FALSE;
     }
-    $expected_roles_ids = array_map(function (OgRoleInterface $role): string {
+    $expected_roles_ids = array_map(function(OgRoleInterface $role): string {
       return $role->id();
     }, $roles);
     $actual_roles_ids = $membership->getRolesIds();
@@ -289,7 +294,9 @@ public function submitRegistrationForm(TableNode $table, $location): void {
     $this->getSession()->getPage()->pressButton("Create new account");
 
     // Get the last registered user.
-    $results = \Drupal::entityTypeManager()->getStorage('user')->loadByProperties(['name' => $username]);
+    $results = \Drupal::entityTypeManager()
+      ->getStorage('user')
+      ->loadByProperties(['name' => $username]);
     /** @var \Drupal\user\UserInterface $user */
     $user = reset($results);
 
@@ -317,7 +324,7 @@ public function submitRegistrationForm(TableNode $table, $location): void {
    */
   public function checkSelectContainsOptions($select, $options): void {
     $field = $this->findSelect($select);
-    $available_options = array_map(function (array $option): string {
+    $available_options = array_map(function(array $option): string {
       return $option['text'];
     }, $this->getSelectOptions($field));
     $options = $this->explodeCommaSeparatedStepArgument($options);
@@ -359,7 +366,7 @@ public function checkSelectOptionsSortedAlphabetically(string $select): void {
    */
   public function checkSelectDoesNotContainOptions($select, $options): void {
     $field = $this->findSelect($select);
-    $available_options = array_map(function (array $option): string {
+    $available_options = array_map(function(array $option): string {
       return $option['text'];
     }, $this->getSelectOptions($field));
     $options = $this->explodeCommaSeparatedStepArgument($options);
@@ -402,7 +409,7 @@ public function assertSelectOptionsAsList($select, TableNode $table): void {
    */
   public function assertSelectOptions($select, $options): void {
     $field = $this->findSelect($select);
-    $availableOptions = array_map(function (array $option): string {
+    $availableOptions = array_map(function(array $option): string {
       return $option['text'];
     }, $this->getSelectOptions($field));
     sort($availableOptions);
@@ -436,7 +443,7 @@ public function assertCheckboxesFieldOptions(string $field, TableNode $options):
 
     // Get the checkboxes.
     $checkboxes = $field->findAll('css', 'input[type="checkbox"]');
-    $checkboxLabels = array_map(function (NodeElement $checkbox): string {
+    $checkboxLabels = array_map(function(NodeElement $checkbox): string {
       return $checkbox->getParent()->getText();
     }, $checkboxes);
 
@@ -455,11 +462,12 @@ public function assertCheckboxesFieldOptions(string $field, TableNode $options):
    * @param string $options
    *   A comma separated list of items to check.
    *
-   * @Then the available options in the :select select should not include the :options( options)
+   * @Then the available options in the :select select should not include the
+   *   :options( options)
    */
   public function assertSelectOptionNotAvailable($select, $options): void {
     $field = $this->findSelect($select);
-    $availableOptions = array_map(function (array $option): string {
+    $availableOptions = array_map(function(array $option): string {
       return $option['text'];
     }, $this->getSelectOptions($field));
     $options = $this->explodeCommaSeparatedStepArgument($options);
@@ -640,7 +648,9 @@ public function assertNodeRevisionCount($bundle, $title, $count): void {
     /** @var \Drupal\node\NodeInterface $node */
     $node = $this->getEntityByLabel('node', $title, $bundle);
 
-    $revision_count = \Drupal::entityTypeManager()->getStorage('node')->getQuery()
+    $revision_count = \Drupal::entityTypeManager()
+      ->getStorage('node')
+      ->getQuery()
       ->allRevisions()
       ->accessCheck(FALSE)
       ->condition('nid', $node->id())
@@ -671,7 +681,8 @@ public function assertNodeRevisionCount($bundle, $title, $count): void {
    */
   public function massageFieldsBeforeNodeCreate(BeforeNodeCreateScope $scope): void {
     $node = $scope->getEntity();
-    $field_definitions = \Drupal::service('entity_field.manager')->getFieldDefinitions('node', $node->type);
+    $field_definitions = \Drupal::service('entity_field.manager')
+      ->getFieldDefinitions('node', $node->type);
     // Replace field label aliases with the actual field names.
     foreach (get_object_vars($node) as $alias => $value) {
       $name = $this->getNodeFieldNameFromAlias($node->type, $alias);
@@ -820,9 +831,10 @@ public function massageFieldsBeforeNodeCreate(BeforeNodeCreateScope $scope): voi
     if (!empty($field_definitions['owner']) && empty($node->owner)) {
       $node->owner = $this->getDefaultOwner()->label();
     }
-    if (!empty($field_definitions['abstract']) && empty($node->abstract)) {
+    if (!empty($field_definitions['abstract']) && !isset($node->abstract)) {
       $node->abstract = 'default abstract';
     }
+
     if (!empty($field_definitions['description']) && empty($node->descritpion)) {
       $node->description = 'default description';
     }
@@ -963,8 +975,10 @@ public function clearDateRangeField($field, $component, $date = NULL): void {
   public function assertDateTimeFieldValue(string $field): void {
     $now = new \DateTimeImmutable();
 
-    $date_part = $this->findDateRangeComponent($field, 'date')->getAttribute('value');
-    $time_part = $this->findDateRangeComponent($field, 'time')->getAttribute('value');
+    $date_part = $this->findDateRangeComponent($field, 'date')
+      ->getAttribute('value');
+    $time_part = $this->findDateRangeComponent($field, 'time')
+      ->getAttribute('value');
     if (empty($date_part) || empty($time_part)) {
       throw new ExpectationFailedException("The '{$field}' date/time field is not filled with the current time.");
     }
@@ -998,8 +1012,10 @@ public function assertDateTimeFieldValue(string $field): void {
    *   Thrown when the field was not found.
    */
   public function findDateFields($field): array {
-    $field_selectors = $this->getSession()->getPage()->findAll('css', '.field--widget-datetime-timestamp');
-    $field_selectors = array_filter($field_selectors, function ($field_selector) use ($field) {
+    $field_selectors = $this->getSession()
+      ->getPage()
+      ->findAll('css', '.field--widget-datetime-timestamp');
+    $field_selectors = array_filter($field_selectors, function($field_selector) use ($field) {
       return $field_selector->has('named', ['content', $field]);
     });
     if (empty($field_selectors)) {
@@ -1158,7 +1174,8 @@ public function assertTilePresent(string $heading): void {
       // Custom page cards in carousels have a different structure. In order to
       // identify the tile, we need to check the title of the first "a" element.
       // First, retrieve the parent element so that the "a" element is present.
-      if ($result->getParent()->find('xpath', "/a[contains(@title, \"{$heading}\")]")) {
+      if ($result->getParent()
+        ->find('xpath', "/a[contains(@title, \"{$heading}\")]")) {
         return;
       }
     }
@@ -1278,7 +1295,8 @@ public function assertTextVisible($text, $region): void {
    *   element of the list heading if given.
    *
    * @Then I( should) see the( following) tiles in the correct order:
-   * @Then in the :list_title list, I should see the following tiles in the correct order:
+   * @Then in the :list_title list, I should see the following tiles in the
+   *   correct order:
    */
   public function assertOrderedTilesPresent(TableNode $titles_table, ?string $list_title = NULL): void {
     $headings = array_keys($this->getTiles(listTitle: $list_title));
@@ -1507,7 +1525,9 @@ public function assertFormSubmitButtonsVisible($buttons, $count = NULL): void {
       // Only check the actual form submit buttons, ignore other buttons that
       // might be present in wysiwygs or are used to add multiple values to a
       // field.
-      $actual = count($this->getSession()->getPage()->findAll('xpath', '//main//div[contains(concat(" ", normalize-space(@class), " "), " form-actions ")]//input[@type = "submit"]'));
+      $actual = count($this->getSession()
+        ->getPage()
+        ->findAll('xpath', '//main//div[contains(concat(" ", normalize-space(@class), " "), " form-actions ")]//input[@type = "submit"]'));
       Assert::assertEquals($count, $actual);
     }
   }
@@ -1545,7 +1565,9 @@ public function assertButtonsNotVisible($buttons): void {
    * @Then I should see the plus button menu
    */
   public function assertPlusButtonMenuPresent(): void {
-    $element = $this->getSession()->getPage()->find('css', '#dropdown-add-content');
+    $element = $this->getSession()
+      ->getPage()
+      ->find('css', '#dropdown-add-content');
     Assert::assertNotEmpty($element);
   }
 
@@ -1555,7 +1577,9 @@ public function assertPlusButtonMenuPresent(): void {
    * @Then I should not see the plus button menu
    */
   public function assertPlusButtonMenuNotPresent(): void {
-    $element = $this->getSession()->getPage()->find('css', 'div.add-content-menu ul');
+    $element = $this->getSession()
+      ->getPage()
+      ->find('css', 'div.add-content-menu ul');
     Assert::assertEmpty($element);
   }
 
@@ -1589,7 +1613,9 @@ public function openPlusButtonMenu(): void {
       return;
     }
 
-    $button = $this->getSession()->getPage()->find('css', '#dropdown-add-content');
+    $button = $this->getSession()
+      ->getPage()
+      ->find('css', '#dropdown-add-content');
     $button->press();
   }
 
@@ -1601,7 +1627,10 @@ public function openPlusButtonMenu(): void {
   public function iOpenTheEntityTasksMenu(): void {
     if ($this->hasJavascriptSupport()) {
       $entity_tasks_selector = $this->getRegionSelector('Entity actions');
-      $this->getSession()->getPage()->find('css', "$entity_tasks_selector button")->press();
+      $this->getSession()
+        ->getPage()
+        ->find('css', "$entity_tasks_selector button")
+        ->press();
     }
   }
 
@@ -1619,7 +1648,9 @@ public function iOpenTheAccountMenu(): void {
 
     // Depending on the screen width, a different dropdown item may be visible.
     /** @var \Behat\Mink\Element\NodeElement[] $elements */
-    $elements = $this->getSession()->getPage()->findAll('css', '#main-navbar .dropdown');
+    $elements = $this->getSession()
+      ->getPage()
+      ->findAll('css', '#main-navbar .dropdown');
     foreach ($elements as $element) {
       if ($element->isVisible()) {
         $this->openBootstrapDropdown($element);
@@ -1664,7 +1695,9 @@ public function relativeUrlMatches(string $method, string $url): void {
    */
   public function assertEmptyPlusButtonMenu(): void {
     if ($this->hasJavascriptSupport()) {
-      if ($this->getSession()->getPage()->findAll('xpath', '//div[contains(concat(" ", normalize-space(@class), " "), " add-content-menu ")]//li[last()]')) {
+      if ($this->getSession()
+        ->getPage()
+        ->findAll('xpath', '//div[contains(concat(" ", normalize-space(@class), " "), " add-content-menu ")]//li[last()]')) {
         throw new \Exception("The plus button menu is not empty.");
       }
     }
@@ -1773,7 +1806,9 @@ public function createComments(TableNode $table): void {
    * @Then the current workflow state should be :state
    */
   public function assertCurrentWorkflowState($state): void {
-    $element = $this->getSession()->getPage()->find('css', 'div.current-workflow-state');
+    $element = $this->getSession()
+      ->getPage()
+      ->find('css', 'div.current-workflow-state');
     if (empty($element)) {
       throw new \Exception('The current workflow state field is not present on the page.');
     }
@@ -1838,7 +1873,8 @@ public function assertFieldDescription($label, $description): void {
    * @throws \Exception
    *   Thrown when the field does not have a description.
    *
-   * @Then I should not see the description :description for (the ):label( field)
+   * @Then I should not see the description :description for (the ):label(
+   *   field)
    */
   public function assertNoFieldDescription($label, $description): void {
     $xpath = '//label[text()="' . $label . '"]/ancestor::div[contains(concat(" ", normalize-space(@class), " "), " form-item ")]//div[contains(concat(" ", normalize-space(@class), " "), " description ")] | //label[text()="' . $label . '"]/ancestor::div[contains(concat(" ", normalize-space(@class), " "), " form-item ")]//small[contains(concat(" ", normalize-space(@class), " "), " description ")]';
@@ -1970,7 +2006,8 @@ public function assertFieldContainsLinkToPage($field, $title): void {
    * @throws \Exception
    *   Thrown when the link is not in the page.
    *
-   * @Then /^the share link "(?P<link>[^"]+)" should point to the "(?P<title>[^"]+)" content(?:| entity)$/
+   * @Then /^the share link "(?P<link>[^"]+)" should point to the
+   *   "(?P<title>[^"]+)" content(?:| entity)$/
    */
   public function assertLinkContainsEntityUrl(string $link, string $title): void {
     /** @var \Drupal\Core\Entity\EntityInterface $entity */
@@ -2041,7 +2078,8 @@ public function ogCleanup(AfterScenarioScope $event): void {
   /**
    * Assert that a given attribute is not set for a given element in a region.
    *
-   * @Then I( should) not see the :tag element with the :attribute attribute set to :value in the :region( region)
+   * @Then I( should) not see the :tag element with the :attribute attribute
+   *   set to :value in the :region( region)
    */
   public function assertRegionElementAttribute($tag, $attribute, $value, $region): void {
     $regionObj = $this->getRegion($region);
@@ -2054,7 +2092,8 @@ public function assertRegionElementAttribute($tag, $attribute, $value, $region):
         $attr = $element->getAttribute($attribute);
         if (!empty($attr)) {
           if (strpos($attr, "$value") !== FALSE) {
-            throw new \Exception(sprintf('The "%s" attribute is equal to "%s" on the element "%s" in the "%s" region on the page %s', $attribute, $value, $tag, $region, $this->getSession()->getCurrentUrl()));
+            throw new \Exception(sprintf('The "%s" attribute is equal to "%s" on the element "%s" in the "%s" region on the page %s', $attribute, $value, $tag, $region, $this->getSession()
+              ->getCurrentUrl()));
           }
         }
       }
@@ -2067,7 +2106,8 @@ public function assertRegionElementAttribute($tag, $attribute, $value, $region):
    * @Then the persistent url should contain :pattern
    */
   public function thePersistentUrlShouldContain($pattern): void {
-    $this->assertSession()->elementAttributeContains('css', '.permalink', 'href', $pattern);
+    $this->assertSession()
+      ->elementAttributeContains('css', '.permalink', 'href', $pattern);
   }
 
   /**
@@ -2139,8 +2179,8 @@ public function fillFieldWithNormalisedEntityReference(string $value, ?string $f
       // @see ::locatePath()
       $client = new Client(['base_uri' => $this->getMinkParameter('base_url')]);
       $uri = $element->getAttribute('data-autocomplete-path') . '?' . UrlHelper::buildQuery([
-        'q' => $value,
-      ]);
+          'q' => $value,
+        ]);
       $response = $client->get($uri);
 
       if ($response->getStatusCode() !== 200) {
@@ -2247,7 +2287,7 @@ public function assertNoActiveLinksInRegion($region): void {
     $links = $this->findLinksMarkedAsActive($region);
 
     if (!empty($links)) {
-      $labels = array_map(function ($link) {
+      $labels = array_map(function($link) {
         /** @var \Behat\Mink\Element\NodeElement $link */
         return $link->getText() . ' (' . $link->getAttribute('href') . ')';
       }, $links);
@@ -2277,7 +2317,7 @@ public function assertActiveLinkInRegion($text, $region): void {
 
     /** @var \Behat\Mink\Element\NodeElement[] $links */
     if (count($links) > 1) {
-      $labels = array_map(function ($link) {
+      $labels = array_map(function($link) {
         /** @var \Behat\Mink\Element\NodeElement $link */
         return $link->getText() . ' (' . $link->getAttribute('href') . ')';
       }, $links);
@@ -2321,6 +2361,8 @@ public function assertTileMarkedAsFeatured($heading): void {
    *
    * @Then the :tile :type tile should not be marked as featured
    *
+   * @see https://citnet.tech.ec.europa.eu/CITnet/jira/browse/ISAICP-4849
+   * @see https://citnet.tech.ec.europa.eu/CITnet/jira/browse/ISAICP-4352
    * @todo Due to the bug described in ISAICP-4352, we have to temporary check
    * if a tile is not featured via backend, rather than checking the DOM.
    * Manually testing or running this Behat step definition Behat in test
@@ -2329,8 +2371,6 @@ public function assertTileMarkedAsFeatured($heading): void {
    * Revert back the check that a tile is not featured by checking the DOM, in
    * ISAICP-4849.
    *
-   * @see https://citnet.tech.ec.europa.eu/CITnet/jira/browse/ISAICP-4849
-   * @see https://citnet.tech.ec.europa.eu/CITnet/jira/browse/ISAICP-4352
    */
   public function assertTileNotMarkedAsFeatured(string $heading, string $type): void {
     assert(in_array($type,
@@ -2365,7 +2405,8 @@ public function assertTileNotMarkedAsFeatured(string $heading, string $type): vo
    *
    * @see \Drupal\DrupalExtension\Context\MarkupContext::assertNotRegionElementText()
    *
-   * @Then I( should) see a(n) :tag element with the text :text in the :region( region)
+   * @Then I( should) see a(n) :tag element with the text :text in the :region(
+   *   region)
    */
   public function assertRegionElementText($tag, $text, $region): void {
     $regionObj = $this->getRegion($region);
@@ -2377,7 +2418,8 @@ public function assertRegionElementText($tag, $text, $region): void {
         }
       }
     }
-    throw new \Exception(sprintf('The text "%s" was not found in the "%s" element in the "%s" region on the page %s', $text, $tag, $region, $this->getSession()->getCurrentUrl()));
+    throw new \Exception(sprintf('The text "%s" was not found in the "%s" element in the "%s" region on the page %s', $text, $tag, $region, $this->getSession()
+      ->getCurrentUrl()));
   }
 
   /**
@@ -2386,7 +2428,9 @@ public function assertRegionElementText($tag, $text, $region): void {
    * @Then a tour should be available
    */
   public function assertTourAvailable(): void {
-    if (!$this->getSession()->getPage()->find('css', 'a.js-tour-start-button')) {
+    if (!$this->getSession()
+      ->getPage()
+      ->find('css', 'a.js-tour-start-button')) {
       throw new \Exception("No tour is available on the page.");
     }
   }
@@ -2491,7 +2535,9 @@ public function assertDraggableMenuTable(TableNode $table, string $group_label,
 
     $group = $this->getEntityByLabel('node', $group_label, $group_bundle);
     /** @var \Behat\Mink\Element\NodeElement[] $rows */
-    $rows = $this->getSession()->getPage()->findAll('css', '#menu-overview tbody tr.draggable');
+    $rows = $this->getSession()
+      ->getPage()
+      ->findAll('css', '#menu-overview tbody tr.draggable');
     $expected = $table->getColumnsHash();
     Assert::assertSameSize($expected, $rows);
 
@@ -2564,12 +2610,14 @@ public function dragTitledTableRowTowardsDirection($title, $direction): void {
    *   page.
    *
    * @Then I drag the table row at position :position( to the) :direction
-   * @Then I drag the table row in the :region region at position :position( to the) :direction
+   * @Then I drag the table row in the :region region at position :position( to
+   *   the) :direction
    */
   public function findTableRowByPositionAndDragTowardsDirection(string $position, string $direction, ?string $region = NULL): void {
     $this->assertJavaScriptEnabledBrowser();
 
-    $region = empty($region) ? $this->getSession()->getPage() : $this->getRegion($region);
+    $region = empty($region) ? $this->getSession()
+      ->getPage() : $this->getRegion($region);
     $row = $this->findDraggableTableRowByPosition((int) $position, $region);
     $this->dragTableRowTowardsDirection($row, $direction);
   }
@@ -2595,7 +2643,8 @@ public function fillLastFieldWithLabel($field, $value): void {
     $fields = $page->findAll('named', ['field', $field]);
 
     if (empty($fields)) {
-      throw new ElementNotFoundException($this->getSession()->getDriver(), 'form field', 'id|name|label|value|placeholder', $field);
+      throw new ElementNotFoundException($this->getSession()
+        ->getDriver(), 'form field', 'id|name|label|value|placeholder', $field);
     }
 
     /** @var \Behat\Mink\Element\NodeElement $last */
@@ -2641,7 +2690,8 @@ public function pressLatestButton(string $label): void {
     $buttons = $page->findAll('named', ['button', $label]);
 
     if (empty($buttons)) {
-      throw new ElementNotFoundException($this->getSession()->getDriver(), 'button', 'label', $label);
+      throw new ElementNotFoundException($this->getSession()
+        ->getDriver(), 'button', 'label', $label);
     }
 
     /** @var \Behat\Mink\Element\NodeElement $last_button */
@@ -2697,7 +2747,7 @@ public function theOutputShouldMatchTheFile($file_path): void {
    * @Then I enter the following for the :label link field:
    */
   public function fillLinkField(TableNode $table, string $label): void {
-    $rows = array_map(function (array $row): array {
+    $rows = array_map(function(array $row): array {
       return array_change_key_case($row);
     }, $table->getColumnsHash());
 
@@ -2710,7 +2760,9 @@ public function fillLinkField(TableNode $table, string $label): void {
         throw new \InvalidArgumentException('Missing URL column in link table.');
       }
       $xpath = "//input[@id=(//label[text()='$label'])[$i]/@for]";
-      $url_input_element = $this->getSession()->getPage()->find('xpath', $xpath);
+      $url_input_element = $this->getSession()
+        ->getPage()
+        ->find('xpath', $xpath);
       if (!$url_input_element) {
         throw new \Exception("URL input field $i not found for link field with label '$label'.'");
       }
@@ -2728,7 +2780,9 @@ public function fillLinkField(TableNode $table, string $label): void {
         throw new \Exception("Malformed HTML ID for URL input field $i for link field with label '$label'.");
       }
 
-      $title_input_element = $this->getSession()->getPage()->findById($title_input_id);
+      $title_input_element = $this->getSession()
+        ->getPage()
+        ->findById($title_input_id);
       if (!$title_input_element) {
         throw new \Exception("Title input field $i not found for link field with label '$label'.'");
       }
@@ -2797,7 +2851,9 @@ public function assertElementCount(string $count, string $element_name): void {
    * @Then I should see a paragraph containing the text :text
    */
   public function assertParagraphText(string $text): void {
-    $element = $this->getSession()->getPage()->find('xpath', '//p[contains(text(), "' . $text . '")]');
+    $element = $this->getSession()
+      ->getPage()
+      ->find('xpath', '//p[contains(text(), "' . $text . '")]');
     Assert::assertNotEmpty($element);
   }
 
@@ -2827,7 +2883,8 @@ public function assertContentAbsoluteUrlsAsLinkInPage(TableNode $titles): void {
    * @throws \Exception
    *   Thrown if at least a link exists in the page.
    *
-   * @Given I should not see the absolute urls of the following content entities:
+   * @Given I should not see the absolute urls of the following content
+   *   entities:
    */
   public function assertNotContentAbsoluteUrlsAsLinkInPage(TableNode $titles): void {
     foreach ($titles->getRows() as $title) {
@@ -2848,7 +2905,8 @@ public function assertNotContentAbsoluteUrlsAsLinkInPage(TableNode $titles): voi
    * @throws \InvalidArgumentException
    *   Thrown when one of the parameters is not correct.
    *
-   * @Given the publication date of the :title :bundle content is changed to :new_value
+   * @Given the publication date of the :title :bundle content is changed to
+   *   :new_value
    */
   public function givenPublicationDateChanged(string $title, string $bundle, string $new_publication_date): void {
     $entity = $this->getEntityByLabel('node', $title, $bundle);
@@ -2900,9 +2958,11 @@ protected function assertEntityUrlInSitemap(string $entity_type_id, string $enti
    * @Given the name of the :old_name term is changed to :new_name
    */
   public function givenTermNameChanges(string $old_name, string $new_name): void {
-    $terms = \Drupal::entityTypeManager()->getStorage('taxonomy_term')->loadByProperties([
-      'name' => $old_name,
-    ]);
+    $terms = \Drupal::entityTypeManager()
+      ->getStorage('taxonomy_term')
+      ->loadByProperties([
+        'name' => $old_name,
+      ]);
     $term = reset($terms);
     $term->setName($new_name);
     $term->save();
@@ -2926,7 +2986,9 @@ public function getAllCardsInPage(): array {
       '.glide__slides .slide a',
     ];
 
-    return $this->getSession()->getPage()->findAll('css', implode(', ', $locators));
+    return $this->getSession()
+      ->getPage()
+      ->findAll('css', implode(', ', $locators));
   }
 
   /**
@@ -2961,7 +3023,8 @@ public function resetTopicMetaEntity(): void {
       ->clearItems()
       ->save();
 
-    $meta_entity_storage = \Drupal::entityTypeManager()->getStorage('meta_entity');
+    $meta_entity_storage = \Drupal::entityTypeManager()
+      ->getStorage('meta_entity');
     $ids = $meta_entity_storage->getQuery()->accessCheck(FALSE)
       ->condition('type', 'topic')
       ->condition('published', TRUE)
@@ -2971,7 +3034,8 @@ public function resetTopicMetaEntity(): void {
     if ($ids) {
       /** @var \Drupal\meta_entity\Entity\MetaEntityInterface[] $meta_entities */
       $meta_entities = $meta_entity_storage->loadMultiple($ids);
-      $tids = array_map(fn(MetaEntityInterface $meta_entity) => $meta_entity->getTargetEntity()->id(), $meta_entities);
+      $tids = array_map(fn(MetaEntityInterface $meta_entity) => $meta_entity->getTargetEntity()
+        ->id(), $meta_entities);
       $meta_entity_storage->delete($meta_entities);
       foreach ($tids as $tid) {
         $meta_entity_storage->create([
diff --git a/web/modules/custom/joinup_test/joinup_test.install b/web/modules/custom/joinup_test/joinup_test.install
index aea1ed6873..d5d7f09d28 100644
--- a/web/modules/custom/joinup_test/joinup_test.install
+++ b/web/modules/custom/joinup_test/joinup_test.install
@@ -24,18 +24,25 @@ function joinup_test_install($is_syncing): void {
   $termStorage = $entityTypeManager->getStorage('taxonomy_term');
 
   // Creates a term given term data from YAML file.
-  $createTerm = function (string $vid, int $weight, array $data, array $definitions, int $parentTermId = 0) use ($termStorage): TermInterface {
+  $createTerm = function(string $vid, int $weight, array $data, array $definitions, int $parentTermId = 0) use ($termStorage): TermInterface {
     $values = ['vid' => $vid, 'weight' => $weight, 'parent' => $parentTermId];
     foreach ($data as $fieldName => $fieldValue) {
       if (isset($definitions[$fieldName])) {
-        if (is_a($definitions[$fieldName]->getItemDefinition()->getClass(), EntityReferenceItemInterface::class, TRUE)) {
+        if (is_a($definitions[$fieldName]->getItemDefinition()
+          ->getClass(), EntityReferenceItemInterface::class, TRUE)) {
           // Reference to other entity should be always represented as URI.
           assert((bool) filter_var($fieldValue, FILTER_VALIDATE_URL));
-          $values[$fieldName] = \Drupal::getContainer()->get('rdf_sync.mapper')->getEntityByUri($fieldValue);
+          $values[$fieldName] = \Drupal::getContainer()
+            ->get('rdf_sync.mapper')
+            ->getEntityByUri($fieldValue);
         }
         else {
-          if (is_a($definitions[$fieldName]->getItemDefinition()->getClass(), TextItemBase::class, TRUE)) {
-            $fieldValue = ['value' => $fieldValue, 'format' => 'content_editor'];
+          if (is_a($definitions[$fieldName]->getItemDefinition()
+            ->getClass(), TextItemBase::class, TRUE)) {
+            $fieldValue = [
+              'value' => $fieldValue,
+              'format' => 'content_editor',
+            ];
           }
           $values[$fieldName] = $fieldValue;
         }
@@ -82,40 +89,42 @@ function joinup_test_install($is_syncing): void {
   // Create the Joinup collection on clean installation.
   $nodeStorage = $entityTypeManager->getStorage('node');
   $mapper = \Drupal::getContainer()->get('rdf_sync.mapper');
-  $collection = $nodeStorage->create([
-    'type' => 'collection',
-    'uri' => JoinupCollectionHelper::JOINUP_COLLECTION_URI,
-    'title' => 'The Portal',
-    'field_state' => 'published',
-    'field_topic' => $mapper->getEntityByUri('http://joinup.eu/ontology/topic#demography'),
-    'created' => strtotime('2015-01-01 08:00'),
-    'changed' => strtotime('2015-01-01 08:00'),
-    'published_at' => strtotime('2015-01-01 08:00'),
-    'abstract' => 'The Portal is a collaborative platform created by the European Commission and funded by the European Union via the ISA² Programme.',
-    'description' => [
-      'value' => 'The Portal is a collaborative platform created by the European Commission and funded by the European Union via the ISA² Programme. It offers several services that aim to help e-Government professionals share their experience with each other. The platform is also a repository of e-Government solutions, case studies, reusable software and components, and best practices. The Portal is a key initiative of the European Commission’s ISA² Programme, which is part of the EU’s policy to create a Digital Single Market.',
-      'format' => 'content_editor',
-    ],
-    'contact' => $nodeStorage->create([
-      'type' => 'contact_information',
-      'uuid' => 'a1b2c3d4-e5f6-7890-ab12-cd34ef567890',
-      'title' => 'Contact name',
-      'email' => 'contact.email@example.com',
-    ]),
-    'owner' => $nodeStorage->create([
-      'type' => 'owner',
-      'uuid' => 'a1b2c3d4-e5f6-7890-ab12-cd34ef567891',
-      'title' => 'ISA²',
-    ]),
-
-  ]);
-  $collection->save();
-  \Drupal::state()->set('joinup_test.joinup_collection.created', TRUE);
-
-  $indexes = ContentEntity::getIndexesForEntity($collection);
-  foreach ($indexes as $index) {
-    $index->setOption('index_directly', TRUE);
-    $index->trackItemsUpdated('entity:node', [$collection->id() . ':en']);
+  if (!$mapper->getEntityByUri(JoinupCollectionHelper::JOINUP_COLLECTION_URI)) {
+    $collection = $nodeStorage->create([
+      'type' => 'collection',
+      'uri' => JoinupCollectionHelper::JOINUP_COLLECTION_URI,
+      'title' => 'The Portal',
+      'field_state' => 'published',
+      'field_topic' => $mapper->getEntityByUri('http://joinup.eu/ontology/topic#demography'),
+      'created' => strtotime('2015-01-01 08:00'),
+      'changed' => strtotime('2015-01-01 08:00'),
+      'published_at' => strtotime('2015-01-01 08:00'),
+      'abstract' => 'The Portal is a collaborative platform created by the European Commission and funded by the European Union via the ISA² Programme.',
+      'description' => [
+        'value' => 'The Portal is a collaborative platform created by the European Commission and funded by the European Union via the ISA² Programme. It offers several services that aim to help e-Government professionals share their experience with each other. The platform is also a repository of e-Government solutions, case studies, reusable software and components, and best practices. The Portal is a key initiative of the European Commission’s ISA² Programme, which is part of the EU’s policy to create a Digital Single Market.',
+        'format' => 'content_editor',
+      ],
+      'contact' => $nodeStorage->create([
+        'type' => 'contact_information',
+        'uuid' => 'a1b2c3d4-e5f6-7890-ab12-cd34ef567890',
+        'title' => 'Contact name',
+        'email' => 'contact.email@example.com',
+      ]),
+      'owner' => $nodeStorage->create([
+        'type' => 'owner',
+        'uuid' => 'a1b2c3d4-e5f6-7890-ab12-cd34ef567891',
+        'title' => 'ISA²',
+      ]),
+
+    ]);
+    $collection->save();
+    \Drupal::state()->set('joinup_test.joinup_collection.created', TRUE);
+
+    $indexes = ContentEntity::getIndexesForEntity($collection);
+    foreach ($indexes as $index) {
+      $index->setOption('index_directly', TRUE);
+      $index->trackItemsUpdated('entity:node', [$collection->id() . ':en']);
+    }
   }
 }
 
-- 
GitLab


From a64b2cd5986b5ad33e70d0a063502487efe8dab9 Mon Sep 17 00:00:00 2001
From: "micha.jakubowski" <micha.jakubowski@ffwagency.com>
Date: Fri, 6 Dec 2024 12:14:17 +0100
Subject: [PATCH 053/137] ISAICP-8780: general fix

---
 tests/features/homepage.feature               |  30 +--
 tests/src/Context/JoinupContext.php           | 182 ++++++------------
 tests/src/Traits/NodeTrait.php                |  34 ++--
 .../custom/joinup_test/joinup_test.install    |  17 +-
 4 files changed, 94 insertions(+), 169 deletions(-)

diff --git a/tests/features/homepage.feature b/tests/features/homepage.feature
index b6d078b6f1..c1a1c3ca2d 100644
--- a/tests/features/homepage.feature
+++ b/tests/features/homepage.feature
@@ -49,10 +49,10 @@ Feature: Homepage
       | Earlier transformations     | Ecosystem management     | Shaping of nature | EU and European Policies                              | published | 2021-03-29T10:18:00Z |                             | <p><drupal-media data-entity-type="media" data-entity-uuid="32b3beae-2218-11ee-be56-0242ac120002">&nbsp;</drupal-media>Archaeological evidence shows that by 10000 BCE all societies employed ecologically transformative land use practices including burning hunting species propagation domestication cultivation have left long-term legacies across the biosphere.</p> |
     When I am on the homepage
     Then the latest news section should contain the following news articles:
-      | date   | topics                                      | title                       | body                        |
-      | 26 Apr | Finance in EU, Supplier exchange, +2 topics | Current biodiversity crisis | We have some abstract here. |
-      | 29 Mar | EU and European Policies                    | Earlier transformations     | default abstract            |
-      | 28 Feb | HR, Statistics and Analysis, E-justice      | Spatial reconstruction      | default abstract            |
+      | date   | topics                                      | title                       | body                                                                                                                                                                                                       |
+      | 26 Apr | Finance in EU, Supplier exchange, +2 topics | Current biodiversity crisis | We have some abstract here.                                                                                                                                                                                |
+      | 29 Mar | EU and European Policies                    | Earlier transformations     | Archaeological evidence shows that by 10000 BCE all societies employed ecologically transformative land use practices including burning hunting species propagation domestication cultivation have left... |
+      | 28 Feb | HR, Statistics and Analysis, E-justice      | Spatial reconstruction      | Global land use history confirms that empowering the environmental stewardship of Indigenous peoples and local communities will be critical to conserving biodiversity across the planet.                  |
 
     # There is a "More news" link that for the moment leads to the search page
     # pre-filtered on news articles. In the future this will become a dedicated
@@ -305,18 +305,18 @@ Feature: Homepage
       | solution   | Cities of France            | 2018-12-14 17:36     | There are many variations                                                                                                                                                                                                     |
       | solution   | Cities of Bulgaria          | 2018-11-14 17:36     | Supports fields                                                                                                                                                                                                               |
       | news       | Current biodiversity adapt  | 2021-04-30T19:09:00Z | Biodiversity adapt abstract                                                                                                                                                                                                   |
-      | news       | Super-Alfvenic plasma flow  | 2021-04-29T10:18:00Z | default abstract                                                                                                                                                                                                              |
-      | news       | H-rich Wolf-Rayet star      | 2021-03-29T10:18:00Z | default abstract                                                                                                                                                                                                              |
-      | news       | Spatial construction        | 2021-02-26T13:15:00Z | default abstract                                                                                                                                                                                                              |
-      | news       | Environmental tests         | 2021-01-27T16:12:00Z | default abstract                                                                                                                                                                                                              |
-      | news       | Easier transformations      | 2021-01-09T10:18:00Z | default abstract                                                                                                                                                                                                              |
-      | event      | SXR plasma supply           | 2021-05-30T10:18:00Z | default abstract                                                                                                                                                                                                              |
-      | event      | Dark material               | 2021-04-30T10:18:00Z | default abstract                                                                                                                                                                                                              |
+      | news       | Super-Alfvenic plasma flow  | 2021-04-29T10:18:00Z | Magnetic draping                                                                                                                                                                                                              |
+      | news       | H-rich Wolf-Rayet star      | 2021-03-29T10:18:00Z | Polarimetric analysis Watch our video                                                                                                                                                                                         |
+      | news       | Spatial construction        | 2021-02-26T13:15:00Z | Global land use history confirms that empowering the environmental stewardship of Indigenous peoples and local communities will be critical to conserving biodiversity across the planet.                                     |
+      | news       | Environmental tests         | 2021-01-27T16:12:00Z | With rare exceptions current biodiversity losses are caused not by human conversion or degradation of untouched ecosystems but rather by the appropriation colonization and intensification of use in...                      |
+      | news       | Easier transformations      | 2021-01-09T10:18:00Z | Archaeological evidence shows that by 10000 BCE all societies employed ecologically transformative land use practices including burning hunting species propagation domestication cultivation have left...                    |
+      | event      | SXR plasma supply           | 2021-05-30T10:18:00Z |                                                                                                                                                                                                                               |
+      | event      | Dark material               | 2021-04-30T10:18:00Z | The presence of a relatively large magnetic field is acting as a quenching agent. The authors say the observations confirm their hypothesis that there is a strong active magnetic field interacting...                       |
       | event      | Thick-target news           | 2021-04-27T19:05:00Z | Abstract: Evaporation                                                                                                                                                                                                         |
-      | event      | Cooling losses              | 2021-03-20T10:18:00Z | default abstract                                                                                                                                                                                                              |
-      | event      | Source of SXR plasma supply | 2021-02-27T13:15:00Z | default abstract                                                                                                                                                                                                              |
-      | event      | Plasma supply               | 2021-01-30T10:18:00Z | default abstract                                                                                                                                                                                                              |
-      | event      | Stars material              | 2021-01-10T10:18:00Z | default abstract                                                                                                                                                                                                              |
+      | event      | Cooling losses              | 2021-03-20T10:18:00Z | Single-loop                                                                                                                                                                                                                   |
+      | event      | Source of SXR plasma supply | 2021-02-27T13:15:00Z | Fast electrons                                                                                                                                                                                                                |
+      | event      | Plasma supply               | 2021-01-30T10:18:00Z | Fast electrons                                                                                                                                                                                                                |
+      | event      | Stars material              | 2021-01-10T10:18:00Z | Colossal material! Read our greypaper.                                                                                                                                                                                        |
 
     And I should see the button "Solutions" in the "Explore block"
     And I should see the button "Collections" in the "Explore block"
diff --git a/tests/src/Context/JoinupContext.php b/tests/src/Context/JoinupContext.php
index 12a29b568f..aed6f7301e 100644
--- a/tests/src/Context/JoinupContext.php
+++ b/tests/src/Context/JoinupContext.php
@@ -138,8 +138,7 @@ public function assertTextCount(string $text, int $count): void {
    * @throws \Exception
    *   Thrown when a collection or solution with the given label doesn't exist.
    *
-   * @Given I am logged in as a user with the :role role(s) of the :group_label
-   *   :group_bundle
+   * @Given I am logged in as a user with the :role role(s) of the :group_label :group_bundle
    * @Given I am logged in as a/an :role of the :group_label :group_bundle
    *
    * @see \Drupal\DrupalExtension\Context\DrupalContext::assertAuthenticatedByRole()
@@ -219,8 +218,7 @@ public function updateGroupRoles(string $group_label, string $group_bundle, stri
    * @throws \Exception
    *   Thrown when a collection or solution with the given label doesn't exist.
    *
-   * @Given my membership state in the :group_label :group_bundle changes to
-   *   :state
+   * @Given my membership state in the :group_label :group_bundle changes to :state
    */
   public function updateGroupState(string $group_label, string $group_bundle, string $state): void {
     $entity = $this->getEntityByLabel('node', $group_label, $group_bundle);
@@ -252,19 +250,16 @@ public function updateGroupState(string $group_label, string $group_bundle, stri
    * @see \Drupal\DrupalExtension\Context\RawDrupalContext::loggedInWithRole
    */
   protected function loggedInWithOgRoles(array $roles, GroupInterface $group): bool {
-    if ($this->getUserManager()
-        ->currentUserIsAnonymous() || !$this->loggedIn()) {
+    if ($this->getUserManager()->currentUserIsAnonymous() || !$this->loggedIn()) {
       return FALSE;
     }
     $current_user = $this->getUserManager()->getCurrentUser();
-    $user = \Drupal::entityTypeManager()
-      ->getStorage('user')
-      ->loadUnchanged($current_user->uid);
+    $user = \Drupal::entityTypeManager()->getStorage('user')->loadUnchanged($current_user->uid);
     $membership = $group->getMembership((int) $user->id());
     if (empty($membership)) {
       return FALSE;
     }
-    $expected_roles_ids = array_map(function(OgRoleInterface $role): string {
+    $expected_roles_ids = array_map(function (OgRoleInterface $role): string {
       return $role->id();
     }, $roles);
     $actual_roles_ids = $membership->getRolesIds();
@@ -294,9 +289,7 @@ public function submitRegistrationForm(TableNode $table, $location): void {
     $this->getSession()->getPage()->pressButton("Create new account");
 
     // Get the last registered user.
-    $results = \Drupal::entityTypeManager()
-      ->getStorage('user')
-      ->loadByProperties(['name' => $username]);
+    $results = \Drupal::entityTypeManager()->getStorage('user')->loadByProperties(['name' => $username]);
     /** @var \Drupal\user\UserInterface $user */
     $user = reset($results);
 
@@ -324,7 +317,7 @@ public function submitRegistrationForm(TableNode $table, $location): void {
    */
   public function checkSelectContainsOptions($select, $options): void {
     $field = $this->findSelect($select);
-    $available_options = array_map(function(array $option): string {
+    $available_options = array_map(function (array $option): string {
       return $option['text'];
     }, $this->getSelectOptions($field));
     $options = $this->explodeCommaSeparatedStepArgument($options);
@@ -366,7 +359,7 @@ public function checkSelectOptionsSortedAlphabetically(string $select): void {
    */
   public function checkSelectDoesNotContainOptions($select, $options): void {
     $field = $this->findSelect($select);
-    $available_options = array_map(function(array $option): string {
+    $available_options = array_map(function (array $option): string {
       return $option['text'];
     }, $this->getSelectOptions($field));
     $options = $this->explodeCommaSeparatedStepArgument($options);
@@ -409,7 +402,7 @@ public function assertSelectOptionsAsList($select, TableNode $table): void {
    */
   public function assertSelectOptions($select, $options): void {
     $field = $this->findSelect($select);
-    $availableOptions = array_map(function(array $option): string {
+    $availableOptions = array_map(function (array $option): string {
       return $option['text'];
     }, $this->getSelectOptions($field));
     sort($availableOptions);
@@ -443,7 +436,7 @@ public function assertCheckboxesFieldOptions(string $field, TableNode $options):
 
     // Get the checkboxes.
     $checkboxes = $field->findAll('css', 'input[type="checkbox"]');
-    $checkboxLabels = array_map(function(NodeElement $checkbox): string {
+    $checkboxLabels = array_map(function (NodeElement $checkbox): string {
       return $checkbox->getParent()->getText();
     }, $checkboxes);
 
@@ -462,12 +455,11 @@ public function assertCheckboxesFieldOptions(string $field, TableNode $options):
    * @param string $options
    *   A comma separated list of items to check.
    *
-   * @Then the available options in the :select select should not include the
-   *   :options( options)
+   * @Then the available options in the :select select should not include the :options( options)
    */
   public function assertSelectOptionNotAvailable($select, $options): void {
     $field = $this->findSelect($select);
-    $availableOptions = array_map(function(array $option): string {
+    $availableOptions = array_map(function (array $option): string {
       return $option['text'];
     }, $this->getSelectOptions($field));
     $options = $this->explodeCommaSeparatedStepArgument($options);
@@ -648,9 +640,7 @@ public function assertNodeRevisionCount($bundle, $title, $count): void {
     /** @var \Drupal\node\NodeInterface $node */
     $node = $this->getEntityByLabel('node', $title, $bundle);
 
-    $revision_count = \Drupal::entityTypeManager()
-      ->getStorage('node')
-      ->getQuery()
+    $revision_count = \Drupal::entityTypeManager()->getStorage('node')->getQuery()
       ->allRevisions()
       ->accessCheck(FALSE)
       ->condition('nid', $node->id())
@@ -681,8 +671,7 @@ public function assertNodeRevisionCount($bundle, $title, $count): void {
    */
   public function massageFieldsBeforeNodeCreate(BeforeNodeCreateScope $scope): void {
     $node = $scope->getEntity();
-    $field_definitions = \Drupal::service('entity_field.manager')
-      ->getFieldDefinitions('node', $node->type);
+    $field_definitions = \Drupal::service('entity_field.manager')->getFieldDefinitions('node', $node->type);
     // Replace field label aliases with the actual field names.
     foreach (get_object_vars($node) as $alias => $value) {
       $name = $this->getNodeFieldNameFromAlias($node->type, $alias);
@@ -825,6 +814,7 @@ public function massageFieldsBeforeNodeCreate(BeforeNodeCreateScope $scope): voi
       // to satisfy data integrity and prevent form validation errors.
       $node->field_topic = $this->getRandomTopic()->label();
     }
+
     if (!empty($field_definitions['contact']) && empty($node->contact)) {
       $node->contact = $this->getDefaultContact()->label();
     }
@@ -975,10 +965,8 @@ public function clearDateRangeField($field, $component, $date = NULL): void {
   public function assertDateTimeFieldValue(string $field): void {
     $now = new \DateTimeImmutable();
 
-    $date_part = $this->findDateRangeComponent($field, 'date')
-      ->getAttribute('value');
-    $time_part = $this->findDateRangeComponent($field, 'time')
-      ->getAttribute('value');
+    $date_part = $this->findDateRangeComponent($field, 'date')->getAttribute('value');
+    $time_part = $this->findDateRangeComponent($field, 'time')->getAttribute('value');
     if (empty($date_part) || empty($time_part)) {
       throw new ExpectationFailedException("The '{$field}' date/time field is not filled with the current time.");
     }
@@ -1012,10 +1000,8 @@ public function assertDateTimeFieldValue(string $field): void {
    *   Thrown when the field was not found.
    */
   public function findDateFields($field): array {
-    $field_selectors = $this->getSession()
-      ->getPage()
-      ->findAll('css', '.field--widget-datetime-timestamp');
-    $field_selectors = array_filter($field_selectors, function($field_selector) use ($field) {
+    $field_selectors = $this->getSession()->getPage()->findAll('css', '.field--widget-datetime-timestamp');
+    $field_selectors = array_filter($field_selectors, function ($field_selector) use ($field) {
       return $field_selector->has('named', ['content', $field]);
     });
     if (empty($field_selectors)) {
@@ -1174,8 +1160,7 @@ public function assertTilePresent(string $heading): void {
       // Custom page cards in carousels have a different structure. In order to
       // identify the tile, we need to check the title of the first "a" element.
       // First, retrieve the parent element so that the "a" element is present.
-      if ($result->getParent()
-        ->find('xpath', "/a[contains(@title, \"{$heading}\")]")) {
+      if ($result->getParent()->find('xpath', "/a[contains(@title, \"{$heading}\")]")) {
         return;
       }
     }
@@ -1295,8 +1280,7 @@ public function assertTextVisible($text, $region): void {
    *   element of the list heading if given.
    *
    * @Then I( should) see the( following) tiles in the correct order:
-   * @Then in the :list_title list, I should see the following tiles in the
-   *   correct order:
+   * @Then in the :list_title list, I should see the following tiles in the correct order:
    */
   public function assertOrderedTilesPresent(TableNode $titles_table, ?string $list_title = NULL): void {
     $headings = array_keys($this->getTiles(listTitle: $list_title));
@@ -1525,9 +1509,7 @@ public function assertFormSubmitButtonsVisible($buttons, $count = NULL): void {
       // Only check the actual form submit buttons, ignore other buttons that
       // might be present in wysiwygs or are used to add multiple values to a
       // field.
-      $actual = count($this->getSession()
-        ->getPage()
-        ->findAll('xpath', '//main//div[contains(concat(" ", normalize-space(@class), " "), " form-actions ")]//input[@type = "submit"]'));
+      $actual = count($this->getSession()->getPage()->findAll('xpath', '//main//div[contains(concat(" ", normalize-space(@class), " "), " form-actions ")]//input[@type = "submit"]'));
       Assert::assertEquals($count, $actual);
     }
   }
@@ -1565,9 +1547,7 @@ public function assertButtonsNotVisible($buttons): void {
    * @Then I should see the plus button menu
    */
   public function assertPlusButtonMenuPresent(): void {
-    $element = $this->getSession()
-      ->getPage()
-      ->find('css', '#dropdown-add-content');
+    $element = $this->getSession()->getPage()->find('css', '#dropdown-add-content');
     Assert::assertNotEmpty($element);
   }
 
@@ -1577,9 +1557,7 @@ public function assertPlusButtonMenuPresent(): void {
    * @Then I should not see the plus button menu
    */
   public function assertPlusButtonMenuNotPresent(): void {
-    $element = $this->getSession()
-      ->getPage()
-      ->find('css', 'div.add-content-menu ul');
+    $element = $this->getSession()->getPage()->find('css', 'div.add-content-menu ul');
     Assert::assertEmpty($element);
   }
 
@@ -1613,9 +1591,7 @@ public function openPlusButtonMenu(): void {
       return;
     }
 
-    $button = $this->getSession()
-      ->getPage()
-      ->find('css', '#dropdown-add-content');
+    $button = $this->getSession()->getPage()->find('css', '#dropdown-add-content');
     $button->press();
   }
 
@@ -1627,10 +1603,7 @@ public function openPlusButtonMenu(): void {
   public function iOpenTheEntityTasksMenu(): void {
     if ($this->hasJavascriptSupport()) {
       $entity_tasks_selector = $this->getRegionSelector('Entity actions');
-      $this->getSession()
-        ->getPage()
-        ->find('css', "$entity_tasks_selector button")
-        ->press();
+      $this->getSession()->getPage()->find('css', "$entity_tasks_selector button")->press();
     }
   }
 
@@ -1648,9 +1621,7 @@ public function iOpenTheAccountMenu(): void {
 
     // Depending on the screen width, a different dropdown item may be visible.
     /** @var \Behat\Mink\Element\NodeElement[] $elements */
-    $elements = $this->getSession()
-      ->getPage()
-      ->findAll('css', '#main-navbar .dropdown');
+    $elements = $this->getSession()->getPage()->findAll('css', '#main-navbar .dropdown');
     foreach ($elements as $element) {
       if ($element->isVisible()) {
         $this->openBootstrapDropdown($element);
@@ -1695,9 +1666,7 @@ public function relativeUrlMatches(string $method, string $url): void {
    */
   public function assertEmptyPlusButtonMenu(): void {
     if ($this->hasJavascriptSupport()) {
-      if ($this->getSession()
-        ->getPage()
-        ->findAll('xpath', '//div[contains(concat(" ", normalize-space(@class), " "), " add-content-menu ")]//li[last()]')) {
+      if ($this->getSession()->getPage()->findAll('xpath', '//div[contains(concat(" ", normalize-space(@class), " "), " add-content-menu ")]//li[last()]')) {
         throw new \Exception("The plus button menu is not empty.");
       }
     }
@@ -1806,9 +1775,7 @@ public function createComments(TableNode $table): void {
    * @Then the current workflow state should be :state
    */
   public function assertCurrentWorkflowState($state): void {
-    $element = $this->getSession()
-      ->getPage()
-      ->find('css', 'div.current-workflow-state');
+    $element = $this->getSession()->getPage()->find('css', 'div.current-workflow-state');
     if (empty($element)) {
       throw new \Exception('The current workflow state field is not present on the page.');
     }
@@ -1873,8 +1840,7 @@ public function assertFieldDescription($label, $description): void {
    * @throws \Exception
    *   Thrown when the field does not have a description.
    *
-   * @Then I should not see the description :description for (the ):label(
-   *   field)
+   * @Then I should not see the description :description for (the ):label( field)
    */
   public function assertNoFieldDescription($label, $description): void {
     $xpath = '//label[text()="' . $label . '"]/ancestor::div[contains(concat(" ", normalize-space(@class), " "), " form-item ")]//div[contains(concat(" ", normalize-space(@class), " "), " description ")] | //label[text()="' . $label . '"]/ancestor::div[contains(concat(" ", normalize-space(@class), " "), " form-item ")]//small[contains(concat(" ", normalize-space(@class), " "), " description ")]';
@@ -2006,8 +1972,7 @@ public function assertFieldContainsLinkToPage($field, $title): void {
    * @throws \Exception
    *   Thrown when the link is not in the page.
    *
-   * @Then /^the share link "(?P<link>[^"]+)" should point to the
-   *   "(?P<title>[^"]+)" content(?:| entity)$/
+   * @Then /^the share link "(?P<link>[^"]+)" should point to the "(?P<title>[^"]+)" content(?:| entity)$/
    */
   public function assertLinkContainsEntityUrl(string $link, string $title): void {
     /** @var \Drupal\Core\Entity\EntityInterface $entity */
@@ -2078,8 +2043,7 @@ public function ogCleanup(AfterScenarioScope $event): void {
   /**
    * Assert that a given attribute is not set for a given element in a region.
    *
-   * @Then I( should) not see the :tag element with the :attribute attribute
-   *   set to :value in the :region( region)
+   * @Then I( should) not see the :tag element with the :attribute attribute set to :value in the :region( region)
    */
   public function assertRegionElementAttribute($tag, $attribute, $value, $region): void {
     $regionObj = $this->getRegion($region);
@@ -2092,8 +2056,7 @@ public function assertRegionElementAttribute($tag, $attribute, $value, $region):
         $attr = $element->getAttribute($attribute);
         if (!empty($attr)) {
           if (strpos($attr, "$value") !== FALSE) {
-            throw new \Exception(sprintf('The "%s" attribute is equal to "%s" on the element "%s" in the "%s" region on the page %s', $attribute, $value, $tag, $region, $this->getSession()
-              ->getCurrentUrl()));
+            throw new \Exception(sprintf('The "%s" attribute is equal to "%s" on the element "%s" in the "%s" region on the page %s', $attribute, $value, $tag, $region, $this->getSession()->getCurrentUrl()));
           }
         }
       }
@@ -2106,8 +2069,7 @@ public function assertRegionElementAttribute($tag, $attribute, $value, $region):
    * @Then the persistent url should contain :pattern
    */
   public function thePersistentUrlShouldContain($pattern): void {
-    $this->assertSession()
-      ->elementAttributeContains('css', '.permalink', 'href', $pattern);
+    $this->assertSession()->elementAttributeContains('css', '.permalink', 'href', $pattern);
   }
 
   /**
@@ -2179,8 +2141,8 @@ public function fillFieldWithNormalisedEntityReference(string $value, ?string $f
       // @see ::locatePath()
       $client = new Client(['base_uri' => $this->getMinkParameter('base_url')]);
       $uri = $element->getAttribute('data-autocomplete-path') . '?' . UrlHelper::buildQuery([
-          'q' => $value,
-        ]);
+        'q' => $value,
+      ]);
       $response = $client->get($uri);
 
       if ($response->getStatusCode() !== 200) {
@@ -2287,7 +2249,7 @@ public function assertNoActiveLinksInRegion($region): void {
     $links = $this->findLinksMarkedAsActive($region);
 
     if (!empty($links)) {
-      $labels = array_map(function($link) {
+      $labels = array_map(function ($link) {
         /** @var \Behat\Mink\Element\NodeElement $link */
         return $link->getText() . ' (' . $link->getAttribute('href') . ')';
       }, $links);
@@ -2317,7 +2279,7 @@ public function assertActiveLinkInRegion($text, $region): void {
 
     /** @var \Behat\Mink\Element\NodeElement[] $links */
     if (count($links) > 1) {
-      $labels = array_map(function($link) {
+      $labels = array_map(function ($link) {
         /** @var \Behat\Mink\Element\NodeElement $link */
         return $link->getText() . ' (' . $link->getAttribute('href') . ')';
       }, $links);
@@ -2361,8 +2323,6 @@ public function assertTileMarkedAsFeatured($heading): void {
    *
    * @Then the :tile :type tile should not be marked as featured
    *
-   * @see https://citnet.tech.ec.europa.eu/CITnet/jira/browse/ISAICP-4849
-   * @see https://citnet.tech.ec.europa.eu/CITnet/jira/browse/ISAICP-4352
    * @todo Due to the bug described in ISAICP-4352, we have to temporary check
    * if a tile is not featured via backend, rather than checking the DOM.
    * Manually testing or running this Behat step definition Behat in test
@@ -2371,6 +2331,8 @@ public function assertTileMarkedAsFeatured($heading): void {
    * Revert back the check that a tile is not featured by checking the DOM, in
    * ISAICP-4849.
    *
+   * @see https://citnet.tech.ec.europa.eu/CITnet/jira/browse/ISAICP-4849
+   * @see https://citnet.tech.ec.europa.eu/CITnet/jira/browse/ISAICP-4352
    */
   public function assertTileNotMarkedAsFeatured(string $heading, string $type): void {
     assert(in_array($type,
@@ -2405,8 +2367,7 @@ public function assertTileNotMarkedAsFeatured(string $heading, string $type): vo
    *
    * @see \Drupal\DrupalExtension\Context\MarkupContext::assertNotRegionElementText()
    *
-   * @Then I( should) see a(n) :tag element with the text :text in the :region(
-   *   region)
+   * @Then I( should) see a(n) :tag element with the text :text in the :region( region)
    */
   public function assertRegionElementText($tag, $text, $region): void {
     $regionObj = $this->getRegion($region);
@@ -2418,8 +2379,7 @@ public function assertRegionElementText($tag, $text, $region): void {
         }
       }
     }
-    throw new \Exception(sprintf('The text "%s" was not found in the "%s" element in the "%s" region on the page %s', $text, $tag, $region, $this->getSession()
-      ->getCurrentUrl()));
+    throw new \Exception(sprintf('The text "%s" was not found in the "%s" element in the "%s" region on the page %s', $text, $tag, $region, $this->getSession()->getCurrentUrl()));
   }
 
   /**
@@ -2428,9 +2388,7 @@ public function assertRegionElementText($tag, $text, $region): void {
    * @Then a tour should be available
    */
   public function assertTourAvailable(): void {
-    if (!$this->getSession()
-      ->getPage()
-      ->find('css', 'a.js-tour-start-button')) {
+    if (!$this->getSession()->getPage()->find('css', 'a.js-tour-start-button')) {
       throw new \Exception("No tour is available on the page.");
     }
   }
@@ -2535,9 +2493,7 @@ public function assertDraggableMenuTable(TableNode $table, string $group_label,
 
     $group = $this->getEntityByLabel('node', $group_label, $group_bundle);
     /** @var \Behat\Mink\Element\NodeElement[] $rows */
-    $rows = $this->getSession()
-      ->getPage()
-      ->findAll('css', '#menu-overview tbody tr.draggable');
+    $rows = $this->getSession()->getPage()->findAll('css', '#menu-overview tbody tr.draggable');
     $expected = $table->getColumnsHash();
     Assert::assertSameSize($expected, $rows);
 
@@ -2610,14 +2566,12 @@ public function dragTitledTableRowTowardsDirection($title, $direction): void {
    *   page.
    *
    * @Then I drag the table row at position :position( to the) :direction
-   * @Then I drag the table row in the :region region at position :position( to
-   *   the) :direction
+   * @Then I drag the table row in the :region region at position :position( to the) :direction
    */
   public function findTableRowByPositionAndDragTowardsDirection(string $position, string $direction, ?string $region = NULL): void {
     $this->assertJavaScriptEnabledBrowser();
 
-    $region = empty($region) ? $this->getSession()
-      ->getPage() : $this->getRegion($region);
+    $region = empty($region) ? $this->getSession()->getPage() : $this->getRegion($region);
     $row = $this->findDraggableTableRowByPosition((int) $position, $region);
     $this->dragTableRowTowardsDirection($row, $direction);
   }
@@ -2643,8 +2597,7 @@ public function fillLastFieldWithLabel($field, $value): void {
     $fields = $page->findAll('named', ['field', $field]);
 
     if (empty($fields)) {
-      throw new ElementNotFoundException($this->getSession()
-        ->getDriver(), 'form field', 'id|name|label|value|placeholder', $field);
+      throw new ElementNotFoundException($this->getSession()->getDriver(), 'form field', 'id|name|label|value|placeholder', $field);
     }
 
     /** @var \Behat\Mink\Element\NodeElement $last */
@@ -2690,8 +2643,7 @@ public function pressLatestButton(string $label): void {
     $buttons = $page->findAll('named', ['button', $label]);
 
     if (empty($buttons)) {
-      throw new ElementNotFoundException($this->getSession()
-        ->getDriver(), 'button', 'label', $label);
+      throw new ElementNotFoundException($this->getSession()->getDriver(), 'button', 'label', $label);
     }
 
     /** @var \Behat\Mink\Element\NodeElement $last_button */
@@ -2747,7 +2699,7 @@ public function theOutputShouldMatchTheFile($file_path): void {
    * @Then I enter the following for the :label link field:
    */
   public function fillLinkField(TableNode $table, string $label): void {
-    $rows = array_map(function(array $row): array {
+    $rows = array_map(function (array $row): array {
       return array_change_key_case($row);
     }, $table->getColumnsHash());
 
@@ -2760,9 +2712,7 @@ public function fillLinkField(TableNode $table, string $label): void {
         throw new \InvalidArgumentException('Missing URL column in link table.');
       }
       $xpath = "//input[@id=(//label[text()='$label'])[$i]/@for]";
-      $url_input_element = $this->getSession()
-        ->getPage()
-        ->find('xpath', $xpath);
+      $url_input_element = $this->getSession()->getPage()->find('xpath', $xpath);
       if (!$url_input_element) {
         throw new \Exception("URL input field $i not found for link field with label '$label'.'");
       }
@@ -2780,9 +2730,7 @@ public function fillLinkField(TableNode $table, string $label): void {
         throw new \Exception("Malformed HTML ID for URL input field $i for link field with label '$label'.");
       }
 
-      $title_input_element = $this->getSession()
-        ->getPage()
-        ->findById($title_input_id);
+      $title_input_element = $this->getSession()->getPage()->findById($title_input_id);
       if (!$title_input_element) {
         throw new \Exception("Title input field $i not found for link field with label '$label'.'");
       }
@@ -2851,9 +2799,7 @@ public function assertElementCount(string $count, string $element_name): void {
    * @Then I should see a paragraph containing the text :text
    */
   public function assertParagraphText(string $text): void {
-    $element = $this->getSession()
-      ->getPage()
-      ->find('xpath', '//p[contains(text(), "' . $text . '")]');
+    $element = $this->getSession()->getPage()->find('xpath', '//p[contains(text(), "' . $text . '")]');
     Assert::assertNotEmpty($element);
   }
 
@@ -2883,8 +2829,7 @@ public function assertContentAbsoluteUrlsAsLinkInPage(TableNode $titles): void {
    * @throws \Exception
    *   Thrown if at least a link exists in the page.
    *
-   * @Given I should not see the absolute urls of the following content
-   *   entities:
+   * @Given I should not see the absolute urls of the following content entities:
    */
   public function assertNotContentAbsoluteUrlsAsLinkInPage(TableNode $titles): void {
     foreach ($titles->getRows() as $title) {
@@ -2905,8 +2850,7 @@ public function assertNotContentAbsoluteUrlsAsLinkInPage(TableNode $titles): voi
    * @throws \InvalidArgumentException
    *   Thrown when one of the parameters is not correct.
    *
-   * @Given the publication date of the :title :bundle content is changed to
-   *   :new_value
+   * @Given the publication date of the :title :bundle content is changed to :new_value
    */
   public function givenPublicationDateChanged(string $title, string $bundle, string $new_publication_date): void {
     $entity = $this->getEntityByLabel('node', $title, $bundle);
@@ -2958,11 +2902,9 @@ protected function assertEntityUrlInSitemap(string $entity_type_id, string $enti
    * @Given the name of the :old_name term is changed to :new_name
    */
   public function givenTermNameChanges(string $old_name, string $new_name): void {
-    $terms = \Drupal::entityTypeManager()
-      ->getStorage('taxonomy_term')
-      ->loadByProperties([
-        'name' => $old_name,
-      ]);
+    $terms = \Drupal::entityTypeManager()->getStorage('taxonomy_term')->loadByProperties([
+      'name' => $old_name,
+    ]);
     $term = reset($terms);
     $term->setName($new_name);
     $term->save();
@@ -2986,9 +2928,7 @@ public function getAllCardsInPage(): array {
       '.glide__slides .slide a',
     ];
 
-    return $this->getSession()
-      ->getPage()
-      ->findAll('css', implode(', ', $locators));
+    return $this->getSession()->getPage()->findAll('css', implode(', ', $locators));
   }
 
   /**
@@ -3023,8 +2963,7 @@ public function resetTopicMetaEntity(): void {
       ->clearItems()
       ->save();
 
-    $meta_entity_storage = \Drupal::entityTypeManager()
-      ->getStorage('meta_entity');
+    $meta_entity_storage = \Drupal::entityTypeManager()->getStorage('meta_entity');
     $ids = $meta_entity_storage->getQuery()->accessCheck(FALSE)
       ->condition('type', 'topic')
       ->condition('published', TRUE)
@@ -3034,8 +2973,7 @@ public function resetTopicMetaEntity(): void {
     if ($ids) {
       /** @var \Drupal\meta_entity\Entity\MetaEntityInterface[] $meta_entities */
       $meta_entities = $meta_entity_storage->loadMultiple($ids);
-      $tids = array_map(fn(MetaEntityInterface $meta_entity) => $meta_entity->getTargetEntity()
-        ->id(), $meta_entities);
+      $tids = array_map(fn(MetaEntityInterface $meta_entity) => $meta_entity->getTargetEntity()->id(), $meta_entities);
       $meta_entity_storage->delete($meta_entities);
       foreach ($tids as $tid) {
         $meta_entity_storage->create([
diff --git a/tests/src/Traits/NodeTrait.php b/tests/src/Traits/NodeTrait.php
index 8b93c9707a..24e340c1ff 100644
--- a/tests/src/Traits/NodeTrait.php
+++ b/tests/src/Traits/NodeTrait.php
@@ -48,41 +48,35 @@ public function getNodeRevisionIdsList(string $title, string $bundle, ?bool $pub
   /**
    * Returns contact_information entity referenced in Joinip collection.
    *
-   *  @See \joinup_test_install()
-   *
-   * @throws \Drupal\Component\Plugin\Exception\InvalidPluginDefinitionException
-   * @throws \Drupal\Component\Plugin\Exception\PluginNotFoundException
+   * @See \joinup_test_install()
    *
    * @return \Drupal\node\Entity\Node
    *   contact_information entity from field "contact" in Joinup collection
+   *
+   * @throws \Drupal\Component\Plugin\Exception\PluginNotFoundException
+   *
+   * @throws \Drupal\Component\Plugin\Exception\InvalidPluginDefinitionException
    */
   protected function getDefaultContact(): Node {
-    $nodeStorage = \Drupal::entityTypeManager()->getStorage('node');
-    $node = $nodeStorage->loadByProperties([
-      'type' => 'contact_information',
-      'uuid' => 'a1b2c3d4-e5f6-7890-ab12-cd34ef567890',
-    ]);
-    return array_shift($node);
+    return \Drupal::service('entity.repository')
+      ->loadEntityByUuid('node', 'a1b2c3d4-e5f6-7890-ab12-cd34ef567890');
   }
 
   /**
    * Returns owner entity referenced in Joinip collection.
    *
-   *  @See \joinup_test_install()
-   *
-   * @throws \Drupal\Component\Plugin\Exception\InvalidPluginDefinitionException
-   * @throws \Drupal\Component\Plugin\Exception\PluginNotFoundException
+   * @See \joinup_test_install()
    *
    * @return \Drupal\node\Entity\Node
    *   owner entity from field "contact" in Joinup collection
+   *
+   * @throws \Drupal\Component\Plugin\Exception\PluginNotFoundException
+   *
+   * @throws \Drupal\Component\Plugin\Exception\InvalidPluginDefinitionException
    */
   protected function getDefaultOwner(): Node {
-    $nodeStorage = \Drupal::entityTypeManager()->getStorage('node');
-    $node = $nodeStorage->loadByProperties([
-      'type' => 'owner',
-      'uuid' => 'a1b2c3d4-e5f6-7890-ab12-cd34ef567891',
-    ]);
-    return array_shift($node);
+    return \Drupal::service('entity.repository')
+      ->loadEntityByUuid('node', 'a1b2c3d4-e5f6-7890-ab12-cd34ef567891');
   }
 
 }
diff --git a/web/modules/custom/joinup_test/joinup_test.install b/web/modules/custom/joinup_test/joinup_test.install
index d5d7f09d28..3f9cf1cf2a 100644
--- a/web/modules/custom/joinup_test/joinup_test.install
+++ b/web/modules/custom/joinup_test/joinup_test.install
@@ -24,25 +24,18 @@ function joinup_test_install($is_syncing): void {
   $termStorage = $entityTypeManager->getStorage('taxonomy_term');
 
   // Creates a term given term data from YAML file.
-  $createTerm = function(string $vid, int $weight, array $data, array $definitions, int $parentTermId = 0) use ($termStorage): TermInterface {
+  $createTerm = function (string $vid, int $weight, array $data, array $definitions, int $parentTermId = 0) use ($termStorage): TermInterface {
     $values = ['vid' => $vid, 'weight' => $weight, 'parent' => $parentTermId];
     foreach ($data as $fieldName => $fieldValue) {
       if (isset($definitions[$fieldName])) {
-        if (is_a($definitions[$fieldName]->getItemDefinition()
-          ->getClass(), EntityReferenceItemInterface::class, TRUE)) {
+        if (is_a($definitions[$fieldName]->getItemDefinition()->getClass(), EntityReferenceItemInterface::class, TRUE)) {
           // Reference to other entity should be always represented as URI.
           assert((bool) filter_var($fieldValue, FILTER_VALIDATE_URL));
-          $values[$fieldName] = \Drupal::getContainer()
-            ->get('rdf_sync.mapper')
-            ->getEntityByUri($fieldValue);
+          $values[$fieldName] = \Drupal::getContainer()->get('rdf_sync.mapper')->getEntityByUri($fieldValue);
         }
         else {
-          if (is_a($definitions[$fieldName]->getItemDefinition()
-            ->getClass(), TextItemBase::class, TRUE)) {
-            $fieldValue = [
-              'value' => $fieldValue,
-              'format' => 'content_editor',
-            ];
+          if (is_a($definitions[$fieldName]->getItemDefinition()->getClass(), TextItemBase::class, TRUE)) {
+            $fieldValue = ['value' => $fieldValue, 'format' => 'content_editor'];
           }
           $values[$fieldName] = $fieldValue;
         }
-- 
GitLab


From c4998336e30d324905a68cdc7b2c78129ebd2e01 Mon Sep 17 00:00:00 2001
From: "micha.jakubowski" <micha.jakubowski@ffwagency.com>
Date: Fri, 6 Dec 2024 13:55:29 +0100
Subject: [PATCH 054/137] ISAICP-8780: tests fix - group i

---
 tests/features/solution/solution.notifications.feature  | 1 +
 tests/features/taxonomy/curated_homepage_topics.feature | 4 ++--
 2 files changed, 3 insertions(+), 2 deletions(-)

diff --git a/tests/features/solution/solution.notifications.feature b/tests/features/solution/solution.notifications.feature
index b2acd9acbd..ef7d1847d4 100644
--- a/tests/features/solution/solution.notifications.feature
+++ b/tests/features/solution/solution.notifications.feature
@@ -61,6 +61,7 @@ Feature: Solution notifications
     # Template 15. The moderation team requests changes.
     When I go to the homepage of the "Solution notification to request changes" solution
     And I click "Edit" in the "Entity actions" region
+    And I select "Data Owner" from "Solution type"
     And I press "Request changes"
     # Motivation required.
     Then I should see the error message "This action requires you to fill in the motivation field"
diff --git a/tests/features/taxonomy/curated_homepage_topics.feature b/tests/features/taxonomy/curated_homepage_topics.feature
index 879188c268..f75e186d1b 100644
--- a/tests/features/taxonomy/curated_homepage_topics.feature
+++ b/tests/features/taxonomy/curated_homepage_topics.feature
@@ -592,8 +592,8 @@ Feature:
       | Show content    | type: select - value: All                                  |
       | Query presets   | type: text - value: entity_bundle\|solution,collection\|IN |
     And I press "Save"
-    And the url should match "/topic/law-and-justice/e-justice"
+#    And the url should match "/topic/law-and-justice/e-justice"
     And I should see the text "Magic abstract" in the "Col with abstract" tile
     And I should see the text "Another abstract" in the "Col without abstract" tile
-    And I should see the text "default abstract" in the "Another rough day" tile
+    And I should see the text "Lorem description issum" in the "Another rough day" tile
     And I should see the text "This is an soltion with abstract" in the "Just another solt" tile
-- 
GitLab


From fa4f7ec3e000e6f5d41384cd66cbb3f606d8ffa5 Mon Sep 17 00:00:00 2001
From: "micha.jakubowski" <micha.jakubowski@ffwagency.com>
Date: Fri, 6 Dec 2024 14:20:46 +0100
Subject: [PATCH 055/137] ISAICP-8780: tests fix - group g

---
 tests/features/joinup_rss/collection_feed.feature | 6 +++---
 tests/features/joinup_search/search.feature       | 2 +-
 2 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/tests/features/joinup_rss/collection_feed.feature b/tests/features/joinup_rss/collection_feed.feature
index 869b825e8c..01aa2b491b 100644
--- a/tests/features/joinup_rss/collection_feed.feature
+++ b/tests/features/joinup_rss/collection_feed.feature
@@ -60,8 +60,8 @@ Feature: Collection RSS feed.
       | title                                                      | link                                                                     | description                                                                            | published at                    | author          |
       | Discussion: Is the indigo coloration caused by their food? | /collection/indigo-monkey/discussion/indigo-coloration-caused-their-food | I was reading the technical paper and it seems their main food is the indigo cherries. | Mon, 21 Jan 2019 13:00:00 +0000 | Aleta Jakeman   |
       | News: Monkeys favourite indigo amongst colors              | /collection/indigo-monkey/news/monkeys-favourite-indigo-amongst-colors   | Research results are out.                                                              | Mon, 21 Jan 2019 12:36:00 +0000 | Aleta Jakeman   |
-      | Solution: Proton Lonesome                                  | /collection/indigo-monkey/solution/proton-lonesome                       |                                                                                        | Sat, 05 Jan 2019 10:00:00 +0000 | Aleta Jakeman   |
-      | Solution: Lantern Global                                   | /collection/indigo-monkey/solution/lantern-global                        |                                                                                        | Tue, 18 Dec 2018 08:00:00 +0000 | Aleta Jakeman   |
+      | Solution: Proton Lonesome                                  | /collection/indigo-monkey/solution/proton-lonesome                       | <p>default description</p>                                                             | Sat, 05 Jan 2019 10:00:00 +0000 | Aleta Jakeman   |
+      | Solution: Lantern Global                                   | /collection/indigo-monkey/solution/lantern-global                        | <p>default description</p>                                                             | Tue, 18 Dec 2018 08:00:00 +0000 | Aleta Jakeman   |
       | Event: Banana tasting                                      | /collection/indigo-monkey/event/banana-tasting                           | Testing more than 20 varities of bananas from all over the world.                      | Fri, 14 Sep 2018 07:36:00 +0000 | Forest Robinson |
       | Custom page: Indigo variations                             | /collection/indigo-monkey/indigo-variations                              | The four major tones of indigo are listed here.                                        | Sun, 15 Oct 2017 18:30:00 +0000 | Forest Robinson |
       | Document: Indigo technical paper                           | /collection/indigo-monkey/document/indigo-technical-paper                | All technical information about the rare indigo monkeys.                               | Mon, 30 May 2016 12:21:00 +0000 | Aleta Jakeman   |
@@ -77,7 +77,7 @@ Feature: Collection RSS feed.
       | link        | /collection/dreaded-scissors                                                                                          |
     And the RSS feed items should be:
       | title                                   | link                                                                | description                                                                                                                                                                                              | published at                    | author     |
-      | Solution: Shiny Ray                     | /collection/dreaded-scissors/solution/shiny-ray                     |                                                                                                                                                                                                          | Tue, 14 Aug 2018 17:36:00 +0000 | Otto Drake |
+      | Solution: Shiny Ray                     | /collection/dreaded-scissors/solution/shiny-ray                     | <p>default description</p>                                                                                                                                                                               | Tue, 14 Aug 2018 17:36:00 +0000 | Otto Drake |
       | News: New metal alloy improves scissors | /collection/dreaded-scissors/news/new-metal-alloy-improves-scissors | It improves sharpness but they are more subject to rust.                                                                                                                                                 | Wed, 11 Apr 2018 09:00:00 +0000 | Otto Drake |
       # The 'Scissor sharpening party' is using the `content_editor` text format
       # which is not configured to wrap the result in <p> tags after stripping
diff --git a/tests/features/joinup_search/search.feature b/tests/features/joinup_search/search.feature
index ddda77daf5..37614f9f84 100644
--- a/tests/features/joinup_search/search.feature
+++ b/tests/features/joinup_search/search.feature
@@ -338,7 +338,7 @@ Feature: Global search
     When I go to the homepage
     And I enter "contact" in the search bar and press enter
     # The Portal collection is included
-    Then the page should show the tiles "The Portal, Solution alpha, Release Alpha"
+    Then the page should show the tiles "The Portal, Solution alpha, Release Alpha, Collection alpha, Col for Sol"
 
     # Users should be found by first name, family name and organisation.
     When I enter "Jenessa" in the search bar and press enter
-- 
GitLab


From 9b8e748cd4c8137b29e6962c5ee89eb3316f166e Mon Sep 17 00:00:00 2001
From: "micha.jakubowski" <micha.jakubowski@ffwagency.com>
Date: Fri, 6 Dec 2024 14:54:24 +0100
Subject: [PATCH 056/137] ISAICP-8780: tests fix - group g

---
 .../community.content.subscriptions.feature          | 12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)

diff --git a/tests/features/joinup_subscription/community.content.subscriptions.feature b/tests/features/joinup_subscription/community.content.subscriptions.feature
index 942ca9788a..a6bbc3cd70 100644
--- a/tests/features/joinup_subscription/community.content.subscriptions.feature
+++ b/tests/features/joinup_subscription/community.content.subscriptions.feature
@@ -44,13 +44,13 @@ Feature: Subscribing to community content in collections and solutions
       | Distant observers | Distant abstract | Distribution of bolometric flux |                    | Bolometric appearance | published | junfukue |
       | Close observers   |                  | Close observers body            |                    | Bolometric appearance | published | junfukue |
     And event content:
-      | title               | field_paragraphs_body | collection         | solution       | state     | author   | start date          | end date            |
-      | Effective potential | Schwarzschild metric  | Black hole imaging |                | published | junfukue | 2019-11-28T11:12:13 | 2019-11-28T11:12:13 |
-      | Deflected rays      | Marginally trapped    |                    | Null geodesics | published | junfukue | 2019-12-05T12:00:00 | 2019-12-15T12:00:00 |
+      | title               | field_paragraphs_body | collection         | solution       | state     | author   | start date          | end date            |abstract |
+      | Effective potential | Schwarzschild metric  | Black hole imaging |                | published | junfukue | 2019-11-28T11:12:13 | 2019-11-28T11:12:13 |         |
+      | Deflected rays      | Marginally trapped    |                    | Null geodesics | published | junfukue | 2019-12-05T12:00:00 | 2019-12-15T12:00:00 |         |
     And news content:
-      | title             | field_paragraphs_body      | collection         | solution              | state     | author |
-      | The periastron    | Jacobian elliptic integral | Black hole imaging |                       | published | bisera |
-      | Newtonian context | Projecting ellipses        |                    | Bolometric appearance | archived  | hristo |
+      | title             | field_paragraphs_body      | collection         | solution              | state     | author | abstract |
+      | The periastron    | Jacobian elliptic integral | Black hole imaging |                       | published | bisera |          |
+      | Newtonian context | Projecting ellipses        |                    | Bolometric appearance | archived  | hristo |          |
 
     # The group content digest should contain the content posted in the
     # collection and the solution.
-- 
GitLab


From fc6b4860bedc22abae7179be367f0b665d2a2ff9 Mon Sep 17 00:00:00 2001
From: "micha.jakubowski" <micha.jakubowski@ffwagency.com>
Date: Fri, 6 Dec 2024 16:00:40 +0100
Subject: [PATCH 057/137] ISAICP-8780: tests fix - group i

---
 tests/features/solution/manage_solutions.archive.feature | 1 +
 tests/features/solution/solution.notifications.feature   | 2 +-
 2 files changed, 2 insertions(+), 1 deletion(-)

diff --git a/tests/features/solution/manage_solutions.archive.feature b/tests/features/solution/manage_solutions.archive.feature
index d8b422745b..5d0809e56a 100644
--- a/tests/features/solution/manage_solutions.archive.feature
+++ b/tests/features/solution/manage_solutions.archive.feature
@@ -252,6 +252,7 @@ Feature: When a solution is archived then its sub-content also should be archive
     Then I should not see the text "Archived" in the "Header"
     When I go to the edit form of the "Solution" solution
     Then I should see the button "Archive"
+    And I select "Data Owner" from "Solution type"
     And I press "Archive"
     Then I should see the text "Archived" in the "Header"
 
diff --git a/tests/features/solution/solution.notifications.feature b/tests/features/solution/solution.notifications.feature
index ef7d1847d4..8f665b0175 100644
--- a/tests/features/solution/solution.notifications.feature
+++ b/tests/features/solution/solution.notifications.feature
@@ -25,7 +25,6 @@ Feature: Solution notifications
       | Solution notification to propose from request changes | Ramiro Myers | Collection of random solutions | needs update |
       | Solution notification to delete by moderator team     | Ramiro Myers | Collection of random solutions | published    |
       | Solution notification to delete by owner              | Ramiro Myers | Collection of random solutions | published    |
-
     When I am logged in as "Pat Harper"
 
     # Template 7. The moderation team proposes changes.
@@ -35,6 +34,7 @@ Feature: Solution notifications
     # Motivation required.
     Then I should see the error message "This action requires you to fill in the motivation field"
     When I fill in "Motivation" with "Please, check my updates"
+    And I select "Data Owner" from "Solution type"
     And I press "Propose"
     Then the email sent to "Ramiro Myers" with subject "Interoperable Europe Portal: Changes have been proposed for your solution" contains the following lines of text:
       | The Portal Support Team has requested you to modify the interoperability solution "Solution notification to propose changes", with the following motivation: Please, check my updates. |
-- 
GitLab


From 1b2faaf5a509e0b8a32fd87dd62cb47e1a26222c Mon Sep 17 00:00:00 2001
From: "micha.jakubowski" <micha.jakubowski@ffwagency.com>
Date: Tue, 10 Dec 2024 10:19:38 +0100
Subject: [PATCH 058/137] ISAICP-8780: new uuid for contact and owner

---
 tests/src/Traits/NodeTrait.php                         |  5 +++--
 .../joinup_collection/src/JoinupCollectionHelper.php   | 10 ++++++++++
 web/modules/custom/joinup_test/joinup_test.install     |  4 ++--
 3 files changed, 15 insertions(+), 4 deletions(-)

diff --git a/tests/src/Traits/NodeTrait.php b/tests/src/Traits/NodeTrait.php
index 24e340c1ff..a280d40111 100644
--- a/tests/src/Traits/NodeTrait.php
+++ b/tests/src/Traits/NodeTrait.php
@@ -4,6 +4,7 @@
 
 namespace Drupal\joinup\Traits;
 
+use Drupal\joinup_collection\JoinupCollectionHelper;
 use Drupal\node\Entity\Node;
 
 /**
@@ -59,7 +60,7 @@ public function getNodeRevisionIdsList(string $title, string $bundle, ?bool $pub
    */
   protected function getDefaultContact(): Node {
     return \Drupal::service('entity.repository')
-      ->loadEntityByUuid('node', 'a1b2c3d4-e5f6-7890-ab12-cd34ef567890');
+      ->loadEntityByUuid('node', JoinupCollectionHelper::JOINUP_CONTACT_UUID);
   }
 
   /**
@@ -76,7 +77,7 @@ protected function getDefaultContact(): Node {
    */
   protected function getDefaultOwner(): Node {
     return \Drupal::service('entity.repository')
-      ->loadEntityByUuid('node', 'a1b2c3d4-e5f6-7890-ab12-cd34ef567891');
+      ->loadEntityByUuid('node', JoinupCollectionHelper::JOINUP_OWNER_UUID);
   }
 
 }
diff --git a/web/modules/custom/joinup_communities/joinup_collection/src/JoinupCollectionHelper.php b/web/modules/custom/joinup_communities/joinup_collection/src/JoinupCollectionHelper.php
index 136af4ca24..5df1c90372 100644
--- a/web/modules/custom/joinup_communities/joinup_collection/src/JoinupCollectionHelper.php
+++ b/web/modules/custom/joinup_communities/joinup_collection/src/JoinupCollectionHelper.php
@@ -14,4 +14,14 @@ class JoinupCollectionHelper {
    */
   public const string JOINUP_COLLECTION_URI = 'http://data.europa.eu/w21/df34e3a2-207b-4910-a804-344931654e20';
 
+  /**
+   * The UUID of the contact related to Joinup collection.
+   */
+  public const string JOINUP_CONTACT_UUID = '44adff59-50b8-44e5-a685-38e43c61fce9';
+
+  /**
+   * The UUID of the owner related to Joinup collection.
+   */
+  public const string JOINUP_OWNER_UUID = '0c6c8821-6e7f-43da-8931-addf604d90d1';
+
 }
diff --git a/web/modules/custom/joinup_test/joinup_test.install b/web/modules/custom/joinup_test/joinup_test.install
index 3f9cf1cf2a..10cb4bcd6d 100644
--- a/web/modules/custom/joinup_test/joinup_test.install
+++ b/web/modules/custom/joinup_test/joinup_test.install
@@ -99,13 +99,13 @@ function joinup_test_install($is_syncing): void {
       ],
       'contact' => $nodeStorage->create([
         'type' => 'contact_information',
-        'uuid' => 'a1b2c3d4-e5f6-7890-ab12-cd34ef567890',
+        'uuid' => JoinupCollectionHelper::JOINUP_CONTACT_UUID,
         'title' => 'Contact name',
         'email' => 'contact.email@example.com',
       ]),
       'owner' => $nodeStorage->create([
         'type' => 'owner',
-        'uuid' => 'a1b2c3d4-e5f6-7890-ab12-cd34ef567891',
+        'uuid' => JoinupCollectionHelper::JOINUP_OWNER_UUID,
         'title' => 'ISA²',
       ]),
 
-- 
GitLab


From 64bb7d9b28031d866394b6691a2d5c36735f3535 Mon Sep 17 00:00:00 2001
From: "micha.jakubowski" <micha.jakubowski@ffwagency.com>
Date: Tue, 10 Dec 2024 12:09:40 +0100
Subject: [PATCH 059/137] ISAICP-8780: tests fix on clone-behat

---
 .../contact_information/contact_information.seo.feature        | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/tests/features/contact_information/contact_information.seo.feature b/tests/features/contact_information/contact_information.seo.feature
index ce475d78a2..7c4e76291a 100644
--- a/tests/features/contact_information/contact_information.seo.feature
+++ b/tests/features/contact_information/contact_information.seo.feature
@@ -40,6 +40,7 @@ Feature: Contact Information entities don't cause exceptions because of their in
     And I press "Create owner"
 
     # Add the contact information entity.
+    And I press "Add new contact information"
     And I fill in "Name" with "Mr. John Doe DLA"
     And I fill in "E-mail address" with "john.doe@example.com"
     And I fill in "Website URL" with "http://example.com/john-doe"
@@ -47,7 +48,7 @@ Feature: Contact Information entities don't cause exceptions because of their in
 
     And I press "Publish"
     Then I should see the success message containing "Status message You've added a collection short ID: contact-info-test. It will take some time until the collection content URLs will be updated."
-    And I should see the success message "A new confirmation message has been sent to john.doe@example.com."
+    And I should see the success message "A new confirmation message has been sent"
 
     # Visit the canonical page of the contact information entity created by IEF.
     When I go to the "Mr. John Doe DLA" contact information page
-- 
GitLab


From d6eb1d497e3b0cb130c2f3b241ddbb54a9251ab9 Mon Sep 17 00:00:00 2001
From: "micha.jakubowski" <micha.jakubowski@ffwagency.com>
Date: Tue, 10 Dec 2024 14:25:50 +0100
Subject: [PATCH 060/137] ISAICP-8780: contact information and owner update

---
 .../contact_information/contact_information.seo.feature      | 5 ++---
 tests/src/Context/JoinupContext.php                          | 4 ++--
 2 files changed, 4 insertions(+), 5 deletions(-)

diff --git a/tests/features/contact_information/contact_information.seo.feature b/tests/features/contact_information/contact_information.seo.feature
index 7c4e76291a..9007067983 100644
--- a/tests/features/contact_information/contact_information.seo.feature
+++ b/tests/features/contact_information/contact_information.seo.feature
@@ -21,8 +21,8 @@ Feature: Contact Information entities don't cause exceptions because of their in
   @javascript
   Scenario: Create contact info entity through IEF in a collection.
     Given collection content:
-      | title                     | state     |
-      | Contact Info Content Test | published |
+      | title                     | state     | owner | contact |
+      | Contact Info Content Test | published |       |         |
     Given I am logged in as a user with the "moderator" role
     When I go to the edit form of the "Contact Info Content Test" collection
     Then I should see the text "Edit Collection Contact Info Content Test"
@@ -40,7 +40,6 @@ Feature: Contact Information entities don't cause exceptions because of their in
     And I press "Create owner"
 
     # Add the contact information entity.
-    And I press "Add new contact information"
     And I fill in "Name" with "Mr. John Doe DLA"
     And I fill in "E-mail address" with "john.doe@example.com"
     And I fill in "Website URL" with "http://example.com/john-doe"
diff --git a/tests/src/Context/JoinupContext.php b/tests/src/Context/JoinupContext.php
index aed6f7301e..132c101e9c 100644
--- a/tests/src/Context/JoinupContext.php
+++ b/tests/src/Context/JoinupContext.php
@@ -815,10 +815,10 @@ public function massageFieldsBeforeNodeCreate(BeforeNodeCreateScope $scope): voi
       $node->field_topic = $this->getRandomTopic()->label();
     }
 
-    if (!empty($field_definitions['contact']) && empty($node->contact)) {
+    if (!empty($field_definitions['contact']) && !isset($node->contact)) {
       $node->contact = $this->getDefaultContact()->label();
     }
-    if (!empty($field_definitions['owner']) && empty($node->owner)) {
+    if (!empty($field_definitions['owner']) && !isset($node->owner)) {
       $node->owner = $this->getDefaultOwner()->label();
     }
     if (!empty($field_definitions['abstract']) && !isset($node->abstract)) {
-- 
GitLab


From 1f69b61a5bd3d5327c544b7fe0028b4a0dfac6ae Mon Sep 17 00:00:00 2001
From: "micha.jakubowski" <micha.jakubowski@ffwagency.com>
Date: Fri, 13 Dec 2024 12:21:35 +0100
Subject: [PATCH 061/137] ISAICP-8780: typo fix

---
 tests/src/Traits/NodeTrait.php | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/tests/src/Traits/NodeTrait.php b/tests/src/Traits/NodeTrait.php
index a280d40111..ebc550d1ea 100644
--- a/tests/src/Traits/NodeTrait.php
+++ b/tests/src/Traits/NodeTrait.php
@@ -47,7 +47,7 @@ public function getNodeRevisionIdsList(string $title, string $bundle, ?bool $pub
   }
 
   /**
-   * Returns contact_information entity referenced in Joinip collection.
+   * Returns contact_information entity referenced in Joinup collection.
    *
    * @See \joinup_test_install()
    *
@@ -64,7 +64,7 @@ protected function getDefaultContact(): Node {
   }
 
   /**
-   * Returns owner entity referenced in Joinip collection.
+   * Returns owner entity referenced in Joinup collection.
    *
    * @See \joinup_test_install()
    *
-- 
GitLab


From 3692b1e1228f483e6263428c5a0b8ddd3347fb0e Mon Sep 17 00:00:00 2001
From: "micha.jakubowski" <micha.jakubowski@ffwagency.com>
Date: Fri, 13 Dec 2024 13:14:32 +0100
Subject: [PATCH 062/137] ISAICP-8780: cleanup state published in tests

---
 .../collection/collection_overview.feature    | 28 +++++++-------
 .../collection/last_update_time.feature       |  4 +-
 .../add_community_content.feature             | 38 +++++++++----------
 .../contact_information.moderation.feature    |  4 +-
 .../announcements.professional_domain.feature |  4 +-
 .../member_permissions_table.feature          | 24 ++++++------
 .../my_subscriptions.feature                  | 10 ++---
 7 files changed, 56 insertions(+), 56 deletions(-)

diff --git a/tests/features/collection/collection_overview.feature b/tests/features/collection/collection_overview.feature
index 5073a25709..d2cefcdff8 100644
--- a/tests/features/collection/collection_overview.feature
+++ b/tests/features/collection/collection_overview.feature
@@ -98,12 +98,12 @@ Feature: Collections Overview
   @javascript
   Scenario: Feature icon should be visible for collection's content.
     Given collection content:
-      | title                   | state     |
-      | Service Management apps | published |
+      | title                   |
+      | Service Management apps |
     And news content:
-      | title  | collection              | state     | featured |
-      | Jira   | Service Management apps | published | yes      |
-      | Trello | Service Management apps | published | no       |
+      | title  | collection              | featured |
+      | Jira   | Service Management apps | yes      |
+      | Trello | Service Management apps | no       |
     When I go to the homepage of the "Service Management apps" collection
     Then the "Jira" tile should be marked as featured
     But the "Trello" "news" tile should not be marked as featured
@@ -115,17 +115,17 @@ Feature: Collections Overview
       | Luigi Plant       |
       | Yiannis Parios    |
     And collection content:
-      | title                       | state     | featured | author            |
-      | Enemies of the state        | published | yes      | Luigi Plant       |
-      | Fed up meatlovers           | published | no       | Carolina Mercedes |
-      | Ugly farmers                | published | yes      | Luigi Plant       |
-      | Yiannis Parios collection 1 | published | no       | Yiannis Parios    |
-      | Yiannis Parios collection 2 | published | no       | Yiannis Parios    |
-      | Yiannis Parios collection 3 | published | no       | Yiannis Parios    |
+      | title                       | featured | author            |
+      | Enemies of the state        | yes      | Luigi Plant       |
+      | Fed up meatlovers           | no       | Carolina Mercedes |
+      | Ugly farmers                | yes      | Luigi Plant       |
+      | Yiannis Parios collection 1 | no       | Yiannis Parios    |
+      | Yiannis Parios collection 2 | no       | Yiannis Parios    |
+      | Yiannis Parios collection 3 | no       | Yiannis Parios    |
     # Technical: use a separate step to create a collection associated to the anonymous user.
     And collection content:
-      | title              | state     | featured |
-      | Biologic meatballs | published | no       |
+      | title              | featured |
+      | Biologic meatballs | no       |
 
     When I am logged in as "Yiannis Parios"
     And I visit the collection overview
diff --git a/tests/features/collection/last_update_time.feature b/tests/features/collection/last_update_time.feature
index 5ca6db79d9..bd3bf39bba 100644
--- a/tests/features/collection/last_update_time.feature
+++ b/tests/features/collection/last_update_time.feature
@@ -9,8 +9,8 @@ Feature: Tests the collection last update time.
       | Username    | Roles     |
       | The Cleaner | moderator |
     And collection content:
-      | title            | state     | modification date | creation date | author      |
-      | Household Wizard | published | 2011-05-06T21:56  | 2001-01-03    | The Cleaner |
+      | title            | modification date | creation date | author      |
+      | Household Wizard | 2011-05-06T21:56  | 2001-01-03    | The Cleaner |
     Given solution content:
       | title           | collection       | state     | modification date | creation date | author      |
       | Roof Hole Cover | Household Wizard | published | 2010-07-05T23:03  | 2001-01-01    | The Cleaner |
diff --git a/tests/features/community_content/add_community_content.feature b/tests/features/community_content/add_community_content.feature
index 23eef1209f..49ebad7ee3 100644
--- a/tests/features/community_content/add_community_content.feature
+++ b/tests/features/community_content/add_community_content.feature
@@ -6,8 +6,8 @@ Feature: Add community content
 
   Scenario Outline: Advanced content and group administration should not be accessible for group members
     Given collection content:
-      | title           | state     |
-      | The night shift | published |
+      | title           |
+      | The night shift |
 
     When I am logged in as a "<member type>" of the "The night shift" collection
     And I go to the homepage of the "The night shift" collection
@@ -38,8 +38,8 @@ Feature: Add community content
 
   Scenario Outline: Advanced content and group administration should not be accessible for moderators
     Given collection content:
-      | title           | state     |
-      | The night shift | published |
+      | title           |
+      | The night shift |
 
     When I am logged in as a "moderator"
     And I go to the homepage of the "The night shift" collection
@@ -71,8 +71,8 @@ Feature: Add community content
       | Username  | E-mail                     | First name | Family name    | Roles     |
       | Publisher | publisher-example@test.com | Publisher  | Georgakopoulos | moderator |
     And collection content:
-      | title               | state     |
-      | The afternoon shift | published |
+      | title               |
+      | The afternoon shift |
     And discussion content:
       | title             | content         | author    | state | collection          | created    |
       | Sample discussion | Sample content. | Publisher | draft | The afternoon shift | 01-01-2010 |
@@ -113,8 +113,8 @@ Feature: Add community content
 
   Scenario: Directly publishing community content sets the correct publication date.
     Given collection content:
-      | title        | description                  | logo     | state     |
-      | CC container | Community content container. | logo.png | published |
+      | title        | description                  | logo     |
+      | CC container | Community content container. | logo.png |
     And I am logged in as a "facilitator" of the "CC container" collection
 
     # Create a published discussion.
@@ -186,11 +186,11 @@ Feature: Add community content
 
   Scenario Outline: Community content type is indicated on the byline
     Given collection content:
-      | title           | state     |
-      | The night watch | published |
+      | title           |
+      | The night watch |
     And <content type> content:
-      | title                   | collection      | state     |
-      | The glorious revolution | The night watch | published |
+      | title                   | collection      |
+      | The glorious revolution | The night watch |
     When I go to the content page of the type "<content type>" with the title "The glorious revolution"
     Then I should see the text <label> in the "Page title" region
 
@@ -202,12 +202,12 @@ Feature: Add community content
 
   Scenario: Event content type is not indicated on the byline
     Given collection content:
-      | title           | state     |
-      | The night batch | published |
+      | title           |
+      | The night batch |
     And event content:
-      | title                    | collection      | state     | start date   | end date            | state     |
-      | Red glorious revolution  | The night batch | published | now +1 years | now +1 years +1 day | published |
-      | Blue glorious revolution | The night batch | published | now -1 years | now -1 years +1 day | published |
+      | title                    | collection      | start date   | end date            |
+      | Red glorious revolution  | The night batch | now +1 years | now +1 years +1 day |
+      | Blue glorious revolution | The night batch | now -1 years | now -1 years +1 day |
     When I go to the content page of the type "event" with the title "Red glorious revolution"
     And I should see the button "Add to Calendar"
     And I should see the link "Google"
@@ -227,8 +227,8 @@ Feature: Add community content
   @javascript @loggedErrors @uploadFiles:logo.png
   Scenario: Editor File dialog form does not trigger warning
     Given collection content:
-      | title                        | state     |
-      | The editor tester collection | published |
+      | title                        |
+      | The editor tester collection |
     And the site error reporting verbosity is "verbose"
 
     When I am logged in as a "facilitator" of the "The editor tester collection" collection
diff --git a/tests/features/contact_information/contact_information.moderation.feature b/tests/features/contact_information/contact_information.moderation.feature
index d5ec50bf7c..d9d42f1e1b 100644
--- a/tests/features/contact_information/contact_information.moderation.feature
+++ b/tests/features/contact_information/contact_information.moderation.feature
@@ -118,8 +118,8 @@ Feature: Contact Information moderation
       | name        | email            | author         | state     |
       | Secreteriat | info@example.com | Sown Carnberry | validated |
     And collection content:
-      | title                 | description        | logo     | owner       | contact information | state     |
-      | Saint Louis solutions | A software company | logo.png | Saint Louis | Secreteriat         | published |
+      | title                 | description        | logo     | owner       | contact information |
+      | Saint Louis solutions | A software company | logo.png | Saint Louis | Secreteriat         |
     And the following collection user memberships:
       | collection            | user            | roles       |
       | Saint Louis solutions | Sown Carnberry  |             |
diff --git a/tests/features/joinup_group/announcements.professional_domain.feature b/tests/features/joinup_group/announcements.professional_domain.feature
index 5fe0e946ae..1fa2195734 100644
--- a/tests/features/joinup_group/announcements.professional_domain.feature
+++ b/tests/features/joinup_group/announcements.professional_domain.feature
@@ -3,8 +3,8 @@ Feature: Filter announcements by professional domain
 
   Scenario Outline: User can narrow down targeted users based on the business domains.
     Given <group> content:
-      | title         | state     |
-      | Pension funds | published |
+      | title         |
+      | Pension funds |
     And users:
       | Username | E-mail              | Professional domain                     | Status  |
       | Mogul    | mogul@example.com   | Demography, E-health, E-justice, HR, HR | active  |
diff --git a/tests/features/joinup_group/member_permissions_table.feature b/tests/features/joinup_group/member_permissions_table.feature
index 4f9d75ca0c..4a5a69c60d 100644
--- a/tests/features/joinup_group/member_permissions_table.feature
+++ b/tests/features/joinup_group/member_permissions_table.feature
@@ -15,19 +15,19 @@ Feature: Group member permissions table
       | Hex              |
       | Mustrum Ridcully |
     Given collection content:
-      | title                                       | state     | content creation         | moderation |
-      | Applied astrology                           | published | facilitators and authors | yes        |
-      | Illiberal studies                           | published | facilitators and authors | no         |
-      | Approximate accuracy                        | published | members                  | yes        |
-      | Dust, miscellaneous particles and filaments | published | members                  | no         |
-      | Creative uncertainty                        | published | registered users         | yes        |
-      | Woolly thinking                             | published | registered users         | no         |
+      | title                                       | content creation         | moderation |
+      | Applied astrology                           | facilitators and authors | yes        |
+      | Illiberal studies                           | facilitators and authors | no         |
+      | Approximate accuracy                        | members                  | yes        |
+      | Dust, miscellaneous particles and filaments | members                  | no         |
+      | Creative uncertainty                        | registered users         | yes        |
+      | Woolly thinking                             | registered users         | no         |
     Given solution content:
-      | title                         | state     | content creation         | moderation |
-      | Applied anthropics            | published | facilitators and authors | yes        |
-      | Extreme horticulture          | published | facilitators and authors | no         |
-      | Prehumous morbid bibliomancy  | published | registered users         | yes        |
-      | Posthumous morbid bibliomancy | published | registered users         | no         |
+      | title                         | content creation         | moderation |
+      | Applied anthropics            | facilitators and authors | yes        |
+      | Extreme horticulture          | facilitators and authors | no         |
+      | Prehumous morbid bibliomancy  | registered users         | yes        |
+      | Posthumous morbid bibliomancy | registered users         | no         |
     And the following collection user memberships:
       | collection                                  | user             | roles       |
       | Approximate accuracy                        | Horace Worblehat |             |
diff --git a/tests/features/joinup_subscription/my_subscriptions.feature b/tests/features/joinup_subscription/my_subscriptions.feature
index 9b0aa7c74e..d15437c771 100644
--- a/tests/features/joinup_subscription/my_subscriptions.feature
+++ b/tests/features/joinup_subscription/my_subscriptions.feature
@@ -189,8 +189,8 @@ Feature: My subscriptions
   @javascript
   Scenario Outline: Change the notification frequency of my digests
     Given collection content:
-      | title           | state     |
-      | Malicious plans | published |
+      | title           |
+      | Malicious plans |
     And the following collection user memberships:
       | collection      | user             |
       | Malicious plans | Auric Goldfinger |
@@ -243,9 +243,9 @@ Feature: My subscriptions
   Scenario: Regression test "My subscriptions"
 
     Given collection content:
-      | title     | state     |
-      | Fireblade | published |
-      | Lopitopes | published |
+      | title     |
+      | Fireblade |
+      | Lopitopes |
     And user:
       | Username | Blade One           |
       | E-mail   | blade.1@example.com |
-- 
GitLab


From 929cff5f2e14514ec3ee8077e382b7c53606daee Mon Sep 17 00:00:00 2001
From: "micha.jakubowski" <micha.jakubowski@ffwagency.com>
Date: Mon, 16 Dec 2024 11:21:08 +0100
Subject: [PATCH 063/137] ISAICP-8780: cleanup tests with owner

---
 .../collection/collection_content.feature     |   4 +-
 tests/features/collection/homepage.feature    |  22 +-
 tests/features/collection/propose.feature     |   4 +-
 .../features/communities/eif/toolbox.feature  |   3 -
 .../archive.listings.feature                  |  44 ++--
 .../contact_information.moderation.feature    |   7 +-
 .../community_content.view_mode.feature       |  68 +++--
 .../joinup_event/event.moderation.feature     |  10 +-
 tests/features/joinup_group/short_id.feature  |  12 +-
 .../joinup_release/add_release.feature        |  27 +-
 .../joinup_release/release.delete.feature     |  24 +-
 tests/features/joinup_search/search.feature   | 236 ++++++++----------
 tests/features/solution/homepage.feature      |   4 +-
 .../solution/homepage_content.feature         |  16 +-
 .../solution/manage_solutions.archive.feature |   3 -
 .../solution/related_solution.feature         |  20 +-
 tests/features/user/profile.feature           |  39 ++-
 17 files changed, 231 insertions(+), 312 deletions(-)

diff --git a/tests/features/collection/collection_content.feature b/tests/features/collection/collection_content.feature
index a87de61a96..5520ca6747 100644
--- a/tests/features/collection/collection_content.feature
+++ b/tests/features/collection/collection_content.feature
@@ -21,8 +21,8 @@ Feature: Collection content
       | title                                     | collection                | start date          | end date            | topic             |
       | Opening of the Hellenistic Period Section | Turin Egyptian Collection | 2016-03-15T11:12:12 | 2016-03-15T11:12:12 | Supplier exchange |
     And news content:
-      | title                          | body                                                           | state     | collection                | changed    | topic             |
-      | Turin Egyptian Museum Reopened | <p>After <em>more than</em> <a href="#link">two years</a>.</p> | published | Turin Egyptian Collection | 2019-11-19 | Supplier exchange |
+      | title                          | body                                                           | collection                | changed    | topic             |
+      | Turin Egyptian Museum Reopened | <p>After <em>more than</em> <a href="#link">two years</a>.</p> | Turin Egyptian Collection | 2019-11-19 | Supplier exchange |
 
   Scenario: Publishing new solutions should result in counters being properly updated.
     Given owner content:
diff --git a/tests/features/collection/homepage.feature b/tests/features/collection/homepage.feature
index efbc52440b..fd8af828c1 100644
--- a/tests/features/collection/homepage.feature
+++ b/tests/features/collection/homepage.feature
@@ -16,23 +16,23 @@ Feature: Collection homepage
       | name          |
       | Bilbo Baggins |
     And collection content:
-      | title              | description        | owner         | contact information | logo     | moderation | content creation | state     | topic                            | published at      | modification date |
-      | Middle earth daily | Middle earth daily | Bilbo Baggins | Contact name        | logo.png | yes        | members          | published | Employment and Support Allowance | 2012-12-01 9:00am | 2017-12-01 9:00am |
+      | title              | description        | owner         | contact information | logo     | moderation | content creation | topic                            | published at      | modification date |
+      | Middle earth daily | Middle earth daily | Bilbo Baggins | Contact name        | logo.png | yes        | members          | Employment and Support Allowance | 2012-12-01 9:00am | 2017-12-01 9:00am |
     And solution content:
-      | title        | collection         | description           | content creation | creation date     | state     | topic |
-      | Bilbo's book | Middle earth daily | Bilbo's autobiography | registered users | 2014-10-17 8:32am | published | Info  |
+      | title        | collection         | description           | content creation | creation date     | topic |
+      | Bilbo's book | Middle earth daily | Bilbo's autobiography | registered users | 2014-10-17 8:32am | Info  |
     And the following collection user memberships:
       | collection         | user    | roles       |
       | Middle earth daily | Frodo   | facilitator |
       | Middle earth daily | Boromir |             |
       | Middle earth daily | Legolas |             |
     And news content:
-      | title                                             | body                | topic             | collection         | state     | created           | changed  |
-      | Rohirrim make extraordinary deal                  | Horse prices drops  | Finance in EU     | Middle earth daily | published | 2014-10-17 8:34am | 2017-7-5 |
-      | Breaking: Gandalf supposedly plans his retirement | A new white wizard? | Supplier exchange | Middle earth daily | published | 2014-10-17 8:31am | 2017-7-5 |
+      | title                                             | body                | topic             | collection         | created           | changed  |
+      | Rohirrim make extraordinary deal                  | Horse prices drops  | Finance in EU     | Middle earth daily | 2014-10-17 8:34am | 2017-7-5 |
+      | Breaking: Gandalf supposedly plans his retirement | A new white wizard? | Supplier exchange | Middle earth daily | 2014-10-17 8:31am | 2017-7-5 |
     And event content:
-      | title                                    | short title      | field_paragraphs_body                     | collection         | created           | start date          | end date            | state     | topic             | changed  |
-      | Big hobbit feast - fireworks at midnight | Big hobbit feast | Barbecue followed by dance and fireworks. | Middle earth daily | 2014-10-17 8:33am | 2016-03-15T11:12:12 | 2016-03-15T11:12:12 | published | Supplier exchange | 2017-7-5 |
+      | title                                    | short title      | field_paragraphs_body                     | collection         | created           | start date          | end date            | topic             | changed  |
+      | Big hobbit feast - fireworks at midnight | Big hobbit feast | Barbecue followed by dance and fireworks. | Middle earth daily | 2014-10-17 8:33am | 2016-03-15T11:12:12 | 2016-03-15T11:12:12 | Supplier exchange | 2017-7-5 |
 
   Scenario: The collection homepage shows the collection metrics.
     When I go to the homepage of the "Middle earth daily" collection
@@ -169,8 +169,8 @@ Feature: Collection homepage
   @javascript
   Scenario: The applied etranslate selectors correspond to the collection's landing page
     Given "custom_page" content:
-      | title               | collection         | state     |
-      | Custom Landing Page | Middle earth daily | published |
+      | title               | collection         |
+      | Custom Landing Page | Middle earth daily |
     Given I am not logged in
     When I go to the homepage of the "Middle earth daily" collection
     Then I should see a Webtools eTrans element
diff --git a/tests/features/collection/propose.feature b/tests/features/collection/propose.feature
index 404eec74c8..b4762f80bb 100644
--- a/tests/features/collection/propose.feature
+++ b/tests/features/collection/propose.feature
@@ -95,8 +95,8 @@ Feature: Proposing a collection
 
   Scenario: Propose a collection with a duplicate name
     Given collection content:
-      | title                  | state     |
-      | The Ratcatcher's Guild | published |
+      | title                  |
+      | The Ratcatcher's Guild |
     Given I am logged in as a user with the "authenticated" role
     When I go to the propose collection form
     And I fill in the following:
diff --git a/tests/features/communities/eif/toolbox.feature b/tests/features/communities/eif/toolbox.feature
index 2692048ab7..b335d54d84 100644
--- a/tests/features/communities/eif/toolbox.feature
+++ b/tests/features/communities/eif/toolbox.feature
@@ -6,9 +6,6 @@ Feature:
 
   @javascript
   Scenario: Present and search the solutions.
-    Given owner content:
-      | name | owner type |
-      | ACDC | Company    |
     And collection content:
       | title   | state     |
       | Killjoy | published |
diff --git a/tests/features/community_content/archive.listings.feature b/tests/features/community_content/archive.listings.feature
index 794be04994..add0ddfd86 100644
--- a/tests/features/community_content/archive.listings.feature
+++ b/tests/features/community_content/archive.listings.feature
@@ -2,24 +2,18 @@
 Feature: Archived content on content listings - groups and paragraphs.
 
   Background:
-    Given owner content:
-      | name       |
-      | Some owner |
-    And contact_information content:
-      | name         |
-      | Some contact |
-    And collection content:
-      | title           | description | topic             | owner      | contact information | state     |
-      | Some collection | Test        | Supplier exchange | Some owner | Some contact        | published |
-      | Poly screens    | Test        | Supplier exchange | Some owner | Some contact        | published |
+    Given collection content:
+      | title           | description | topic             |
+      | Some collection | Test        | Supplier exchange |
+      | Poly screens    | Test        | Supplier exchange |
     And news content:
-      | title          | headline       | state     | collection      | abstract | field_paragraphs_body | content | created         |
-      | Archived news  | Archived news  | published | Some collection | Abstract | Test                  | Test    | 2016-01-03T4:00 |
-      | Published news | Published news | published | Some collection | Abstract | Test                  | Test    | 2016-02-04T5:00 |
-      | Poly news 1    | Poly news 1    | published | Poly screens    | Abstract | Test                  | Test    | 2016-03-05T6:00 |
-      | Poly news 2    | Poly news 2    | published | Poly screens    | Abstract | Test                  | Test    | 2016-04-06T7:00 |
-      | Poly news 3    | Poly news 3    | published | Poly screens    | Abstract | Test                  | Test    | 2016-05-07T8:00 |
-      | Poly news 4    | Poly news 4    | published | Poly screens    | Abstract | Test                  | Test    | 2016-06-08T9:00 |
+      | title          | headline       | collection      | abstract | field_paragraphs_body | content | created         |
+      | Archived news  | Archived news  | Some collection | Abstract | Test                  | Test    | 2016-01-03T4:00 |
+      | Published news | Published news | Some collection | Abstract | Test                  | Test    | 2016-02-04T5:00 |
+      | Poly news 1    | Poly news 1    | Poly screens    | Abstract | Test                  | Test    | 2016-03-05T6:00 |
+      | Poly news 2    | Poly news 2    | Poly screens    | Abstract | Test                  | Test    | 2016-04-06T7:00 |
+      | Poly news 3    | Poly news 3    | Poly screens    | Abstract | Test                  | Test    | 2016-05-07T8:00 |
+      | Poly news 4    | Poly news 4    | Poly screens    | Abstract | Test                  | Test    | 2016-06-08T9:00 |
     # We need the "Archived news" content to be archived by altering its state
     # because "Unarchiving" it restored the previous revision and thus, needs
     # to have a previous revision (created as published).
@@ -66,8 +60,8 @@ Feature: Archived content on content listings - groups and paragraphs.
   @javascript
   Scenario: Content listing paragraph can control visibility of archived items.
     And custom_page content:
-      | title     | abstract           | collection      | state     | topic             |
-      | Some page | Some page abstract | Some collection | published | Supplier exchange |
+      | title     | abstract           | collection      | topic             |
+      | Some page | Some page abstract | Some collection | Supplier exchange |
     And I append "layout" to "field_paragraphs_body" field in "node" entity with following "Some page" title:
       | behavior_settings | a:3:{s:17:"layout_paragraphs";a:4:{s:6:"layout";s:13:"layout_onecol";s:6:"config";a:1:{s:5:"label";s:0:"";}s:11:"parent_uuid";N;s:6:"region";N;}s:16:"background_theme";a:0:{}s:11:"extra_class";a:0:{}} |
 
@@ -114,15 +108,15 @@ Feature: Archived content on content listings - groups and paragraphs.
   @javascript
   Scenario: Carousel listings can also control archived items visibility.
     Given collection content:
-      | uri                                                            | title                | state     |
-      | http://data.europa.eu/w21/8e30f798-ff2b-478b-9c09-5ed5a63b4c8c | Interoperable Europe | published |
+      | uri                                                            | title                |
+      | http://data.europa.eu/w21/8e30f798-ff2b-478b-9c09-5ed5a63b4c8c | Interoperable Europe |
     And news content:
       | title              | headline           | state     | collection           | body | content |
       | IOP archived news  | IOP archived news  | archived  | Interoperable Europe | Test | Test    |
       | IOP published news | IOP published news | published | Interoperable Europe | Test | Test    |
     And custom_page content:
-      | title    | abstract          | collection           | state     |
-      | IOP page | IOP page abstract | Interoperable Europe | published |
+      | title    | abstract          | collection           |
+      | IOP page | IOP page abstract | Interoperable Europe |
     And I append "layout" to "field_paragraphs_body" field in "node" entity with following "IOP page" title:
       | behavior_settings | a:3:{s:17:"layout_paragraphs";a:4:{s:6:"layout";s:13:"layout_onecol";s:6:"config";a:1:{s:5:"label";s:0:"";}s:11:"parent_uuid";N;s:6:"region";N;}s:16:"background_theme";a:0:{}s:11:"extra_class";a:0:{}} |
 
@@ -188,8 +182,8 @@ Feature: Archived content on content listings - groups and paragraphs.
 
   Scenario: "Show archived" facet on Discussions page content listing.
     Given collection content:
-      | title                      | description | topic             | owner      | contact information | state     |
-      | Some discussion collection | Test        | Supplier exchange | Some owner | Some contact        | published |
+      | title                      | description | topic             |
+      | Some discussion collection | Test        | Supplier exchange |
     And discussion content:
       | title           | collection                 | state     |
       | Rand discussion | Some discussion collection | published |
diff --git a/tests/features/contact_information/contact_information.moderation.feature b/tests/features/contact_information/contact_information.moderation.feature
index d9d42f1e1b..4602a4f8f9 100644
--- a/tests/features/contact_information/contact_information.moderation.feature
+++ b/tests/features/contact_information/contact_information.moderation.feature
@@ -9,12 +9,9 @@ Feature: Contact Information moderation
       | Username              |
       | Sæwine Cynebald       |
       | Secondary facilitator |
-    And owner content:
-      | owner type | name               |
-      | Company    | Anglo-Saxon Museum |
     And collection content:
-      | title                        | description                                   | logo     | owner              | topic       | state |
-      | Games of the Anglo-Saxon age | There were many different board games played. | logo.png | Anglo-Saxon Museum | E-inclusion | draft |
+      | title                        | description                                   | logo     | topic       | state |
+      | Games of the Anglo-Saxon age | There were many different board games played. | logo.png | E-inclusion | draft |
     And collection user membership:
       | collection                   | user                  | roles       |
       | Games of the Anglo-Saxon age | Sæwine Cynebald       | facilitator |
diff --git a/tests/features/custom_page/community_content.view_mode.feature b/tests/features/custom_page/community_content.view_mode.feature
index c4074fc47d..611c476820 100644
--- a/tests/features/custom_page/community_content.view_mode.feature
+++ b/tests/features/custom_page/community_content.view_mode.feature
@@ -5,39 +5,33 @@ Feature:
   I need to be able to see the content listed in the appropriate view mode.
 
   Scenario: Present custom page solution listings in tiles.
-    Given owner content:
-      | name                   | owner type |
-      | Some fancy named owner | Company    |
-    And contact_information content:
-      | name                     | email                 |
-      | Some fancy named contact | who.cares@example.com |
     Given solution content:
-      | title         | description | owner                  | contact information      | state     |
-      | Tile solution | Meh...      | Some fancy named owner | Some fancy named contact | published |
+      | title         | description |
+      | Tile solution | Meh...      |
     And release content:
-      | title        | release number | release notes | is version of | contact information      | state     |
-      | Tile release | 0.1            | Meh...        | Tile solution | Some fancy named contact | published |
+      | title        | release number | release notes | is version of |
+      | Tile release | 0.1            | Meh...        | Tile solution |
     And distribution content:
-      | title       | description | release      | access url | state     |
-      | Tile distro | meh...      | Tile release | test.zip   | published |
+      | title       | description | release      | access url |
+      | Tile distro | meh...      | Tile release | test.zip   |
     And licence content:
       | title        | description |
       | Tile licence | Meh...      |
     And news content:
-      | title     | headline  | body   | solution      | state     |
-      | Tile news | Tile news | Meh... | Tile solution | published |
+      | title     | headline  | body   | solution      |
+      | Tile news | Tile news | Meh... | Tile solution |
     And event content:
-      | title      | short title | field_paragraphs_body | agenda        | location   | organisation        | scope         | solution      | state     |
-      | Tile event | Tile event  | Meh...                | Event agenda. | Some place | European Commission | International | Tile solution | published |
+      | title      | short title | field_paragraphs_body | agenda        | location   | organisation        | scope         | solution      |
+      | Tile event | Tile event  | Meh...                | Event agenda. | Some place | European Commission | International | Tile solution |
     And document content:
-      | title         | document type | short title | field_paragraphs_body | solution      | state     |
-      | Tile document | Document      | Meh...      | Meh...                | Tile solution | published |
+      | title         | document type | short title | field_paragraphs_body | solution      |
+      | Tile document | Document      | Meh...      | Meh...                | Tile solution |
     And discussion content:
-      | title           | body   | solution      | state     |
-      | Tile discussion | Meh... | Tile solution | published |
+      | title           | body   | solution      |
+      | Tile discussion | Meh... | Tile solution |
     And custom_page content:
-      | title            | solution      | state     |
-      | Tile custom page | Tile solution | published |
+      | title            | solution      |
+      | Tile custom page | Tile solution |
     And I append "content_listing" to "field_paragraphs_body" field in "node" entity with following "Tile custom page" title:
       | content_listing:value | a:3:{s:7:"enabled";i:1;s:13:"query_presets";s:68:"entity_bundle\|distribution,release,discussion,document,event,news\|IN";s:5:"limit";s:2:"10";} |
 
@@ -54,30 +48,24 @@ Feature:
     But I should not see the "Tile licence" tile
 
   Scenario: Present custom page collection listings in tiles.
-    Given owner content:
-      | name                   | owner type |
-      | Some fancy named owner | Company    |
-    And contact_information content:
-      | name                     | email                 |
-      | Some fancy named contact | who.cares@example.com |
     And collection content:
-      | title           | description | owner                  | contact information      | state     |
-      | Tile collection | Meh...      | Some fancy named owner | Some fancy named contact | published |
+      | title           | description |
+      | Tile collection | Meh...      |
     And news content:
-      | title     | headline  | body   | collection      | state     |
-      | Tile news | Tile news | Meh... | Tile collection | published |
+      | title     | headline  | body   | collection      |
+      | Tile news | Tile news | Meh... | Tile collection |
     And event content:
-      | title      | short title | field_paragraphs_body | agenda        | location   | organisation        | scope         | collection      | state     |
-      | Tile event | Tile event  | Meh...                | Event agenda. | Some place | European Commission | International | Tile collection | published |
+      | title      | short title | field_paragraphs_body | agenda        | location   | organisation        | scope         | collection      |
+      | Tile event | Tile event  | Meh...                | Event agenda. | Some place | European Commission | International | Tile collection |
     And document content:
-      | title         | document type | short title | field_paragraphs_body | collection      | state     |
-      | Tile document | Document      | Meh...      | Meh...                | Tile collection | published |
+      | title         | document type | short title | field_paragraphs_body | collection      |
+      | Tile document | Document      | Meh...      | Meh...                | Tile collection |
     And discussion content:
-      | title           | body   | collection      | state     |
-      | Tile discussion | Meh... | Tile collection | published |
+      | title           | body   | collection      |
+      | Tile discussion | Meh... | Tile collection |
     And custom_page content:
-      | title            | collection      | state     |
-      | Tile custom page | Tile collection | published |
+      | title            | collection      |
+      | Tile custom page | Tile collection |
     And I append "content_listing" to "field_paragraphs_body" field in "node" entity with following "Tile custom page" title:
       | content_listing:value | a:3:{s:7:"enabled";i:1;s:13:"query_presets";s:47:"entity_bundle\|discussion,document,event,news\|IN";s:5:"limit";s:2:"10";} |
 
diff --git a/tests/features/joinup_event/event.moderation.feature b/tests/features/joinup_event/event.moderation.feature
index 67c815f348..138ea3d191 100644
--- a/tests/features/joinup_event/event.moderation.feature
+++ b/tests/features/joinup_event/event.moderation.feature
@@ -10,15 +10,9 @@ Feature: Event moderation
       | Salvador Thomas |
       | Rosa Vaughn     |
       | Patricia Lynch  |
-    And owner content:
-      | name     |
-      | Alma Lee |
-    And contact_information content:
-      | name        | email                   |
-      | Evs contact | evs.contact@example.com |
     And collection content:
-      | title     | description           | logo     | content creation | moderation | state     | owner    | contact information | topic       |
-      | Wet Lords | The Forgotten Female. | logo.png | registered users | no         | published | Alma Lee | Evs contact         | E-inclusion |
+      | title     | description           | logo     | content creation | moderation | topic       |
+      | Wet Lords | The Forgotten Female. | logo.png | registered users | no         | E-inclusion |
     And the following collection user membership:
       | collection | user           | roles       |
       | Wet Lords  | Rosa Vaughn    | member      |
diff --git a/tests/features/joinup_group/short_id.feature b/tests/features/joinup_group/short_id.feature
index 74e41f3eaa..f60df62f2d 100644
--- a/tests/features/joinup_group/short_id.feature
+++ b/tests/features/joinup_group/short_id.feature
@@ -6,8 +6,8 @@ Feature:
 
   Scenario: Short IDs are unique in collections.
     Given collection content:
-      | title              | short ID | state     |
-      | Scientific Studies | sst-2020 | published |
+      | title              | short ID |
+      | Scientific Studies | sst-2020 |
     And owner content:
       | name                 | owner type |
       | Organisation example | Company    |
@@ -68,11 +68,11 @@ Feature:
 
   Scenario: Short IDs are unique in solutions.
     Given collection content:
-      | title              | short ID | state     |
-      | Scientific Studies | sst-2020 | published |
+      | title              | short ID |
+      | Scientific Studies | sst-2020 |
     Given solution content:
-      | title                         | short ID | state     | collection         |
-      | Who knows what a solution is? | wkwasi   | published | Scientific Studies |
+      | title                         | short ID | collection         |
+      | Who knows what a solution is? | wkwasi   | Scientific Studies |
     And owner content:
       | name                 | owner type |
       | Organisation example | Company    |
diff --git a/tests/features/joinup_release/add_release.feature b/tests/features/joinup_release/add_release.feature
index e5473c266d..0328ccba65 100644
--- a/tests/features/joinup_release/add_release.feature
+++ b/tests/features/joinup_release/add_release.feature
@@ -6,8 +6,8 @@ Feature: "Add release" visibility options.
 
   Scenario: "Add release" button should only be shown to solution facilitators.
     Given solution content:
-      | title                 | description         | documentation | state     |
-      | Release solution test | My awesome solution | text.pdf      | published |
+      | title                 | description         | documentation |
+      | Release solution test | My awesome solution | text.pdf      |
 
     When I am logged in as a "facilitator" of the "Release solution test" solution
     And I go to the homepage of the "Release solution test" solution
@@ -24,15 +24,13 @@ Feature: "Add release" visibility options.
     Then I should not see the link "Add release"
 
   Scenario: Add release as a solution facilitator.
-    Given owner content:
-      | name                 | owner type |
-      | Organisation example | Company    |
+
     Given solution content:
-      | title          | description        | documentation | owner                | state     |
-      | Release Test 1 | test description 1 | text.pdf      | Organisation example | published |
+      | title          | description        | documentation |
+      | Release Test 1 | test description 1 | text.pdf      |
     And release content:
-      | title           | is version of  | release number | status    | state     | creation date       | published at        |
-      | Chasing shadows | Release Test 1 | 1.0            | Completed | published | 2014-08-30 23:59:00 | 2014-08-30 23:59:00 |
+      | title           | is version of  | release number | status    | creation date       | published at        |
+      | Chasing shadows | Release Test 1 | 1.0            | Completed | 2014-08-30 23:59:00 | 2014-08-30 23:59:00 |
 
     # Assert that the "Release" tiles are present and contain version, release date, label and bundle type.
     When I go to the homepage of the "Release Test 1" solution
@@ -97,8 +95,8 @@ Feature: "Add release" visibility options.
 
   Scenario: Do not allow access to the page if the parent is not a solution.
     Given collection content:
-      | uri                       | title               | state     |
-      | http://example1regression | The Stripped Stream | published |
+      | uri                       | title               |
+      | http://example1regression | The Stripped Stream |
 
     When I am not logged in
     And I go to "/collection/stripped-stream/release/add"
@@ -109,12 +107,9 @@ Feature: "Add release" visibility options.
     Then I should see the heading "Page not found"
 
   Scenario: Check publish time release is present time and past.
-    Given owner content:
-      | name                     | owner type |
-      | Organisation example two | Company    |
     Given solution content:
-      | title          | description        | documentation | owner                    | state     |
-      | Release Test 2 | test description 2 | text.pdf      | Organisation example two | published |
+      | title          | description        | documentation |
+      | Release Test 2 | test description 2 | text.pdf      |
     When I am logged in as a "facilitator" of the "Release Test 2" solution
     And I go to the homepage of the "Release Test 2" solution
     And I click "Add release" in the plus button menu
diff --git a/tests/features/joinup_release/release.delete.feature b/tests/features/joinup_release/release.delete.feature
index c728541911..258da2b2c7 100644
--- a/tests/features/joinup_release/release.delete.feature
+++ b/tests/features/joinup_release/release.delete.feature
@@ -5,23 +5,17 @@ Feature: Asset release "delete" functionality.
   I need to be able to delete "Release" rdf entities through UI.
 
   Background:
-    Given owner content:
-      | name              |
-      | Yet another owner |
-    And contact_information content:
-      | name                | email                         | website url        |
-      | Yet another contact | yetanothercontact@example.com | http://example.com |
-    And collection content:
-      | title                  | state     |
-      | Yet another collection | published |
+    Given collection content:
+      | title                  |
+      | Yet another collection |
     And solution content:
-      | title                | description                | documentation | owner             | contact information | collection             | state     |
-      | Yet another solution | Bored of finding new texts | text.pdf      | Yet another owner | Yet another contact | Yet another collection | published |
+      | title                | description                | documentation | collection             |
+      | Yet another solution | Bored of finding new texts | text.pdf      | Yet another collection |
     And release content:
-      | title               | release notes    | documentation | release number | release notes   | is version of        | state     |
-      | Yet another release | A sample release | text.pdf      | 1              | Changed release | Yet another solution | published |
-      | No release          | A sample release | text.pdf      | 1.2            | Changed release | Yet another solution | published |
-      | Jinks               | A sample release | text.pdf      | 3              | Changed release | Yet another solution | published |
+      | title               | release notes    | documentation | release number | release notes   | is version of        |
+      | Yet another release | A sample release | text.pdf      | 1              | Changed release | Yet another solution |
+      | No release          | A sample release | text.pdf      | 1.2            | Changed release | Yet another solution |
+      | Jinks               | A sample release | text.pdf      | 3              | Changed release | Yet another solution |
     And users:
       | Username        | E-mail                      | First name | Family name |
       | Ronnie Holloway | Ronnie.holloway@example.com | Ronnie     | Holloway    |
diff --git a/tests/features/joinup_search/search.feature b/tests/features/joinup_search/search.feature
index 37614f9f84..47c51a95a3 100644
--- a/tests/features/joinup_search/search.feature
+++ b/tests/features/joinup_search/search.feature
@@ -5,19 +5,19 @@ Feature: Global search
   @javascript
   Scenario: Anonymous user can find items
     Given collection content:
-      | title                        | logo     | moderation | topic      | spatial coverage | state     |
-      | Molecular cooking collection | logo.png | no         | Demography | Belgium          | published |
+      | title                        | logo     | moderation | topic      | spatial coverage |
+      | Molecular cooking collection | logo.png | no         | Demography | Belgium          |
     Given solution content:
-      | title          | collection                   | description                                                                                                                          | topic      | spatial coverage | state     |
-      | Spherification | Molecular cooking collection | Spherification is the culinary process of shaping a liquid into spheres                                                              | Demography | European Union   | published |
-      | Foam           | Molecular cooking collection | "The use of foam in cuisine has been used in many forms in the history of cooking:whipped cream, meringue, and mousse are all foams" | eGov       |                  | published |
+      | title          | collection                   | description                                                                                                                          | topic      | spatial coverage |
+      | Spherification | Molecular cooking collection | Spherification is the culinary process of shaping a liquid into spheres                                                              | Demography | European Union   |
+      | Foam           | Molecular cooking collection | "The use of foam in cuisine has been used in many forms in the history of cooking:whipped cream, meringue, and mousse are all foams" | eGov       |                  |
     And news content:
-      | title                | headline              | field_paragraphs_body | collection                   | topic                   | spatial coverage | state     |
-      | El Tuba de Los Lobos | El Celler de Can Roca | The best in town      | Molecular cooking collection | Statistics and Analysis | Luxembourg       | published |
-      | Dummy news 1         | Dummy title 1         | Dummy body            | Molecular cooking collection | E-inclusion             | Luxembourg       | published |
-      | Dummy news 2         | Dummy title 2         | Dummy body            | Molecular cooking collection | E-inclusion             | Luxembourg       | published |
-      | Dummy news 3         | Dummy title 3         | Dummy body            | Molecular cooking collection | E-inclusion             | Luxembourg       | published |
-      | Dummy news 4         | Dummy title 4         | Dummy body            | Molecular cooking collection | E-inclusion             | Luxembourg       | published |
+      | title                | headline              | field_paragraphs_body | collection                   | topic                   | spatial coverage |
+      | El Tuba de Los Lobos | El Celler de Can Roca | The best in town      | Molecular cooking collection | Statistics and Analysis | Luxembourg       |
+      | Dummy news 1         | Dummy title 1         | Dummy body            | Molecular cooking collection | E-inclusion             | Luxembourg       |
+      | Dummy news 2         | Dummy title 2         | Dummy body            | Molecular cooking collection | E-inclusion             | Luxembourg       |
+      | Dummy news 3         | Dummy title 3         | Dummy body            | Molecular cooking collection | E-inclusion             | Luxembourg       |
+      | Dummy news 4         | Dummy title 4         | Dummy body            | Molecular cooking collection | E-inclusion             | Luxembourg       |
 
     When I visit the search page
     Then the response should not contain "data-drupal-facet-id=\"status\""
@@ -199,23 +199,17 @@ Feature: Global search
 
   @javascript
   Scenario: Alphabetical order for the spatial coverage in the search page.
-    Given owner content:
-      | name              | owner type |
-      | Responsible owner | Company    |
-    And contact_information content:
-      | name          | email             |
-      | Go-to contact | go-to@example.com |
     And collection content:
-      | title            | description                                          | abstract                       | state     |
-      | Collection alpha | <p>collection <strong>beta</strong> description.</p> | The collection gamma abstract. | published |
-      | Col for Sol      | <p>collection for the solution.</p>                  | The col for sol abstract.      | published |
+      | title            | description                                          | abstract                       |
+      | Collection alpha | <p>collection <strong>beta</strong> description.</p> | The collection gamma abstract. |
+      | Col for Sol      | <p>collection for the solution.</p>                  | The col for sol abstract.      |
     And event content:
-      | title             | short title       | field_paragraphs_body               | spatial coverage | agenda         | location       | organisation        | scope         | keywords | collection       | state     |
-      | Event Omega       | Event short delta | The epsilon event content.          | Greece           | Event agenda.  | Some place     | European Commission | International | Alphabet | Collection alpha | published |
-      | Alternative event | Alt event         | This event stays in the background. | Luxembourg       | To be planned. | Event location | Event organisation  |               |          | Collection alpha | published |
+      | title             | short title       | field_paragraphs_body               | spatial coverage | agenda         | location       | organisation        | scope         | keywords | collection       |
+      | Event Omega       | Event short delta | The epsilon event content.          | Greece           | Event agenda.  | Some place     | European Commission | International | Alphabet | Collection alpha |
+      | Alternative event | Alt event         | This event stays in the background. | Luxembourg       | To be planned. | Event location | Event organisation  |               |          | Collection alpha |
     And document content:
-      | title          | document type | short title          | field_paragraphs_body                   | spatial coverage | keywords | collection       | state     |
-      | Document omega | Document      | Document short delta | A document consists of epsilon strings. | Luxembourg       | Alphabet | Collection alpha | published |
+      | title          | document type | short title          | field_paragraphs_body                   | spatial coverage | keywords | collection       |
+      | Document omega | Document      | Document short delta | A document consists of epsilon strings. | Luxembourg       | Alphabet | Collection alpha |
 
     When I visit the search page
 
@@ -232,44 +226,38 @@ Feature: Global search
     And the "spatial coverage" checkbox facet should allow selecting the following values "Greece (1), Luxembourg (2)"
 
   Scenario: Content can be found with a full-text search.
-    Given owner content:
-      | name              | owner type |
-      | Responsible owner | Company    |
-    And contact_information content:
-      | name          | email             | state     |
-      | Go-to contact | go-to@example.com | validated |
     And collection content:
-      | title            | description                                          | abstract                       | state     |
-      | Collection alpha | <p>collection <strong>beta</strong> description.</p> | The collection gamma abstract. | published |
-      | Col for Sol      | <p>collection for the solution.</p>                  | The col for sol abstract.      | published |
+      | title            | description                                          | abstract                       |
+      | Collection alpha | <p>collection <strong>beta</strong> description.</p> | The collection gamma abstract. |
+      | Col for Sol      | <p>collection for the solution.</p>                  | The col for sol abstract.      |
     Given solution content:
-      | title          | description                                                | keywords | owner             | contact information | collection  | state     |
-      | Solution alpha | <p>This is the solution <strong>beta</strong> description. | Alphabet | Responsible owner | Go-to contact       | Col for Sol | published |
+      | title          | description                                                | keywords | collection  |
+      | Solution alpha | <p>This is the solution <strong>beta</strong> description. | Alphabet | Col for Sol |
     And release content:
-      | title         | release number | release notes                               | keywords | is version of  | state     |
-      | Release Alpha | 1              | <p>Release notes for <em>beta</em> changes. | Alphabet | Solution alpha | published |
+      | title         | release number | release notes                               | keywords | is version of  |
+      | Release Alpha | 1              | <p>Release notes for <em>beta</em> changes. | Alphabet | Solution alpha |
     And distribution content:
-      | title              | description                                    | release       | access url | state     |
-      | Distribution alpha | <p>A simple beta distribution description.</p> | Release Alpha | test.zip   | published |
+      | title              | description                                    | release       | access url |
+      | Distribution alpha | <p>A simple beta distribution description.</p> | Release Alpha | test.zip   |
     And licence content:
       | title         | description                         |
       | Licence Alpha | A beta description for the licence. |
     And news content:
-      | title      | headline            | field_paragraphs_body     | keywords | collection       | state     |
-      | News omega | News headline delta | The epsilon news content. | Alphabet | Collection alpha | published |
+      | title      | headline            | field_paragraphs_body     | keywords | collection       |
+      | News omega | News headline delta | The epsilon news content. | Alphabet | Collection alpha |
     And event content:
-      | title             | short title       | abstract                                         | field_paragraphs_body               | agenda         | location       | organisation        | scope         | keywords | collection       | solution       | state     |
-      | Event Omega       | Event short delta | The epsilon event content but abstract.          | The epsilon event content.          | Event agenda.  | Some place     | European Commission | International | Alphabet |                  | Solution alpha | published |
-      | Alternative event | Alt event         | This event stays in the background but abstract. | This event stays in the background. | To be planned. | Event location | Event organisation  |               |          | Collection alpha |                | published |
+      | title             | short title       | abstract                                         | field_paragraphs_body               | agenda         | location       | organisation        | scope         | keywords | collection       | solution       |
+      | Event Omega       | Event short delta | The epsilon event content but abstract.          | The epsilon event content.          | Event agenda.  | Some place     | European Commission | International | Alphabet |                  | Solution alpha |
+      | Alternative event | Alt event         | This event stays in the background but abstract. | This event stays in the background. | To be planned. | Event location | Event organisation  |               |          | Collection alpha |                |
     And document content:
-      | title          | document type | short title          | field_paragraphs_body                   | keywords | collection       | state     |
-      | Document omega | Document      | Document short delta | A document consists of epsilon strings. | Alphabet | Collection alpha | published |
+      | title          | document type | short title          | field_paragraphs_body                   | keywords | collection       |
+      | Document omega | Document      | Document short delta | A document consists of epsilon strings. | Alphabet | Collection alpha |
     And discussion content:
-      | title            | body                                                              | solution       | state     |
-      | Discussion omega | <p>Does anybody has idea why this <em>epsilon</em> is everywhere? | Solution alpha | published |
+      | title            | body                                                              | solution       |
+      | Discussion omega | <p>Does anybody has idea why this <em>epsilon</em> is everywhere? | Solution alpha |
     And custom_page content:
-      | title      | body                                     | collection       | state     | keywords |
-      | Page omega | This is just an epsilon but should work. | Collection alpha | published | Alphabet |
+      | title      | body                                     | collection       | keywords |
+      | Page omega | This is just an epsilon but should work. | Collection alpha | Alphabet |
     And users:
       | Username     | E-mail                      | First name | Family name | Organisation |
       | jenlyle      | jenessa.carlyle@example.com | Jenessa    | Carlyle     | Clyffco      |
@@ -369,25 +357,25 @@ Feature: Global search
   # See https://citnet.tech.ec.europa.eu/CITnet/jira/browse/ISAICP-6917
   Scenario: Collections and solutions are shown first in search results with the same relevance.
     Given collection content:
-      | title                           | description                         | state     |
-      | Ornithology: the study of birds | Ornithology is a branch of zoology. | published |
-      | Husky Flying Xylophone          | A strange instrument.               | published |
+      | title                           | description                         |
+      | Ornithology: the study of birds | Ornithology is a branch of zoology. |
+      | Husky Flying Xylophone          | A strange instrument.               |
     And solution content:
-      | title                     | collection                      | description                          | state     |
-      | Bird outposts in the wild | Ornithology: the study of birds | Exotic wings and where to find them. | published |
+      | title                     | collection                      | description                          |
+      | Bird outposts in the wild | Ornithology: the study of birds | Exotic wings and where to find them. |
     And custom_page content:
-      | title           | body                                  | collection                      | state     |
-      | Disturbed birds | Flocks of trained pigeons flying off. | Ornithology: the study of birds | published |
+      | title           | body                                  | collection                      |
+      | Disturbed birds | Flocks of trained pigeons flying off. | Ornithology: the study of birds |
     And news content:
-      | title                               | headline                            | field_paragraphs_body           | collection                      | state     |
-      | Chickens are small birds            | Chickens are small birds            | Birds domesticated in India.    | Ornithology: the study of birds | published |
-      | Found a xylophone from 1600 in Asia | Found a xylophone from 1600 in Asia | Oldest instrument of this type. | Husky Flying Xylophone          | published |
+      | title                               | headline                            | field_paragraphs_body           | collection                      |
+      | Chickens are small birds            | Chickens are small birds            | Birds domesticated in India.    | Ornithology: the study of birds |
+      | Found a xylophone from 1600 in Asia | Found a xylophone from 1600 in Asia | Oldest instrument of this type. | Husky Flying Xylophone          |
     And event content:
-      | title         | field_paragraphs_body  | collection                      | state     |
-      | Bird spotting | Roosters crow at dawn. | Ornithology: the study of birds | published |
+      | title         | field_paragraphs_body  | collection                      |
+      | Bird spotting | Roosters crow at dawn. | Ornithology: the study of birds |
     And discussion content:
-      | title                             | body                    | collection                      | state     |
-      | Best place to find an exotic bird | Somewhere exotic maybe? | Ornithology: the study of birds | published |
+      | title                             | body                    | collection                      |
+      | Best place to find an exotic bird | Somewhere exotic maybe? | Ornithology: the study of birds |
     And user:
       | Username    | Bird watcher |
       | First name  | Bird         |
@@ -418,8 +406,8 @@ Feature: Global search
 
     # Add distribution, child of solution.
     Given distribution content:
-      | title       | solution  | description          | access url                      | licence    | format | representation technique | state     |
-      | ZzoluDistro | Zzolution | Übermensch foot size | http://example.com/zzolu-distro | Apache-2.0 | ZIP    | Datalog                  | published |
+      | title       | solution  | description          | access url                      | licence    | format | representation technique |
+      | ZzoluDistro | Zzolution | Übermensch foot size | http://example.com/zzolu-distro | Apache-2.0 | ZIP    | Datalog                  |
 
     When I enter "zzoludistro" in the search bar and press enter
     Then the page should show only the tiles "Zzolution"
@@ -504,8 +492,8 @@ Feature: Global search
     Then I should see "No content found for your search."
 
     Given distribution content:
-      | title         | release | description | access url                        | licence    | format | representation technique | state     |
-      | ReleazzDistro | Releazz | Dracula     | http://example.com/releazz-distro | Apache-2.0 | ZIP    | Datalog                  | published |
+      | title         | release | description | access url                        | licence    | format | representation technique |
+      | ReleazzDistro | Releazz | Dracula     | http://example.com/releazz-distro | Apache-2.0 | ZIP    | Datalog                  |
 
     When I enter "releazzDistro" in the search bar and press enter
     Then the page should show only the tiles "Releazz"
@@ -593,17 +581,17 @@ Feature: Global search
   @javascript
   Scenario: Users are able to select the sort order.
     Given collection content:
-      | title             | description       | state     |
-      | Custom collection | Some custom data. | published |
+      | title             | description       |
+      | Custom collection | Some custom data. |
     And news content:
-      | title               | headline                           | field_paragraphs_body                                             | collection        | state     | created    | changed    |
-      | Quantum information | Relativity is the word             | No one cares about the body.                                      | Custom collection | published | 01/01/2019 | 03/08/2019 |
-      | The uneven universe | Relativity news: Relativity theory | I do care about the relativity keyword in the body.               | Custom collection | published | 02/01/2019 | 02/08/2019 |
-      | The earth is square | Absolutely nonsense                | Some news are not worth it but I will add relativity here anyway. | Custom collection | published | 03/01/2019 | 01/08/2019 |
+      | title               | headline                           | field_paragraphs_body                                             | collection        | created    | changed    |
+      | Quantum information | Relativity is the word             | No one cares about the body.                                      | Custom collection | 01/01/2019 | 03/08/2019 |
+      | The uneven universe | Relativity news: Relativity theory | I do care about the relativity keyword in the body.               | Custom collection | 02/01/2019 | 02/08/2019 |
+      | The earth is square | Absolutely nonsense                | Some news are not worth it but I will add relativity here anyway. | Custom collection | 03/01/2019 | 01/08/2019 |
     And event content:
-      | title           | collection        | state     | start date   | end date            | state     | created      |
-      | Blue revolution | Custom collection | published | now +1 years | now +1 years +1 day | published | now -2 years |
-      | Red revolution  | Custom collection | published | now -1 years | now -1 years +1 day | published | now -1 years |
+      | title           | collection        | state     | start date   | end date            | created      |
+      | Blue revolution | Custom collection | published | now +1 years | now +1 years +1 day | now -2 years |
+      | Red revolution  | Custom collection | published | now -1 years | now -1 years +1 day | now -1 years |
 
     When I am on the homepage
     And I enter "Relativity" in the search bar and press enter
@@ -654,19 +642,19 @@ Feature: Global search
   @javascript
   Scenario: Anonymous user can find facets summary
     Given collection content:
-      | title                    | logo     | moderation | topic      | spatial coverage | state     |
-      | Radio cooking collection | logo.png | no         | Demography | Belgium          | published |
+      | title                    | logo     | moderation | topic      | spatial coverage |
+      | Radio cooking collection | logo.png | no         | Demography | Belgium          |
     Given solution content:
-      | title    | collection               | description                                                                                                                                                   | topic      | spatial coverage | state     |
-      | Spheres  | Radio cooking collection | Spherification is the culinary process of shaping a liquid into spheres. Drupal is the best digital experience platform(DXP) on the web, proudly open source. | Demography | European Union   | published |
-      | Movistar | Radio cooking collection | "The use of foam in cuisine has been used in many forms in the history of cooking:whipped cream, meringue, and mousse are all foams", proudly open source.    |            |                  | published |
+      | title    | collection               | description                                                                                                                                                   | topic      | spatial coverage |
+      | Spheres  | Radio cooking collection | Spherification is the culinary process of shaping a liquid into spheres. Drupal is the best digital experience platform(DXP) on the web, proudly open source. | Demography | European Union   |
+      | Movistar | Radio cooking collection | "The use of foam in cuisine has been used in many forms in the history of cooking:whipped cream, meringue, and mousse are all foams", proudly open source.    |            |                  |
     And news content:
-      | title           | field_paragraphs_body                                                                | collection               | topic                   | spatial coverage | state     |
-      | El Cabo da Roca | The best in town, proudly open source.                                               | Radio cooking collection | Statistics and Analysis | Luxembourg       | published |
-      | Funny news 1    | Drupal is the best digital experience platform(DXP) on the web, proudly open source. | Radio cooking collection | E-inclusion             | Luxembourg       | published |
-      | Funny news 2    | Drupal is the best digital experience platform(DXP) on the web, proudly open source. | Radio cooking collection | E-inclusion             | Luxembourg       | published |
-      | Funny news 3    | Drupal is the best digital experience platform(DXP) on the web, proudly open source. | Radio cooking collection | E-inclusion             | Luxembourg       | published |
-      | Funny news 4    | Drupal is the best digital experience platform(DXP) on the web, proudly open source. | Radio cooking collection | E-inclusion             | Luxembourg       | published |
+      | title           | field_paragraphs_body                                                                | collection               | topic                   | spatial coverage |
+      | El Cabo da Roca | The best in town, proudly open source.                                               | Radio cooking collection | Statistics and Analysis | Luxembourg       |
+      | Funny news 1    | Drupal is the best digital experience platform(DXP) on the web, proudly open source. | Radio cooking collection | E-inclusion             | Luxembourg       |
+      | Funny news 2    | Drupal is the best digital experience platform(DXP) on the web, proudly open source. | Radio cooking collection | E-inclusion             | Luxembourg       |
+      | Funny news 3    | Drupal is the best digital experience platform(DXP) on the web, proudly open source. | Radio cooking collection | E-inclusion             | Luxembourg       |
+      | Funny news 4    | Drupal is the best digital experience platform(DXP) on the web, proudly open source. | Radio cooking collection | E-inclusion             | Luxembourg       |
 
     Given I am logged in as a user with the "authenticated" role
     When I visit the search page
@@ -731,27 +719,27 @@ Feature: Global search
 
   Scenario: Filter on date
     Given collection content:
-      | title         | state     |
-      | Mice in space | published |
+      | title         |
+      | Mice in space |
     And document content:
-      | title        | collection    | topic                                  | state     | logo     | field_paragraphs_body                                                                                                                                                                           |
-      | Microgravity | Mice in space | HR, Statistics and Analysis, E-justice | published | alan.jpg | Conventional studies investigating the effects of reduced gravity on muscle mass and function have used a ground control group that is not directly comparable to the space experimental group. |
+      | title        | collection    | topic                                  | logo     | field_paragraphs_body                                                                                                                                                                           |
+      | Microgravity | Mice in space | HR, Statistics and Analysis, E-justice | alan.jpg | Conventional studies investigating the effects of reduced gravity on muscle mass and function have used a ground control group that is not directly comparable to the space experimental group. |
     And event content:
-      | title           | collection    | topic                    | state     | logo        | field_paragraphs_body                                                                                                                                                                 |
-      | Stay at the ISS | Mice in space | EU and European Policies | published | charles.jpg | Two groups of mice (six per group) were housed aboard the International Space Station for 35 days. One group was subjected to artificial gravity (1 g) and the other to microgravity. |
+      | title           | collection    | topic                    | logo        | field_paragraphs_body                                                                                                                                                                 |
+      | Stay at the ISS | Mice in space | EU and European Policies | charles.jpg | Two groups of mice (six per group) were housed aboard the International Space Station for 35 days. One group was subjected to artificial gravity (1 g) and the other to microgravity. |
     And news content:
-      | title           | body                                       | collection    | topic                   | spatial coverage | state     | logo        | created    | changed    | published_at |
-      | Muscle atrophy  | Researchers from the University of Tsukuba | Mice in space | Finance in EU           | Luxembourg       | published | blaise.jpg  | 01/01/2019 | 01/01/2019 | 01/01/2019   |
-      | El Cabo da Roca | The best in town                           | Mice in space | Statistics and Analysis | Luxembourg       | published | charles.jpg | 01/12/2020 | 01/12/2020 | 01/12/2020   |
-      | Funny news 1    | Dummy body                                 | Mice in space | HR                      | Luxembourg       | published | ada.png     | 05/01/2019 | 05/01/2019 | 05/01/2019   |
-      | Funny news 2    | Dummy body                                 | Mice in space | E-inclusion             | Luxembourg       | published | alan.jpg    | 06/21/2019 | 06/21/2019 | 06/21/2019   |
-      | Funny news 3    | Dummy body                                 | Mice in space | E-inclusion             | Luxembourg       | published | charles.jpg | 12/31/2021 | 12/31/2021 | 12/31/2021   |
-      | Funny news 4    | Dummy body                                 | Mice in space | HR                      | Luxembourg       | published | ada.png     | 06/25/2020 | 06/25/2020 | 06/25/2020   |
-      | Funny news 5    | Dummy body                                 | Mice in space | HR                      | Luxembourg       | published | ada.png     | 01/01/2021 | 01/01/2021 | 01/01/2021   |
-      | Dummy news 1    | Dummy body                                 | Mice in space | Statistics and Analysis | Luxembourg       | published | charles.jpg | 09/24/2019 | 09/24/2019 | 09/24/2019   |
-      | Dummy news 2    | Dummy body                                 | Mice in space | E-inclusion             | Luxembourg       | published | alan.jpg    | 01/18/2021 | 01/18/2021 | 01/18/2021   |
-      | Dummy news 3    | Dummy body                                 | Mice in space | Statistics and Analysis | Luxembourg       | published | ada.png     | 08/01/2019 | 08/01/2019 | 08/01/2019   |
-      | Dummy news 4    | Dummy body                                 | Mice in space | E-inclusion             | Luxembourg       | published | charles.jpg | 09/18/2019 | 09/18/2019 | 09/18/2019   |
+      | title           | body                                       | collection    | topic                   | spatial coverage | logo        | created    | changed    | published_at |
+      | Muscle atrophy  | Researchers from the University of Tsukuba | Mice in space | Finance in EU           | Luxembourg       | blaise.jpg  | 01/01/2019 | 01/01/2019 | 01/01/2019   |
+      | El Cabo da Roca | The best in town                           | Mice in space | Statistics and Analysis | Luxembourg       | charles.jpg | 01/12/2020 | 01/12/2020 | 01/12/2020   |
+      | Funny news 1    | Dummy body                                 | Mice in space | HR                      | Luxembourg       | ada.png     | 05/01/2019 | 05/01/2019 | 05/01/2019   |
+      | Funny news 2    | Dummy body                                 | Mice in space | E-inclusion             | Luxembourg       | alan.jpg    | 06/21/2019 | 06/21/2019 | 06/21/2019   |
+      | Funny news 3    | Dummy body                                 | Mice in space | E-inclusion             | Luxembourg       | charles.jpg | 12/31/2021 | 12/31/2021 | 12/31/2021   |
+      | Funny news 4    | Dummy body                                 | Mice in space | HR                      | Luxembourg       | ada.png     | 06/25/2020 | 06/25/2020 | 06/25/2020   |
+      | Funny news 5    | Dummy body                                 | Mice in space | HR                      | Luxembourg       | ada.png     | 01/01/2021 | 01/01/2021 | 01/01/2021   |
+      | Dummy news 1    | Dummy body                                 | Mice in space | Statistics and Analysis | Luxembourg       | charles.jpg | 09/24/2019 | 09/24/2019 | 09/24/2019   |
+      | Dummy news 2    | Dummy body                                 | Mice in space | E-inclusion             | Luxembourg       | alan.jpg    | 01/18/2021 | 01/18/2021 | 01/18/2021   |
+      | Dummy news 3    | Dummy body                                 | Mice in space | Statistics and Analysis | Luxembourg       | ada.png     | 08/01/2019 | 08/01/2019 | 08/01/2019   |
+      | Dummy news 4    | Dummy body                                 | Mice in space | E-inclusion             | Luxembourg       | charles.jpg | 09/18/2019 | 09/18/2019 | 09/18/2019   |
 
     When I visit the search page
 
@@ -773,8 +761,8 @@ Feature: Global search
 
   Scenario: Max 2 topic terms appear in each search result with a suffix for the rest.
     Given collection content:
-      | title                  | moderation | topic                                                                              | state     |
-      | Max 2 topic collection | no         | Finance in EU, Supplier exchange, Demography, E-inclusion, Statistics and Analysis | published |
+      | title                  | moderation | topic                                                                              |
+      | Max 2 topic collection | no         | Finance in EU, Supplier exchange, Demography, E-inclusion, Statistics and Analysis |
     When I visit the search page
     Then there should be 2 topics in the "Max 2 topic collection" card
     And I should see the text "+3 topics" in the "Max 2 topic collection" card
@@ -784,10 +772,10 @@ Feature: Global search
       | title             | description       | state     |
       | Custom collection | Some custom data. | published |
     And news content:
-      | title               | headline                           | body                                                              | collection        | state     | created    | changed    |
-      | Quantum information | Relativity is the word             | No one cares about the body.                                      | Custom collection | published | 01/01/2019 | 03/08/2019 |
-      | The uneven universe | Relativity news: Relativity theory | I do care about the relativity keyword in the body.               | Custom collection | published | 02/01/2019 | 02/08/2019 |
-      | The earth is square | Absolutely nonsense                | Some news are not worth it but I will add relativity here anyway. | Custom collection | published | 03/01/2019 | 01/08/2019 |
+      | title               | headline                           | body                                                              | collection        | created    | changed    |
+      | Quantum information | Relativity is the word             | No one cares about the body.                                      | Custom collection | 01/01/2019 | 03/08/2019 |
+      | The uneven universe | Relativity news: Relativity theory | I do care about the relativity keyword in the body.               | Custom collection | 02/01/2019 | 02/08/2019 |
+      | The earth is square | Absolutely nonsense                | Some news are not worth it but I will add relativity here anyway. | Custom collection | 03/01/2019 | 01/08/2019 |
     When I visit the search page
     Then I should see the text "Last update: 08/03/2019" in the "Quantum information" card
     And I should see the text "Last update: 08/02/2019" in the "The uneven universe" card
@@ -812,12 +800,6 @@ Feature: Global search
 
   @javascript
   Scenario: Search page - Show the abstract or description in the search results.
-    Given owner content:
-      | name        | owner type |
-      | Renew owner | Company    |
-    And contact_information content:
-      | name           | email              |
-      | Gor-to contact | gor-to@example.com |
     And collection content:
       | title            | description                                          | abstract                      | state     |
       | Pull alpha       | <p>collection <strong>pull</strong> description.</p> | The collection pull abstract. | published |
@@ -825,15 +807,15 @@ Feature: Global search
       | Roll alpha       | <p>collection <strong>roll</strong> description.</p> | The collection roll abstract. | archived  |
       | Col for Sol net  | <p>collection for the solution net.</p>              | Loky and Rocky.               | archived  |
     Given solution content:
-      | title         | description                                                | abstract                    | keywords | owner       | contact information | collection       | state     |
-      | Solution pull | <p>This is the solution <strong>pull</strong> description. | The solution pull abstract. | Alphabet | Renew owner | Gor-to contact      | Pull alpha       | published |
-      | Solution javi | <p>This is the solution <strong>javi</strong> description. |                             | Alphabet | Renew owner | Gor-to contact      | Col for Sol javi | published |
-      | Solution roll | <p>This is the solution <strong>roll</strong> description. | The solution roll abstract. | Alphabet | Renew owner | Gor-to contact      | Roll alpha       | published |
-      | Solution net  | <p>This is the solution <strong>net</strong> description.  |                             | Alphabet | Renew owner | Gor-to contact      | Col for Sol net  | published |
+      | title         | description                                                | abstract                    | keywords | collection       |
+      | Solution pull | <p>This is the solution <strong>pull</strong> description. | The solution pull abstract. | Alphabet | Pull alpha       |
+      | Solution javi | <p>This is the solution <strong>javi</strong> description. |                             | Alphabet | Col for Sol javi |
+      | Solution roll | <p>This is the solution <strong>roll</strong> description. | The solution roll abstract. | Alphabet | Roll alpha       |
+      | Solution net  | <p>This is the solution <strong>net</strong> description.  |                             | Alphabet | Col for Sol net  |
     And "custom_page" content:
-      | title                    | collection       | abstract             | logo     | state     |
-      | Custom example abstract  | Pull alpha       | Lorem ipsum abstract | logo.png | published |
-      | Custom example paragraph | Col for Sol javi |                      | logo.png | published |
+      | title                    | collection       | abstract             | logo     |
+      | Custom example abstract  | Pull alpha       | Lorem ipsum abstract | logo.png |
+      | Custom example paragraph | Col for Sol javi |                      | logo.png |
     And I append "text" to "field_paragraphs_body" field in "node" entity with following "Custom example paragraph" title:
       | field_body:value  | That's one small step for a man, a giant leap for mankind. |
       | field_body:format | text_html                                                  |
diff --git a/tests/features/solution/homepage.feature b/tests/features/solution/homepage.feature
index 9af6713ca7..14a5a9af97 100644
--- a/tests/features/solution/homepage.feature
+++ b/tests/features/solution/homepage.feature
@@ -12,8 +12,8 @@ Feature: Solution homepage
       | title     | description                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      | owner         | topic                   | solution type                           | spatial coverage | language | status    | published at    | modification date | abstract                   |
       | Petri net | "<p>A <b>Petri net</b>, also known as a <b>place/transition (PT) net</b>, is one of several <a href=\"#mathematical\">mathematical</a> modeling languages for the description of distributed systems. It is a class of discrete event dynamic system. A Petri net is a directed bipartite graph, in which the nodes represent transitions (i.e. events that may occur, represented by bars) and places (i.e. conditions, represented by circles). The directed arcs describe which places are pre- and/or postconditions for which transitions (signified by arrows). Some sources state that Petri nets were invented in August 1939 by Carl Adam Petri at the age of 13 for the purpose of describing chemical processes.</p>" | Awesome owner | Demography, E-inclusion | Non-binding Instrument, Logging Service | Greece, Belgium  | English  | Completed | 2012-12-01T8:43 | 2017-12-01T8:43   | Short abstract description |
     And release content:
-      | title          | release notes    | documentation | release number | release notes   | is version of | state     | creation date    | published at     |
-      | Petri net v1.1 | A sample release | text.pdf      | 1.1            | Changed release | Petri net     | published | 2022-12-21T13:00 | 2022-12-21T13:00 |
+      | title          | release notes    | documentation | release number | release notes   | is version of | creation date    | published at     |
+      | Petri net v1.1 | A sample release | text.pdf      | 1.1            | Changed release | Petri net     | 2022-12-21T13:00 | 2022-12-21T13:00 |
 
     When I go to the homepage of the "Petri net" solution
     Then the page should be cacheable
diff --git a/tests/features/solution/homepage_content.feature b/tests/features/solution/homepage_content.feature
index 00eb10b2fe..5947d53fc3 100644
--- a/tests/features/solution/homepage_content.feature
+++ b/tests/features/solution/homepage_content.feature
@@ -7,16 +7,10 @@ Feature: Solution homepage
   # @covers \Drupal\joinup_release\Plugin\search_api\processor\ReleaseSolutionData::preprocessIndexItems
   # @covers \Drupal\joinup_search\Plugin\search_api\processor\AddAggregatedTopicHierarchy::preprocessIndexItems
   Scenario: The solution homepage shows related content.
-    Given owner content:
-      | name          | owner type |
-      | Kostas Agathe | Company    |
-    And contact_information content:
-      | name    | email               |
-      | Placebo | Placebo@example.com |
     Given solution content:
-      | title                        | abstract                              | description                           | logo     | state     | status | related by type | owner         | contact information | solution type | topic       |
-      | Information sharing protocol | Handling information sharing securely | Handling information sharing securely | logo.png | published |        | yes             | Kostas Agathe | Placebo             | Business      | E-inclusion |
-      | Security audit tools         | Automated test of security            | Automated test of security            | logo.png | published |        | yes             | Kostas Agathe | Placebo             | Business      | E-inclusion |
+      | title                        | abstract                              | description                           | logo     | status | related by type | solution type | topic       |
+      | Information sharing protocol | Handling information sharing securely | Handling information sharing securely | logo.png |        | yes             | Business      | E-inclusion |
+      | Security audit tools         | Automated test of security            | Automated test of security            | logo.png |        | yes             | Business      | E-inclusion |
     And release content:
       | title                | release number | creation date     | release notes                               | is version of                | state     | spatial coverage |
       | IS protocol paper    | 1              | 2018-10-04 8:01am | First stable version.                       | Information sharing protocol | published | Belgium          |
@@ -37,8 +31,8 @@ Feature: Solution homepage
       | IS protocol meet-up         | Discussion about the next standard. | 2018-10-04 8:02am | Statistics and Analysis | European Union   | Information sharing protocol | published |
       | Archiving some distribution | Old ZIP version archived.           | 2018-10-04 8:02am | Statistics and Analysis | European Union   | Information sharing protocol | archived  |
     And document content:
-      | title               | document type | short title | created           | field_paragraphs_body   | spatial coverage | topic       | solution                     | state     |
-      | IS protocol draft 2 | Document      | IS draft 2  | 2018-10-04 8:08am | Next proposition draft. | European Union   | E-inclusion | Information sharing protocol | published |
+      | title               | document type | short title | created           | field_paragraphs_body   | spatial coverage | topic       | solution                     |
+      | IS protocol draft 2 | Document      | IS draft 2  | 2018-10-04 8:08am | Next proposition draft. | European Union   | E-inclusion | Information sharing protocol |
 
     When I go to the homepage of the "Information sharing protocol" solution
     # I should see only the related release.
diff --git a/tests/features/solution/manage_solutions.archive.feature b/tests/features/solution/manage_solutions.archive.feature
index 5d0809e56a..7ecd879cb9 100644
--- a/tests/features/solution/manage_solutions.archive.feature
+++ b/tests/features/solution/manage_solutions.archive.feature
@@ -5,9 +5,6 @@ Feature: When a solution is archived then its sub-content also should be archive
     Given collection content:
       | title      |
       | Collection |
-    And owner content:
-      | name        | owner type |
-      | The Company | Company    |
     And contact_information content:
       | name                 | email                      |
       | Liam Smith           | liam.smith@example.com     |
diff --git a/tests/features/solution/related_solution.feature b/tests/features/solution/related_solution.feature
index 5a19e2d713..b6fb620751 100644
--- a/tests/features/solution/related_solution.feature
+++ b/tests/features/solution/related_solution.feature
@@ -4,20 +4,14 @@ Feature: Related solution
   solutions and present the related solutions to the users.
 
   Background:
-    Given contact_information content:
-      | name        | email       |
-      | Kalikatoura | bar@bar.com |
-    And owner content:
-      | name         | owner type |
-      | Kalikatoures | Company    |
     Given solution content:
-      | title      | related solutions | abstract                         | description                         | documentation | related by type | moderation | logo     | topic      | state     | solution type | owner        | contact information |
-      | C          |                   | Blazing fast segmentation faults | Blazing fast segmentation faults.   | text.pdf      | yes             | no         | logo.png | Demography | published |               | Kalikatoures | Kalikatoura         |
-      | Java       | C                 | Because inheritance is cool      | Because inheritance is cool.        | text.pdf      | yes             | no         | logo.png | Demography | published | Citizen       | Kalikatoures | Kalikatoura         |
-      | PHP        |                   | Make a site                      | Make a site.                        | text.pdf      | yes             | yes        | logo.png | Demography | published | Citizen       | Kalikatoures | Kalikatoura         |
-      | Golang     |                   | Concurrency for the masses       | Concurrency for the masses          | text.pdf      | yes             | yes        | logo.png | Demography | proposed  | Citizen       | Kalikatoures | Kalikatoura         |
-      | Python     |                   | Get stuff done                   | Get stuff done.                     | text.pdf      | yes             | no         | logo.png | Demography | published |               | Kalikatoures | Kalikatoura         |
-      | Javascript | Java, PHP         | Java is related to javascript    | Java is related to javascript. Huh? | text.pdf      | no              | no         | logo.png | Demography | published | Citizen       | Kalikatoures | Kalikatoura         |
+      | title      | related solutions | abstract                         | description                         | documentation | related by type | moderation | logo     | topic      | state     | solution type |
+      | C          |                   | Blazing fast segmentation faults | Blazing fast segmentation faults.   | text.pdf      | yes             | no         | logo.png | Demography | published |               |
+      | Java       | C                 | Because inheritance is cool      | Because inheritance is cool.        | text.pdf      | yes             | no         | logo.png | Demography | published | Citizen       |
+      | PHP        |                   | Make a site                      | Make a site.                        | text.pdf      | yes             | yes        | logo.png | Demography | published | Citizen       |
+      | Golang     |                   | Concurrency for the masses       | Concurrency for the masses          | text.pdf      | yes             | yes        | logo.png | Demography | proposed  | Citizen       |
+      | Python     |                   | Get stuff done                   | Get stuff done.                     | text.pdf      | yes             | no         | logo.png | Demography | published |               |
+      | Javascript | Java, PHP         | Java is related to javascript    | Java is related to javascript. Huh? | text.pdf      | no              | no         | logo.png | Demography | published | Citizen       |
 
   # @covers \joinup_solution_get_related_solutions_ids.
   Scenario: Related solutions
diff --git a/tests/features/user/profile.feature b/tests/features/user/profile.feature
index 0aa8033d6c..99833c1260 100644
--- a/tests/features/user/profile.feature
+++ b/tests/features/user/profile.feature
@@ -104,33 +104,26 @@ Feature: User profile
       | Jayson Granger    | jayson.granger@example.com    |            |             |
       | Clarette Fairburn | clarette.fairburn@example.com | Clarette   | Fairburn    |
     And collection content:
-      | title                 | description                           | logo     | state     | creation date    |
-      | Botanic E.D.E.N.      | European Deep Earth Nurturing project | logo.png | published | 2017-02-23 10:00 |
-      | Ethic flower handling | Because even flowers have feelings.   | logo.png | published | 2017-02-23 12:00 |
+      | title                 | description                           | logo     | creation date    |
+      | Botanic E.D.E.N.      | European Deep Earth Nurturing project | logo.png | 2017-02-23 10:00 |
+      | Ethic flower handling | Because even flowers have feelings.   | logo.png | 2017-02-23 12:00 |
     Given solution content:
-      | title              | collection            | description                                     | logo     | state     | creation date    |
-      | E.C.O. fertilizers | Botanic E.D.E.N.      | Ecologic cool organic fertilizers production.   | logo.png | published | 2017-02-23 13:00 |
-      | SOUND project      | Ethic flower handling | Music playlist for growing flowers with rhythm. | logo.png | published | 2017-02-23 14:01 |
+      | title              | collection            | description                                     | logo     | creation date    |
+      | E.C.O. fertilizers | Botanic E.D.E.N.      | Ecologic cool organic fertilizers production.   | logo.png | 2017-02-23 13:00 |
+      | SOUND project      | Ethic flower handling | Music playlist for growing flowers with rhythm. | logo.png | 2017-02-23 14:01 |
     And discussion content:
-      | title                          | author          | collection            | state     | created          |
-      | Repopulating blue iris         | Corwin Robert   | Botanic E.D.E.N.      | published | 2018-06-15 16:00 |
-      | Best topsoil for plant comfort | Anise Edwardson | Ethic flower handling | published | 2018-09-01 19:30 |
+      | title                          | author          | collection            | created          |
+      | Repopulating blue iris         | Corwin Robert   | Botanic E.D.E.N.      | 2018-06-15 16:00 |
+      | Best topsoil for plant comfort | Anise Edwardson | Ethic flower handling | 2018-09-01 19:30 |
     And document content:
-      | title                    | author        | collection       | state     | created          |
-      | Cherry blossoms schedule | Corwin Robert | Botanic E.D.E.N. | published | 2017-05-13 16:00 |
+      | title                    | author        | collection       | created          |
+      | Cherry blossoms schedule | Corwin Robert | Botanic E.D.E.N. | 2017-05-13 16:00 |
     And event content:
-      | title                | author        | collection       | state     | created          |
-      | Spring blossom party | Corwin Robert | Botanic E.D.E.N. | published | 2018-06-27 18:00 |
+      | title                | author        | collection       | created          |
+      | Spring blossom party | Corwin Robert | Botanic E.D.E.N. | 2018-06-27 18:00 |
     And news content:
-      | title                         | author        | collection       | state     | created         |
-      | Discovered new flower species | Corwin Robert | Botanic E.D.E.N. | published | 2018-11-15 9:01 |
-    # Contact information and owner tiles should never be shown.
-    And contact_information content:
-      | name           | email                      | website url        | author        |
-      | Wibo Verhoeven | wibo.verhoeven@example.com | http://example.com | Corwin Robert |
-    And owner content:
-      | owner type | name                 | author        |
-      | Company    | Somboon De Laurentis | Corwin Robert |
+      | title                         | author        | collection       | created         |
+      | Discovered new flower species | Corwin Robert | Botanic E.D.E.N. | 2018-11-15 9:01 |
     And the following collection user membership:
       | user          | collection       |
       | Corwin Robert | Botanic E.D.E.N. |
@@ -281,7 +274,7 @@ Feature: User profile
       | Salt is salty           |
       # Always present in all tests.
       # See joinup_test.install
-      | The Portal               |
+      | The Portal              |
 
     When I click "Show archived"
     Then I should see the following tiles in the correct order:
-- 
GitLab


From 4aa050ba6a10be5ee1eabbe369dc84a82fa58b3d Mon Sep 17 00:00:00 2001
From: "micha.jakubowski" <micha.jakubowski@ffwagency.com>
Date: Mon, 16 Dec 2024 11:31:11 +0100
Subject: [PATCH 064/137] ISAICP-8780: cleanup tests with contact_information

---
 tests/features/ckeditor5.feature              | 46 ++++++++-----------
 .../collection/collection.archived.feature    | 14 ++----
 tests/features/joinup_seo/sitemap.feature     | 12 ++---
 3 files changed, 28 insertions(+), 44 deletions(-)

diff --git a/tests/features/ckeditor5.feature b/tests/features/ckeditor5.feature
index 3f2d6ad6a9..2b6e009451 100644
--- a/tests/features/ckeditor5.feature
+++ b/tests/features/ckeditor5.feature
@@ -2,19 +2,13 @@
 Feature: CKEditor5
 
   Background:
-    Given owner content:
-      | name     | owner type |
-      | Landlord | Company    |
-    And contact_information content:
-      | name    | email                |
-      | ReachMe | reach.me@example.com |
-    And collection content:
-      | title                 | state     | topic                   | owner    | contact information |
-      | Shaping of disruption | published | Supplier exchange       | Landlord | ReachMe             |
-      | The Other Collection  | published | Statistics and Analysis | Landlord | ReachMe             |
+    Given collection content:
+      | title                 | topic                   |
+      | Shaping of disruption | Supplier exchange       |
+      | The Other Collection  | Statistics and Analysis |
     Given solution content:
-      | title       | collection            | state     | topic             | owner    | contact information |
-      | Angry Birds | Shaping of disruption | published | Supplier exchange | Landlord | ReachMe             |
+      | title       | collection            | topic             |
+      | Angry Birds | Shaping of disruption | Supplier exchange |
 
   Scenario: CKE5 textarea do not respect any configurable sizes.
     Given glossary content:
@@ -244,35 +238,31 @@ Feature: CKEditor5
 
   @casMockServer
   Scenario: Add test coverage for 'Contact us' wysiwyg button.
-
-    And owner content:
-      | name  | owner type |
-      | Lotte | Company    |
-    And user:
+    Given user:
       | Username    | Pally Rapamichael      |
       | First name  | Pally                  |
       | Family name | Rapamichael            |
       | E-mail      | p.papamichael@pally.de |
     And contact_information content:
-      | name                 | email                      |
-      | Klim Smith           | klim.smith@example.com     |
-      | Raul Timon           | raul.timon@example.com     |
+      | name       | email                  |
+      | Klim Smith | klim.smith@example.com |
+      | Raul Timon | raul.timon@example.com |
     And the following email confirmation request:
       | email                  | status    |
       | klim.smith@example.com | confirmed |
       | raul.timon@example.com | confirmed |
     And collection content:
-      | title                | state     | contact information |
-      | Antiruin development | published | Raul Timon          |
+      | title                | contact information |
+      | Antiruin development | Raul Timon          |
     And solution content:
-      | title                    | abstract                        | description                     | state     | topic                   | owner | solution type                      | collection           | contact information |
-      | One exclusion advantages | Separating molecules by height. | Separating molecules by weight. | published | Demography, E-inclusion | Lotte | Non-binding Instrument, Data Owner | Antiruin development | Klim Smith          |
+      | title                    | abstract                        | description                     | topic                   | solution type                      | collection           | contact information |
+      | One exclusion advantages | Separating molecules by height. | Separating molecules by weight. | Demography, E-inclusion | Non-binding Instrument, Data Owner | Antiruin development | Klim Smith          |
     And users:
       | Username    | E-mail         | First name | Family name |
       | jmacc_local | jodine@ankh.am | John       | Maccalariat |
     And CAS users:
-      | First name | Last name   | Username  | E-mail         | Password | Local username |
-      | John       | Maccalariat | jmacc     | jodine@ankh.am | 10d1ne   | jmacc_local    |
+      | First name | Last name   | Username | E-mail         | Password | Local username |
+      | John       | Maccalariat | jmacc    | jodine@ankh.am | 10d1ne   | jmacc_local    |
 
     Given I am logged in as a moderator
     Then I go to "/collection/antiruin-development/solution/one-exclusion-advantages/contact"
@@ -316,8 +306,8 @@ Feature: CKEditor5
 
     # Check layout paragraphs.
     Given custom_page content:
-      | title                             | collection            | state     | abstract |
-      | Contact us text check             | Antiruin development  | published | N/A      |
+      | title                 | collection           | abstract |
+      | Contact us text check | Antiruin development | N/A      |
     And I append "layout" to "field_paragraphs_body" field in "node" entity with following "Contact us text check" title:
       | behavior_settings | a:3:{s:17:"layout_paragraphs";a:4:{s:6:"layout";s:13:"layout_onecol";s:6:"config";a:1:{s:5:"label";s:0:"";}s:11:"parent_uuid";N;s:6:"region";N;}s:16:"background_theme";a:0:{}s:11:"extra_class";a:0:{}} |
 
diff --git a/tests/features/collection/collection.archived.feature b/tests/features/collection/collection.archived.feature
index dd5a97330d..5cd832bb40 100644
--- a/tests/features/collection/collection.archived.feature
+++ b/tests/features/collection/collection.archived.feature
@@ -10,23 +10,17 @@ Feature: Creating content and commenting on archived collection
       | Flora Hunt  | moderator |
       | Lee Reeves  |           |
       | Karl Fields |           |
-    And contact_information content:
-      | name           | email                 |
-      | Jody Rodriquez | JodyRodriquez@bar.com |
-    And owner content:
-      | name          |
-      | April Hawkins |
     And collection content:
-      | title               | abstract            | description         | logo     | owner         | contact information | state     | topic                   |
-      | The Willing Consort | The Willing Consort | The Willing Consort | logo.png | April Hawkins | Jody Rodriquez      | published | Statistics and Analysis |
+      | title               | abstract            | description         | logo     | topic                   |
+      | The Willing Consort | The Willing Consort | The Willing Consort | logo.png | Statistics and Analysis |
     And the following collection user memberships:
       | collection          | user        | roles              |
       | The Willing Consort | Karl Fields | owner, facilitator |
 
   Scenario: 'Comment form' should not be accessible on an archived collection content.
     Given discussion content:
-      | title               | collection          | state     |
-      | The Weeping's Stars | The Willing Consort | published |
+      | title               | collection          |
+      | The Weeping's Stars | The Willing Consort |
     When I am logged in as "Lee Reeves"
     And I go to the "The Weeping's Stars" discussion
     Then the following fields should be present "Create comment"
diff --git a/tests/features/joinup_seo/sitemap.feature b/tests/features/joinup_seo/sitemap.feature
index 8118365e15..b4c69e884f 100644
--- a/tests/features/joinup_seo/sitemap.feature
+++ b/tests/features/joinup_seo/sitemap.feature
@@ -24,16 +24,16 @@ Feature:
       | Sitemap release 1 | 1              | New release   | Sitemap solution published | published |
       | Sitemap release 2 | 2              | Newer release | Sitemap solution published | draft     |
     And distribution content:
-      | title                | description           | release           | access url | state     |
-      | Sitemap distribution | Some kind of download | Sitemap release 1 | test.zip   | published |
+      | title                | description           | release           | access url |
+      | Sitemap distribution | Some kind of download | Sitemap release 1 | test.zip   |
     And licence content:
       | title           | description |
       | Sitemap licence | Not allowed |
     And "custom_page" content:
-      | title                                           | collection                   | body | logo     | langcode | state     |
-      | Sitemap custom page of draft                    | Sitemap collection draft     | N/A  | logo.png | en       | published |
-      | Sitemap custom page of published                | Sitemap collection published | N/A  | logo.png | en       | published |
-      | Sitemap custom page of published but in Spanish | Sitemap collection published | N/A  | logo.png | es       | published |
+      | title                                           | collection                   | body | logo     | langcode |
+      | Sitemap custom page of draft                    | Sitemap collection draft     | N/A  | logo.png | en       |
+      | Sitemap custom page of published                | Sitemap collection published | N/A  | logo.png | en       |
+      | Sitemap custom page of published but in Spanish | Sitemap collection published | N/A  | logo.png | es       |
     And news content:
       | title                                    | headline     | body              | solution                   | state     | published at              |
       | Sitemap news draft                       | Sitemap news | Sitemap news body | Sitemap solution published | draft     |                           |
-- 
GitLab


From 3ad047976d38a89d91ba409864d905e0d3b00088 Mon Sep 17 00:00:00 2001
From: "micha.jakubowski" <micha.jakubowski@ffwagency.com>
Date: Mon, 16 Dec 2024 12:31:26 +0100
Subject: [PATCH 065/137] ISAICP-8780:Restore search.feature

---
 tests/features/joinup_search/search.feature | 238 +++++++++++---------
 1 file changed, 128 insertions(+), 110 deletions(-)

diff --git a/tests/features/joinup_search/search.feature b/tests/features/joinup_search/search.feature
index 47c51a95a3..ddda77daf5 100644
--- a/tests/features/joinup_search/search.feature
+++ b/tests/features/joinup_search/search.feature
@@ -5,19 +5,19 @@ Feature: Global search
   @javascript
   Scenario: Anonymous user can find items
     Given collection content:
-      | title                        | logo     | moderation | topic      | spatial coverage |
-      | Molecular cooking collection | logo.png | no         | Demography | Belgium          |
+      | title                        | logo     | moderation | topic      | spatial coverage | state     |
+      | Molecular cooking collection | logo.png | no         | Demography | Belgium          | published |
     Given solution content:
-      | title          | collection                   | description                                                                                                                          | topic      | spatial coverage |
-      | Spherification | Molecular cooking collection | Spherification is the culinary process of shaping a liquid into spheres                                                              | Demography | European Union   |
-      | Foam           | Molecular cooking collection | "The use of foam in cuisine has been used in many forms in the history of cooking:whipped cream, meringue, and mousse are all foams" | eGov       |                  |
+      | title          | collection                   | description                                                                                                                          | topic      | spatial coverage | state     |
+      | Spherification | Molecular cooking collection | Spherification is the culinary process of shaping a liquid into spheres                                                              | Demography | European Union   | published |
+      | Foam           | Molecular cooking collection | "The use of foam in cuisine has been used in many forms in the history of cooking:whipped cream, meringue, and mousse are all foams" | eGov       |                  | published |
     And news content:
-      | title                | headline              | field_paragraphs_body | collection                   | topic                   | spatial coverage |
-      | El Tuba de Los Lobos | El Celler de Can Roca | The best in town      | Molecular cooking collection | Statistics and Analysis | Luxembourg       |
-      | Dummy news 1         | Dummy title 1         | Dummy body            | Molecular cooking collection | E-inclusion             | Luxembourg       |
-      | Dummy news 2         | Dummy title 2         | Dummy body            | Molecular cooking collection | E-inclusion             | Luxembourg       |
-      | Dummy news 3         | Dummy title 3         | Dummy body            | Molecular cooking collection | E-inclusion             | Luxembourg       |
-      | Dummy news 4         | Dummy title 4         | Dummy body            | Molecular cooking collection | E-inclusion             | Luxembourg       |
+      | title                | headline              | field_paragraphs_body | collection                   | topic                   | spatial coverage | state     |
+      | El Tuba de Los Lobos | El Celler de Can Roca | The best in town      | Molecular cooking collection | Statistics and Analysis | Luxembourg       | published |
+      | Dummy news 1         | Dummy title 1         | Dummy body            | Molecular cooking collection | E-inclusion             | Luxembourg       | published |
+      | Dummy news 2         | Dummy title 2         | Dummy body            | Molecular cooking collection | E-inclusion             | Luxembourg       | published |
+      | Dummy news 3         | Dummy title 3         | Dummy body            | Molecular cooking collection | E-inclusion             | Luxembourg       | published |
+      | Dummy news 4         | Dummy title 4         | Dummy body            | Molecular cooking collection | E-inclusion             | Luxembourg       | published |
 
     When I visit the search page
     Then the response should not contain "data-drupal-facet-id=\"status\""
@@ -199,17 +199,23 @@ Feature: Global search
 
   @javascript
   Scenario: Alphabetical order for the spatial coverage in the search page.
+    Given owner content:
+      | name              | owner type |
+      | Responsible owner | Company    |
+    And contact_information content:
+      | name          | email             |
+      | Go-to contact | go-to@example.com |
     And collection content:
-      | title            | description                                          | abstract                       |
-      | Collection alpha | <p>collection <strong>beta</strong> description.</p> | The collection gamma abstract. |
-      | Col for Sol      | <p>collection for the solution.</p>                  | The col for sol abstract.      |
+      | title            | description                                          | abstract                       | state     |
+      | Collection alpha | <p>collection <strong>beta</strong> description.</p> | The collection gamma abstract. | published |
+      | Col for Sol      | <p>collection for the solution.</p>                  | The col for sol abstract.      | published |
     And event content:
-      | title             | short title       | field_paragraphs_body               | spatial coverage | agenda         | location       | organisation        | scope         | keywords | collection       |
-      | Event Omega       | Event short delta | The epsilon event content.          | Greece           | Event agenda.  | Some place     | European Commission | International | Alphabet | Collection alpha |
-      | Alternative event | Alt event         | This event stays in the background. | Luxembourg       | To be planned. | Event location | Event organisation  |               |          | Collection alpha |
+      | title             | short title       | field_paragraphs_body               | spatial coverage | agenda         | location       | organisation        | scope         | keywords | collection       | state     |
+      | Event Omega       | Event short delta | The epsilon event content.          | Greece           | Event agenda.  | Some place     | European Commission | International | Alphabet | Collection alpha | published |
+      | Alternative event | Alt event         | This event stays in the background. | Luxembourg       | To be planned. | Event location | Event organisation  |               |          | Collection alpha | published |
     And document content:
-      | title          | document type | short title          | field_paragraphs_body                   | spatial coverage | keywords | collection       |
-      | Document omega | Document      | Document short delta | A document consists of epsilon strings. | Luxembourg       | Alphabet | Collection alpha |
+      | title          | document type | short title          | field_paragraphs_body                   | spatial coverage | keywords | collection       | state     |
+      | Document omega | Document      | Document short delta | A document consists of epsilon strings. | Luxembourg       | Alphabet | Collection alpha | published |
 
     When I visit the search page
 
@@ -226,38 +232,44 @@ Feature: Global search
     And the "spatial coverage" checkbox facet should allow selecting the following values "Greece (1), Luxembourg (2)"
 
   Scenario: Content can be found with a full-text search.
+    Given owner content:
+      | name              | owner type |
+      | Responsible owner | Company    |
+    And contact_information content:
+      | name          | email             | state     |
+      | Go-to contact | go-to@example.com | validated |
     And collection content:
-      | title            | description                                          | abstract                       |
-      | Collection alpha | <p>collection <strong>beta</strong> description.</p> | The collection gamma abstract. |
-      | Col for Sol      | <p>collection for the solution.</p>                  | The col for sol abstract.      |
+      | title            | description                                          | abstract                       | state     |
+      | Collection alpha | <p>collection <strong>beta</strong> description.</p> | The collection gamma abstract. | published |
+      | Col for Sol      | <p>collection for the solution.</p>                  | The col for sol abstract.      | published |
     Given solution content:
-      | title          | description                                                | keywords | collection  |
-      | Solution alpha | <p>This is the solution <strong>beta</strong> description. | Alphabet | Col for Sol |
+      | title          | description                                                | keywords | owner             | contact information | collection  | state     |
+      | Solution alpha | <p>This is the solution <strong>beta</strong> description. | Alphabet | Responsible owner | Go-to contact       | Col for Sol | published |
     And release content:
-      | title         | release number | release notes                               | keywords | is version of  |
-      | Release Alpha | 1              | <p>Release notes for <em>beta</em> changes. | Alphabet | Solution alpha |
+      | title         | release number | release notes                               | keywords | is version of  | state     |
+      | Release Alpha | 1              | <p>Release notes for <em>beta</em> changes. | Alphabet | Solution alpha | published |
     And distribution content:
-      | title              | description                                    | release       | access url |
-      | Distribution alpha | <p>A simple beta distribution description.</p> | Release Alpha | test.zip   |
+      | title              | description                                    | release       | access url | state     |
+      | Distribution alpha | <p>A simple beta distribution description.</p> | Release Alpha | test.zip   | published |
     And licence content:
       | title         | description                         |
       | Licence Alpha | A beta description for the licence. |
     And news content:
-      | title      | headline            | field_paragraphs_body     | keywords | collection       |
-      | News omega | News headline delta | The epsilon news content. | Alphabet | Collection alpha |
+      | title      | headline            | field_paragraphs_body     | keywords | collection       | state     |
+      | News omega | News headline delta | The epsilon news content. | Alphabet | Collection alpha | published |
     And event content:
-      | title             | short title       | abstract                                         | field_paragraphs_body               | agenda         | location       | organisation        | scope         | keywords | collection       | solution       |
-      | Event Omega       | Event short delta | The epsilon event content but abstract.          | The epsilon event content.          | Event agenda.  | Some place     | European Commission | International | Alphabet |                  | Solution alpha |
-      | Alternative event | Alt event         | This event stays in the background but abstract. | This event stays in the background. | To be planned. | Event location | Event organisation  |               |          | Collection alpha |                |
+      | title             | short title       | abstract                                         | field_paragraphs_body               | agenda         | location       | organisation        | scope         | keywords | collection       | solution       | state     |
+      | Event Omega       | Event short delta | The epsilon event content but abstract.          | The epsilon event content.          | Event agenda.  | Some place     | European Commission | International | Alphabet |                  | Solution alpha | published |
+      | Alternative event | Alt event         | This event stays in the background but abstract. | This event stays in the background. | To be planned. | Event location | Event organisation  |               |          | Collection alpha |                | published |
     And document content:
-      | title          | document type | short title          | field_paragraphs_body                   | keywords | collection       |
-      | Document omega | Document      | Document short delta | A document consists of epsilon strings. | Alphabet | Collection alpha |
+      | title          | document type | short title          | field_paragraphs_body                   | keywords | collection       | state     |
+      | Document omega | Document      | Document short delta | A document consists of epsilon strings. | Alphabet | Collection alpha | published |
     And discussion content:
-      | title            | body                                                              | solution       |
-      | Discussion omega | <p>Does anybody has idea why this <em>epsilon</em> is everywhere? | Solution alpha |
+      | title            | body                                                              | solution       | state     |
+      | Discussion omega | <p>Does anybody has idea why this <em>epsilon</em> is everywhere? | Solution alpha | published |
     And custom_page content:
-      | title      | body                                     | collection       | keywords |
-      | Page omega | This is just an epsilon but should work. | Collection alpha | Alphabet |
+      | title      | body                                     | collection       | state     | keywords |
+      | Page omega | This is just an epsilon but should work. | Collection alpha | published | Alphabet |
     And users:
       | Username     | E-mail                      | First name | Family name | Organisation |
       | jenlyle      | jenessa.carlyle@example.com | Jenessa    | Carlyle     | Clyffco      |
@@ -326,7 +338,7 @@ Feature: Global search
     When I go to the homepage
     And I enter "contact" in the search bar and press enter
     # The Portal collection is included
-    Then the page should show the tiles "The Portal, Solution alpha, Release Alpha, Collection alpha, Col for Sol"
+    Then the page should show the tiles "The Portal, Solution alpha, Release Alpha"
 
     # Users should be found by first name, family name and organisation.
     When I enter "Jenessa" in the search bar and press enter
@@ -357,25 +369,25 @@ Feature: Global search
   # See https://citnet.tech.ec.europa.eu/CITnet/jira/browse/ISAICP-6917
   Scenario: Collections and solutions are shown first in search results with the same relevance.
     Given collection content:
-      | title                           | description                         |
-      | Ornithology: the study of birds | Ornithology is a branch of zoology. |
-      | Husky Flying Xylophone          | A strange instrument.               |
+      | title                           | description                         | state     |
+      | Ornithology: the study of birds | Ornithology is a branch of zoology. | published |
+      | Husky Flying Xylophone          | A strange instrument.               | published |
     And solution content:
-      | title                     | collection                      | description                          |
-      | Bird outposts in the wild | Ornithology: the study of birds | Exotic wings and where to find them. |
+      | title                     | collection                      | description                          | state     |
+      | Bird outposts in the wild | Ornithology: the study of birds | Exotic wings and where to find them. | published |
     And custom_page content:
-      | title           | body                                  | collection                      |
-      | Disturbed birds | Flocks of trained pigeons flying off. | Ornithology: the study of birds |
+      | title           | body                                  | collection                      | state     |
+      | Disturbed birds | Flocks of trained pigeons flying off. | Ornithology: the study of birds | published |
     And news content:
-      | title                               | headline                            | field_paragraphs_body           | collection                      |
-      | Chickens are small birds            | Chickens are small birds            | Birds domesticated in India.    | Ornithology: the study of birds |
-      | Found a xylophone from 1600 in Asia | Found a xylophone from 1600 in Asia | Oldest instrument of this type. | Husky Flying Xylophone          |
+      | title                               | headline                            | field_paragraphs_body           | collection                      | state     |
+      | Chickens are small birds            | Chickens are small birds            | Birds domesticated in India.    | Ornithology: the study of birds | published |
+      | Found a xylophone from 1600 in Asia | Found a xylophone from 1600 in Asia | Oldest instrument of this type. | Husky Flying Xylophone          | published |
     And event content:
-      | title         | field_paragraphs_body  | collection                      |
-      | Bird spotting | Roosters crow at dawn. | Ornithology: the study of birds |
+      | title         | field_paragraphs_body  | collection                      | state     |
+      | Bird spotting | Roosters crow at dawn. | Ornithology: the study of birds | published |
     And discussion content:
-      | title                             | body                    | collection                      |
-      | Best place to find an exotic bird | Somewhere exotic maybe? | Ornithology: the study of birds |
+      | title                             | body                    | collection                      | state     |
+      | Best place to find an exotic bird | Somewhere exotic maybe? | Ornithology: the study of birds | published |
     And user:
       | Username    | Bird watcher |
       | First name  | Bird         |
@@ -406,8 +418,8 @@ Feature: Global search
 
     # Add distribution, child of solution.
     Given distribution content:
-      | title       | solution  | description          | access url                      | licence    | format | representation technique |
-      | ZzoluDistro | Zzolution | Übermensch foot size | http://example.com/zzolu-distro | Apache-2.0 | ZIP    | Datalog                  |
+      | title       | solution  | description          | access url                      | licence    | format | representation technique | state     |
+      | ZzoluDistro | Zzolution | Übermensch foot size | http://example.com/zzolu-distro | Apache-2.0 | ZIP    | Datalog                  | published |
 
     When I enter "zzoludistro" in the search bar and press enter
     Then the page should show only the tiles "Zzolution"
@@ -492,8 +504,8 @@ Feature: Global search
     Then I should see "No content found for your search."
 
     Given distribution content:
-      | title         | release | description | access url                        | licence    | format | representation technique |
-      | ReleazzDistro | Releazz | Dracula     | http://example.com/releazz-distro | Apache-2.0 | ZIP    | Datalog                  |
+      | title         | release | description | access url                        | licence    | format | representation technique | state     |
+      | ReleazzDistro | Releazz | Dracula     | http://example.com/releazz-distro | Apache-2.0 | ZIP    | Datalog                  | published |
 
     When I enter "releazzDistro" in the search bar and press enter
     Then the page should show only the tiles "Releazz"
@@ -581,17 +593,17 @@ Feature: Global search
   @javascript
   Scenario: Users are able to select the sort order.
     Given collection content:
-      | title             | description       |
-      | Custom collection | Some custom data. |
+      | title             | description       | state     |
+      | Custom collection | Some custom data. | published |
     And news content:
-      | title               | headline                           | field_paragraphs_body                                             | collection        | created    | changed    |
-      | Quantum information | Relativity is the word             | No one cares about the body.                                      | Custom collection | 01/01/2019 | 03/08/2019 |
-      | The uneven universe | Relativity news: Relativity theory | I do care about the relativity keyword in the body.               | Custom collection | 02/01/2019 | 02/08/2019 |
-      | The earth is square | Absolutely nonsense                | Some news are not worth it but I will add relativity here anyway. | Custom collection | 03/01/2019 | 01/08/2019 |
+      | title               | headline                           | field_paragraphs_body                                             | collection        | state     | created    | changed    |
+      | Quantum information | Relativity is the word             | No one cares about the body.                                      | Custom collection | published | 01/01/2019 | 03/08/2019 |
+      | The uneven universe | Relativity news: Relativity theory | I do care about the relativity keyword in the body.               | Custom collection | published | 02/01/2019 | 02/08/2019 |
+      | The earth is square | Absolutely nonsense                | Some news are not worth it but I will add relativity here anyway. | Custom collection | published | 03/01/2019 | 01/08/2019 |
     And event content:
-      | title           | collection        | state     | start date   | end date            | created      |
-      | Blue revolution | Custom collection | published | now +1 years | now +1 years +1 day | now -2 years |
-      | Red revolution  | Custom collection | published | now -1 years | now -1 years +1 day | now -1 years |
+      | title           | collection        | state     | start date   | end date            | state     | created      |
+      | Blue revolution | Custom collection | published | now +1 years | now +1 years +1 day | published | now -2 years |
+      | Red revolution  | Custom collection | published | now -1 years | now -1 years +1 day | published | now -1 years |
 
     When I am on the homepage
     And I enter "Relativity" in the search bar and press enter
@@ -642,19 +654,19 @@ Feature: Global search
   @javascript
   Scenario: Anonymous user can find facets summary
     Given collection content:
-      | title                    | logo     | moderation | topic      | spatial coverage |
-      | Radio cooking collection | logo.png | no         | Demography | Belgium          |
+      | title                    | logo     | moderation | topic      | spatial coverage | state     |
+      | Radio cooking collection | logo.png | no         | Demography | Belgium          | published |
     Given solution content:
-      | title    | collection               | description                                                                                                                                                   | topic      | spatial coverage |
-      | Spheres  | Radio cooking collection | Spherification is the culinary process of shaping a liquid into spheres. Drupal is the best digital experience platform(DXP) on the web, proudly open source. | Demography | European Union   |
-      | Movistar | Radio cooking collection | "The use of foam in cuisine has been used in many forms in the history of cooking:whipped cream, meringue, and mousse are all foams", proudly open source.    |            |                  |
+      | title    | collection               | description                                                                                                                                                   | topic      | spatial coverage | state     |
+      | Spheres  | Radio cooking collection | Spherification is the culinary process of shaping a liquid into spheres. Drupal is the best digital experience platform(DXP) on the web, proudly open source. | Demography | European Union   | published |
+      | Movistar | Radio cooking collection | "The use of foam in cuisine has been used in many forms in the history of cooking:whipped cream, meringue, and mousse are all foams", proudly open source.    |            |                  | published |
     And news content:
-      | title           | field_paragraphs_body                                                                | collection               | topic                   | spatial coverage |
-      | El Cabo da Roca | The best in town, proudly open source.                                               | Radio cooking collection | Statistics and Analysis | Luxembourg       |
-      | Funny news 1    | Drupal is the best digital experience platform(DXP) on the web, proudly open source. | Radio cooking collection | E-inclusion             | Luxembourg       |
-      | Funny news 2    | Drupal is the best digital experience platform(DXP) on the web, proudly open source. | Radio cooking collection | E-inclusion             | Luxembourg       |
-      | Funny news 3    | Drupal is the best digital experience platform(DXP) on the web, proudly open source. | Radio cooking collection | E-inclusion             | Luxembourg       |
-      | Funny news 4    | Drupal is the best digital experience platform(DXP) on the web, proudly open source. | Radio cooking collection | E-inclusion             | Luxembourg       |
+      | title           | field_paragraphs_body                                                                | collection               | topic                   | spatial coverage | state     |
+      | El Cabo da Roca | The best in town, proudly open source.                                               | Radio cooking collection | Statistics and Analysis | Luxembourg       | published |
+      | Funny news 1    | Drupal is the best digital experience platform(DXP) on the web, proudly open source. | Radio cooking collection | E-inclusion             | Luxembourg       | published |
+      | Funny news 2    | Drupal is the best digital experience platform(DXP) on the web, proudly open source. | Radio cooking collection | E-inclusion             | Luxembourg       | published |
+      | Funny news 3    | Drupal is the best digital experience platform(DXP) on the web, proudly open source. | Radio cooking collection | E-inclusion             | Luxembourg       | published |
+      | Funny news 4    | Drupal is the best digital experience platform(DXP) on the web, proudly open source. | Radio cooking collection | E-inclusion             | Luxembourg       | published |
 
     Given I am logged in as a user with the "authenticated" role
     When I visit the search page
@@ -719,27 +731,27 @@ Feature: Global search
 
   Scenario: Filter on date
     Given collection content:
-      | title         |
-      | Mice in space |
+      | title         | state     |
+      | Mice in space | published |
     And document content:
-      | title        | collection    | topic                                  | logo     | field_paragraphs_body                                                                                                                                                                           |
-      | Microgravity | Mice in space | HR, Statistics and Analysis, E-justice | alan.jpg | Conventional studies investigating the effects of reduced gravity on muscle mass and function have used a ground control group that is not directly comparable to the space experimental group. |
+      | title        | collection    | topic                                  | state     | logo     | field_paragraphs_body                                                                                                                                                                           |
+      | Microgravity | Mice in space | HR, Statistics and Analysis, E-justice | published | alan.jpg | Conventional studies investigating the effects of reduced gravity on muscle mass and function have used a ground control group that is not directly comparable to the space experimental group. |
     And event content:
-      | title           | collection    | topic                    | logo        | field_paragraphs_body                                                                                                                                                                 |
-      | Stay at the ISS | Mice in space | EU and European Policies | charles.jpg | Two groups of mice (six per group) were housed aboard the International Space Station for 35 days. One group was subjected to artificial gravity (1 g) and the other to microgravity. |
+      | title           | collection    | topic                    | state     | logo        | field_paragraphs_body                                                                                                                                                                 |
+      | Stay at the ISS | Mice in space | EU and European Policies | published | charles.jpg | Two groups of mice (six per group) were housed aboard the International Space Station for 35 days. One group was subjected to artificial gravity (1 g) and the other to microgravity. |
     And news content:
-      | title           | body                                       | collection    | topic                   | spatial coverage | logo        | created    | changed    | published_at |
-      | Muscle atrophy  | Researchers from the University of Tsukuba | Mice in space | Finance in EU           | Luxembourg       | blaise.jpg  | 01/01/2019 | 01/01/2019 | 01/01/2019   |
-      | El Cabo da Roca | The best in town                           | Mice in space | Statistics and Analysis | Luxembourg       | charles.jpg | 01/12/2020 | 01/12/2020 | 01/12/2020   |
-      | Funny news 1    | Dummy body                                 | Mice in space | HR                      | Luxembourg       | ada.png     | 05/01/2019 | 05/01/2019 | 05/01/2019   |
-      | Funny news 2    | Dummy body                                 | Mice in space | E-inclusion             | Luxembourg       | alan.jpg    | 06/21/2019 | 06/21/2019 | 06/21/2019   |
-      | Funny news 3    | Dummy body                                 | Mice in space | E-inclusion             | Luxembourg       | charles.jpg | 12/31/2021 | 12/31/2021 | 12/31/2021   |
-      | Funny news 4    | Dummy body                                 | Mice in space | HR                      | Luxembourg       | ada.png     | 06/25/2020 | 06/25/2020 | 06/25/2020   |
-      | Funny news 5    | Dummy body                                 | Mice in space | HR                      | Luxembourg       | ada.png     | 01/01/2021 | 01/01/2021 | 01/01/2021   |
-      | Dummy news 1    | Dummy body                                 | Mice in space | Statistics and Analysis | Luxembourg       | charles.jpg | 09/24/2019 | 09/24/2019 | 09/24/2019   |
-      | Dummy news 2    | Dummy body                                 | Mice in space | E-inclusion             | Luxembourg       | alan.jpg    | 01/18/2021 | 01/18/2021 | 01/18/2021   |
-      | Dummy news 3    | Dummy body                                 | Mice in space | Statistics and Analysis | Luxembourg       | ada.png     | 08/01/2019 | 08/01/2019 | 08/01/2019   |
-      | Dummy news 4    | Dummy body                                 | Mice in space | E-inclusion             | Luxembourg       | charles.jpg | 09/18/2019 | 09/18/2019 | 09/18/2019   |
+      | title           | body                                       | collection    | topic                   | spatial coverage | state     | logo        | created    | changed    | published_at |
+      | Muscle atrophy  | Researchers from the University of Tsukuba | Mice in space | Finance in EU           | Luxembourg       | published | blaise.jpg  | 01/01/2019 | 01/01/2019 | 01/01/2019   |
+      | El Cabo da Roca | The best in town                           | Mice in space | Statistics and Analysis | Luxembourg       | published | charles.jpg | 01/12/2020 | 01/12/2020 | 01/12/2020   |
+      | Funny news 1    | Dummy body                                 | Mice in space | HR                      | Luxembourg       | published | ada.png     | 05/01/2019 | 05/01/2019 | 05/01/2019   |
+      | Funny news 2    | Dummy body                                 | Mice in space | E-inclusion             | Luxembourg       | published | alan.jpg    | 06/21/2019 | 06/21/2019 | 06/21/2019   |
+      | Funny news 3    | Dummy body                                 | Mice in space | E-inclusion             | Luxembourg       | published | charles.jpg | 12/31/2021 | 12/31/2021 | 12/31/2021   |
+      | Funny news 4    | Dummy body                                 | Mice in space | HR                      | Luxembourg       | published | ada.png     | 06/25/2020 | 06/25/2020 | 06/25/2020   |
+      | Funny news 5    | Dummy body                                 | Mice in space | HR                      | Luxembourg       | published | ada.png     | 01/01/2021 | 01/01/2021 | 01/01/2021   |
+      | Dummy news 1    | Dummy body                                 | Mice in space | Statistics and Analysis | Luxembourg       | published | charles.jpg | 09/24/2019 | 09/24/2019 | 09/24/2019   |
+      | Dummy news 2    | Dummy body                                 | Mice in space | E-inclusion             | Luxembourg       | published | alan.jpg    | 01/18/2021 | 01/18/2021 | 01/18/2021   |
+      | Dummy news 3    | Dummy body                                 | Mice in space | Statistics and Analysis | Luxembourg       | published | ada.png     | 08/01/2019 | 08/01/2019 | 08/01/2019   |
+      | Dummy news 4    | Dummy body                                 | Mice in space | E-inclusion             | Luxembourg       | published | charles.jpg | 09/18/2019 | 09/18/2019 | 09/18/2019   |
 
     When I visit the search page
 
@@ -761,8 +773,8 @@ Feature: Global search
 
   Scenario: Max 2 topic terms appear in each search result with a suffix for the rest.
     Given collection content:
-      | title                  | moderation | topic                                                                              |
-      | Max 2 topic collection | no         | Finance in EU, Supplier exchange, Demography, E-inclusion, Statistics and Analysis |
+      | title                  | moderation | topic                                                                              | state     |
+      | Max 2 topic collection | no         | Finance in EU, Supplier exchange, Demography, E-inclusion, Statistics and Analysis | published |
     When I visit the search page
     Then there should be 2 topics in the "Max 2 topic collection" card
     And I should see the text "+3 topics" in the "Max 2 topic collection" card
@@ -772,10 +784,10 @@ Feature: Global search
       | title             | description       | state     |
       | Custom collection | Some custom data. | published |
     And news content:
-      | title               | headline                           | body                                                              | collection        | created    | changed    |
-      | Quantum information | Relativity is the word             | No one cares about the body.                                      | Custom collection | 01/01/2019 | 03/08/2019 |
-      | The uneven universe | Relativity news: Relativity theory | I do care about the relativity keyword in the body.               | Custom collection | 02/01/2019 | 02/08/2019 |
-      | The earth is square | Absolutely nonsense                | Some news are not worth it but I will add relativity here anyway. | Custom collection | 03/01/2019 | 01/08/2019 |
+      | title               | headline                           | body                                                              | collection        | state     | created    | changed    |
+      | Quantum information | Relativity is the word             | No one cares about the body.                                      | Custom collection | published | 01/01/2019 | 03/08/2019 |
+      | The uneven universe | Relativity news: Relativity theory | I do care about the relativity keyword in the body.               | Custom collection | published | 02/01/2019 | 02/08/2019 |
+      | The earth is square | Absolutely nonsense                | Some news are not worth it but I will add relativity here anyway. | Custom collection | published | 03/01/2019 | 01/08/2019 |
     When I visit the search page
     Then I should see the text "Last update: 08/03/2019" in the "Quantum information" card
     And I should see the text "Last update: 08/02/2019" in the "The uneven universe" card
@@ -800,6 +812,12 @@ Feature: Global search
 
   @javascript
   Scenario: Search page - Show the abstract or description in the search results.
+    Given owner content:
+      | name        | owner type |
+      | Renew owner | Company    |
+    And contact_information content:
+      | name           | email              |
+      | Gor-to contact | gor-to@example.com |
     And collection content:
       | title            | description                                          | abstract                      | state     |
       | Pull alpha       | <p>collection <strong>pull</strong> description.</p> | The collection pull abstract. | published |
@@ -807,15 +825,15 @@ Feature: Global search
       | Roll alpha       | <p>collection <strong>roll</strong> description.</p> | The collection roll abstract. | archived  |
       | Col for Sol net  | <p>collection for the solution net.</p>              | Loky and Rocky.               | archived  |
     Given solution content:
-      | title         | description                                                | abstract                    | keywords | collection       |
-      | Solution pull | <p>This is the solution <strong>pull</strong> description. | The solution pull abstract. | Alphabet | Pull alpha       |
-      | Solution javi | <p>This is the solution <strong>javi</strong> description. |                             | Alphabet | Col for Sol javi |
-      | Solution roll | <p>This is the solution <strong>roll</strong> description. | The solution roll abstract. | Alphabet | Roll alpha       |
-      | Solution net  | <p>This is the solution <strong>net</strong> description.  |                             | Alphabet | Col for Sol net  |
+      | title         | description                                                | abstract                    | keywords | owner       | contact information | collection       | state     |
+      | Solution pull | <p>This is the solution <strong>pull</strong> description. | The solution pull abstract. | Alphabet | Renew owner | Gor-to contact      | Pull alpha       | published |
+      | Solution javi | <p>This is the solution <strong>javi</strong> description. |                             | Alphabet | Renew owner | Gor-to contact      | Col for Sol javi | published |
+      | Solution roll | <p>This is the solution <strong>roll</strong> description. | The solution roll abstract. | Alphabet | Renew owner | Gor-to contact      | Roll alpha       | published |
+      | Solution net  | <p>This is the solution <strong>net</strong> description.  |                             | Alphabet | Renew owner | Gor-to contact      | Col for Sol net  | published |
     And "custom_page" content:
-      | title                    | collection       | abstract             | logo     |
-      | Custom example abstract  | Pull alpha       | Lorem ipsum abstract | logo.png |
-      | Custom example paragraph | Col for Sol javi |                      | logo.png |
+      | title                    | collection       | abstract             | logo     | state     |
+      | Custom example abstract  | Pull alpha       | Lorem ipsum abstract | logo.png | published |
+      | Custom example paragraph | Col for Sol javi |                      | logo.png | published |
     And I append "text" to "field_paragraphs_body" field in "node" entity with following "Custom example paragraph" title:
       | field_body:value  | That's one small step for a man, a giant leap for mankind. |
       | field_body:format | text_html                                                  |
-- 
GitLab


From 4994fe8add8366eaddc1e8cbd5668f39a3c7a51a Mon Sep 17 00:00:00 2001
From: "micha.jakubowski" <micha.jakubowski@ffwagency.com>
Date: Mon, 16 Dec 2024 14:10:34 +0100
Subject: [PATCH 066/137] ISAICP-8780:Remove unuseful status from another tests

---
 .../collection/collection.event.feature       |  16 +-
 ...collection.membership_signup_leave.feature |  12 +-
 .../collection/join-as-anonymous.feature      |   4 +-
 tests/features/comments/add_comment.feature   |  24 +--
 .../features/comments/delete_comment.feature  |  12 +-
 tests/features/comments/edit_comment.feature  |   8 +-
 .../features/comments/freeze_comment.feature  |   4 +-
 tests/features/comments/view_comment.feature  |   8 +-
 .../features/communities/eif/eif.view.feature |   6 +-
 .../eif/meta_entity.bundles.feature           |   4 +-
 .../interoperable_europe.feature              |  12 +-
 .../iop_paragraphs.feature                    |  54 +++----
 .../communities/oss_catalogue/search.feature  |   4 +-
 .../community_content/archive.feature         |  32 ++--
 .../community_content/content_sharing.feature |  96 +++++------
 .../community_content/moderation.feature      |  16 +-
 .../notification.muted.feature                |   8 +-
 ...fication.post_moderated.discussion.feature |  26 +--
 ...tification.post_moderated.document.feature |   4 +-
 .../notification.post_moderated.event.feature |  16 +-
 .../notification.post_moderated.news.feature  |  14 +-
 ...ification.pre_moderated.discussion.feature |  48 +++---
 ...otification.pre_moderated.document.feature |  36 ++---
 .../notification.pre_moderated.event.feature  |  34 ++--
 .../notification.pre_moderated.news.feature   |  26 +--
 .../overview.datetime.feature                 |  16 +-
 .../community_content/revisions.feature       |  24 +--
 tests/features/contact_form/prefill.feature   |   8 +-
 tests/features/contact_form/report.feature    |  16 +-
 .../contact_information.seo.feature           |   4 +-
 tests/features/content_overview.feature       |  62 +++----
 .../custom_page/add_custom_page.feature       |  38 ++---
 .../community_content_listing.feature         | 150 ++++++++---------
 .../custom_page/custom_page.delete.feature    |   4 +-
 .../custom_page/custom_page.edit.feature      |   8 +-
 .../custom_page.file_download.feature         |  14 +-
 .../custom_page/custom_page.view.feature      |   6 +-
 .../custom_page/landing_custom_page.feature   |   8 +-
 .../custom_page/navigation_menu.feature       | 106 ++++++------
 tests/features/featured_entities.feature      |  24 +--
 tests/features/file_url/widget-ui.feature     |   8 +-
 tests/features/glossary/glossary.feature      |  66 ++++----
 tests/features/homepage.feature               |  34 ++--
 .../isa2_analytics/site_search.feature        |   4 +-
 .../isa2_analytics/site_sections.feature      |  16 +-
 .../features/joinup_bookmark/bookmark.feature |  22 +--
 .../features/joinup_core/input_filter.feature |  32 ++--
 .../joinup_core/manage_content.feature        |  70 ++++----
 .../joinup_core/owner_deletion.feature        |   4 +-
 tests/features/joinup_core/pathauto.feature   |  46 +++---
 .../joinup_core/persistent_uris.feature       |  32 ++--
 tests/features/joinup_core/plusbutton.feature |   4 +-
 tests/features/joinup_core/reporting.feature  |  14 +-
 .../features/joinup_core/social_share.feature |  16 +-
 .../transfer_group_ownership.feature          |  30 ++--
 .../joinup_discussion/discussion.view.feature |   8 +-
 .../joinup_discussion/last_activity.feature   |  10 +-
 .../joinup_discussion/pin_discussion.feature  |  14 +-
 .../add_asset_distribution.feature            |  30 ++--
 .../asset_distribution.archive.feature        |   4 +-
 .../asset_distribution.delete.feature         |  10 +-
 .../asset_distribution.edit.feature           |  18 +--
 .../track_download.feature                    |  36 ++---
 .../add_document.collection.feature           |  26 +--
 .../add_document.solution.feature             |  18 +--
 .../joinup_document/document.edit.feature     |  16 +-
 .../joinup_document/document.overview.feature |  10 +-
 .../joinup_event/add_event.collection.feature |  22 +--
 .../joinup_event/add_event.solution.feature   |  19 ++-
 .../features/joinup_event/event.edit.feature  |  12 +-
 .../features/joinup_event/event.view.feature  |   8 +-
 .../joinup_group/announcements.feature        | 152 +++++++++---------
 .../joinup_group/group_reports.feature        |  12 +-
 .../joinup_group/landing_page.feature         |  42 ++---
 .../metadata_banner_disabled.feature          |  18 +--
 .../joinup_group/revoke_privileges.feature    |   8 +-
 .../joinup_release/release.overview.feature   |  10 +-
 .../joinup_replicate/replicate.feature        |  36 ++---
 .../features/joinup_rss/solution_feed.feature |  26 +--
 .../joinup_search/group_search.feature        |   6 +-
 .../joinup_search/interoperable.feature       |  10 +-
 .../joinup_search/multilingual.feature        |   4 +-
 tests/features/joinup_seo/discussion.feature  |  14 +-
 tests/features/joinup_seo/document.feature    |  12 +-
 tests/features/joinup_seo/event.feature       |  16 +-
 tests/features/joinup_seo/news.feature        |   8 +-
 tests/features/joinup_seo/rdf_entity.feature  |  16 +-
 .../collection.subscribe-on-join.feature      |  10 +-
 .../community.content.subscriptions.feature   |  86 +++++-----
 .../solution.subscriptions.feature            |   8 +-
 .../subscribers_report.feature                |  12 +-
 tests/features/local_actions.feature          |  32 ++--
 tests/features/machine_translation.feature    |  28 ++--
 tests/features/outdated_content.feature       |  22 +--
 tests/features/pin_in_collection.feature      |  66 ++++----
 tests/features/pin_in_solution.feature        |  22 +--
 tests/features/rdf_sync.feature               |   4 +-
 tests/features/report.feature                 |  20 +--
 .../solution/solution_overview.feature        |  22 +--
 .../taxonomy/curated_homepage_topics.feature  |  86 +++++-----
 .../taxonomy/topic.term_redirect.feature      |   4 +-
 tests/features/user/cancel.feature            |  24 +--
 .../features/user/cancel_group_owner.feature  |  10 +-
 tests/features/video/embed.feature            |  10 +-
 104 files changed, 1263 insertions(+), 1264 deletions(-)

diff --git a/tests/features/collection/collection.event.feature b/tests/features/collection/collection.event.feature
index 24976a706d..cde72c8a46 100644
--- a/tests/features/collection/collection.event.feature
+++ b/tests/features/collection/collection.event.feature
@@ -14,16 +14,16 @@ Feature: As a user of the website
       | title      |
       | Fairy Tail |
     And event content:
-      | title                     | collection | start date   | end date            | created    | state     | author         |
-      | Sweet Palm                | Fairy Tail | now -1 years | now -1 years +1 day | now -5 day | published | katerpillar    |
-      | Melted Hairdresser        | Fairy Tail | now -2 day   | now +2 day          | now -4 day | published | katerpillar    |
-      | Hot Air                   | Fairy Tail | now +3 day   | now +5 day          | now -3 day | published | katerpillar    |
-      | Walking Unofficial Humans | Fairy Tail | now -4 day   | now -2 day          | now        | published | trustysidekick |
+      | title                     | collection | start date   | end date            | created    | author         |
+      | Sweet Palm                | Fairy Tail | now -1 years | now -1 years +1 day | now -5 day | katerpillar    |
+      | Melted Hairdresser        | Fairy Tail | now -2 day   | now +2 day          | now -4 day | katerpillar    |
+      | Hot Air                   | Fairy Tail | now +3 day   | now +5 day          | now -3 day | katerpillar    |
+      | Walking Unofficial Humans | Fairy Tail | now -4 day   | now -2 day          | now        | trustysidekick |
       # The "Spring Freezing" event is associated with the anonymous user.
-      | Spring Freezing           | Fairy Tail | now +1 week  | now +1 week         | now -6 day | published |                |
+      | Spring Freezing           | Fairy Tail | now +1 week  | now +1 week         | now -6 day |                |
     And document content:
-      | title       | collection | state     | created   |
-      | Yellow Zeus | Fairy Tail | published | yesterday |
+      | title       | collection | created   |
+      | Yellow Zeus | Fairy Tail | yesterday |
 
     When I am logged in as "katerpillar"
     And I go to the homepage of the "Fairy Tail" collection
diff --git a/tests/features/collection/collection.membership_signup_leave.feature b/tests/features/collection/collection.membership_signup_leave.feature
index 4b172119c9..044090682a 100644
--- a/tests/features/collection/collection.membership_signup_leave.feature
+++ b/tests/features/collection/collection.membership_signup_leave.feature
@@ -10,12 +10,12 @@ Feature: Joining and leaving collections through the web interface
       | Collection author |
       | Stewe Griffin     |
     Given collection content:
-      | title                                 | state     | closed | author            |
-      | Open collection                       | published | no     | Collection author |
-      | Open collection with public CoC       | published | no     |                   |
-      | Closed collection                     | published | yes    |                   |
-      | Closed collection with public CoC     | published | yes    |                   |
-      | Closed collection with non-public CoC | published | yes    |                   |
+      | title                                 | closed | author            |
+      | Open collection                       | no     | Collection author |
+      | Open collection with public CoC       | no     |                   |
+      | Closed collection                     | yes    |                   |
+      | Closed collection with public CoC     | yes    |                   |
+      | Closed collection with non-public CoC | yes    |                   |
     Given custom_page content:
       | title                           | collection                            | state     |
       | Public CoC of Open collection   | Open collection with public CoC       | published |
diff --git a/tests/features/collection/join-as-anonymous.feature b/tests/features/collection/join-as-anonymous.feature
index 6c5e5dfbbb..bcf8fd1529 100644
--- a/tests/features/collection/join-as-anonymous.feature
+++ b/tests/features/collection/join-as-anonymous.feature
@@ -23,8 +23,8 @@ Feature: Joining a collection as an anonymous user
       | Username           | E-mail         | Password |
       | Iodine Maccalariat | iodine@ankh.am | 10d1ne   |
     And custom_page content:
-      | title                 | collection     | state     |
-      | CoC of CoC collection | CoC collection | published |
+      | title                 | collection     |
+      | CoC of CoC collection | CoC collection |
     And the "code of conduct" setting of the "CoC collection" collection is set to "CoC of CoC collection" "custom page"
 
   Scenario: Joining collections without JavaScript
diff --git a/tests/features/comments/add_comment.feature b/tests/features/comments/add_comment.feature
index cf67485f01..9d483be941 100644
--- a/tests/features/comments/add_comment.feature
+++ b/tests/features/comments/add_comment.feature
@@ -4,8 +4,8 @@ Feature: Add comments
 
   Background:
     Given collection content:
-      | title             | state     | closed |
-      | Gossip collection | published | no     |
+      | title             | closed |
+      | Gossip collection | no     |
     And users:
       | Username        | E-mail                 | Roles | First name | Family name |
       | Miss tell tales | tell.tales@example.com |       | Miss       | Tales       |
@@ -17,8 +17,8 @@ Feature: Add comments
   Scenario Outline: Make an authenticated comment, skips moderation.
 
     Given solution content:
-      | title                | collection        | state     |
-      | Gossip girl solution | Gossip collection | published |
+      | title                | collection        |
+      | Gossip girl solution | Gossip collection |
     And users:
       | Username          | E-mail                        | Roles     | First name | Family name |
       | Comment moderator | comment.moderator@example.com | moderator | Comment    | Moderator   |
@@ -87,9 +87,9 @@ Feature: Add comments
       | If you think this action is not clear or not due, please contact Portal Support at http |
     # The owner of the content does not receive a notification due to being the actor.
     And the following email should not have been sent:
-      | recipient | Salma Coster                            |
+      | recipient | Salma Coster                                                 |
       | subject   | Interoperable Europe Portal: A new comment has been created. |
-      | body      | Salma Coster posted a comment in        |
+      | body      | Salma Coster posted a comment in                             |
 
     Examples:
       | content type | title           | state     | parent     | parent title         |
@@ -105,8 +105,8 @@ Feature: Add comments
   Scenario Outline: Make an authenticated comment at a community content using layout paragraphs, skips moderation.
 
     Given solution content:
-      | title                | collection        | state     |
-      | Gossip girl solution | Gossip collection | published |
+      | title                | collection        |
+      | Gossip girl solution | Gossip collection |
     And users:
       | Username          | E-mail                        | Roles     | First name | Family name |
       | Comment moderator | comment.moderator@example.com | moderator | Comment    | Moderator   |
@@ -175,9 +175,9 @@ Feature: Add comments
       | If you think this action is not clear or not due, please contact Portal Support at http |
     # The owner of the content does not receive a notification due to being the actor.
     And the following email should not have been sent:
-      | recipient | Salma Coster                            |
+      | recipient | Salma Coster                                                 |
       | subject   | Interoperable Europe Portal: A new comment has been created. |
-      | body      | Salma Coster posted a comment in        |
+      | body      | Salma Coster posted a comment in                             |
 
     Examples:
       | content type | title     | state     | parent     | parent title      |
@@ -244,8 +244,8 @@ Feature: Add comments
   Scenario Outline: Comments are disallowed for anonymous users.
 
     Given collection content:
-      | title          | state     | closed |
-      | Shy collection | published | yes    |
+      | title          | closed |
+      | Shy collection | yes    |
     And <content type> content:
       | title   | body                                                | collection   | state   |
       | <title> | How could this ever happen? Moral panic on its way! | <collection> | <state> |
diff --git a/tests/features/comments/delete_comment.feature b/tests/features/comments/delete_comment.feature
index 5eeb3428ee..dd4f152b9f 100644
--- a/tests/features/comments/delete_comment.feature
+++ b/tests/features/comments/delete_comment.feature
@@ -4,16 +4,16 @@ Feature: Delete comments
 
   Background:
     Given collection content:
-      | title                 | logo     | state     |
-      | Semantic web fanatics | logo.png | published |
+      | title                 | logo     |
+      | Semantic web fanatics | logo.png |
     And users:
       | Username             | E-mail                        | First name  | Family name |
       | Tim Berners Lee      | tim.berners-lee@example.com   | Tim Berners | Lee         |
       | Vicky visitor        | vicky.visitor@example.com     | Vicky       | visitor     |
       | Do Re Mi Facilitator | doremifacilitator@example.com | Do Re Mi    | Facilitator |
     And news content:
-      | title                          | body                              | collection            | state     |
-      | RDF Schemas for government use | Home for DCAT, ADMS, and the like | Semantic web fanatics | published |
+      | title                          | body                              | collection            |
+      | RDF Schemas for government use | Home for DCAT, ADMS, and the like | Semantic web fanatics |
     And comments:
       | subject         | field_body       | author          | parent                         |
       | ADMS is awesome | Let's all use it | Tim Berners Lee | RDF Schemas for government use |
@@ -46,6 +46,6 @@ Feature: Delete comments
     Then I should see "Are you sure you want to delete the comment ADMS is awesome?"
     Then I press "Delete"
     Then the following email should have been sent:
-      | recipient | Tim Berners Lee                                                                                                                                                  |
-      | subject   | Interoperable Europe Portal: Your comment has been deleted.                                                                                                                            |
+      | recipient | Tim Berners Lee                                                                                                                                                   |
+      | subject   | Interoperable Europe Portal: Your comment has been deleted.                                                                                                       |
       | body      | Do Re Mi Facilitator deleted your comment in "RDF Schemas for government use". To avoid comment moderation in the future, please read our community guidelines at |
diff --git a/tests/features/comments/edit_comment.feature b/tests/features/comments/edit_comment.feature
index 341c830409..af0f2ed605 100644
--- a/tests/features/comments/edit_comment.feature
+++ b/tests/features/comments/edit_comment.feature
@@ -5,15 +5,15 @@ Feature: Edit a comment
 
   Scenario: Edit a comment.
     Given collection content:
-      | title              | state     | closed |
-      | Structural pension | published | no     |
+      | title              | closed |
+      | Structural pension | no     |
     And users:
       | Username               | E-mail                             | Roles     | First name | Family name |
       | Sons of anarchy        | sonsofanarchy@example.com          |           | Sons       | Anarchy     |
       | Comment edit moderator | comment.edit.moderator@example.com | moderator | Steeve     | Roberts     |
     And news content:
-      | title            | body                                                | collection         | state     |
-      | Paying with cash | How could this ever happen? Moral panic on its way! | Structural pension | published |
+      | title            | body                                                | collection         |
+      | Paying with cash | How could this ever happen? Moral panic on its way! | Structural pension |
     And comments:
       | subject                       | field_body       | author          | parent           |
       | This comment should be edited | Let's all use it | Sons of anarchy | Paying with cash |
diff --git a/tests/features/comments/freeze_comment.feature b/tests/features/comments/freeze_comment.feature
index fe8b8b85e8..a617159e99 100644
--- a/tests/features/comments/freeze_comment.feature
+++ b/tests/features/comments/freeze_comment.feature
@@ -4,8 +4,8 @@ Feature: Freeze comments on archived content
 
   Background:
     Given collection content:
-      | title             | state     |
-      | Gossip collection | published |
+      | title             |
+      | Gossip collection |
     And users:
       | Username        | E-mail                      | Roles | First name | Family name |
       | Sons of anarchy | sons-of-anarchy@example.com |       | Sons       | Anarchy     |
diff --git a/tests/features/comments/view_comment.feature b/tests/features/comments/view_comment.feature
index dd517d5ad4..153fc21ccd 100644
--- a/tests/features/comments/view_comment.feature
+++ b/tests/features/comments/view_comment.feature
@@ -4,11 +4,11 @@ Feature: View a comment
 
   Scenario Outline: View comments on community content
     Given collection content:
-      | title                      | state     |
-      | Hashrate, shares & workers | published |
+      | title                      |
+      | Hashrate, shares & workers |
     And <content type> content:
-      | title                      | body                                  | collection                 | state     |
-      | Current effective hashrate | Ethash is the proof of work algorithm | Hashrate, shares & workers | published |
+      | title                      | body                                  | collection                 |
+      | Current effective hashrate | Ethash is the proof of work algorithm | Hashrate, shares & workers |
     And user:
       | Username | Vasundhara Guadarrama |
     And comments:
diff --git a/tests/features/communities/eif/eif.view.feature b/tests/features/communities/eif/eif.view.feature
index 31b382f3b8..427542c0e9 100644
--- a/tests/features/communities/eif/eif.view.feature
+++ b/tests/features/communities/eif/eif.view.feature
@@ -4,9 +4,9 @@ Feature:
 
   Scenario: Create an EIF perspective and view the data.
     Given solution content:
-      | title         | description                                      | state     |
-      | EIF solution  | Some description not to be shown in the EIF page | published |
-      | EIF only type | Some description not to be shown in the EIF page | published |
+      | title         | description                                      |
+      | EIF solution  | Some description not to be shown in the EIF page |
+      | EIF only type | Some description not to be shown in the EIF page |
     Given the following EIF perspective data for the "EIF solution" solution:
       | Description    | This should be in the description field.                                                       |
       | Solution type  | Common frameworks                                                                              |
diff --git a/tests/features/communities/eif/meta_entity.bundles.feature b/tests/features/communities/eif/meta_entity.bundles.feature
index f3b3b2463b..4cfc7b3e0d 100644
--- a/tests/features/communities/eif/meta_entity.bundles.feature
+++ b/tests/features/communities/eif/meta_entity.bundles.feature
@@ -6,8 +6,8 @@ Feature:
 
   Background:
     Given solution content:
-      | title             | state     |
-      | Some EIF solution | published |
+      | title             |
+      | Some EIF solution |
 
   Scenario Outline: Only moderators can access the EIF perspective page.
     Given I am <role>
diff --git a/tests/features/communities/interoperable_europe/interoperable_europe.feature b/tests/features/communities/interoperable_europe/interoperable_europe.feature
index a8fbc710e1..cfe2cc8f94 100644
--- a/tests/features/communities/interoperable_europe/interoperable_europe.feature
+++ b/tests/features/communities/interoperable_europe/interoperable_europe.feature
@@ -72,8 +72,8 @@ Feature:
   @javascript
   Scenario: User should see error message if he does not fill out all required fields.
     Given custom_page content:
-      | title               | collection           | state     |
-      | IOP validation page | Interoperable Europe | published |
+      | title               | collection           |
+      | IOP validation page | Interoperable Europe |
 
     Then I am logged in as a moderator
     And I go to the edit form of the "IOP validation page" "custom page"
@@ -84,8 +84,8 @@ Feature:
   @javascript
   Scenario: Report link and eTranslate button are not available in IOP custom pages.
     Given custom_page content:
-      | title    | collection           | state     |
-      | IOP page | Interoperable Europe | published |
+      | title    | collection           |
+      | IOP page | Interoperable Europe |
 
     When I am logged in as a user with the authenticated role
     And I go to the "IOP page" custom page
@@ -95,8 +95,8 @@ Feature:
   @javascript
   Scenario Outline: Report link and eTranslate button are not available in IOP.
     Given <type> content:
-      | title      | collection           | state     |
-      | IOP <type> | Interoperable Europe | published |
+      | title      | collection           |
+      | IOP <type> | Interoperable Europe |
 
     When I am logged in as a user with the authenticated role
     And I go to the "IOP <type>" <type>
diff --git a/tests/features/communities/interoperable_europe/iop_paragraphs.feature b/tests/features/communities/interoperable_europe/iop_paragraphs.feature
index 0316be2bc4..2d54f8566d 100644
--- a/tests/features/communities/interoperable_europe/iop_paragraphs.feature
+++ b/tests/features/communities/interoperable_europe/iop_paragraphs.feature
@@ -5,20 +5,20 @@ Feature:
   Background:
     # Mimic the "Interoperable Europe" collection.
     Given collection content:
-      | uri                                                            | title                | state     | topic      |
-      | http://data.europa.eu/w21/8e30f798-ff2b-478b-9c09-5ed5a63b4c8c | Interoperable Europe | published | Demography |
+      | uri                                                            | title                | topic      |
+      | http://data.europa.eu/w21/8e30f798-ff2b-478b-9c09-5ed5a63b4c8c | Interoperable Europe | Demography |
 
   Scenario: Test that carousels content listing options are working correctly.
     Given collection content:
-      | title       | state     |
-      | Carousel c1 | published |
+      | title       |
+      | Carousel c1 |
     And news content:
-      | title       | collection           | content       | state     |
-      | Some news 1 | Interoperable Europe | Some content. | published |
-      | Some news 2 | Carousel c1          | Come content. | published |
+      | title       | collection           | content       |
+      | Some news 1 | Interoperable Europe | Some content. |
+      | Some news 2 | Carousel c1          | Come content. |
     And custom_page content:
-      | title         | collection           | state     |
-      | News carousel | Interoperable Europe | published |
+      | title         | collection           |
+      | News carousel | Interoperable Europe |
     And I append "carousel" to "field_paragraphs_body" field in "node" entity with following "News carousel" title:
       | content_listing:value | a:6:{s:6:"fields";a:1:{s:20:"content_listing_type";a:2:{s:6:"weight";i:0;s:6:"region";s:3:"top";}}s:7:"enabled";i:1;s:13:"query_presets";s:18:"entity_bundle\|news";s:5:"limit";s:2:"12";s:11:"show_shared";i:0;s:13:"global_search";i:0;} |
 
@@ -30,13 +30,13 @@ Feature:
   @javascript
   Scenario: Test that carousels with specific content is working correctly.
     Given collection content:
-      | title       | state     |
-      | Carousel c1 | published |
+      | title       |
+      | Carousel c1 |
     And custom_page content:
-      | title       | collection           | content       | state     |
-      | Some page 1 | Interoperable Europe | Some content. | published |
-      | Some page 2 | Carousel c1          | Some content. | published |
-      | Some page 3 | Carousel c1          | Some content. | published |
+      | title       | collection           | content       |
+      | Some page 1 | Interoperable Europe | Some content. |
+      | Some page 2 | Carousel c1          | Some content. |
+      | Some page 3 | Carousel c1          | Some content. |
 
     When I am logged in as a moderator
     And I go to the "Interoperable Europe" collection
@@ -88,13 +88,13 @@ Feature:
 
   Scenario: Carousels should be ordered by creation date by default.
     Given news content:
-      | title       | collection           | content       | state     | created    |
-      | Some news 1 | Interoperable Europe | Some content. | published | 2 day ago  |
-      | Some news 2 | Interoperable Europe | Some content. | published | 3 days ago |
-      | Some news 3 | Interoperable Europe | Some content. | published | 1 days ago |
+      | title       | collection           | content       | created    |
+      | Some news 1 | Interoperable Europe | Some content. | 2 day ago  |
+      | Some news 2 | Interoperable Europe | Some content. | 3 days ago |
+      | Some news 3 | Interoperable Europe | Some content. | 1 days ago |
     And custom_page content:
-      | title                | collection           | state     |
-      | A carousel with news | Interoperable Europe | published |
+      | title                | collection           |
+      | A carousel with news | Interoperable Europe |
     And I append "carousel" to "field_paragraphs_body" field in "node" entity with following "A carousel with news" title:
       | content_listing:value | a:6:{s:6:"fields";a:1:{s:20:"content_listing_type";a:2:{s:6:"weight";i:0;s:6:"region";s:3:"top";}}s:7:"enabled";i:1;s:13:"query_presets";s:18:"entity_bundle\|news";s:5:"limit";s:2:"12";s:11:"show_shared";i:0;s:13:"global_search";i:0;} |
 
@@ -106,13 +106,13 @@ Feature:
 
   Scenario: Test also that events, when listed alone, are sorted by event date.
     Given event content:
-      | title        | collection           | field_paragraphs_body | state     | created    | start date | end date   |
-      | Some event 1 | Interoperable Europe | Some content.         | published | 2 day ago  | 5 day ago  | 4 day ago  |
-      | Some event 2 | Interoperable Europe | Some content.         | published | 3 days ago | 6 days ago | 5 days ago |
-      | Some event 3 | Interoperable Europe | Some content.         | published | 1 days ago | 7 days ago | 6 days ago |
+      | title        | collection           | field_paragraphs_body | created    | start date | end date   |
+      | Some event 1 | Interoperable Europe | Some content.         | 2 day ago  | 5 day ago  | 4 day ago  |
+      | Some event 2 | Interoperable Europe | Some content.         | 3 days ago | 6 days ago | 5 days ago |
+      | Some event 3 | Interoperable Europe | Some content.         | 1 days ago | 7 days ago | 6 days ago |
     And custom_page content:
-      | title           | collection           | state     |
-      | Events carousel | Interoperable Europe | published |
+      | title           | collection           |
+      | Events carousel | Interoperable Europe |
     And I append "carousel" to "field_paragraphs_body" field in "node" entity with following "Events carousel" title:
       | content_listing:value | a:6:{s:6:"fields";a:1:{s:20:"content_listing_type";a:2:{s:6:"weight";i:0;s:6:"region";s:3:"top";}}s:7:"enabled";i:1;s:13:"query_presets";s:19:"entity_bundle\|event";s:5:"limit";s:2:"12";s:11:"show_shared";i:0;s:13:"global_search";i:0;} |
 
diff --git a/tests/features/communities/oss_catalogue/search.feature b/tests/features/communities/oss_catalogue/search.feature
index 36e33c95da..a24faf7b4c 100644
--- a/tests/features/communities/oss_catalogue/search.feature
+++ b/tests/features/communities/oss_catalogue/search.feature
@@ -35,8 +35,8 @@ Feature: OSS catalogue search
   Scenario: User is able to search.
     # Mimic the "EU OSSC" collection.
     Given collection content:
-      | uri                                                            | uuid                                 | title                              | state     |
-      | http://data.europa.eu/w21/6d621a47-71ce-4f1a-90e2-8859403d3ecd | 6d621a47-71ce-4f1a-90e2-8859403d3ecd | EU Open Source Solutions Catalogue | published |
+      | uri                                                            | uuid                                 | title                              |
+      | http://data.europa.eu/w21/6d621a47-71ce-4f1a-90e2-8859403d3ecd | 6d621a47-71ce-4f1a-90e2-8859403d3ecd | EU Open Source Solutions Catalogue |
 
     When I visit the OSS search page
     Then I see the text "EU Open Source Solutions Catalogue" in the "Header" region
diff --git a/tests/features/community_content/archive.feature b/tests/features/community_content/archive.feature
index 446598b2c3..bd9a79eb46 100644
--- a/tests/features/community_content/archive.feature
+++ b/tests/features/community_content/archive.feature
@@ -5,11 +5,11 @@ Feature: Content archival.
     Given collection content:
       # Set the moderation to yes to be able to access all states. Deletion
       # request is not available in a post moderation workflow.
-      | title           | state     | moderation |
-      | Some collection | published | yes        |
+      | title           | moderation |
+      | Some collection | yes        |
     Given discussion content:
-      | title           | state     | collection      | body | content | headline        | changed          |
-      | Test discussion | published | Some collection | Test | Test    | Test discussion | 2017-11-17 20:00 |
+      | title           | collection      | body | content | headline        | changed          |
+      | Test discussion | Some collection | Test | Test    | Test discussion | 2017-11-17 20:00 |
     When I am logged in as a moderator
     And I go to the edit form of the "Test discussion" discussion
     Then I should see the button "Archive"
@@ -34,11 +34,11 @@ Feature: Content archival.
     Given collection content:
       # Set the moderation to yes to be able to access all states. Deletion
       # request is not available in a post moderation workflow.
-      | title           | state     | moderation |
-      | Some collection | published | yes        |
+      | title           | moderation |
+      | Some collection | yes        |
     And <type> content:
-      | title       | state     | collection      | abstract | content | headline    | changed          | field_paragraphs_body |
-      | Test <type> | published | Some collection | Test     | Test    | Test <type> | 2019-11-12 20:00 | Some text             |
+      | title       | collection      | abstract | content | headline    | changed          | field_paragraphs_body |
+      | Test <type> | Some collection | Test     | Test    | Test <type> | 2019-11-12 20:00 | Some text             |
 
     When I am logged in as a moderator
     And I go to the edit form of the "Test <type>" <type>
@@ -89,11 +89,11 @@ Feature: Content archival.
     Given <group type> content:
       # Set the moderation to yes to be able to access all states. Deletion
       # request is not available in a post moderation workflow.
-      | title      | state     | moderation |
-      | Some group | published | yes        |
+      | title      | moderation |
+      | Some group | yes        |
     Given discussion content:
-      | title           | state     | <group type> | body | content | headline        |
-      | Test discussion | published | Some group   | Test | Test    | Test discussion |
+      | title           | <group type> | body | content | headline        |
+      | Test discussion | Some group   | Test | Test    | Test discussion |
     When I am logged in as a facilitator of the "Some group" <group type>
     And I go to the edit form of the "Test discussion" discussion
     Then I should see the button "Archive"
@@ -113,11 +113,11 @@ Feature: Content archival.
     Given <group type> content:
       # Set the moderation to yes to be able to access all states. Deletion
       # request is not available in a post moderation workflow.
-      | title      | state     | moderation |
-      | Some group | published | yes        |
+      | title      | moderation |
+      | Some group | yes        |
     Given <type> content:
-      | title       | state     | <group type> | abstract | content | headline    | field_paragraphs_body |
-      | Test <type> | published | Some group   | Test     | Test    | Test <type> | Test paragraph        |
+      | title       | <group type> | abstract | content | headline    | field_paragraphs_body |
+      | Test <type> | Some group   | Test     | Test    | Test <type> | Test paragraph        |
     When I am logged in as a facilitator of the "Some group" <group type>
     And I go to the edit form of the "Test <type>" <type>
     Then I should see the button "Archive"
diff --git a/tests/features/community_content/content_sharing.feature b/tests/features/community_content/content_sharing.feature
index 58382dfdb5..64fa7894f3 100644
--- a/tests/features/community_content/content_sharing.feature
+++ b/tests/features/community_content/content_sharing.feature
@@ -13,18 +13,18 @@ Feature: Sharing content between collections
       | Marjolein Rye | marjolein.rye@example.com |
       | Group owner   | group.owner@example.com   |
     And <group type> content:
-      | title        | state     |
-      | Classic Rock | published |
-      | Hip-Hop      | published |
-      | Power ballad | published |
-      | Drum'n'Bass  | published |
+      | title        |
+      | Classic Rock |
+      | Hip-Hop      |
+      | Power ballad |
+      | Drum'n'Bass  |
     And news content:
-      | title                          | short title                    | <group type> | state     |
-      | New D'n'B compilation released | New D'n'B compilation released | Classic Rock | published |
-      | Old-school line-up concert     | Old-school line-up concert     | Hip-Hop      | published |
+      | title                          | short title                    | <group type> |
+      | New D'n'B compilation released | New D'n'B compilation released | Classic Rock |
+      | Old-school line-up concert     | Old-school line-up concert     | Hip-Hop      |
     And document content:
-      | title                       | <group type> | state     |
-      | Rockabilly is still rocking | Classic Rock | published |
+      | title                       | <group type> |
+      | Rockabilly is still rocking | Classic Rock |
     And the following <group type> user memberships:
       | <group type> | user          | roles |
       | Hip-Hop      | Marjolein Rye |       |
@@ -33,8 +33,8 @@ Feature: Sharing content between collections
       | Drum'n'Bass  | Sara Barber   |       |
       | Hip-Hop      | Group owner   | owner |
     And <content type> content:
-      | title               | <group type> | state     |
-      | Interesting content | Hip-Hop      | published |
+      | title               | <group type> |
+      | Interesting content | Hip-Hop      |
 
     # Anonymous users can share only in social networks.
     When I am an anonymous user
@@ -162,12 +162,12 @@ Feature: Sharing content between collections
   @javascript
   Scenario Outline: Share/Unshare should be visible according to the group permissions.
     Given <group type> content:
-      | title      | state     |
-      | Westeros   | published |
-      | Essos city | published |
+      | title      |
+      | Westeros   |
+      | Essos city |
     And "<content type>" content:
-      | title       | <group type> | state     |
-      | Iron throne | Westeros     | published |
+      | title       | <group type> |
+      | Iron throne | Westeros     |
     Given users:
       | Username       | E-mail                     | Roles     |
       | Jamie Lanister | jamie.lanister@example.com | moderator |
@@ -232,15 +232,15 @@ Feature: Sharing content between collections
   @javascript
   Scenario Outline: Shared content should show visual cues in the groups they are shared into.
     Given <group type> content:
-      | title | state     |
-      | Earth | published |
-      | Mars  | published |
-      | Venus | published |
+      | title |
+      | Earth |
+      | Mars  |
+      | Venus |
     And <content type> content:
-      | title         | <group type> | shared on   | state     |
-      | Earth content | Earth        | Mars        | published |
-      | Mars content  | Mars         |             | published |
-      | Venus content | Venus        | Earth, Mars | published |
+      | title         | <group type> | shared on   |
+      | Earth content | Earth        | Mars        |
+      | Mars content  | Mars         |             |
+      | Venus content | Venus        | Earth, Mars |
 
     When I go to the homepage of the "Earth" <group type>
     Then I should see the "Earth content" tile
@@ -276,13 +276,13 @@ Feature: Sharing content between collections
 
   Scenario: Shared pinned content is erroneously shown first.
     Given collection content:
-      | title         | state     |
-      | Milky Way     | published |
-      | Chocolate Way | published |
+      | title         |
+      | Milky Way     |
+      | Chocolate Way |
     And "document" content:
-      | title                 | collection    | shared on     | state     | created    | pinned |
-      | Milky Way content     | Milky Way     | Chocolate Way | published | 2017-06-04 | yes    |
-      | Chocolate Way content | Chocolate Way |               | published | 2017-06-05 | no     |
+      | title                 | collection    | shared on     | created    | pinned |
+      | Milky Way content     | Milky Way     | Chocolate Way | 2017-06-04 | yes    |
+      | Chocolate Way content | Chocolate Way |               | 2017-06-05 | no     |
     When I go to the homepage of the "Chocolate Way" collection
     Then I should see the following tiles in the correct order:
       | Chocolate Way content |
@@ -291,15 +291,15 @@ Feature: Sharing content between collections
   @javascript
   Scenario: Carousel tiles should show the "Shared from" visual cue.
     Given collection content:
-      | title | state     |
-      | Earth | published |
-      | Mars  | published |
-      | Venus | published |
+      | title |
+      | Earth |
+      | Mars  |
+      | Venus |
     And news content:
-      | title         | collection | shared on   | state     |
-      | Earth content | Earth      | Mars        | published |
-      | Mars content  | Mars       |             | published |
-      | Venus content | Venus      | Earth, Mars | published |
+      | title         | collection | shared on   |
+      | Earth content | Earth      | Mars        |
+      | Mars content  | Mars       |             |
+      | Venus content | Venus      | Earth, Mars |
 
     When I am logged in as a moderator
     And I go to the homepage of the "Earth" collection
@@ -327,12 +327,12 @@ Feature: Sharing content between collections
   @javascript
   Scenario Outline: The sharing options should be shown in a modal window.
     Given collection content:
-      | title   | state     |
-      | Secrets | published |
-      | Gossip  | published |
+      | title   |
+      | Secrets |
+      | Gossip  |
     And <content type> content:
-      | title                 | collection | state     |
-      | An unshareable secret | Secrets    | published |
+      | title                 | collection |
+      | An unshareable secret | Secrets    |
     And users:
       | Username        | E-mail                |
       | Sanjica Sauvage | sanjisauv@example.com |
@@ -355,10 +355,10 @@ Feature: Sharing content between collections
     And I click "Share"
     Then a modal should open
     And I should see the following lines of text:
-      | Share on               |
-      | Facebook               |
-      | Twitter                |
-      | Linkedin               |
+      | Share on                                    |
+      | Facebook                                    |
+      | Twitter                                     |
+      | Linkedin                                    |
       | Other groups on Interoperable Europe Portal |
     When I check "Gossip"
     And I press "Share" in the "Modal buttons" region
diff --git a/tests/features/community_content/moderation.feature b/tests/features/community_content/moderation.feature
index ffda2ffc7c..9cd515a5da 100644
--- a/tests/features/community_content/moderation.feature
+++ b/tests/features/community_content/moderation.feature
@@ -6,11 +6,11 @@ Feature: Moderate community content
 
   Scenario: Content moderation overview
     Given collection content:
-      | title               | state     | content creation | moderation |
-      | Black hole research | published | members          | yes        |
+      | title               | content creation | moderation |
+      | Black hole research | members          | yes        |
     And solution content:
-      | title                 | state     | collection          |
-      | Survey For Supernovae | published | Black hole research |
+      | title                 | collection          |
+      | Survey For Supernovae | Black hole research |
     And users:
       | Username       | E-mail                   | First name | Family name |
       | Marco Farfarer | marco.farfar@example.com | Marco      | Farfarer    |
@@ -304,8 +304,8 @@ Feature: Moderate community content
   Scenario: Filtering the content moderation overview
 
     Given collection content:
-      | title         | state     |
-      | Neutron stars | published |
+      | title         |
+      | Neutron stars |
 
     And discussion content:
       | title                       | body                  | collection    | state    |
@@ -378,8 +378,8 @@ Feature: Moderate community content
     Given user:
       | Username | leo |
     And collection content:
-      | title               | state     | moderation |
-      | Black hole research | published | yes        |
+      | title               | moderation |
+      | Black hole research | yes        |
     And the following collection user membership:
       | collection          | user |
       | Black hole research | leo  |
diff --git a/tests/features/community_content/notification.muted.feature b/tests/features/community_content/notification.muted.feature
index e97cf7742b..35cb745582 100644
--- a/tests/features/community_content/notification.muted.feature
+++ b/tests/features/community_content/notification.muted.feature
@@ -5,8 +5,8 @@ Feature: Notifications are muted when entity is archived/unarchived.
 
   Background:
     Given collection content:
-      | title     | state     |
-      | Milky Way | published |
+      | title     |
+      | Milky Way |
     And users:
       | Username | E-mail            | First name | Family name  | Notification frequency |
       | hristo   | hristo@example.bg | Hristo     | Draganov     | daily                  |
@@ -25,8 +25,8 @@ Feature: Notifications are muted when entity is archived/unarchived.
 
   Scenario Outline: Updates to archive and unarchive state does not trigger notifications.
     Given <type> content:
-      | title            | state     | collection | body | content | headline    |
-      | Milky Way <type> | published | Milky Way  | Test | Test    | Test <type> |
+      | title            | collection | body | content | headline    |
+      | Milky Way <type> | Milky Way  | Test | Test    | Test <type> |
     And I mark all emails as read
     When I am logged in as "bisera"
     And I go to the edit form of the "Milky Way <type>" <type>
diff --git a/tests/features/community_content/notification.post_moderated.discussion.feature b/tests/features/community_content/notification.post_moderated.discussion.feature
index 6c9271d35f..15815af341 100644
--- a/tests/features/community_content/notification.post_moderated.discussion.feature
+++ b/tests/features/community_content/notification.post_moderated.discussion.feature
@@ -12,8 +12,8 @@ Feature: Notification test for the discussion transitions on a post moderated pa
       | CC facilitator   |           | notify_facilitator@test.com | CC         | Facilitator | immediate              |
       | CC member        |           | notify_member@test.com      | CC         | Member      | immediate              |
     And collection content:
-      | title              | state     | content creation | moderation   |
-      | CC post collection | published | members          | <moderation> |
+      | title              | content creation | moderation   |
+      | CC post collection | members          | <moderation> |
     And the following collection user memberships:
       | collection         | user           | roles       |
       | CC post collection | CC owner       | owner       |
@@ -37,8 +37,8 @@ Feature: Notification test for the discussion transitions on a post moderated pa
     And I select "HR" from "Topic"
     And I press "Publish"
     Then the following email should have been sent:
-      | recipient | CC owner                                                                                                                                                                   |
-      | subject   | Interoperable Europe Portal: Content has been published                                                                                                                                         |
+      | recipient | CC owner                                                                                                                                                                    |
+      | subject   | Interoperable Europe Portal: Content has been published                                                                                                                     |
       | body      | CC Member has published the new discussion - "CC notify create publish" in the collection: "CC post collection". You can access the new content at the following link: http |
 
     # Test 'update' operation.
@@ -48,7 +48,7 @@ Feature: Notification test for the discussion transitions on a post moderated pa
     And I press "Publish"
     Then the following email should have been sent:
       | recipient | CC owner                                                                                                       |
-      | subject   | Interoperable Europe Portal: Content has been published                                                                             |
+      | subject   | Interoperable Europe Portal: Content has been published                                                        |
       | body      | CC Member has published the new discussion - "CC notify post publish" in the collection: "CC post collection". |
 
     When I am logged in as "CC facilitator"
@@ -60,7 +60,7 @@ Feature: Notification test for the discussion transitions on a post moderated pa
     And I press "Request changes"
     Then the following email should have been sent:
       | recipient | CC member                                                                                                                                                                                                         |
-      | subject   | Interoperable Europe Portal: Content has been updated                                                                                                                                                                                  |
+      | subject   | Interoperable Europe Portal: Content has been updated                                                                                                                                                             |
       | body      | the Facilitator, CC Facilitator has requested you to modify the discussion - "CC notify post request changes" in the collection: "CC post collection", with the following motivation: "Can you do some changes?". |
 
     When I am logged in as "CC facilitator"
@@ -72,7 +72,7 @@ Feature: Notification test for the discussion transitions on a post moderated pa
     And I press "Request changes"
     Then the following email should have been sent:
       | recipient | CC member                                                                                                                                                                                                |
-      | subject   | Interoperable Europe Portal: Content has been updated                                                                                                                                                                         |
+      | subject   | Interoperable Europe Portal: Content has been updated                                                                                                                                                    |
       | body      | the Facilitator, CC Facilitator has requested you to modify the discussion - "CC notify post report" in the collection: "CC post collection", with the following motivation: "Your content is reported". |
 
     When I mark all emails as read
@@ -83,7 +83,7 @@ Feature: Notification test for the discussion transitions on a post moderated pa
     Then 1 e-mail should have been sent
     Then the following email should have been sent:
       | recipient | CC member                                                                                                                                                               |
-      | subject   | Interoperable Europe Portal: Content has been updated                                                                                                                                        |
+      | subject   | Interoperable Europe Portal: Content has been updated                                                                                                                   |
       | body      | the Facilitator, CC Facilitator has approved your request of publication of the discussion - "CC notify post approve proposed" in the collection: "CC post collection". |
 
     # Test 'delete' operation.
@@ -96,12 +96,12 @@ Feature: Notification test for the discussion transitions on a post moderated pa
     Then 1 e-mail should have been sent
     Then the following email should not have been sent:
       | recipient | CC member                                                                                                                |
-      | subject   | Interoperable Europe Portal: Content has been deleted                                                                                         |
+      | subject   | Interoperable Europe Portal: Content has been deleted                                                                    |
       | body      | Facilitator CC Facilitator has deleted the discussion - "CC notify post delete" in the collection: "CC post collection". |
     But the following email should have been sent:
-      | recipient | CC member                                                                                                          |
-      | subject   | Interoperable Europe Portal: The discussion "CC notify post delete" was deleted in the space of "CC post collection"                    |
-      | body      | for your information, the discussion "CC notify post delete" was deleted from the "CC post collection" collection. |
+      | recipient | CC member                                                                                                            |
+      | subject   | Interoperable Europe Portal: The discussion "CC notify post delete" was deleted in the space of "CC post collection" |
+      | body      | for your information, the discussion "CC notify post delete" was deleted from the "CC post collection" collection.   |
 
     Examples:
       | moderation | roles  |
@@ -137,7 +137,7 @@ Feature: Notification test for the discussion transitions on a post moderated pa
     And I click "Delete"
     And I press "Delete"
     Then the following email should have been sent:
-      | recipient | Lindsey McCray                                                            |
+      | recipient | Lindsey McCray                                                                                 |
       | subject   | Interoperable Europe Portal: Your collection has been deleted by the moderation team           |
       | body      | The Interoperable Europe Portal moderation team deleted the collection Event Horizon Telescope |
     And 1 e-mail should have been sent
diff --git a/tests/features/community_content/notification.post_moderated.document.feature b/tests/features/community_content/notification.post_moderated.document.feature
index 757832fe45..10094c1565 100644
--- a/tests/features/community_content/notification.post_moderated.document.feature
+++ b/tests/features/community_content/notification.post_moderated.document.feature
@@ -12,8 +12,8 @@ Feature: Notification test for the document transitions on a post moderated pare
       | CC facilitator   |           | notify_facilitator@test.com | CC         | Facilitator |
       | CC member        |           | notify_member@test.com      | CC         | Member      |
     And collection content:
-      | title         | state     | content creation | moderation   |
-      | CC collection | published | members          | <moderation> |
+      | title         | content creation | moderation   |
+      | CC collection | members          | <moderation> |
     And the following collection user memberships:
       | collection    | user           | roles       |
       | CC collection | CC owner       | owner       |
diff --git a/tests/features/community_content/notification.post_moderated.event.feature b/tests/features/community_content/notification.post_moderated.event.feature
index 903605eb6e..be4f349a1a 100644
--- a/tests/features/community_content/notification.post_moderated.event.feature
+++ b/tests/features/community_content/notification.post_moderated.event.feature
@@ -12,8 +12,8 @@ Feature: Notification test for the event transitions on a post moderated parent.
       | CC facilitator   |           | notify_facilitator@test.com | CC         | Facilitator |
       | CC member        |           | notify_member@test.com      | CC         | Member      |
     And collection content:
-      | title              | state     | content creation | moderation   |
-      | CC post collection | published | members          | <moderation> |
+      | title              | content creation | moderation   |
+      | CC post collection | members          | <moderation> |
     And the following collection user memberships:
       | collection         | user           | roles       |
       | CC post collection | CC owner       | owner       |
@@ -42,7 +42,7 @@ Feature: Notification test for the event transitions on a post moderated parent.
     And I press "Publish"
     Then the following email should have been sent:
       | recipient | CC owner                                                                                                                                                               |
-      | subject   | Interoperable Europe Portal: Content has been published                                                                                                                                     |
+      | subject   | Interoperable Europe Portal: Content has been published                                                                                                                |
       | body      | CC Member has published the new event - "CC notify create publish" in the collection: "CC post collection". You can access the new content at the following link: http |
 
     # Test 'update' operation.
@@ -52,7 +52,7 @@ Feature: Notification test for the event transitions on a post moderated parent.
     And I press "Publish"
     Then the following email should have been sent:
       | recipient | CC owner                                                                                                  |
-      | subject   | Interoperable Europe Portal: Content has been published                                                                        |
+      | subject   | Interoperable Europe Portal: Content has been published                                                   |
       | body      | CC Member has published the new event - "CC notify post publish" in the collection: "CC post collection". |
 
     When I am logged in as "CC facilitator"
@@ -64,7 +64,7 @@ Feature: Notification test for the event transitions on a post moderated parent.
     And I press "Request changes"
     Then the following email should have been sent:
       | recipient | CC member                                                                                                                                                                                                    |
-      | subject   | Interoperable Europe Portal: Content has been updated                                                                                                                                                                             |
+      | subject   | Interoperable Europe Portal: Content has been updated                                                                                                                                                        |
       | body      | the Facilitator, CC Facilitator has requested you to modify the event - "CC notify post request changes" in the collection: "CC post collection", with the following motivation: "Can you do some changes?". |
 
     When I am logged in as "CC facilitator"
@@ -76,7 +76,7 @@ Feature: Notification test for the event transitions on a post moderated parent.
     And I press "Request changes"
     Then the following email should have been sent:
       | recipient | CC member                                                                                                                                                                                           |
-      | subject   | Interoperable Europe Portal: Content has been updated                                                                                                                                                                    |
+      | subject   | Interoperable Europe Portal: Content has been updated                                                                                                                                               |
       | body      | the Facilitator, CC Facilitator has requested you to modify the event - "CC notify post report" in the collection: "CC post collection", with the following motivation: "Your content is reported". |
 
     When I am logged in as "CC facilitator"
@@ -85,7 +85,7 @@ Feature: Notification test for the event transitions on a post moderated parent.
     And I press "Publish"
     Then the following email should have been sent:
       | recipient | CC member                                                                                                                                                          |
-      | subject   | Interoperable Europe Portal: Content has been updated                                                                                                                                   |
+      | subject   | Interoperable Europe Portal: Content has been updated                                                                                                              |
       | body      | the Facilitator, CC Facilitator has approved your request of publication of the event - "CC notify post approve proposed" in the collection: "CC post collection". |
 
     # Test 'delete' operation.
@@ -96,7 +96,7 @@ Feature: Notification test for the event transitions on a post moderated parent.
     And I press "Delete"
     Then the following email should have been sent:
       | recipient | CC member                                                                                                           |
-      | subject   | Interoperable Europe Portal: Content has been deleted                                                                                    |
+      | subject   | Interoperable Europe Portal: Content has been deleted                                                               |
       | body      | Facilitator CC Facilitator has deleted the event - "CC notify post delete" in the collection: "CC post collection". |
 
     Examples:
diff --git a/tests/features/community_content/notification.post_moderated.news.feature b/tests/features/community_content/notification.post_moderated.news.feature
index 619fc81a23..38db0d218f 100644
--- a/tests/features/community_content/notification.post_moderated.news.feature
+++ b/tests/features/community_content/notification.post_moderated.news.feature
@@ -12,8 +12,8 @@ Feature: Notification test for the news transitions on a post moderated parent.
       | CC facilitator   |           | notify_facilitator@test.com | CC         | Facilitator |
       | CC member        |           | notify_member@test.com      | CC         | Member      |
     And collection content:
-      | title              | state     | content creation | moderation   |
-      | CC post collection | published | members          | <moderation> |
+      | title              | content creation | moderation   |
+      | CC post collection | members          | <moderation> |
     And the following collection user memberships:
       | collection         | user           | roles       |
       | CC post collection | CC owner       | owner       |
@@ -41,8 +41,8 @@ Feature: Notification test for the news transitions on a post moderated parent.
     And I select "Statistics and Analysis" from "Topic"
     And I press "Publish"
     Then the following email should have been sent:
-      | recipient | CC owner                                                                                                                                                       |
-      | subject   | Interoperable Europe Portal: Content has been published                                                                                                                             |
+      | recipient | CC owner                                                                                                                                                        |
+      | subject   | Interoperable Europe Portal: Content has been published                                                                                                         |
       | body      | CC Member has published the new news - "CCN create publish" in the collection: "CC post collection". You can access the new content at the following link: http |
 
     # Test 'update' operation.
@@ -52,7 +52,7 @@ Feature: Notification test for the news transitions on a post moderated parent.
     And I press "Publish"
     Then the following email should have been sent:
       | recipient | CC owner                                                                                           |
-      | subject   | Interoperable Europe Portal: Content has been published                                                                 |
+      | subject   | Interoperable Europe Portal: Content has been published                                            |
       | body      | CC Member has published the new news - "CCN post publish" in the collection: "CC post collection". |
 
     When I am logged in as "CC facilitator"
@@ -83,7 +83,7 @@ Feature: Notification test for the news transitions on a post moderated parent.
     And I press "Publish"
     Then the following email should have been sent:
       | recipient | CC member                                                                                                                                                   |
-      | subject   | Interoperable Europe Portal: Content has been updated                                                                                                                            |
+      | subject   | Interoperable Europe Portal: Content has been updated                                                                                                       |
       | body      | the Facilitator, CC Facilitator has approved your request of publication of the news - "CCN post approve proposed" in the collection: "CC post collection". |
 
     # Test 'delete' operation.
@@ -94,7 +94,7 @@ Feature: Notification test for the news transitions on a post moderated parent.
     And I press "Delete"
     Then the following email should have been sent:
       | recipient | CC member                                                                                                    |
-      | subject   | Interoperable Europe Portal: Content has been deleted                                                                             |
+      | subject   | Interoperable Europe Portal: Content has been deleted                                                        |
       | body      | Facilitator CC Facilitator has deleted the news - "CCN post delete" in the collection: "CC post collection". |
 
     Examples:
diff --git a/tests/features/community_content/notification.pre_moderated.discussion.feature b/tests/features/community_content/notification.pre_moderated.discussion.feature
index 4c584d8aa0..764d38440b 100644
--- a/tests/features/community_content/notification.pre_moderated.discussion.feature
+++ b/tests/features/community_content/notification.pre_moderated.discussion.feature
@@ -12,8 +12,8 @@ Feature: Notification test for the discussion transitions on a pre moderated par
       | CC facilitator   |           | notify_facilitator@test.com | CC         | Facilitator |
       | CC member        |           | notify_member@test.com      | CC         | Member      |
     And collection content:
-      | title             | state     | content creation | moderation |
-      | CC pre collection | published | members          | yes        |
+      | title             | content creation | moderation |
+      | CC pre collection | members          | yes        |
     And the following collection user memberships:
       | collection        | user           | roles       |
       | CC pre collection | CC owner       | owner       |
@@ -45,7 +45,7 @@ Feature: Notification test for the discussion transitions on a pre moderated par
     And I press "Propose"
     Then the following email should have been sent:
       | recipient | CC owner                                                                                                                      |
-      | subject   | Interoperable Europe Portal: Content has been proposed                                                                                             |
+      | subject   | Interoperable Europe Portal: Content has been proposed                                                                        |
       | body      | CC Member has submitted a new discussion - "CC notify create propose" for publication in the collection: "CC pre collection". |
 
     When I am logged in as "CC facilitator"
@@ -56,8 +56,8 @@ Feature: Notification test for the discussion transitions on a pre moderated par
     And I select "Statistics and Analysis" from "Topic"
     And I press "Publish"
     Then the following email should have been sent:
-      | recipient | CC owner                                                                                                                                                                       |
-      | subject   | Interoperable Europe Portal: Content has been published                                                                                                                                             |
+      | recipient | CC owner                                                                                                                                                                        |
+      | subject   | Interoperable Europe Portal: Content has been published                                                                                                                         |
       | body      | CC Facilitator has published the new discussion - "CC notify create publish" in the collection: "CC pre collection". You can access the new content at the following link: http |
 
     # Test 'update' operation.
@@ -67,7 +67,7 @@ Feature: Notification test for the discussion transitions on a pre moderated par
     And I press "Propose"
     Then the following email should have been sent:
       | recipient | CC owner                                                                                                                   |
-      | subject   | Interoperable Europe Portal: Content has been proposed                                                                                          |
+      | subject   | Interoperable Europe Portal: Content has been proposed                                                                     |
       | body      | CC Member has submitted a new discussion - "CC notify pre propose" for publication in the collection: "CC pre collection". |
 
     When I go to the "CC notify pre propose from reported" discussion
@@ -75,7 +75,7 @@ Feature: Notification test for the discussion transitions on a pre moderated par
     And I press "Propose"
     Then the following email should have been sent:
       | recipient | CC owner                                                                                                                                                                          |
-      | subject   | Interoperable Europe Portal: Content has been updated                                                                                                                                                  |
+      | subject   | Interoperable Europe Portal: Content has been updated                                                                                                                             |
       | body      | CC Member has updated the content of the discussion - "CC notify pre propose from reported" as advised and requests again its publication in the collection: "CC pre collection". |
 
     When I go to the "CC notify pre request deletion" discussion
@@ -86,7 +86,7 @@ Feature: Notification test for the discussion transitions on a pre moderated par
     And I press "Request deletion"
     Then the following email should have been sent:
       | recipient | CC owner                                                                                                                                                                                |
-      | subject   | Interoperable Europe Portal: Content has been updated                                                                                                                                                        |
+      | subject   | Interoperable Europe Portal: Content has been updated                                                                                                                                   |
       | body      | CC Member has requested to delete the discussion - "CC notify pre request deletion" in the collection: "CC pre collection", with the following motivation: "I just want to delete it.". |
 
     When I go to the "CC notify published to revise" discussion
@@ -94,7 +94,7 @@ Feature: Notification test for the discussion transitions on a pre moderated par
     And I press "Propose changes"
     Then the following email should have been sent:
       | recipient | CC owner                                                                                                                                      |
-      | subject   | Interoperable Europe Portal: Content has been proposed                                                                                                             |
+      | subject   | Interoperable Europe Portal: Content has been proposed                                                                                        |
       | body      | CC Member has submitted an update of the discussion - "CC notify published to revise" for publication in the collection: "CC pre collection". |
 
     When I am logged in as "CC facilitator"
@@ -103,7 +103,7 @@ Feature: Notification test for the discussion transitions on a pre moderated par
     And I press "Publish"
     Then the following email should have been sent:
       | recipient | CC owner                                                                                                          |
-      | subject   | Interoperable Europe Portal: Content has been published                                                                                |
+      | subject   | Interoperable Europe Portal: Content has been published                                                           |
       | body      | CC Facilitator has published the new discussion - "CC notify pre publish" in the collection: "CC pre collection". |
 
     When I am logged in as "CC facilitator"
@@ -115,11 +115,11 @@ Feature: Notification test for the discussion transitions on a pre moderated par
     And I press "Request changes"
     Then the following email should have been sent:
       | recipient | CC member                                                                                                                                                                                                       |
-      | subject   | Interoperable Europe Portal: Content has been updated                                                                                                                                                                                |
+      | subject   | Interoperable Europe Portal: Content has been updated                                                                                                                                                           |
       | body      | the Facilitator, CC Facilitator has requested you to modify the discussion - "CC notify pre request changes" in the collection: "CC pre collection", with the following motivation: "Can you do some changes?". |
     But the following email should not have been sent:
       | recipient | CC owner                                                                                                                                           |
-      | subject   | Interoperable Europe Portal: Content has been proposed                                                                                                                  |
+      | subject   | Interoperable Europe Portal: Content has been proposed                                                                                             |
       | body      | CC Facilitator has submitted an update of the discussion - "CC notify pre request changes" for publication in the collection: "CC pre collection". |
 
     When I am logged in as "CC facilitator"
@@ -131,7 +131,7 @@ Feature: Notification test for the discussion transitions on a pre moderated par
     And I press "Request changes"
     Then the following email should have been sent:
       | recipient | CC member                                                                                                                                                                                              |
-      | subject   | Interoperable Europe Portal: Content has been updated                                                                                                                                                                       |
+      | subject   | Interoperable Europe Portal: Content has been updated                                                                                                                                                  |
       | body      | the Facilitator, CC Facilitator has requested you to modify the discussion - "CC notify pre report" in the collection: "CC pre collection", with the following motivation: "Your content is reported". |
 
     When I am logged in as "CC facilitator"
@@ -140,7 +140,7 @@ Feature: Notification test for the discussion transitions on a pre moderated par
     And I press "Publish"
     Then the following email should have been sent:
       | recipient | CC member                                                                                                                                                             |
-      | subject   | Interoperable Europe Portal: Content has been updated                                                                                                                                      |
+      | subject   | Interoperable Europe Portal: Content has been updated                                                                                                                 |
       | body      | the Facilitator, CC Facilitator has approved your request of publication of the discussion - "CC notify pre approve proposed" in the collection: "CC pre collection". |
 
     When I am logged in as "CC facilitator"
@@ -152,7 +152,7 @@ Feature: Notification test for the discussion transitions on a pre moderated par
     And I press "Reject deletion"
     Then the following email should have been sent:
       | recipient | CC member                                                                                                                                                                                                          |
-      | subject   | Interoperable Europe Portal: Content has been updated                                                                                                                                                                                   |
+      | subject   | Interoperable Europe Portal: Content has been updated                                                                                                                                                              |
       | body      | the Facilitator, CC Facilitator has not approved your request to delete the discussion - "CC notify pre reject deletion" in the collection: "CC pre collection", with the following motivation: "I still like it". |
 
     # Test 'delete' operation on an entity in 'deletion_request' state.
@@ -162,9 +162,9 @@ Feature: Notification test for the discussion transitions on a pre moderated par
     And I click "Delete"
     And I press "Delete"
     Then the following email should have been sent:
-      | recipient | CC member                                                                                                                                            |
-      | subject   | Interoperable Europe Portal: The discussion "CC notify pre delete" was deleted in the space of "CC pre collection"                    |
-      | body      | for your information, the discussion "CC notify pre delete" was deleted from the "CC pre collection" collection. |
+      | recipient | CC member                                                                                                          |
+      | subject   | Interoperable Europe Portal: The discussion "CC notify pre delete" was deleted in the space of "CC pre collection" |
+      | body      | for your information, the discussion "CC notify pre delete" was deleted from the "CC pre collection" collection.   |
 
     When I am logged in as "CC facilitator"
     And I go to the "CC notify pre request deletion" discussion
@@ -172,9 +172,9 @@ Feature: Notification test for the discussion transitions on a pre moderated par
     And I click "Delete"
     And I press "Delete"
     Then the following email should have been sent:
-      | recipient | CC member                                                                                                                                                      |
-      | subject   | Interoperable Europe Portal: The discussion "CC notify pre request deletion" was deleted in the space of "CC pre collection"                    |
-      | body      | for your information, the discussion "CC notify pre request deletion" was deleted from the "CC pre collection" collection. |
+      | recipient | CC member                                                                                                                    |
+      | subject   | Interoperable Europe Portal: The discussion "CC notify pre request deletion" was deleted in the space of "CC pre collection" |
+      | body      | for your information, the discussion "CC notify pre request deletion" was deleted from the "CC pre collection" collection.   |
 
     # Test 'delete' operation on an entity in 'published' state.
     When I am logged in as "CC facilitator"
@@ -183,6 +183,6 @@ Feature: Notification test for the discussion transitions on a pre moderated par
     And I click "Delete"
     And I press "Delete"
     Then the following email should have been sent:
-      | recipient | CC member                                                                                                                       |
-      | subject   | Interoperable Europe Portal: The discussion "CC notify published to delete" was deleted in the space of "CC pre collection"                    |
-      | body      | for your information, the discussion "CC notify published to delete" was deleted from the "CC pre collection" collection. |
+      | recipient | CC member                                                                                                                   |
+      | subject   | Interoperable Europe Portal: The discussion "CC notify published to delete" was deleted in the space of "CC pre collection" |
+      | body      | for your information, the discussion "CC notify published to delete" was deleted from the "CC pre collection" collection.   |
diff --git a/tests/features/community_content/notification.pre_moderated.document.feature b/tests/features/community_content/notification.pre_moderated.document.feature
index 81a06a86ee..fe27e6ba4b 100644
--- a/tests/features/community_content/notification.pre_moderated.document.feature
+++ b/tests/features/community_content/notification.pre_moderated.document.feature
@@ -12,8 +12,8 @@ Feature: Notification test for the document transitions on a pre moderated paren
       | CC facilitator   |           | notify_facilitator@test.com | CC         | Facilitator |
       | CC member        |           | notify_member@test.com      | CC         | Member      |
     And collection content:
-      | title             | state     | content creation | moderation |
-      | CC pre collection | published | members          | yes        |
+      | title             | content creation | moderation |
+      | CC pre collection | members          | yes        |
     And the following collection user memberships:
       | collection        | user           | roles       |
       | CC pre collection | CC owner       | owner       |
@@ -49,7 +49,7 @@ Feature: Notification test for the document transitions on a pre moderated paren
     And I press "Propose"
     Then the following email should have been sent:
       | recipient | CC owner                                                                                                                    |
-      | subject   | Interoperable Europe Portal: Content has been proposed                                                                                           |
+      | subject   | Interoperable Europe Portal: Content has been proposed                                                                      |
       | body      | CC Member has submitted a new document - "CC notify create propose" for publication in the collection: "CC pre collection". |
 
     When I am logged in as "CC facilitator"
@@ -64,8 +64,8 @@ Feature: Notification test for the document transitions on a pre moderated paren
     And I select "Statistics and Analysis" from "Topic"
     And I press "Publish"
     Then the following email should have been sent:
-      | recipient | CC owner                                                                                                                                                                     |
-      | subject   | Interoperable Europe Portal: Content has been published                                                                                                                                           |
+      | recipient | CC owner                                                                                                                                                                      |
+      | subject   | Interoperable Europe Portal: Content has been published                                                                                                                       |
       | body      | CC Facilitator has published the new document - "CC notify create publish" in the collection: "CC pre collection". You can access the new content at the following link: http |
 
     # Test 'update' operation.
@@ -75,7 +75,7 @@ Feature: Notification test for the document transitions on a pre moderated paren
     And I press "Propose"
     Then the following email should have been sent:
       | recipient | CC owner                                                                                                                 |
-      | subject   | Interoperable Europe Portal: Content has been proposed                                                                                        |
+      | subject   | Interoperable Europe Portal: Content has been proposed                                                                   |
       | body      | CC Member has submitted a new document - "CC notify pre propose" for publication in the collection: "CC pre collection". |
 
     When I go to the "CC notify pre propose from reported" document
@@ -83,7 +83,7 @@ Feature: Notification test for the document transitions on a pre moderated paren
     And I press "Propose"
     Then the following email should have been sent:
       | recipient | CC owner                                                                                                                                                                        |
-      | subject   | Interoperable Europe Portal: Content has been updated                                                                                                                                                |
+      | subject   | Interoperable Europe Portal: Content has been updated                                                                                                                           |
       | body      | CC Member has updated the content of the document - "CC notify pre propose from reported" as advised and requests again its publication in the collection: "CC pre collection". |
 
     When I go to the "CC notify pre request deletion" document
@@ -94,7 +94,7 @@ Feature: Notification test for the document transitions on a pre moderated paren
     And I press "Request deletion"
     Then the following email should have been sent:
       | recipient | CC owner                                                                                                                                                                              |
-      | subject   | Interoperable Europe Portal: Content has been updated                                                                                                                                                      |
+      | subject   | Interoperable Europe Portal: Content has been updated                                                                                                                                 |
       | body      | CC Member has requested to delete the document - "CC notify pre request deletion" in the collection: "CC pre collection", with the following motivation: "I just want to delete it.". |
 
     When I go to the "CC notify published to revise" document
@@ -102,7 +102,7 @@ Feature: Notification test for the document transitions on a pre moderated paren
     And I press "Propose changes"
     Then the following email should have been sent:
       | recipient | CC owner                                                                                                                                    |
-      | subject   | Interoperable Europe Portal: Content has been proposed                                                                                                           |
+      | subject   | Interoperable Europe Portal: Content has been proposed                                                                                      |
       | body      | CC Member has submitted an update of the document - "CC notify published to revise" for publication in the collection: "CC pre collection". |
 
     When I am logged in as "CC facilitator"
@@ -111,7 +111,7 @@ Feature: Notification test for the document transitions on a pre moderated paren
     And I press "Publish"
     Then the following email should have been sent:
       | recipient | CC owner                                                                                                        |
-      | subject   | Interoperable Europe Portal: Content has been published                                                                              |
+      | subject   | Interoperable Europe Portal: Content has been published                                                         |
       | body      | CC Facilitator has published the new document - "CC notify pre publish" in the collection: "CC pre collection". |
 
     When I am logged in as "CC facilitator"
@@ -123,11 +123,11 @@ Feature: Notification test for the document transitions on a pre moderated paren
     And I press "Request changes"
     Then the following email should have been sent:
       | recipient | CC member                                                                                                                                                                                                     |
-      | subject   | Interoperable Europe Portal: Content has been updated                                                                                                                                                                              |
+      | subject   | Interoperable Europe Portal: Content has been updated                                                                                                                                                         |
       | body      | the Facilitator, CC Facilitator has requested you to modify the document - "CC notify pre request changes" in the collection: "CC pre collection", with the following motivation: "Can you do some changes?". |
     But the following email should not have been sent:
       | recipient | CC owner                                                                                                                                         |
-      | subject   | Interoperable Europe Portal: Content has been proposed                                                                                                                |
+      | subject   | Interoperable Europe Portal: Content has been proposed                                                                                           |
       | body      | CC Facilitator has submitted an update of the document - "CC notify pre request changes" for publication in the collection: "CC pre collection". |
 
     When I am logged in as "CC facilitator"
@@ -139,7 +139,7 @@ Feature: Notification test for the document transitions on a pre moderated paren
     And I press "Request changes"
     Then the following email should have been sent:
       | recipient | CC member                                                                                                                                                                                            |
-      | subject   | Interoperable Europe Portal: Content has been updated                                                                                                                                                                     |
+      | subject   | Interoperable Europe Portal: Content has been updated                                                                                                                                                |
       | body      | the Facilitator, CC Facilitator has requested you to modify the document - "CC notify pre report" in the collection: "CC pre collection", with the following motivation: "Your content is reported". |
 
     When I am logged in as "CC facilitator"
@@ -148,7 +148,7 @@ Feature: Notification test for the document transitions on a pre moderated paren
     And I press "Publish"
     Then the following email should have been sent:
       | recipient | CC member                                                                                                                                                           |
-      | subject   | Interoperable Europe Portal: Content has been updated                                                                                                                                    |
+      | subject   | Interoperable Europe Portal: Content has been updated                                                                                                               |
       | body      | the Facilitator, CC Facilitator has approved your request of publication of the document - "CC notify pre approve proposed" in the collection: "CC pre collection". |
 
     When I am logged in as "CC facilitator"
@@ -160,7 +160,7 @@ Feature: Notification test for the document transitions on a pre moderated paren
     And I press "Reject deletion"
     Then the following email should have been sent:
       | recipient | CC member                                                                                                                                                                                                        |
-      | subject   | Interoperable Europe Portal: Content has been updated                                                                                                                                                                                 |
+      | subject   | Interoperable Europe Portal: Content has been updated                                                                                                                                                            |
       | body      | the Facilitator, CC Facilitator has not approved your request to delete the document - "CC notify pre reject deletion" in the collection: "CC pre collection", with the following motivation: "I still like it". |
 
     # Test 'delete' operation on an entity in 'deletion_request' state.
@@ -171,7 +171,7 @@ Feature: Notification test for the document transitions on a pre moderated paren
     And I press "Delete"
     Then the following email should have been sent:
       | recipient | CC member                                                                                                                                          |
-      | subject   | Interoperable Europe Portal: Content has been deleted                                                                                                                   |
+      | subject   | Interoperable Europe Portal: Content has been deleted                                                                                              |
       | body      | Facilitator CC Facilitator has approved your request of deletion for the document - "CC notify pre delete" in the collection: "CC pre collection". |
 
     When I am logged in as "CC facilitator"
@@ -181,7 +181,7 @@ Feature: Notification test for the document transitions on a pre moderated paren
     And I press "Delete"
     Then the following email should have been sent:
       | recipient | CC member                                                                                                                                                    |
-      | subject   | Interoperable Europe Portal: Content has been deleted                                                                                                                             |
+      | subject   | Interoperable Europe Portal: Content has been deleted                                                                                                        |
       | body      | Facilitator CC Facilitator has approved your request of deletion for the document - "CC notify pre request deletion" in the collection: "CC pre collection". |
 
     # Test 'delete' operation on an entity in 'published' state.
@@ -192,5 +192,5 @@ Feature: Notification test for the document transitions on a pre moderated paren
     And I press "Delete"
     Then the following email should have been sent:
       | recipient | CC member                                                                                                                     |
-      | subject   | Interoperable Europe Portal: Content has been deleted                                                                                              |
+      | subject   | Interoperable Europe Portal: Content has been deleted                                                                         |
       | body      | Facilitator CC Facilitator has deleted the document - "CC notify published to delete" in the collection: "CC pre collection". |
diff --git a/tests/features/community_content/notification.pre_moderated.event.feature b/tests/features/community_content/notification.pre_moderated.event.feature
index 9972c6007f..7f8d3ffece 100644
--- a/tests/features/community_content/notification.pre_moderated.event.feature
+++ b/tests/features/community_content/notification.pre_moderated.event.feature
@@ -12,8 +12,8 @@ Feature: Notification test for the event transitions on a pre moderated parent.
       | CC facilitator   |           | notify_facilitator@test.com | CC         | Facilitator |
       | CC member        |           | notify_member@test.com      | CC         | Member      |
     And collection content:
-      | title             | state     | content creation | moderation |
-      | CC pre collection | published | members          | yes        |
+      | title             | content creation | moderation |
+      | CC pre collection | members          | yes        |
     And the following collection user memberships:
       | collection        | user           | roles       |
       | CC pre collection | CC owner       | owner       |
@@ -49,7 +49,7 @@ Feature: Notification test for the event transitions on a pre moderated parent.
     And I press "Propose"
     Then the following email should have been sent:
       | recipient | CC owner                                                                                                                 |
-      | subject   | Interoperable Europe Portal: Content has been proposed                                                                                        |
+      | subject   | Interoperable Europe Portal: Content has been proposed                                                                   |
       | body      | CC Member has submitted a new event - "CC notify create propose" for publication in the collection: "CC pre collection". |
 
     When I am logged in as "CC facilitator"
@@ -65,7 +65,7 @@ Feature: Notification test for the event transitions on a pre moderated parent.
     And I press "Publish"
     Then the following email should have been sent:
       | recipient | CC owner                                                                                                                                                                   |
-      | subject   | Interoperable Europe Portal: Content has been published                                                                                                                                         |
+      | subject   | Interoperable Europe Portal: Content has been published                                                                                                                    |
       | body      | CC Facilitator has published the new event - "CC notify create publish" in the collection: "CC pre collection". You can access the new content at the following link: http |
 
     # Test 'update' operation.
@@ -75,7 +75,7 @@ Feature: Notification test for the event transitions on a pre moderated parent.
     And I press "Propose"
     Then the following email should have been sent:
       | recipient | CC owner                                                                                                              |
-      | subject   | Interoperable Europe Portal: Content has been proposed                                                                                     |
+      | subject   | Interoperable Europe Portal: Content has been proposed                                                                |
       | body      | CC Member has submitted a new event - "CC notify pre propose" for publication in the collection: "CC pre collection". |
 
     When I go to the "CC notify pre propose from reported" event
@@ -83,7 +83,7 @@ Feature: Notification test for the event transitions on a pre moderated parent.
     And I press "Propose"
     Then the following email should have been sent:
       | recipient | CC owner                                                                                                                                                                     |
-      | subject   | Interoperable Europe Portal: Content has been updated                                                                                                                                             |
+      | subject   | Interoperable Europe Portal: Content has been updated                                                                                                                        |
       | body      | CC Member has updated the content of the event - "CC notify pre propose from reported" as advised and requests again its publication in the collection: "CC pre collection". |
 
     When I go to the "CC notify pre request deletion" event
@@ -94,7 +94,7 @@ Feature: Notification test for the event transitions on a pre moderated parent.
     And I press "Request deletion"
     Then the following email should have been sent:
       | recipient | CC owner                                                                                                                                                                           |
-      | subject   | Interoperable Europe Portal: Content has been updated                                                                                                                                                   |
+      | subject   | Interoperable Europe Portal: Content has been updated                                                                                                                              |
       | body      | CC Member has requested to delete the event - "CC notify pre request deletion" in the collection: "CC pre collection", with the following motivation: "I just want to delete it.". |
 
     When I go to the "CC notify published to revise" event
@@ -102,7 +102,7 @@ Feature: Notification test for the event transitions on a pre moderated parent.
     And I press "Propose changes"
     Then the following email should have been sent:
       | recipient | CC owner                                                                                                                                 |
-      | subject   | Interoperable Europe Portal: Content has been proposed                                                                                                        |
+      | subject   | Interoperable Europe Portal: Content has been proposed                                                                                   |
       | body      | CC Member has submitted an update of the event - "CC notify published to revise" for publication in the collection: "CC pre collection". |
 
     When I am logged in as "CC facilitator"
@@ -111,7 +111,7 @@ Feature: Notification test for the event transitions on a pre moderated parent.
     And I press "Publish"
     Then the following email should have been sent:
       | recipient | CC owner                                                                                                     |
-      | subject   | Interoperable Europe Portal: Content has been published                                                                           |
+      | subject   | Interoperable Europe Portal: Content has been published                                                      |
       | body      | CC Facilitator has published the new event - "CC notify pre publish" in the collection: "CC pre collection". |
 
     When I am logged in as "CC facilitator"
@@ -123,11 +123,11 @@ Feature: Notification test for the event transitions on a pre moderated parent.
     And I press "Request changes"
     Then the following email should have been sent:
       | recipient | CC member                                                                                                                                                                                                  |
-      | subject   | Interoperable Europe Portal: Content has been updated                                                                                                                                                                           |
+      | subject   | Interoperable Europe Portal: Content has been updated                                                                                                                                                      |
       | body      | the Facilitator, CC Facilitator has requested you to modify the event - "CC notify pre request changes" in the collection: "CC pre collection", with the following motivation: "Can you do some changes?". |
     But the following email should not have been sent:
       | recipient | CC owner                                                                                                                                      |
-      | subject   | Interoperable Europe Portal: Content has been proposed                                                                                                             |
+      | subject   | Interoperable Europe Portal: Content has been proposed                                                                                        |
       | body      | CC Facilitator has submitted an update of the event - "CC notify pre request changes" for publication in the collection: "CC pre collection". |
 
     When I am logged in as "CC facilitator"
@@ -139,7 +139,7 @@ Feature: Notification test for the event transitions on a pre moderated parent.
     And I press "Request changes"
     Then the following email should have been sent:
       | recipient | CC member                                                                                                                                                                                         |
-      | subject   | Interoperable Europe Portal: Content has been updated                                                                                                                                                                  |
+      | subject   | Interoperable Europe Portal: Content has been updated                                                                                                                                             |
       | body      | the Facilitator, CC Facilitator has requested you to modify the event - "CC notify pre report" in the collection: "CC pre collection", with the following motivation: "Your content is reported". |
 
     When I am logged in as "CC facilitator"
@@ -148,7 +148,7 @@ Feature: Notification test for the event transitions on a pre moderated parent.
     And I press "Publish"
     Then the following email should have been sent:
       | recipient | CC member                                                                                                                                                        |
-      | subject   | Interoperable Europe Portal: Content has been updated                                                                                                                                 |
+      | subject   | Interoperable Europe Portal: Content has been updated                                                                                                            |
       | body      | the Facilitator, CC Facilitator has approved your request of publication of the event - "CC notify pre approve proposed" in the collection: "CC pre collection". |
 
     When I am logged in as "CC facilitator"
@@ -160,7 +160,7 @@ Feature: Notification test for the event transitions on a pre moderated parent.
     And I press "Reject deletion"
     Then the following email should have been sent:
       | recipient | CC member                                                                                                                                                                                                     |
-      | subject   | Interoperable Europe Portal: Content has been updated                                                                                                                                                                              |
+      | subject   | Interoperable Europe Portal: Content has been updated                                                                                                                                                         |
       | body      | the Facilitator, CC Facilitator has not approved your request to delete the event - "CC notify pre reject deletion" in the collection: "CC pre collection", with the following motivation: "I still like it". |
 
     # Test 'delete' operation on an entity in 'deletion_request' state.
@@ -171,7 +171,7 @@ Feature: Notification test for the event transitions on a pre moderated parent.
     And I press "Delete"
     Then the following email should have been sent:
       | recipient | CC member                                                                                                                                       |
-      | subject   | Interoperable Europe Portal: Content has been deleted                                                                                                                |
+      | subject   | Interoperable Europe Portal: Content has been deleted                                                                                           |
       | body      | Facilitator CC Facilitator has approved your request of deletion for the event - "CC notify pre delete" in the collection: "CC pre collection". |
 
     When I am logged in as "CC facilitator"
@@ -181,7 +181,7 @@ Feature: Notification test for the event transitions on a pre moderated parent.
     And I press "Delete"
     Then the following email should have been sent:
       | recipient | CC member                                                                                                                                                 |
-      | subject   | Interoperable Europe Portal: Content has been deleted                                                                                                                          |
+      | subject   | Interoperable Europe Portal: Content has been deleted                                                                                                     |
       | body      | Facilitator CC Facilitator has approved your request of deletion for the event - "CC notify pre request deletion" in the collection: "CC pre collection". |
 
     # Test 'delete' operation on an entity in 'published' state.
@@ -192,5 +192,5 @@ Feature: Notification test for the event transitions on a pre moderated parent.
     And I press "Delete"
     Then the following email should have been sent:
       | recipient | CC member                                                                                                                  |
-      | subject   | Interoperable Europe Portal: Content has been deleted                                                                                           |
+      | subject   | Interoperable Europe Portal: Content has been deleted                                                                      |
       | body      | Facilitator CC Facilitator has deleted the event - "CC notify published to delete" in the collection: "CC pre collection". |
diff --git a/tests/features/community_content/notification.pre_moderated.news.feature b/tests/features/community_content/notification.pre_moderated.news.feature
index 91e9769949..e5d2a2649c 100644
--- a/tests/features/community_content/notification.pre_moderated.news.feature
+++ b/tests/features/community_content/notification.pre_moderated.news.feature
@@ -12,8 +12,8 @@ Feature: Notification test for the news transitions on a pre moderated parent.
       | CC facilitator   |           | notify_facilitator@test.com | CC         | Facilitator |
       | CC member        |           | notify_member@test.com      | CC         | Member      |
     And collection content:
-      | title             | state     | content creation | moderation |
-      | CC pre collection | published | members          | yes        |
+      | title             | content creation | moderation |
+      | CC pre collection | members          | yes        |
     And the following collection user memberships:
       | collection        | user           | roles       |
       | CC pre collection | CC owner       | owner       |
@@ -64,7 +64,7 @@ Feature: Notification test for the news transitions on a pre moderated parent.
     And I press "Propose"
     Then the following email should have been sent:
       | recipient | Notify moderator                                                                                                             |
-      | subject   | Interoperable Europe Portal: Content has been proposed                                                                                            |
+      | subject   | Interoperable Europe Portal: Content has been proposed                                                                       |
       | body      | CC Member has submitted an update of the news - "CCN create propose" for publication in the collection: "CC pre collection". |
     And the email sent to "CC owner" with subject "Interoperable Europe Portal: Content has been proposed" contains the following lines of text:
       | CC Member has submitted an update of the news - "CCN create propose" for publication in the collection: "CC pre collection". |
@@ -82,8 +82,8 @@ Feature: Notification test for the news transitions on a pre moderated parent.
     And I select "Statistics and Analysis" from "Topic"
     And I press "Publish"
     Then the following email should have been sent:
-      | recipient | CC owner                                                                                                                                                           |
-      | subject   | Interoperable Europe Portal: Content has been published                                                                                                                                 |
+      | recipient | CC owner                                                                                                                                                            |
+      | subject   | Interoperable Europe Portal: Content has been published                                                                                                             |
       | body      | CC Facilitator has published the new news - "CCN create publish" in the collection: "CC pre collection". You can access the new content at the following link: http |
 
     # Test 'update' operation.
@@ -117,7 +117,7 @@ Feature: Notification test for the news transitions on a pre moderated parent.
     And I press "Propose changes"
     Then the following email should have been sent:
       | recipient | CC owner                                                                                                                          |
-      | subject   | Interoperable Europe Portal: Content has been proposed                                                                                                 |
+      | subject   | Interoperable Europe Portal: Content has been proposed                                                                            |
       | body      | CC Member has submitted an update of the news - "CCN published to revise" for publication in the collection: "CC pre collection". |
 
     When I am logged in as "CC facilitator"
@@ -126,7 +126,7 @@ Feature: Notification test for the news transitions on a pre moderated parent.
     And I press "Publish"
     Then the following email should have been sent:
       | recipient | CC owner                                                                                              |
-      | subject   | Interoperable Europe Portal: Content has been published                                                                    |
+      | subject   | Interoperable Europe Portal: Content has been published                                               |
       | body      | CC Facilitator has published the new news - "CCN pre publish" in the collection: "CC pre collection". |
 
     When I am logged in as "CC facilitator"
@@ -141,7 +141,7 @@ Feature: Notification test for the news transitions on a pre moderated parent.
       | If you think this action is not clear or not due, please contact Portal Support at                                                                                                                  |
     But the following email should not have been sent:
       | recipient | CC owner                                                                                                                               |
-      | subject   | Interoperable Europe Portal: Content has been proposed                                                                                                      |
+      | subject   | Interoperable Europe Portal: Content has been proposed                                                                                 |
       | body      | CC Facilitator has submitted an update of the news - "CCN pre request changes" for publication in the collection: "CC pre collection". |
 
     When I am logged in as "CC facilitator"
@@ -161,7 +161,7 @@ Feature: Notification test for the news transitions on a pre moderated parent.
     And I press "Publish"
     Then the following email should have been sent:
       | recipient | CC member                                                                                                                                                 |
-      | subject   | Interoperable Europe Portal: Content has been updated                                                                                                                          |
+      | subject   | Interoperable Europe Portal: Content has been updated                                                                                                     |
       | body      | the Facilitator, CC Facilitator has approved your request of publication of the news - "CCN pre approve proposed" in the collection: "CC pre collection". |
 
     When I am logged in as "CC facilitator"
@@ -173,7 +173,7 @@ Feature: Notification test for the news transitions on a pre moderated parent.
     And I press "Reject deletion"
     Then the following email should have been sent:
       | recipient | CC member                                                                                                                                                                                              |
-      | subject   | Interoperable Europe Portal: Content has been updated                                                                                                                                                                       |
+      | subject   | Interoperable Europe Portal: Content has been updated                                                                                                                                                  |
       | body      | the Facilitator, CC Facilitator has not approved your request to delete the news - "CCN pre reject deletion" in the collection: "CC pre collection", with the following motivation: "I still like it". |
 
     # Test 'delete' operation.
@@ -184,7 +184,7 @@ Feature: Notification test for the news transitions on a pre moderated parent.
     And I press "Delete"
     Then the following email should have been sent:
       | recipient | CC member                                                                                                                                |
-      | subject   | Interoperable Europe Portal: Content has been deleted                                                                                                         |
+      | subject   | Interoperable Europe Portal: Content has been deleted                                                                                    |
       | body      | Facilitator CC Facilitator has approved your request of deletion for the news - "CCN pre delete" in the collection: "CC pre collection". |
 
     When I am logged in as "CC facilitator"
@@ -194,7 +194,7 @@ Feature: Notification test for the news transitions on a pre moderated parent.
     And I press "Delete"
     Then the following email should have been sent:
       | recipient | CC member                                                                                                                                          |
-      | subject   | Interoperable Europe Portal: Content has been deleted                                                                                                                   |
+      | subject   | Interoperable Europe Portal: Content has been deleted                                                                                              |
       | body      | Facilitator CC Facilitator has approved your request of deletion for the news - "CCN pre request deletion" in the collection: "CC pre collection". |
 
     # Test 'delete' operation for a published entity.
@@ -205,5 +205,5 @@ Feature: Notification test for the news transitions on a pre moderated parent.
     And I press "Delete"
     Then the following email should have been sent:
       | recipient | CC member                                                                                                           |
-      | subject   | Interoperable Europe Portal: Content has been deleted                                                                                    |
+      | subject   | Interoperable Europe Portal: Content has been deleted                                                               |
       | body      | Facilitator CC Facilitator has deleted the news - "CCN published to delete" in the collection: "CC pre collection". |
diff --git a/tests/features/community_content/overview.datetime.feature b/tests/features/community_content/overview.datetime.feature
index be19362244..b2ae166cc7 100644
--- a/tests/features/community_content/overview.datetime.feature
+++ b/tests/features/community_content/overview.datetime.feature
@@ -6,11 +6,11 @@ Feature:
 
   Scenario Outline: Last update date shown for specific content bundles.
     Given collection content:
-      | title                        | state     |
-      | Gravitational wave detectors | published |
+      | title                        |
+      | Gravitational wave detectors |
     And <type> content:
-      | title | created                   | <publication field name>  | changed                   | collection                   | state     |
-      | LIGO  | Wed, 25 Dec 2019 13:00:00 | Wed, 25 Dec 2019 14:00:00 | Wed, 25 Dec 2019 15:00:00 | Gravitational wave detectors | published |
+      | title | created                   | <publication field name>  | changed                   | collection                   |
+      | LIGO  | Wed, 25 Dec 2019 13:00:00 | Wed, 25 Dec 2019 14:00:00 | Wed, 25 Dec 2019 15:00:00 | Gravitational wave detectors |
 
     When I go to the "LIGO" <type>
     Then I should see the text "Published on: 25/12/2019"
@@ -63,8 +63,8 @@ Feature:
 
   Scenario: Documents without a publication date should show the published_at property.
     Given collection content:
-      | title                        | state     |
-      | Gravitational pull detectors | published |
+      | title                        |
+      | Gravitational pull detectors |
     When I am logged in as a facilitator of the "Gravitational pull detectors" collection
     And I go to the "Gravitational pull detectors" collection
     And I click "Add document"
@@ -90,8 +90,8 @@ Feature:
 
   Scenario: Draft documents without a publication date should only show the last updated time.
     Given collection content:
-      | title                        | state     |
-      | Gravitational pull detectors | published |
+      | title                        |
+      | Gravitational pull detectors |
     When I am logged in as a facilitator of the "Gravitational pull detectors" collection
     And I go to the "Gravitational pull detectors" collection
     And I click "Add document"
diff --git a/tests/features/community_content/revisions.feature b/tests/features/community_content/revisions.feature
index d574de49e4..133106810b 100644
--- a/tests/features/community_content/revisions.feature
+++ b/tests/features/community_content/revisions.feature
@@ -6,8 +6,8 @@ Feature:
 
   Scenario Outline: Community content revisions
     Given <group type> content:
-      | title        | description                               | moderation   | state     |
-      | Hellow world | Because I do not know how to spell Hello. | <moderation> | published |
+      | title        | description                               | moderation   |
+      | Hellow world | Because I do not know how to spell Hello. | <moderation> |
     And users:
       | Username           | E-mail                    | Roles     |
       | Clumsy Bounce      | clumsy.bounce@example.com |           |
@@ -21,9 +21,9 @@ Feature:
       | Hellow world | Grumpy author     | author      |
       | Hellow world | Jelly Facilitator | facilitator |
     And discussion content:
-      | title                | body                                   | state     | author        | <group type> |
-      | Goodbi world         | Because I cannot spell Goodbye either. | published | Clumsy Bounce | Hellow world |
-      | Careful with that ax | Someone needs to ax these questions.   | published | Grumpy Author | Hellow world |
+      | title                | body                                   | author        | <group type> |
+      | Goodbi world         | Because I cannot spell Goodbye either. | Clumsy Bounce | Hellow world |
+      | Careful with that ax | Someone needs to ax these questions.   | Grumpy Author | Hellow world |
     And discussion revisions:
       | current title        | title                 |
       | Careful with that ax | Careful with that axe |
@@ -190,16 +190,16 @@ Feature:
     # they are posted in a pre-moderated group. The reasoning behind this is
     # everyone should always be free to start a discussion. See ISAICP-2265.
     Examples:
-      | group type | moderation | join button          | leave link            |
-      | collection | yes        | Join this collection | Leave this collection |
+      | group type | moderation | join button                | leave link            |
+      | collection | yes        | Join this collection       | Leave this collection |
       | collection | no         | Join this collection       | Leave this collection |
       | solution   | yes        | Subscribe to this solution | Unsubscribe           |
       | solution   | no         | Subscribe to this solution | Unsubscribe           |
 
   Scenario Outline: Community content revisions (with layout paragraphs)
     Given <group type> content:
-      | title        | description                               | moderation   | state     |
-      | Hellow world | Because I do not know how to spell Hello. | <moderation> | published |
+      | title        | description                               | moderation   |
+      | Hellow world | Because I do not know how to spell Hello. | <moderation> |
     And users:
       | Username           | E-mail                    | Roles     |
       | Clumsy Bounce      | clumsy.bounce@example.com |           |
@@ -213,9 +213,9 @@ Feature:
       | Hellow world | Grumpy author     | author      |
       | Hellow world | Jelly Facilitator | facilitator |
     And <content type> content:
-      | title                | abstract | field_paragraphs_body                  | state     | author        | <group type> |
-      | Goodbi world         | abstract | Because I cannot spell Goodbye either. | published | Clumsy Bounce | Hellow world |
-      | Careful with that ax | abstract | Someone needs to ax these questions.   | published | Grumpy Author | Hellow world |
+      | title                | abstract | field_paragraphs_body                  | author        | <group type> |
+      | Goodbi world         | abstract | Because I cannot spell Goodbye either. | Clumsy Bounce | Hellow world |
+      | Careful with that ax | abstract | Someone needs to ax these questions.   | Grumpy Author | Hellow world |
     And <content type> revisions:
       | current title        | title                 |
       | Careful with that ax | Careful with that axe |
diff --git a/tests/features/contact_form/prefill.feature b/tests/features/contact_form/prefill.feature
index 0f740714bd..e31e15169b 100644
--- a/tests/features/contact_form/prefill.feature
+++ b/tests/features/contact_form/prefill.feature
@@ -6,11 +6,11 @@ Feature: Prefill contact form fields
 
   Scenario: The subject field can be prefilled through links.
     Given collection content:
-      | title                | state     | topic |
-      | CAMSS test community | published | HR    |
+      | title                | topic |
+      | CAMSS test community | HR    |
     And custom_page content:
-      | title                | collection           | state     |
-      | IOP page custom page | CAMSS test community | published |
+      | title                | collection           |
+      | IOP page custom page | CAMSS test community |
     And I append "simple_paragraph" to "field_paragraphs_body" field in "node" entity with following "IOP page custom page" title:
       | field_body:value  | <p>Follow this <a href="../../contact?subject=CAMSS%20Change%20Request">link</a></p> |
       | field_body:format | content_editor                                                                       |
diff --git a/tests/features/contact_form/report.feature b/tests/features/contact_form/report.feature
index dbb7420b8c..8bbd04adbf 100644
--- a/tests/features/contact_form/report.feature
+++ b/tests/features/contact_form/report.feature
@@ -11,8 +11,8 @@ Feature: Submit the contact form
       | Report user      |           | report_user@test.com      | Rudi       | Sinatra     |
       | Report owner     |           | report_owner@test.com     | Clark      | The machine |
     And collection content:
-      | title                                 | state     | abstract     | description   |
-      | Collection with inappropriate content | published | No one cares | No one cares. |
+      | title                                 | abstract     | description   |
+      | Collection with inappropriate content | No one cares | No one cares. |
     And the following collection user memberships:
       | collection                            | user         | roles              |
       | Collection with inappropriate content | Report owner | owner, facilitator |
@@ -37,17 +37,17 @@ Feature: Submit the contact form
     Then the following email should have been sent:
       | template  | Report contact form                                                                                                                                                                             |
       | recipient | Report moderator                                                                                                                                                                                |
-      | subject   | Interoperable Europe Portal: This content has invalid location                                                                                                                                                       |
+      | subject   | Interoperable Europe Portal: This content has invalid location                                                                                                                                  |
       | body      | Balourdos Tsolias has reported the item "Event to report" as abusive due to The location described as "Somewhere" could not be found by my map application. You can access the reported content |
     And the following email should have been sent:
       | template  | Report contact form                                                                                                                                                                             |
       | recipient | Report owner                                                                                                                                                                                    |
-      | subject   | Interoperable Europe Portal: This content has invalid location                                                                                                                                                       |
+      | subject   | Interoperable Europe Portal: This content has invalid location                                                                                                                                  |
       | body      | Balourdos Tsolias has reported the item "Event to report" as abusive due to The location described as "Somewhere" could not be found by my map application. You can access the reported content |
     And the following email should have been sent:
-      | recipient_mail | balourdos@example.rg               |
-      | subject        | Interoperable Europe Portal: Contact form notification  |
-      | body           | We will reply as soon as possible. |
+      | recipient_mail | balourdos@example.rg                                   |
+      | subject        | Interoperable Europe Portal: Contact form notification |
+      | body           | We will reply as soon as possible.                     |
     And I should see the heading "Event to report"
 
     # Now the reporter requires also a copy of its message.
@@ -64,5 +64,5 @@ Feature: Submit the contact form
     Given I press "Submit"
     Then the following email should have been sent:
       | recipient_mail | gbelson@hooli.com                                                                                         |
-      | subject        | Interoperable Europe Portal: Contact form notification                                                                         |
+      | subject        | Interoperable Europe Portal: Contact form notification                                                    |
       | body           | I don't want to live in a world where someone else is making the world a better place better than we are. |
diff --git a/tests/features/contact_information/contact_information.seo.feature b/tests/features/contact_information/contact_information.seo.feature
index 9007067983..18767955f2 100644
--- a/tests/features/contact_information/contact_information.seo.feature
+++ b/tests/features/contact_information/contact_information.seo.feature
@@ -21,8 +21,8 @@ Feature: Contact Information entities don't cause exceptions because of their in
   @javascript
   Scenario: Create contact info entity through IEF in a collection.
     Given collection content:
-      | title                     | state     | owner | contact |
-      | Contact Info Content Test | published |       |         |
+      | title                     | owner | contact |
+      | Contact Info Content Test |       |         |
     Given I am logged in as a user with the "moderator" role
     When I go to the edit form of the "Contact Info Content Test" collection
     Then I should see the text "Edit Collection Contact Info Content Test"
diff --git a/tests/features/content_overview.feature b/tests/features/content_overview.feature
index f745bce3ed..cabd9ce4ab 100644
--- a/tests/features/content_overview.feature
+++ b/tests/features/content_overview.feature
@@ -8,22 +8,22 @@ Feature: Content Overview
       | welshbuzzard | Titus      | Nicotera    | nicotito@example.org |
       | hatchingegg  | Korinna    | Morin       | korimor@example.com  |
     And collection content:
-      | title             | description        | state     | moderation |
-      | Rumble collection | Sample description | published | yes        |
+      | title             | description        | moderation |
+      | Rumble collection | Sample description | yes        |
     And "event" content:
-      | title                | collection        | state     | created           |
-      | Seventh Windows      | Rumble collection | published | 2018-10-03 4:21am |
-      | A Night at the Opera | Rumble collection | published | 2018-10-03 4:17am |
+      | title                | collection        | created           |
+      | Seventh Windows      | Rumble collection | 2018-10-03 4:21am |
+      | A Night at the Opera | Rumble collection | 2018-10-03 4:17am |
     And "news" content:
       | title            | collection        | state     | author       | created           |
       | The Playful Tale | Rumble collection | published | batbull      | 2018-10-03 4:26am |
       | Night of Shadow  | Rumble collection | proposed  | welshbuzzard | 2018-10-03 4:26am |
     And "document" content:
-      | title             | collection        | state     | created           |
-      | History of Flight | Rumble collection | published | 2018-10-03 4:19am |
+      | title             | collection        | created           |
+      | History of Flight | Rumble collection | 2018-10-03 4:19am |
     And "discussion" content:
-      | title            | collection        | state     | author      | created           |
-      | The Men's Female | Rumble collection | published | hatchingegg | 2018-10-03 4:18am |
+      | title            | collection        | author      | created           |
+      | The Men's Female | Rumble collection | hatchingegg | 2018-10-03 4:18am |
 
     # Check that visiting as a moderator does not create cache for all users.
     When I am logged in as a user with the "moderator" role
@@ -88,21 +88,21 @@ Feature: Content Overview
       | michaelanewport | michaela.newport@example.com |
       | nenaroberts     | nena.roberts@example.com     |
     And collection content:
-      | title            | state     |
-      | Timely Xylophone | published |
+      | title            |
+      | Timely Xylophone |
     And "event" content:
-      | title            | collection       | state     |
-      | Sticky Vegetable | Timely Xylophone | published |
+      | title            | collection       |
+      | Sticky Vegetable | Timely Xylophone |
     And "news" content:
-      | title            | collection       | state     | author          | featured |
-      | Early Avenue     | Timely Xylophone | published | michaelanewport | yes      |
-      | Itchy Artificial | Timely Xylophone | published | nenaroberts     | no       |
+      | title            | collection       | author          | featured |
+      | Early Avenue     | Timely Xylophone | michaelanewport | yes      |
+      | Itchy Artificial | Timely Xylophone | nenaroberts     | no       |
     And "document" content:
-      | title             | collection       | state     |
-      | Limousine Scarlet | Timely Xylophone | published |
+      | title             | collection       |
+      | Limousine Scarlet | Timely Xylophone |
     And "discussion" content:
-      | title                  | collection       | state     | author          | featured |
-      | Hideous Dreaded Monkey | Timely Xylophone | published | michaelanewport | yes      |
+      | title                  | collection       | author          | featured |
+      | Hideous Dreaded Monkey | Timely Xylophone | michaelanewport | yes      |
 
     When I am logged in as "michaelanewport"
     And I visit the content overview
@@ -172,21 +172,21 @@ Feature: Content Overview
       | claricemitchell | clarice.mitchell@example.com |
       | jeffreypayne    | jeffrey.payne@example.com    |
     And collection content:
-      | title           | state     |
-      | Barbaric Avenue | published |
+      | title           |
+      | Barbaric Avenue |
     And event content:
-      | title                | collection      | start date   | end date            | created    | state     | author          |
-      | Bitter Finger        | Barbaric Avenue | now -1 years | now -1 years +1 day | now -4 day | published | claricemitchell |
-      | Frozen Barbershop    | Barbaric Avenue | now -1 day   | now +1 day          | now -3 day | published | claricemitchell |
-      | Frozen Breeze        | Barbaric Avenue | now +2 day   | now +4 day          | now -2 day | published | claricemitchell |
-      | Flying Official Fish | Barbaric Avenue | now -3 day   | now -1 day          | now        | published | jeffreypayne    |
+      | title                | collection      | start date   | end date            | created    | author          |
+      | Bitter Finger        | Barbaric Avenue | now -1 years | now -1 years +1 day | now -4 day | claricemitchell |
+      | Frozen Barbershop    | Barbaric Avenue | now -1 day   | now +1 day          | now -3 day | claricemitchell |
+      | Frozen Breeze        | Barbaric Avenue | now +2 day   | now +4 day          | now -2 day | claricemitchell |
+      | Flying Official Fish | Barbaric Avenue | now -3 day   | now -1 day          | now        | jeffreypayne    |
     # Technical: use a separate step to create an event associated to the anonymous user.
     And event content:
-      | title          | collection      | start date  | end date    | created    | state     |
-      | Autumn Boiling | Barbaric Avenue | now +1 week | now +1 week | now -5 day | published |
+      | title          | collection      | start date  | end date    | created    |
+      | Autumn Boiling | Barbaric Avenue | now +1 week | now +1 week | now -5 day |
     And discussion content:
-      | title           | collection      | state     | created   |
-      | Purple Poseidon | Barbaric Avenue | published | yesterday |
+      | title           | collection      | created   |
+      | Purple Poseidon | Barbaric Avenue | yesterday |
 
     When I am logged in as claricemitchell
     And I visit the content overview
diff --git a/tests/features/custom_page/add_custom_page.feature b/tests/features/custom_page/add_custom_page.feature
index 2bd7949a9f..5df2cd36a2 100644
--- a/tests/features/custom_page/add_custom_page.feature
+++ b/tests/features/custom_page/add_custom_page.feature
@@ -6,13 +6,13 @@ Feature: "Add custom page" visibility options.
 
   Background:
     Given collection content:
-      | title           | logo     | state     | topic      |
-      | Open Collective | logo.png | published | Demography |
-      | Code Camp       | logo.png | published | Demography |
+      | title           | logo     | topic      |
+      | Open Collective | logo.png | Demography |
+      | Code Camp       | logo.png | Demography |
     Given solution content:
-      | title     | logo     | state     | topic      |
-      | Parachute | logo.png | published | Demography |
-      | Skydiving | logo.png | published | Demography |
+      | title     | logo     | topic      |
+      | Parachute | logo.png | Demography |
+      | Skydiving | logo.png | Demography |
 
   Scenario Outline: Links and help text for adding custom pages should should only be shown to privileged users
     # Custom pages cannot be added by normal members. Custom pages are
@@ -123,11 +123,11 @@ Feature: "Add custom page" visibility options.
 
   Scenario: Title can be visually hidden.
     Given collection content:
-      | title             | state     |
-      | Aggressive Rubber | published |
+      | title             |
+      | Aggressive Rubber |
     And custom_page content:
-      | title        | collection        | field_hide_title | state     |
-      | Rubber bands | Aggressive Rubber | 1                | published |
+      | title        | collection        | field_hide_title |
+      | Rubber bands | Aggressive Rubber | 1                |
 
     When I go to the "Rubber bands" custom page
     Then I see the text "Rubber bands" in the "Visually hidden title" region
@@ -150,14 +150,14 @@ Feature: "Add custom page" visibility options.
   @javascript
   Scenario: Long list of attachments should be collapsed.
     Given collection content:
-      | title             | state     |
-      | Aggressive Rubber | published |
+      | title             |
+      | Aggressive Rubber |
     # Create custom pages with 5 and 6 attachments.
     # 5 is the limit before adding the "Show more" functionality.
     And custom_page content:
-      | title          | body                 | collection        | state     | attachments                                                                                                                                                                                                          |
-      | Rubber bands   | The aggressive ones. | Aggressive Rubber | published | target_id: empty.rdf - display: 1, target_id: empty_pdf.pdf - display: 1, target_id: invalid_adms.rdf - display: 1, target_id: test.zip - display: 1, target_id: text.pdf - display: 1                               |
-      | Elastic rubber | Also aggressive.     | Aggressive Rubber | published | target_id: ada.png - display: 1, target_id: alan.jpg - display: 1, target_id: blaise.jpg - display: 1, target_id: charles.jpg - display: 1, target_id: leonardo.jpg - display: 1, target_id: linus.jpeg - display: 1 |
+      | title          | body                 | collection        | attachments                                                                                                                                                                                                          |
+      | Rubber bands   | The aggressive ones. | Aggressive Rubber | target_id: empty.rdf - display: 1, target_id: empty_pdf.pdf - display: 1, target_id: invalid_adms.rdf - display: 1, target_id: test.zip - display: 1, target_id: text.pdf - display: 1                               |
+      | Elastic rubber | Also aggressive.     | Aggressive Rubber | target_id: ada.png - display: 1, target_id: alan.jpg - display: 1, target_id: blaise.jpg - display: 1, target_id: charles.jpg - display: 1, target_id: leonardo.jpg - display: 1, target_id: linus.jpeg - display: 1 |
 
     When I go to the "Rubber bands" custom page
     Then the "empty.rdf" link in the Content region should be visible
@@ -193,8 +193,8 @@ Feature: "Add custom page" visibility options.
 
   Scenario Outline: Creating a custom page with a title that already exists.
     And custom_page content:
-      | title        | body        | <group>       | creation date       | state     |
-      | Rubber boots | For outside | <first title> | 2014-08-30 23:59:00 | published |
+      | title        | body        | <group>       | creation date       |
+      | Rubber boots | For outside | <first title> | 2014-08-30 23:59:00 |
 
     # It should not be possible to create a custom page with a duplicate title.
     Given I am logged in as a facilitator of the "<first title>" <group>
@@ -237,8 +237,8 @@ Feature: "Add custom page" visibility options.
   Scenario Outline: Regression test for auto generated aliases.
     # Regression test for ISAICP-8886.
     Given custom_page content:
-      | title   | body        | <type>  | creation date       | state     |
-      | <title> | For outside | <group> | 2014-08-30 23:59:00 | published |
+      | title   | body        | <type>  | creation date       |
+      | <title> | For outside | <group> | 2014-08-30 23:59:00 |
 
     When I am logged in as a moderator
     And I go to the homepage of the "<group>" <type>
diff --git a/tests/features/custom_page/community_content_listing.feature b/tests/features/custom_page/community_content_listing.feature
index 972a37252e..6c6d88301e 100644
--- a/tests/features/custom_page/community_content_listing.feature
+++ b/tests/features/custom_page/community_content_listing.feature
@@ -11,26 +11,26 @@ Feature:
       | Family name | Nine                            |
       | E-mail      | jimmy.nine@ec-europa.example.eu |
     Given collection content:
-      | title      | logo     | state     |
-      | Nintendo64 | logo.png | published |
-      | Emulators  | logo.png | published |
+      | title      | logo     |
+      | Nintendo64 | logo.png |
+      | Emulators  | logo.png |
     And custom_page content:
-      | title               | collection | created           | body                               | state     | pinned |
-      | Latest news listing | Nintendo64 | 2019-10-01 4:26am | You can find the latest news here. | published | no     |
+      | title               | collection | created           | body                               | pinned |
+      | Latest news listing | Nintendo64 | 2019-10-01 4:26am | You can find the latest news here. | no     |
     And I append "layout" to "field_paragraphs_body" field in "node" entity with following "Latest news listing" title:
       | behavior_settings | a:3:{s:17:"layout_paragraphs";a:4:{s:6:"layout";s:13:"layout_onecol";s:6:"config";a:1:{s:5:"label";s:0:"";}s:11:"parent_uuid";N;s:6:"region";N;}s:16:"background_theme";a:0:{}s:11:"extra_class";a:0:{}} |
     And news content:
-      | title                                 | collection | created           | field_paragraphs_body            | state     | pinned |
-      | Rare Nintendo64 disk drive discovered | Nintendo64 | 2018-10-01 4:26am | Magnetic drive called 64DD.      | published | no     |
-      | NEC VR4300 CPU                        | Emulators  | 2018-10-03 4:27am | Update of the emulation library. | published | no     |
+      | title                                 | collection | created           | field_paragraphs_body            | pinned |
+      | Rare Nintendo64 disk drive discovered | Nintendo64 | 2018-10-01 4:26am | Magnetic drive called 64DD.      | no     |
+      | NEC VR4300 CPU                        | Emulators  | 2018-10-03 4:27am | Update of the emulation library. | no     |
     And event content:
-      | title               | collection | created           | field_paragraphs_body                       | state     | pinned |
-      | 20 year anniversary | Nintendo64 | 2018-10-01 4:29am | The console was released in September 1996. | published | no     |
-      | 30 year anniversary | Nintendo64 | 2017-10-01 4:29am | 30 year anniversary of Nintendo64.          | published | yes    |
+      | title               | collection | created           | field_paragraphs_body                       | pinned |
+      | 20 year anniversary | Nintendo64 | 2018-10-01 4:29am | The console was released in September 1996. | no     |
+      | 30 year anniversary | Nintendo64 | 2017-10-01 4:29am | 30 year anniversary of Nintendo64.          | yes    |
     And discussion content:
-      | title                           | collection | content                 | created          | state     | pinned |
-      | What's your favourite N64 game? | Nintendo64 | Post title and reasons. | 2018-11-17 10:17 | published | no     |
-      | Searching for green pad.        | Nintendo64 | Looking for a used one. | 2018-11-17 10:18 | published | no     |
+      | title                           | collection | content                 | created          | pinned |
+      | What's your favourite N64 game? | Nintendo64 | Post title and reasons. | 2018-11-17 10:17 | no     |
+      | Searching for green pad.        | Nintendo64 | Looking for a used one. | 2018-11-17 10:18 | no     |
     And the following collection user membership:
       | collection | user      | roles       |
       | Nintendo64 | jimmy7892 | facilitator |
@@ -272,8 +272,8 @@ Feature:
 
     # Create a solution and add it to the list.
     Given solution content:
-      | title                 | state     | collection |
-      | N64 cartridge cleaner | published | Nintendo64 |
+      | title                 | collection |
+      | N64 cartridge cleaner | Nintendo64 |
     When I open the header local tasks menu
     And I click "Edit" in the "Entity actions" region
     And I "edit" from the "Custom page body" field the child 1 paragraph of 1 layout
@@ -376,20 +376,20 @@ Feature:
 
   Scenario: Test listing by keywords that contain the same word.
     Given document content:
-      | title        | keywords            | field_paragraphs_body | collection | state     |
-      | User's Guide | nintendo64 manuals  | User manual           | Nintendo64 | published |
-      | Licence      | nintendo64 licences | Licence               | Nintendo64 | published |
+      | title        | keywords            | field_paragraphs_body | collection |
+      | User's Guide | nintendo64 manuals  | User manual           | Nintendo64 |
+      | Licence      | nintendo64 licences | Licence               | Nintendo64 |
     And custom_page content:
-      | title   | collection | state     |
-      | Manuals | Nintendo64 | published |
+      | title   | collection |
+      | Manuals | Nintendo64 |
     And I append content listing to "field_paragraphs_body" field in "node" entity with following "Manuals" title with:
     """
     a:3:{s:7:"enabled";i:1;s:13:"query_presets";s:60:"entity_bundle|document
             keywords|"nintendo64 manuals"";s:5:"limit";s:2:"10";}
     """
     And custom_page content:
-      | title    | collection | state     |
-      | Licences | Nintendo64 | published |
+      | title    | collection |
+      | Licences | Nintendo64 |
     And I append content listing to "field_paragraphs_body" field in "node" entity with following "Licences" title with:
     """
     a:3:{s:7:"enabled";i:1;s:13:"query_presets";s:61:"entity_bundle|document
@@ -457,8 +457,8 @@ Feature:
   Scenario: Global search setting allows for site-wide content in the content listing.
     Given I am logged in as a moderator
     And custom_page content:
-      | title       | collection | state     |
-      | All content | Nintendo64 | published |
+      | title       | collection |
+      | All content | Nintendo64 |
     And I append "content_listing" to "field_paragraphs_body" field in "node" entity with following "All content" title:
       | content_listing:value | a:6:{s:6:"fields";a:1:{s:20:"content_listing_type";a:2:{s:6:"weight";i:0;s:6:"region";s:3:"top";}}s:7:"enabled";i:1;s:13:"query_presets";s:38:"entity_bundle\|discussion,event,news\|IN";s:5:"limit";s:2:"12";s:11:"show_shared";i:0;s:13:"global_search";i:1;} |
 
@@ -517,14 +517,14 @@ Feature:
   See https://citnet.tech.ec.europa.eu/CITnet/jira/browse/ISAICP-7040
 
     Given solution content:
-      | title                | collection | state     |
-      | Save the Planet      | Nintendo64 | published |
-      | Fight Global Warming | Nintendo64 | published |
-      | The Green Alliance   | Nintendo64 | published |
+      | title                | collection |
+      | Save the Planet      | Nintendo64 |
+      | Fight Global Warming | Nintendo64 |
+      | The Green Alliance   | Nintendo64 |
 
     And custom_page content:
-      | title   | collection | state     |
-      | Forests | Nintendo64 | published |
+      | title   | collection |
+      | Forests | Nintendo64 |
 
     Given I am logged in as jimmy7892
     And I go to the edit form of the "Forests" "custom page"
@@ -569,14 +569,14 @@ Feature:
   See https://citnet.tech.ec.europa.eu/CITnet/jira/browse/ISAICP-7183
 
     Given solution content:
-      | title              | collection | state     |
-      | Save gasoline      | Nintendo64 | published |
-      | Fight battery mode | Nintendo64 | published |
-      | Black Noise        | Nintendo64 | published |
+      | title              | collection |
+      | Save gasoline      | Nintendo64 |
+      | Fight battery mode | Nintendo64 |
+      | Black Noise        | Nintendo64 |
 
     And custom_page content:
-      | title | collection | state     | abstract |
-      | Bikes | Nintendo64 | published | N/A      |
+      | title | collection |  abstract |
+      | Bikes | Nintendo64 |  N/A      |
 
     And I am logged in as jimmy7892
     And I go to the edit form of the "Bikes" "custom page"
@@ -640,44 +640,44 @@ Feature:
   See https://citnet.tech.ec.europa.eu/CITnet/jira/browse/ISAICP-7819
 
     Given event content:
-      | title              | collection | state     | created           | start date | end date   |
-      | Event pagination 1 | Nintendo64 | published | 2016-10-09 4:29am | now +8 day | now +9 day |
-      | Event pagination 2 | Nintendo64 | published | 2016-10-08 4:29am | now +7 day | now +8 day |
-      | Event pagination 3 | Nintendo64 | published | 2015-10-07 4:29am | now +6 day | now +7 day |
-      | Event pagination 4 | Nintendo64 | published | 2014-10-06 4:29am | now +5 day | now +6 day |
-      | Event pagination 5 | Nintendo64 | published | 2014-10-05 4:29am | now +4 day | now +5 day |
-      | Event pagination 6 | Nintendo64 | published | 2013-10-04 4:29am | now +3 day | now +4 day |
-      | Event pagination 7 | Nintendo64 | published | 2012-10-03 4:29am | now +2 day | now +3 day |
-      | Event pagination 8 | Nintendo64 | published | 2011-10-02 4:29am | now +1 day | now +2 day |
-      | Event pagination 9 | Nintendo64 | published | 2010-10-01 4:29am | now        | now +1 day |
+      | title              | collection |  created           | start date | end date   |
+      | Event pagination 1 | Nintendo64 |  2016-10-09 4:29am | now +8 day | now +9 day |
+      | Event pagination 2 | Nintendo64 |  2016-10-08 4:29am | now +7 day | now +8 day |
+      | Event pagination 3 | Nintendo64 |  2015-10-07 4:29am | now +6 day | now +7 day |
+      | Event pagination 4 | Nintendo64 |  2014-10-06 4:29am | now +5 day | now +6 day |
+      | Event pagination 5 | Nintendo64 |  2014-10-05 4:29am | now +4 day | now +5 day |
+      | Event pagination 6 | Nintendo64 |  2013-10-04 4:29am | now +3 day | now +4 day |
+      | Event pagination 7 | Nintendo64 |  2012-10-03 4:29am | now +2 day | now +3 day |
+      | Event pagination 8 | Nintendo64 |  2011-10-02 4:29am | now +1 day | now +2 day |
+      | Event pagination 9 | Nintendo64 |  2010-10-01 4:29am | now        | now +1 day |
     And news content:
-      | title              | collection | state     |
-      | News pagination 1  | Nintendo64 | published |
-      | News pagination 2  | Nintendo64 | published |
-      | News pagination 3  | Nintendo64 | published |
-      | News pagination 4  | Nintendo64 | published |
-      | News pagination 5  | Nintendo64 | published |
-      | News pagination 6  | Nintendo64 | published |
-      | News pagination 7  | Nintendo64 | published |
-      | News pagination 8  | Nintendo64 | published |
-      | News pagination 9  | Nintendo64 | published |
-      | News pagination 10 | Nintendo64 | published |
-      | News pagination 11 | Nintendo64 | published |
-      | News pagination 12 | Nintendo64 | published |
-      | News pagination 13 | Nintendo64 | published |
-      | News pagination 14 | Nintendo64 | published |
-      | News pagination 15 | Nintendo64 | published |
-      | News pagination 16 | Nintendo64 | published |
-      | News pagination 17 | Nintendo64 | published |
-      | News pagination 18 | Nintendo64 | published |
-      | News pagination 19 | Nintendo64 | published |
-      | News pagination 20 | Nintendo64 | published |
-      | News pagination 21 | Nintendo64 | published |
-      | News pagination 22 | Nintendo64 | published |
-      | News pagination 23 | Nintendo64 | published |
+      | title              | collection |
+      | News pagination 1  | Nintendo64 |
+      | News pagination 2  | Nintendo64 |
+      | News pagination 3  | Nintendo64 |
+      | News pagination 4  | Nintendo64 |
+      | News pagination 5  | Nintendo64 |
+      | News pagination 6  | Nintendo64 |
+      | News pagination 7  | Nintendo64 |
+      | News pagination 8  | Nintendo64 |
+      | News pagination 9  | Nintendo64 |
+      | News pagination 10 | Nintendo64 |
+      | News pagination 11 | Nintendo64 |
+      | News pagination 12 | Nintendo64 |
+      | News pagination 13 | Nintendo64 |
+      | News pagination 14 | Nintendo64 |
+      | News pagination 15 | Nintendo64 |
+      | News pagination 16 | Nintendo64 |
+      | News pagination 17 | Nintendo64 |
+      | News pagination 18 | Nintendo64 |
+      | News pagination 19 | Nintendo64 |
+      | News pagination 20 | Nintendo64 |
+      | News pagination 21 | Nintendo64 |
+      | News pagination 22 | Nintendo64 |
+      | News pagination 23 | Nintendo64 |
     And custom_page content:
-      | title          | collection | state     |
-      | Pagination bug | Nintendo64 | published |
+      | title          | collection |
+      | Pagination bug | Nintendo64 |
     And I append "content_listing" to "field_paragraphs_body" field in "node" entity with following "Pagination bug" title:
       | content_listing:value | a:7:{s:6:"fields";a:2:{s:20:"content_listing_type";a:2:{s:6:"weight";i:-1;s:6:"region";s:3:"top";}s:22:"content_listing_status";a:2:{s:6:"weight";i:0;s:6:"region";s:3:"top";}}s:7:"enabled";i:1;s:13:"query_presets";s:18:"entity_bundle\|news";s:13:"show_archived";s:10:"unarchived";s:5:"limit";s:1:"2";s:11:"show_shared";i:0;s:13:"global_search";i:0;} |
     And I append "content_listing" to "field_paragraphs_body" field in "node" entity with following "Pagination bug" title:
@@ -709,8 +709,8 @@ Feature:
   @javascript
   Scenario: Facets are not shown when there are more than one paragraphs of the same datasource in the page.
     Given custom_page content:
-      | title                  | collection | state     |
-      | Multi paragraph facets | Nintendo64 | published |
+      | title                  | collection |
+      | Multi paragraph facets | Nintendo64 |
     And I append "content_listing" to "field_paragraphs_body" field in "node" entity with following "Multi paragraph facets" title:
       | content_listing:value | a:6:{s:6:"fields";a:1:{s:20:"content_listing_type";a:2:{s:6:"weight";i:0;s:6:"region";s:3:"top";}}s:7:"enabled";i:1;s:13:"query_presets";s:38:"entity_bundle\|discussion,event,news\|IN";s:5:"limit";s:2:"12";s:11:"show_shared";i:0;s:13:"global_search";i:1;} |
 
diff --git a/tests/features/custom_page/custom_page.delete.feature b/tests/features/custom_page/custom_page.delete.feature
index ea35539193..3e5294b636 100644
--- a/tests/features/custom_page/custom_page.delete.feature
+++ b/tests/features/custom_page/custom_page.delete.feature
@@ -10,8 +10,8 @@ Feature: "Custom page" deleteing.
       | Mickey Mouse | mickey.mouse@example.com |
       | Pluto        | pluto@example.com        |
     And <group> content:
-      | title             | description                                                                 |logo       | state       |
-      | Dumbo Collective  | Featuring a semi-anthropomorphic elephant who is cruelly nicknamed "Dumbo". | logo.png  |  published  |
+      | title            | description                                                                 | logo     |
+      | Dumbo Collective | Featuring a semi-anthropomorphic elephant who is cruelly nicknamed "Dumbo". | logo.png |
     And the following <group> user memberships:
       | <group>          | user         | roles       |
       | Dumbo Collective | Mickey Mouse | facilitator |
diff --git a/tests/features/custom_page/custom_page.edit.feature b/tests/features/custom_page/custom_page.edit.feature
index 775d60288e..102d17591e 100644
--- a/tests/features/custom_page/custom_page.edit.feature
+++ b/tests/features/custom_page/custom_page.edit.feature
@@ -22,15 +22,15 @@ Feature: "Custom page" editing.
       | Mickey Mouse | mickey.mouse@example.com |
       | Pluto        | pluto@example.com        |
     And <group> content:
-      | title            | state           |
-      | Dumbo Collective |published        |
+      | title            |
+      | Dumbo Collective |
     And the following <group> user memberships:
       | <group>          | user         | roles       |
       | Dumbo Collective | Mickey Mouse | facilitator |
       | Dumbo Collective | Pluto        | member      |
     And "custom_page" content:
-      | title                            | <group>          |abstract | body | logo     | state     |
-      | Buena Vista Distribution Company | Dumbo Collective | N/A     | N/A  | logo.png | published |
+      | title                            | <group>          | abstract | body | logo     |
+      | Buena Vista Distribution Company | Dumbo Collective | N/A      | N/A  | logo.png |
 
     # Group owner should see the button.
     When I am logged in as "Mickey Mouse"
diff --git a/tests/features/custom_page/custom_page.file_download.feature b/tests/features/custom_page/custom_page.file_download.feature
index aa242baf9c..9fb965fbac 100644
--- a/tests/features/custom_page/custom_page.file_download.feature
+++ b/tests/features/custom_page/custom_page.file_download.feature
@@ -3,15 +3,15 @@ Feature: Permalinks for custom page attachments.
 
   Scenario: Users can download attachments using the permalinks.
     Given collection content:
-      | title            | state     |
-      | Predictable name | published |
+      | title            |
+      | Predictable name |
     And custom_page content:
-      | title           | body        | collection       | attachments                                                          | state     |
-      | Predictable CP1 | Lorem ipsum | Predictable name | empty.rdf, empty_pdf.pdf, invalid_adms.rdf, test.zip, text.pdf       | published |
-      | Predictable CP2 | Lorem ipsum | Predictable name | ada.png, alan.jpg, blaise.jpg, charles.jpg, leonardo.jpg, linus.jpeg | published |
+      | title           | body        | collection       | attachments                                                          |
+      | Predictable CP1 | Lorem ipsum | Predictable name | empty.rdf, empty_pdf.pdf, invalid_adms.rdf, test.zip, text.pdf       |
+      | Predictable CP2 | Lorem ipsum | Predictable name | ada.png, alan.jpg, blaise.jpg, charles.jpg, leonardo.jpg, linus.jpeg |
     And news content:
-      | title           | headline        | collection       | state     | attachments |
-      | Predictable NC1 | Predictable NC1 | Predictable name | published | empty.rdf   |
+      | title           | headline        | collection       | attachments |
+      | Predictable NC1 | Predictable NC1 | Predictable name | empty.rdf   |
 
     When I go to "/collection/predictable-name/predictable-cp1"
     Then I should see "Predictable CP1"
diff --git a/tests/features/custom_page/custom_page.view.feature b/tests/features/custom_page/custom_page.view.feature
index 6e6fa32b0d..9e38aa8416 100644
--- a/tests/features/custom_page/custom_page.view.feature
+++ b/tests/features/custom_page/custom_page.view.feature
@@ -10,9 +10,9 @@ Feature:
       | Drafty things   | draft     |
       | Published tools | published |
     And custom_page content:
-      | title        | body         | collection      | logo     | state     |
-      | About means  | Sample text. | Drafty things   | logo.png | published |
-      | About places | Sample text. | Published tools | logo.png | published |
+      | title        | body         | collection      | logo     |
+      | About means  | Sample text. | Drafty things   | logo.png |
+      | About places | Sample text. | Published tools | logo.png |
 
     # An anonymous user can see only the custom pages of the published
     # groups.
diff --git a/tests/features/custom_page/landing_custom_page.feature b/tests/features/custom_page/landing_custom_page.feature
index 23eab3e7f7..815f5905dc 100644
--- a/tests/features/custom_page/landing_custom_page.feature
+++ b/tests/features/custom_page/landing_custom_page.feature
@@ -6,11 +6,11 @@ Feature: Landing custom page.
 
   Scenario: Manage custom landing pages
     Given collection content:
-      | title     | state     |
-      | Roman law | published |
+      | title     |
+      | Roman law |
     And custom_page content:
-      | title                       | collection | state     |
-      | Early law and jurisprudence | Roman law  | published |
+      | title                       | collection |
+      | Early law and jurisprudence | Roman law  |
 
     Given I am logged in as a "moderator"
 
diff --git a/tests/features/custom_page/navigation_menu.feature b/tests/features/custom_page/navigation_menu.feature
index a09d34b991..80a2862730 100644
--- a/tests/features/custom_page/navigation_menu.feature
+++ b/tests/features/custom_page/navigation_menu.feature
@@ -6,9 +6,9 @@ Feature: Navigation menu for custom pages
 
   Scenario Outline: Access the navigation menu through the contextual link
     Given <group> content:
-      | title            | logo     | state     |
-      | Rainbow tables   | logo.png | published |
-      | Cripple Mr Onion | logo.png | published |
+      | title            | logo     |
+      | Rainbow tables   | logo.png |
+      | Cripple Mr Onion | logo.png |
     When I am logged in as a facilitator of the "Rainbow tables" <group>
     And I go to the homepage of the "Rainbow tables" <group>
     Then the navigation menu of the "Rainbow tables" <group> should have <visible items 1> visible items
@@ -58,9 +58,9 @@ Feature: Navigation menu for custom pages
     # Create a few custom pages in the second collection so we can check if the
     # right menu shows up in each collection.
     Given custom_page content:
-      | title           | body                                                                                                                                  | <group>          | state     | topic |
-      | Eights are wild | You cannot Cripple Mr Onion if your running flush contains more wild eights than the Lesser or Great Onion you are trying to cripple. | Cripple Mr Onion | published | HR    |
-      | Eights are null | They can be included in an existing Onion in order to improve its size by one card.                                                   | Cripple Mr Onion | published | HR    |
+      | title           | body                                                                                                                                  | <group>          | topic |
+      | Eights are wild | You cannot Cripple Mr Onion if your running flush contains more wild eights than the Lesser or Great Onion you are trying to cripple. | Cripple Mr Onion | HR    |
+      | Eights are null | They can be included in an existing Onion in order to improve its size by one card.                                                   | Cripple Mr Onion | HR    |
 
     # Test as a normal member of the group.
     Given I am logged in as a member of the "Rainbow tables" <group>
@@ -118,25 +118,25 @@ Feature: Navigation menu for custom pages
   @javascript
   Scenario: Menus with items that do not fit in available space should be wrapped in a dropdown
     Given collection content:
-      | title         | state     |
-      | Plaster molds | published |
+      | title         |
+      | Plaster molds |
     And custom_page content:
-      | title              | body                   | collection    | state     | topic |
-      | Molds for candles  | This is a sample body. | Plaster molds | published | HR    |
-      | Molds for walls    | This is a sample body. | Plaster molds | published | HR    |
-      | Molds for crafts   | This is a sample body. | Plaster molds | published | HR    |
-      | Molds for pottery  | This is a sample body. | Plaster molds | published | HR    |
-      | Molds for ceramics | This is a sample body. | Plaster molds | published | HR    |
-      | Molds for soaps    | This is a sample body. | Plaster molds | published | HR    |
+      | title              | body                   | collection    | topic |
+      | Molds for candles  | This is a sample body. | Plaster molds | HR    |
+      | Molds for walls    | This is a sample body. | Plaster molds | HR    |
+      | Molds for crafts   | This is a sample body. | Plaster molds | HR    |
+      | Molds for pottery  | This is a sample body. | Plaster molds | HR    |
+      | Molds for ceramics | This is a sample body. | Plaster molds | HR    |
+      | Molds for soaps    | This is a sample body. | Plaster molds | HR    |
     # Menu items are displayed normally
     When I go to the "Plaster molds" collection
     Then I should see the link "Molds for pottery" in the "Navigation menu"
     But I should not see the text "See more" in the "Navigation menu"
     # A menu with items that do not fit the available space are in a dropdown
     Given custom_page content:
-      | title           | body                   | collection    | state     | topic |
-      | Vintage molds   | This is a sample body. | Plaster molds | published | HR    |
-      | Plaster casting | This is a sample body. | Plaster molds | published | HR    |
+      | title           | body                   | collection    | topic |
+      | Vintage molds   | This is a sample body. | Plaster molds | HR    |
+      | Plaster casting | This is a sample body. | Plaster molds | HR    |
     When I go to the "Plaster molds" collection
     Then I should see the text "See more" in the "Navigation menu"
     But I should not see the text "Plaster casting" in the "Navigation menu"
@@ -151,11 +151,11 @@ Feature: Navigation menu for custom pages
     # As a group facilitator
     # I should see a button in the navigation menu that displays options when clicked
     Given <group> content:
-      | title        | logo     | state     |
-      | Prism Gazers | logo.png | published |
+      | title        | logo     |
+      | Prism Gazers | logo.png |
     And custom_page content:
-      | title           | body                   | <group>      | state     | topic |
-      | Mists of dreams | This is a sample body. | Prism Gazers | published | HR    |
+      | title           | body                   | <group>      | topic |
+      | Mists of dreams | This is a sample body. | Prism Gazers | HR    |
     When I am logged in as a facilitator of the "Prism Gazers" <group>
     And I go to the homepage of the "Prism Gazers" <group>
     Then I should see the contextual links button in the "Navigation menu"
@@ -178,11 +178,11 @@ Feature: Navigation menu for custom pages
 
   Scenario Outline: Synchronize titles of custom pages and menu links
     Given <group> content:
-      | title                               | state     |
-      | Ravenous wood-munching alphabeavers | published |
+      | title                               |
+      | Ravenous wood-munching alphabeavers |
     And custom_page content:
-      | title       | abstract               | body                                                                | <group>                             | topic | state     |
-      | Tree eaters | entire region of trees | Given time, they will most likely strip the entire region of trees. | Ravenous wood-munching alphabeavers | HR    | published |
+      | title       | abstract               | body                                                                | <group>                             | topic |
+      | Tree eaters | entire region of trees | Given time, they will most likely strip the entire region of trees. | Ravenous wood-munching alphabeavers | HR    |
     When I am logged in as a facilitator of the "Ravenous wood-munching alphabeavers" "<group>"
     And I go to the homepage of the "Ravenous wood-munching alphabeavers" <group>
     Then I should see the link "Tree eaters" in the "Navigation menu"
@@ -203,19 +203,19 @@ Feature: Navigation menu for custom pages
 
   Scenario Outline: Only the links below the topmost page are rendered in TOC.
     Given <group> content:
-      | title                   | state     |
-      | Table of contents group | published |
+      | title                   |
+      | Table of contents group |
     And custom_page content:
-      | title         | <group>                 | state     | topic |
-      | Page 1        | Table of contents group | published | HR    |
-      | Page 2        | Table of contents group | published | HR    |
-      | Page 3        | Table of contents group | published | HR    |
-      | Subpage 1-1   | Table of contents group | published | HR    |
-      | Subpage 1-1-1 | Table of contents group | published | HR    |
-      | Subpage 1-2   | Table of contents group | published | HR    |
-      | Subpage 1-2-1 | Table of contents group | published | HR    |
-      | Subpage 1-2-2 | Table of contents group | published | HR    |
-      | Subpage 2-1   | Table of contents group | published | HR    |
+      | title         | <group>                 | topic |
+      | Page 1        | Table of contents group | HR    |
+      | Page 2        | Table of contents group | HR    |
+      | Page 3        | Table of contents group | HR    |
+      | Subpage 1-1   | Table of contents group | HR    |
+      | Subpage 1-1-1 | Table of contents group | HR    |
+      | Subpage 1-2   | Table of contents group | HR    |
+      | Subpage 1-2-1 | Table of contents group | HR    |
+      | Subpage 1-2-2 | Table of contents group | HR    |
+      | Subpage 2-1   | Table of contents group | HR    |
     And the following custom pages navigation menu structure for the "Table of contents group" <group>:
       | title         | parent      | weight |
       | Page 1        |             | 1      |
@@ -301,15 +301,15 @@ Feature: Navigation menu for custom pages
   @javascript
   Scenario Outline: Only custom page entries can be nested in the navigation menu.
     Given <group> content:
-      | title               | state     |
-      | Ergonomic backpacks | published |
+      | title               |
+      | Ergonomic backpacks |
     And custom_page content:
-      | title              | <group>             | state     | topic |
-      | Types of backpacks | Ergonomic backpacks | published | HR    |
-      | Frameless          | Ergonomic backpacks | published | HR    |
-      | External frame     | Ergonomic backpacks | published | HR    |
-      | Internal frame     | Ergonomic backpacks | published | HR    |
-      | Bodypack           | Ergonomic backpacks | published | HR    |
+      | title              | <group>             | topic |
+      | Types of backpacks | Ergonomic backpacks | HR    |
+      | Frameless          | Ergonomic backpacks | HR    |
+      | External frame     | Ergonomic backpacks | HR    |
+      | Internal frame     | Ergonomic backpacks | HR    |
+      | Bodypack           | Ergonomic backpacks | HR    |
     And the following custom pages navigation menu structure for the "Ergonomic backpacks" <group>:
       | title              | parent             | weight |
       | Types of backpacks |                    | 3      |
@@ -425,8 +425,8 @@ Feature: Navigation menu for custom pages
 
   Scenario Outline: Show appropriate menu entries in the table of contents outline.
     Given <group> content:
-      | title                     | state     |
-      | Table of contents outline | published |
+      | title                     |
+      | Table of contents outline |
     And custom_page content:
       | title      | <group>                   | state       | topic |
       | TOCO 1     | Table of contents outline | published   | HR    |
@@ -512,12 +512,12 @@ Feature: Navigation menu for custom pages
   @javascript
   Scenario Outline: Assert cache invalidation of the TOC outline.
     Given <group> content:
-      | title                            | state     |
-      | Table of contents outline cached | published |
+      | title                            |
+      | Table of contents outline cached |
     And custom_page content:
-      | title           | <group>                          | state     | topic |
-      | TOCO cached 1   | Table of contents outline cached | published | HR    |
-      | TOCO cached 1-1 | Table of contents outline cached | published | HR    |
+      | title           | <group>                          | topic |
+      | TOCO cached 1   | Table of contents outline cached | HR    |
+      | TOCO cached 1-1 | Table of contents outline cached | HR    |
     And the following custom pages navigation menu structure for the "Table of contents outline cached" <group>:
       | title           | parent        | weight |
       | TOCO cached 1   |               | 1      |
diff --git a/tests/features/featured_entities.feature b/tests/features/featured_entities.feature
index d5b1673a01..2c8713f50a 100644
--- a/tests/features/featured_entities.feature
+++ b/tests/features/featured_entities.feature
@@ -6,13 +6,13 @@ Feature: Featuring content site-wide
 
   Background:
     Given collection content:
-      | title                | state     | featured |
-      | Tidy Neutron         | published | yes      |
-      | Reborn Eternal Gamma | published | no       |
+      | title                | featured |
+      | Tidy Neutron         | yes      |
+      | Reborn Eternal Gamma | no       |
     Given solution content:
-      | title                         | collection           | state     | featured |
-      | Opensource neutron generators | Tidy Neutron         | published | yes      |
-      | Gamma-sensible spectroscopy   | Reborn Eternal Gamma | published | no       |
+      | title                         | collection           | featured |
+      | Opensource neutron generators | Tidy Neutron         | yes      |
+      | Gamma-sensible spectroscopy   | Reborn Eternal Gamma | no       |
     And users:
       | Username        | E-mail                   | Roles     |
       | Niles Turner    | niles.turner@example.com |           |
@@ -28,9 +28,9 @@ Feature: Featuring content site-wide
 
   Scenario Outline: Moderators can feature and unfeature content site-wide.
     Given <content type> content:
-      | title                               | collection   | state     | featured |
-      | Ionizing radiation types            | Tidy Neutron | published | no       |
-      | Elementary particles standard model | Tidy Neutron | published | yes      |
+      | title                               | collection   | featured |
+      | Ionizing radiation types            | Tidy Neutron | no       |
+      | Elementary particles standard model | Tidy Neutron | yes      |
 
     When I am an anonymous user
     And I go to the homepage of the "Tidy Neutron" collection
@@ -92,11 +92,11 @@ Feature: Featuring content site-wide
     When I am an anonymous user
     And I visit the <content type> overview
     Then I should see the following tiles in the correct order:
-      | <featured>   |
-      | <unfeatured> |
+      | <featured>     |
+      | <unfeatured>   |
       # The Portal collection in installed by default.
       # @see \joinup_test_install()
-      | <extra entity>       |
+      | <extra entity> |
     And I should not see the contextual link "Feature" in the "<featured>" tile
     And I should not see the contextual link "Remove from featured" in the "<unfeatured>" tile
 
diff --git a/tests/features/file_url/widget-ui.feature b/tests/features/file_url/widget-ui.feature
index f87d0c2a67..50ce5c2b8e 100644
--- a/tests/features/file_url/widget-ui.feature
+++ b/tests/features/file_url/widget-ui.feature
@@ -6,8 +6,8 @@ Feature: User interface for the File URL field
 
   Background:
     Given collection content:
-      | title            | state     |
-      | Regression tests | published |
+      | title            |
+      | Regression tests |
 
   @javascript
   Scenario: Interact with both the 'File upload' and 'External URL' options
@@ -41,8 +41,8 @@ Feature: User interface for the File URL field
 
   Scenario: User should be able to remove entity even document's entities do not exist
     Given solution content:
-      | title                      | documentation | state     | collection       |
-      | Solution without documents | text.pdf      | published | Regression tests |
+      | title                      | documentation | collection       |
+      | Solution without documents | text.pdf      | Regression tests |
     And I delete documents from "Solution without documents" solution
 
     Given I am logged in as a moderator
diff --git a/tests/features/glossary/glossary.feature b/tests/features/glossary/glossary.feature
index 761804fdd9..469a8bb01f 100644
--- a/tests/features/glossary/glossary.feature
+++ b/tests/features/glossary/glossary.feature
@@ -8,14 +8,14 @@ Feature: As a moderator or group facilitator I want to be able to add, edit and
       | Username | Roles  |
       | <user>   | <role> |
     And collection content:
-      | title             | state     |
-      | A World of Things | published |
+      | title             |
+      | A World of Things |
     And the following collection user membership:
       | collection        | user   | roles     |
       | A World of Things | <user> | <og role> |
     And solution content:
-      | title          | collection        | state     |
-      | Things To Come | A World of Things | published |
+      | title          | collection        |
+      | Things To Come | A World of Things |
 
     Given I am logged in as <user>
     When I go to the "A World of Things" collection
@@ -140,36 +140,36 @@ Feature: As a moderator or group facilitator I want to be able to add, edit and
 
   Scenario: Glossary terms should be shown as links in collection content
     Given collection content:
-      | title                    | state     | description                                                                                       | abstract                              |
-      | Collection With Glossary | published | Colors of Paradise. Abbreviated as CLR. <a href="../contact"><strong>Colors of Dream</strong></a> | The Alphabet is back and it's s/ashy. |
+      | title                    | description                                                                                       | abstract                              |
+      | Collection With Glossary | Colors of Paradise. Abbreviated as CLR. <a href="../contact"><strong>Colors of Dream</strong></a> | The Alphabet is back and it's s/ashy. |
     And solution content:
-      | title            | description | state     | collection               |
-      | Under The Bridge | No Colors   | published | Collection With Glossary |
+      | title            | description | collection               |
+      | Under The Bridge | No Colors   | Collection With Glossary |
     And release content:
-      | title        | release number | release notes         | is version of    | state     |
-      | Summer of 69 | 6.22           | Everything was Colors | Under The Bridge | published |
+      | title        | release number | release notes         | is version of    |
+      | Summer of 69 | 6.22           | Everything was Colors | Under The Bridge |
     And distribution content:
-      | title   | description          | solution         | release      | access url         | state     |
-      | Distro1 | Alphabet & CLR       | Under The Bridge |              | http://example.com | published |
-      | Distro2 | Colors & ABC & colrs |                  | Summer of 69 | http://example.com | published |
+      | title   | description          | solution         | release      | access url         |
+      | Distro1 | Alphabet & CLR       | Under The Bridge |              | http://example.com |
+      | Distro2 | Colors & ABC & colrs |                  | Summer of 69 | http://example.com |
     And custom_page content:
-      | title    | body              | solution         | state     |
-      | Schedule | Colors everywhere | Under The Bridge | published |
+      | title    | body              | solution         |
+      | Schedule | Colors everywhere | Under The Bridge |
     And discussion content:
-      | title        | content                   | collection               | state     |
-      | The Big Talk | The Alphabet. Call it ABC | Collection With Glossary | published |
+      | title        | content                   | collection               |
+      | The Big Talk | The Alphabet. Call it ABC | Collection With Glossary |
     And document content:
-      | title             | abstract           | collection               | state     |
-      | Authentic Papyrus | Authentic abstract | Collection With Glossary | published |
+      | title             | abstract           | collection               |
+      | Authentic Papyrus | Authentic abstract | Collection With Glossary |
     And I append "simple_paragraph" to "field_paragraphs_body" field in "node" entity with following "Authentic Papyrus" title:
       | field_body:value  | Alphabet is back |
       | field_body:format | content_editor   |
     And event content:
-      | title      | field_paragraphs_body             | solution         | state     |
-      | Soho Night | Any cOLOrs You Like. Maybe colrs? | Under The Bridge | published |
+      | title      | field_paragraphs_body             | solution         |
+      | Soho Night | Any cOLOrs You Like. Maybe colrs? | Under The Bridge |
     And news content:
-      | title         | field_paragraphs_body                      | solution         | state     |
-      | Won at Bingo! | aBC is for ALPHABET what CLR is for Colors | Under The Bridge | published |
+      | title         | field_paragraphs_body                      | solution         |
+      | Won at Bingo! | aBC is for ALPHABET what CLR is for Colors | Under The Bridge |
     And glossary content:
       | title    | synonyms  | summary                  | definition                  | collection               |
       | Alphabet | ABC       | Summary of Alphabet      | Long, long definition field | Collection With Glossary |
@@ -243,9 +243,9 @@ Feature: As a moderator or group facilitator I want to be able to add, edit and
       | mod      | moderator |
       | fac1     |           |
     And collection content:
-      | title                    | description                                                                                            | abstract                                                                                              | state     |
-      | Collection With Glossary | The Battle of Evermore of the batTle and the BATTLE. Call it everMore or EVERmore. Also battle again.  | The Battle of Evermore of the batTle and the BATTLE. Call it everMore or EVERmore. Also battle again. | published |
-      | The Other Collection     | desc                                                                                                   | desc                                                                                                  | published |
+      | title                    | description                                                                                           | abstract                                                                                              |
+      | Collection With Glossary | The Battle of Evermore of the batTle and the BATTLE. Call it everMore or EVERmore. Also battle again. | The Battle of Evermore of the batTle and the BATTLE. Call it everMore or EVERmore. Also battle again. |
+      | The Other Collection     | desc                                                                                                  | desc                                                                                                  |
     And the following collection user membership:
       | collection               | user | roles       |
       | Collection With Glossary | fac  | facilitator |
@@ -321,9 +321,9 @@ Feature: As a moderator or group facilitator I want to be able to add, edit and
       | Username |
       | ben      |
     And collection content:
-      | title             | state     |
-      | A World of Things | published |
-      | Other collection  | published |
+      | title             |
+      | A World of Things |
+      | Other collection  |
 
     And the following collection user membership:
       | collection        | user | roles       |
@@ -417,8 +417,8 @@ Feature: As a moderator or group facilitator I want to be able to add, edit and
       | Username | Roles     |
       | mod      | moderator |
     And collection content:
-      | title                    | description                                                                                                             | state     |
-      | Collection With Glossary | The Battle of Evermore of the <strong>batTle</strong> and the BATTLE. Call it everMore or EVERmore. Also, battle again. | published |
+      | title                    | description                                                                                                             |
+      | Collection With Glossary | The Battle of Evermore of the <strong>batTle</strong> and the BATTLE. Call it everMore or EVERmore. Also, battle again. |
     And the following collection user membership:
       | collection               | user | roles       |
       | Collection With Glossary | mod  | facilitator |
@@ -442,8 +442,8 @@ Feature: As a moderator or group facilitator I want to be able to add, edit and
       | fac      |           |
       | mod      | moderator |
     And collection content:
-      | title                    | description                   | abstract                         | state     | author | uri                      |
-      | Collection With Glossary | The Battle of Evermore again. | The Battle of Evermore abstract. | published | auth   | http://collection-battle |
+      | title                    | description                   | abstract                         | author | uri                      |
+      | Collection With Glossary | The Battle of Evermore again. | The Battle of Evermore abstract. | auth   | http://collection-battle |
     And the following collection user membership:
       | collection               | user | roles       |
       | Collection With Glossary | fac  | facilitator |
diff --git a/tests/features/homepage.feature b/tests/features/homepage.feature
index c1a1c3ca2d..31471839ea 100644
--- a/tests/features/homepage.feature
+++ b/tests/features/homepage.feature
@@ -36,17 +36,17 @@ Feature: Homepage
 
   Scenario: Latest news is shown on the homepage
     Given collection content:
-      | title             | state     |
-      | Shaping of nature | published |
+      | title             |
+      | Shaping of nature |
     And the following "Remote video" media:
       | name      | video                                       | group             | uuid                                 |
       | The Video | https://www.youtube.com/watch?v=C0DPdy98e4c | Shaping of nature | 32b3beae-2218-11ee-be56-0242ac120002 |
     And news content:
-      | title                       | headline                 | collection        | topic                                                 | state     | published at         | abstract                    | field_paragraphs_body                                                                                                                                                                                                                                                                                                                                                       |
-      | Current biodiversity crisis | Preserve habitats        | Shaping of nature | Finance in EU, Supplier exchange, E-health, E-justice | published | 2021-04-26T19:09:00Z | We have some abstract here. | Here we combine global maps of human populations and land use over the past 12000 y with current biodiversity data to show that nearly <em>three quarters of nature has long been shaped by histories of human habitation</em> and use by indigenous peoples.                                                                                                               |
-      | Environmental stewardship   | Transformative practices | Shaping of nature | Employment and Support Allowance                      | published | 2021-01-27T16:12:00Z |                             | With rare exceptions current biodiversity losses are caused not by human conversion or degradation of untouched ecosystems but rather by the appropriation colonization and intensification of use in lands inhabited and used by prior societies.                                                                                                                          |
-      | Spatial reconstruction      | Loss of wildlands        | Shaping of nature | HR, Statistics and Analysis, E-justice                | published | 2021-02-28T13:15:00Z |                             | Global land use history confirms that empowering the environmental stewardship of Indigenous peoples and local communities will be critical to conserving biodiversity across the planet.                                                                                                                                                                                   |
-      | Earlier transformations     | Ecosystem management     | Shaping of nature | EU and European Policies                              | published | 2021-03-29T10:18:00Z |                             | <p><drupal-media data-entity-type="media" data-entity-uuid="32b3beae-2218-11ee-be56-0242ac120002">&nbsp;</drupal-media>Archaeological evidence shows that by 10000 BCE all societies employed ecologically transformative land use practices including burning hunting species propagation domestication cultivation have left long-term legacies across the biosphere.</p> |
+      | title                       | headline                 | collection        | topic                                                 | published at          | abstract                    | field_paragraphs_body                                                                                                                                                                                                                                                                                                                                                       |
+      | Current biodiversity crisis | Preserve habitats        | Shaping of nature | Finance in EU, Supplier exchange, E-health, E-justice | 2021-04-26T19:09:00Z  | We have some abstract here. | Here we combine global maps of human populations and land use over the past 12000 y with current biodiversity data to show that nearly <em>three quarters of nature has long been shaped by histories of human habitation</em> and use by indigenous peoples.                                                                                                               |
+      | Environmental stewardship   | Transformative practices | Shaping of nature | Employment and Support Allowance                      | p2021-01-27T16:12:00Z |                             | With rare exceptions current biodiversity losses are caused not by human conversion or degradation of untouched ecosystems but rather by the appropriation colonization and intensification of use in lands inhabited and used by prior societies.                                                                                                                          |
+      | Spatial reconstruction      | Loss of wildlands        | Shaping of nature | HR, Statistics and Analysis, E-justice                | 2021-02-28T13:15:00Z  |                             | Global land use history confirms that empowering the environmental stewardship of Indigenous peoples and local communities will be critical to conserving biodiversity across the planet.                                                                                                                                                                                   |
+      | Earlier transformations     | Ecosystem management     | Shaping of nature | EU and European Policies                              | 2021-03-29T10:18:00Z  |                             | <p><drupal-media data-entity-type="media" data-entity-uuid="32b3beae-2218-11ee-be56-0242ac120002">&nbsp;</drupal-media>Archaeological evidence shows that by 10000 BCE all societies employed ecologically transformative land use practices including burning hunting species propagation domestication cultivation have left long-term legacies across the biosphere.</p> |
     When I am on the homepage
     Then the latest news section should contain the following news articles:
       | date   | topics                                      | title                       | body                                                                                                                                                                                                       |
@@ -68,17 +68,17 @@ Feature: Homepage
       | title         | state     |
       | Mice in space | published |
     And news content:
-      | title       | headline       | collection    | topic                                                 | state     | logo       | field_paragraphs_body |
-      | New muscles | Muscle atrophy | Mice in space | Finance in EU, Supplier exchange, E-health, E-justice | published | blaise.jpg | <news body>           |
+      | title       | headline       | collection    | topic                                                 | logo       | field_paragraphs_body |
+      | New muscles | Muscle atrophy | Mice in space | Finance in EU, Supplier exchange, E-health, E-justice | blaise.jpg | <news body>           |
     And discussion content:
-      | title                | collection    | topic                            | state     | logo    | body                                                                                                                                                                                       |
-      | Influence of gravity | Mice in space | Employment and Support Allowance | published | ada.png | Space exploration has brought about many scientific and technological advances, yet manned spaceflights come at a cost to astronauts, including reduced skeletal muscle mass and strength. |
+      | title                | collection    | topic                            | logo    | body                                                                                                                                                                                       |
+      | Influence of gravity | Mice in space | Employment and Support Allowance | ada.png | Space exploration has brought about many scientific and technological advances, yet manned spaceflights come at a cost to astronauts, including reduced skeletal muscle mass and strength. |
     And document content:
-      | title        | collection    | topic                                  | state     | logo     | abstract                                                                                                                                                                                        |
-      | Microgravity | Mice in space | HR, Statistics and Analysis, E-justice | published | alan.jpg | Conventional studies investigating the effects of reduced gravity on muscle mass and function have used a ground control group that is not directly comparable to the space experimental group. |
+      | title        | collection    | topic                                  | logo     | abstract                                                                                                                                                                                        |
+      | Microgravity | Mice in space | HR, Statistics and Analysis, E-justice | alan.jpg | Conventional studies investigating the effects of reduced gravity on muscle mass and function have used a ground control group that is not directly comparable to the space experimental group. |
     And event content:
-      | title           | collection    | topic                    | state     | logo        | abstract                                                                                                                                                                                        | field_paragraphs_body                                                                                                                                                                 |
-      | Stay at the ISS | Mice in space | EU and European Policies | published | charles.jpg | Abstract: Two groups of mice (six per group) were housed aboard the International Space Station for 35 days. One group was subjected to artificial gravity (1 g) and the other to microgravity. | Two groups of mice (six per group) were housed aboard the International Space Station for 35 days. One group was subjected to artificial gravity (1 g) and the other to microgravity. |
+      | title           | collection    | topic                    | logo        | abstract                                                                                                                                                                                        | field_paragraphs_body                                                                                                                                                                 |
+      | Stay at the ISS | Mice in space | EU and European Policies | charles.jpg | Abstract: Two groups of mice (six per group) were housed aboard the International Space Station for 35 days. One group was subjected to artificial gravity (1 g) and the other to microgravity. | Two groups of mice (six per group) were housed aboard the International Space Station for 35 days. One group was subjected to artificial gravity (1 g) and the other to microgravity. |
     And the "In the spotlight" content listing contains:
       | type    | label           |
       | content | New muscles     |
@@ -102,8 +102,8 @@ Feature: Homepage
 
   Scenario Outline: Community content be highlighted on the homepage
     Given collection content:
-      | title              | state     |
-      | Clash of documents | published |
+      | title              |
+      | Clash of documents |
     And <type> content:
       | title        | headline     | collection         | topic                              | state     | logo     |
       | Microgravity | Microgravity | Clash of documents | HR, E-justice                      | published | alan.jpg |
diff --git a/tests/features/isa2_analytics/site_search.feature b/tests/features/isa2_analytics/site_search.feature
index 70a0179d6e..7522b41bb7 100644
--- a/tests/features/isa2_analytics/site_search.feature
+++ b/tests/features/isa2_analytics/site_search.feature
@@ -12,8 +12,8 @@ Feature: Site search
 
   Scenario: Search results should contain a total count when results are available.
     And collection content:
-      | title                  | description               | abstract               | state     | creation date    | modification date |
-      | Collection total count | No description available. | No abstract available. | published | 03-08-2023 12:05 | 03-04-2022 12:05  |
+      | title                  | description               | abstract               | creation date    | modification date |
+      | Collection total count | No description available. | No abstract available. | 03-08-2023 12:05 | 03-04-2022 12:05  |
     And news content:
       | title                | headline             | abstract | field_paragraphs_body | collection             | state     | created    | changed    |
       | News total count     | News total count     |          | No body available.    | Collection total count | published | 01/01/2019 | 03/03/2022 |
diff --git a/tests/features/isa2_analytics/site_sections.feature b/tests/features/isa2_analytics/site_sections.feature
index 9b5012d5ac..fc5cbc9a69 100644
--- a/tests/features/isa2_analytics/site_sections.feature
+++ b/tests/features/isa2_analytics/site_sections.feature
@@ -6,17 +6,17 @@ Feature: Site sections
 
   Background:
     Given collection content:
-      | uri                                              | title                | state     |
-      | http://joinup.eu/collection/the-polygone-project | The Polygone Project | published |
+      | uri                                              | title                |
+      | http://joinup.eu/collection/the-polygone-project | The Polygone Project |
     And solution content:
-      | title            | collection           | state     |
-      | Miss Fashionista | The Polygone Project | published |
+      | title            | collection           |
+      | Miss Fashionista | The Polygone Project |
     And discussion content:
-      | title         | body       | state     | collection           |
-      | Deep Carnival | Now online | published | The Polygone Project |
+      | title         | body       | collection           |
+      | Deep Carnival | Now online | The Polygone Project |
     And event content:
-      | title                      | state     | solution         |
-      | Flat Beat 20th Anniversary | published | Miss Fashionista |
+      | title                      | solution         |
+      | Flat Beat 20th Anniversary | Miss Fashionista |
 
   Scenario: Reporting of site sections to the analytics platform
     # Check a couple of pages that do not belong to a particular collection or
diff --git a/tests/features/joinup_bookmark/bookmark.feature b/tests/features/joinup_bookmark/bookmark.feature
index 2f51469b69..38d09045b6 100644
--- a/tests/features/joinup_bookmark/bookmark.feature
+++ b/tests/features/joinup_bookmark/bookmark.feature
@@ -10,11 +10,11 @@ Feature: Bookmark/Unbookmark feature.
       | Lisa Bookmark    | lisa@bookmark.com    | bookmark123!#$l | Lisa       | Bookmark    |
       | Gregory Bookmark | gregory@bookmark.com | bookmark123!#$g | Gregory    | Bookmark    |
     Given collection content:
-      | title  | state     |
-      | Batman | published |
+      | title  |
+      | Batman |
     Given solution content:
-      | title         | state     | collection |
-      | Batman Begins | published | Batman     |
+      | title         | collection |
+      | Batman Begins | Batman     |
 
   Scenario Outline: User can Bookmark/unbookmark rdf.
     When I am logged in as "Gregory Bookmark"
@@ -38,8 +38,8 @@ Feature: Bookmark/Unbookmark feature.
 
   Scenario Outline: User can bookmark content.
     And <content type> content:
-      | title            | solution      | state     |
-      | Bookmark content | Batman Begins | published |
+      | title            | solution      |
+      | Bookmark content | Batman Begins |
 
     When I am logged in as "Gregory Bookmark"
     And I go to the content page of the type "<content type>" with the title "Bookmark content"
@@ -77,11 +77,11 @@ Feature: Bookmark/Unbookmark feature.
 
   Scenario: User bookmark page.
     And news content:
-      | title               | solution      | state     |
-      | Bookmark news one   | Batman Begins | published |
-      | Bookmark news two   | Batman Begins | published |
-      | Bookmark news three | Batman Begins | published |
-      | Ohter news          | Batman Begins | published |
+      | title               | solution      |
+      | Bookmark news one   | Batman Begins |
+      | Bookmark news two   | Batman Begins |
+      | Bookmark news three | Batman Begins |
+      | Ohter news          | Batman Begins |
 
     # Add small delays between flaggings so they have different creation dates,
     # important when checking the order later (granularity: seconds).
diff --git a/tests/features/joinup_core/input_filter.feature b/tests/features/joinup_core/input_filter.feature
index 6fc08a864a..296a1d89a1 100644
--- a/tests/features/joinup_core/input_filter.feature
+++ b/tests/features/joinup_core/input_filter.feature
@@ -6,25 +6,25 @@ Feature: Input filter
 
   Background:
     Given collection content:
-      | title         | logo     | state     |
-      | Netflix group | logo.png | published |
+      | title         | logo     |
+      | Netflix group | logo.png |
 
   Scenario: Ensure all required formats are supported in the content editor.
     Given the following "Image" media:
       | name         | image    | alt                  | group         | uuid          |
       | Inline image | logo.png | Image media alt text | Netflix group | whatever uuid |
     And discussion content:
-      | title                   | body                                                                                                                                                                                                                                                                                                                                                                                                                                           | collection    | state     |
-      | Jessica Jones returns   | <iframe width="560" height="315" src="https://www.youtube.com/embed/nWHUjuJ8zxE" frameborder="0" allowfullscreen></iframe>                                                                                                                                                                                                                                                                                                                     | Netflix group | published |
-      | Luke cage               | <iframe width="50" height="50" src="https://www.example.com" ></iframe>                                                                                                                                                                                                                                                                                                                                                                        | Netflix group | published |
-      | Slideshare presentation | <iframe src="//www.slideshare.net/slideshow/embed_code/key/hJ3x3pTrtGaatQ" width="595" height="485" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" style="border:1px solid #CCC; border-width:1px; margin-bottom:5px; max-width: 100%;" allowfullscreen> </iframe>                                                                                                                                                            | Netflix group | published |
-      | Google docs             | <iframe frameborder="0" height="800" marginheight="0" marginwidth="0" src="https://docs.google.com/forms/d/1dBGzMp9whY2Ibxf4pUQNadpE2C3ywxdDefSSM3BdwJ4/viewform?embedded=true" width="100%">Loading...</iframe>                                                                                                                                                                                                                               | Netflix group | published |
-      | Interoperable Europe Portal iframe           | <iframe frameborder="0" height="800" marginheight="0" marginwidth="0" src="/homepage" width="100%"></iframe>                                                                                                                                                                                                                                                                                                                                   | Netflix group | published |
-      | Quoted texts            | <q>This is a famous quote.</q> ~ Interoperable Europe Portal developer.                                                                                                                                                                                                                                                                                                                                                                                             | Netflix group | published |
+      | title                              | body                                                                                                                                                                                                                                                                                | collection    |
+      | Jessica Jones returns              | <iframe width="560" height="315" src="https://www.youtube.com/embed/nWHUjuJ8zxE" frameborder="0" allowfullscreen></iframe>                                                                                                                                                          | Netflix group |
+      | Luke cage                          | <iframe width="50" height="50" src="https://www.example.com" ></iframe>                                                                                                                                                                                                             | Netflix group |
+      | Slideshare presentation            | <iframe src="//www.slideshare.net/slideshow/embed_code/key/hJ3x3pTrtGaatQ" width="595" height="485" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" style="border:1px solid #CCC; border-width:1px; margin-bottom:5px; max-width: 100%;" allowfullscreen> </iframe> | Netflix group |
+      | Google docs                        | <iframe frameborder="0" height="800" marginheight="0" marginwidth="0" src="https://docs.google.com/forms/d/1dBGzMp9whY2Ibxf4pUQNadpE2C3ywxdDefSSM3BdwJ4/viewform?embedded=true" width="100%">Loading...</iframe>                                                                    | Netflix group |
+      | Interoperable Europe Portal iframe | <iframe frameborder="0" height="800" marginheight="0" marginwidth="0" src="/homepage" width="100%"></iframe>                                                                                                                                                                        | Netflix group |
+      | Quoted texts                       | <q>This is a famous quote.</q> ~ Interoperable Europe Portal developer.                                                                                                                                                                                                             | Netflix group |
       # Since area coordinates contains commas and we don't want this to be interpreted as multiple values we need to enclose the value with double quotes and escape the quotes in the HTML.
-      | Image map               | "<map name=""imagemap""><area shape=""circle"" coords=""50,50,25"" href=""/"" alt=""Homepage""/></map><img usemap=""imagemap"" src=""/images/my-image.png"" alt=""Imagemap example"" />"                                                                                                                                                                                                                                                       | Netflix group | published |
-      | Accessibility planning  | Accessibility planning is framed in the context of social exclusion within transport planning <img src="/web/sites/default/files/logo.png" />                                                                                                                                                                                                                                                                                                  | Netflix group | published |
-      | Accessibility rating    | The Accessibility Rating Matrix (ARM) <drupal-media data-entity-type="media" data-entity-uuid="whatever uuid" />                                                                                                                                                                                                                                                                                                                               | Netflix group | published |
+      | Image map                          | "<map name=""imagemap""><area shape=""circle"" coords=""50,50,25"" href=""/"" alt=""Homepage""/></map><img usemap=""imagemap"" src=""/images/my-image.png"" alt=""Imagemap example"" />"                                                                                            | Netflix group |
+      | Accessibility planning             | Accessibility planning is framed in the context of social exclusion within transport planning <img src="/web/sites/default/files/logo.png" />                                                                                                                                       | Netflix group |
+      | Accessibility rating               | The Accessibility Rating Matrix (ARM) <drupal-media data-entity-type="media" data-entity-uuid="whatever uuid" />                                                                                                                                                                    | Netflix group |
 
     # 'src' attributes are the url encoded version of the URLs that were inputted prepended by the ec cck url.
     When I go to the "Jessica Jones returns" discussion
@@ -58,8 +58,8 @@ Feature: Input filter
   @javascript
   Scenario: Tags h1, h5, h6 can exist in a formatted text but the user does not have these options on the editor.
     Given discussion content:
-      | title         | headline      | body                                                                                                  | collection    | state     |
-      | Ragged Crying | Ragged Crying | <h1>test h1</h1> <h2>test h2</h2> <h3>test h3</h3> <h4>test h4</h4> <h5>test h5</h5> <h6>test h6</h6> | Netflix group | published |
+      | title         | headline      | body                                                                                                  | collection    |
+      | Ragged Crying | Ragged Crying | <h1>test h1</h1> <h2>test h2</h2> <h3>test h3</h3> <h4>test h4</h4> <h5>test h5</h5> <h6>test h6</h6> | Netflix group |
 
     When I am logged in as a moderator
     And I go to the "Ragged Crying" discussion
@@ -78,8 +78,8 @@ Feature: Input filter
   @backtrackLimit
   Scenario: Ensure really long HTML tag (e.g. < img > with src:data/image...) does not generate a fatal error.
     Given discussion content:
-      | title         | headline       | body                        | collection    | state     |
-      | Famous actors | Famous peoples | Article about famous actors | Netflix group | published |
+      | title         | headline       | body                        | collection    | state |
+      | Famous actors | Famous peoples | Article about famous actors | Netflix group |
     And I set long body of "Famous actors" discussion
 
     When I go to the "Famous actors" discussion
diff --git a/tests/features/joinup_core/manage_content.feature b/tests/features/joinup_core/manage_content.feature
index 71e545305e..19e3b876d1 100644
--- a/tests/features/joinup_core/manage_content.feature
+++ b/tests/features/joinup_core/manage_content.feature
@@ -5,9 +5,9 @@ Feature:
 
   Scenario: Use the content management UI
     Given collection content:
-      | title        | state     |
-      | Vintage Art  | published |
-      | Decadent Art | published |
+      | title        |
+      | Vintage Art  |
+      | Decadent Art |
     And user:
       | Username | Vasundhara Commentator |
     And document content:
@@ -15,21 +15,21 @@ Feature:
       | The Panama Papers | Document      | Vintage Art | published | 2019-11-19 20:00 |
       | The Area 51 File  | Document      | Vintage Art | draft     | 2018-11-19 21:00 |
     And discussion content:
-      | title               | collection  | state     | created    | published at     | changed    |
-      | The Ultimate Debate | Vintage Art | published | 2016-11-19 | 2016-11-19       | 2016-11-19 |
+      | title               | collection  | created    | published at | changed    |
+      | The Ultimate Debate | Vintage Art | 2016-11-19 | 2016-11-19   | 2016-11-19 |
     And comments:
       | message             | author                 | parent              | created          | changed    |
       | Conducting a Debate | Vasundhara Commentator | The Ultimate Debate | 2017-06-12 19:00 | 1497294000 |
     And event content:
-      | title                    | collection  | state     |
-      | Version 2.0 Launch Party | Vintage Art | published |
+      | title                    | collection  |
+      | Version 2.0 Launch Party | Vintage Art |
     And news content:
-      | title                              | collection  | state     |
-      | Exports Leap Despite Currency Gain | Vintage Art | published |
+      | title                              | collection  |
+      | Exports Leap Despite Currency Gain | Vintage Art |
     And custom_page content:
-      | title                | collection  | state     | changed          |
-      | HOWTOs               | Vintage Art | published | 2016-11-19 20:00 |
-      | Looking for Support? | Vintage Art | published | 2015-11-19 20:00 |
+      | title                | collection  | changed          |
+      | HOWTOs               | Vintage Art | 2016-11-19 20:00 |
+      | Looking for Support? | Vintage Art | 2015-11-19 20:00 |
     And the following custom page navigation menu structure for the "Vintage Art" collection:
       | title                | parent |
       | Looking for Support? | HOWTOs |
@@ -218,14 +218,14 @@ Feature:
 
   Scenario: Move a custom page to a solution
     Given collection content:
-      | title       | state     |
-      | Vintage Art | published |
+      | title       |
+      | Vintage Art |
     Given solution content:
-      | title                | state     |
-      | Vintage Solution Art | published |
+      | title                |
+      | Vintage Solution Art |
     And custom_page content:
-      | title                       | collection  | state     | changed          |
-      | Will be moved to a solution | Vintage Art | published | 2015-11-19 20:00 |
+      | title                       | collection  | changed          |
+      | Will be moved to a solution | Vintage Art | 2015-11-19 20:00 |
 
     Given I am logged in as a moderator
     And I go to the manage content page of "Vintage Art"
@@ -242,12 +242,12 @@ Feature:
   @javascript
   Scenario Outline: Able to select all items on the content management UI
     Given collection content:
-      | title       | state     |
-      | Vintage Art | published |
+      | title       |
+      | Vintage Art |
     And event content:
-      | title                   | collection  | state     |
-      | The Panama Papers Party | Vintage Art | published |
-      | The Area 51 Party       | Vintage Art | published |
+      | title                   | collection  |
+      | The Panama Papers Party | Vintage Art |
+      | The Area 51 Party       | Vintage Art |
 
     When I am <role>
     And I go to the manage content page of "Vintage Art"
@@ -266,22 +266,22 @@ Feature:
 
   Scenario: Releases can only be transferred to solutions.
     Given collection content:
-      | title        | state     |
-      | Collection 1 | published |
-      | Collection 2 | published |
+      | title        |
+      | Collection 1 |
+      | Collection 2 |
     Given solution content:
-      | title      | state     | collection   |
-      | Solution 1 | published | Collection 1 |
-      | Solution 2 | published | Collection 2 |
+      | title      | collection   |
+      | Solution 1 | Collection 1 |
+      | Solution 2 | Collection 2 |
     And event content:
-      | title   | solution   | state     |
-      | Event 1 | Solution 1 | published |
+      | title   | solution   |
+      | Event 1 | Solution 1 |
     And release content:
-      | title     | release number | release notes | is version of | state     |
-      | Release 1 | 1.0            | Release notes | Solution 1    | published |
+      | title     | release number | release notes | is version of |
+      | Release 1 | 1.0            | Release notes | Solution 1    |
     And distribution content:
-      | title          | description | release   | access url         | state     |
-      | Distribution 1 | Description | Release 1 | http://example.com | published |
+      | title          | description | release   | access url         |
+      | Distribution 1 | Description | Release 1 | http://example.com |
 
     When I am logged in as a moderator
     And I go to the manage content page of "Solution 1"
diff --git a/tests/features/joinup_core/owner_deletion.feature b/tests/features/joinup_core/owner_deletion.feature
index c8a85aec3d..8fadb532fc 100644
--- a/tests/features/joinup_core/owner_deletion.feature
+++ b/tests/features/joinup_core/owner_deletion.feature
@@ -12,8 +12,8 @@ Feature: Deletion of collection and solution owners
       | Group member   |           | Group      | member      |
       | Site moderator | moderator | Site       | moderator   |
     And <type> content:
-      | title          | state      |
-      | An owned group | published  |
+      | title          |
+      | An owned group |
     And the following <type> user memberships:
       | <type>         | user          | roles |
       | An owned group | Group owner 1 | owner |
diff --git a/tests/features/joinup_core/pathauto.feature b/tests/features/joinup_core/pathauto.feature
index 54b696b6ef..84b6ac312b 100644
--- a/tests/features/joinup_core/pathauto.feature
+++ b/tests/features/joinup_core/pathauto.feature
@@ -6,40 +6,40 @@ Feature:
 
   Scenario: Entities should have distinct pathauto aliases.
     Given collection content:
-      | title               | logo     | state     |
-      | Pathauto collection | logo.png | published |
+      | title               | logo     |
+      | Pathauto collection | logo.png |
     And solution content:
-      | title             | description       | state     | collection          |
-      | Pathauto solution | Pathauto solution | published | Pathauto collection |
+      | title             | description       | collection          |
+      | Pathauto solution | Pathauto solution | Pathauto collection |
     And release content:
-      | title            | release number | release notes    | is version of     | state     |
-      | Pathauto release | 23             | Pathauto release | Pathauto solution | published |
+      | title            | release number | release notes    | is version of     |
+      | Pathauto release | 23             | Pathauto release | Pathauto solution |
     And distribution content:
-      | title                 | description           | solution          | state     |
-      | Pathauto distribution | Pathauto distribution | Pathauto solution | published |
+      | title                 | description           | solution          |
+      | Pathauto distribution | Pathauto distribution | Pathauto solution |
     And licence content:
       | title            | description      |
       | Pathauto licence | Pathauto licence |
     And discussion content:
-      | title                 | body                  | collection          | solution          | state     |
-      | Pathauto discussion   | Pathauto discussion   | Pathauto collection |                   | published |
-      | Pathauto discussion 2 | Pathauto discussion 2 |                     | Pathauto solution | published |
+      | title                 | body                  | collection          | solution          |
+      | Pathauto discussion   | Pathauto discussion   | Pathauto collection |                   |
+      | Pathauto discussion 2 | Pathauto discussion 2 |                     | Pathauto solution |
     And document content:
-      | title               | field_paragraphs_body | collection          | solution          | state     |
-      | Pathauto document   | Pathauto document     | Pathauto collection |                   | published |
-      | Pathauto document 2 | Pathauto document 2   |                     | Pathauto solution | published |
+      | title               | field_paragraphs_body | collection          | solution          |
+      | Pathauto document   | Pathauto document     | Pathauto collection |                   |
+      | Pathauto document 2 | Pathauto document 2   |                     | Pathauto solution |
     And event content:
-      | title            | field_paragraphs_body | collection          | solution          | state     |
-      | Pathauto event   | Pathauto event        | Pathauto collection |                   | published |
-      | Pathauto event 2 | Pathauto event 2      |                     | Pathauto solution | published |
+      | title            | field_paragraphs_body | collection          | solution          |
+      | Pathauto event   | Pathauto event        | Pathauto collection |                   |
+      | Pathauto event 2 | Pathauto event 2      |                     | Pathauto solution |
     And news content:
-      | title           | body            | collection          | solution          | state     |
-      | Pathauto news   | Pathauto news   | Pathauto collection |                   | published |
-      | Pathauto news 2 | Pathauto news 2 |                     | Pathauto solution | published |
+      | title           | body            | collection          | solution          |
+      | Pathauto news   | Pathauto news   | Pathauto collection |                   |
+      | Pathauto news 2 | Pathauto news 2 |                     | Pathauto solution |
     And custom_page content:
-      | title                    | body          | collection          | solution          | state     |
-      | Pathauto collection page | Pathauto page | Pathauto collection |                   | published |
-      | Pathauto solution page   | Pathauto page |                     | Pathauto solution | published |
+      | title                    | body          | collection          | solution          |
+      | Pathauto collection page | Pathauto page | Pathauto collection |                   |
+      | Pathauto solution page   | Pathauto page |                     | Pathauto solution |
 
     When I go to the "Pathauto collection" collection
     Then the url should match "collection/pathauto-collection"
diff --git a/tests/features/joinup_core/persistent_uris.feature b/tests/features/joinup_core/persistent_uris.feature
index 027d740f8a..cbfad67c6f 100644
--- a/tests/features/joinup_core/persistent_uris.feature
+++ b/tests/features/joinup_core/persistent_uris.feature
@@ -6,14 +6,14 @@ Feature:
 
   Scenario: Entities should have distinct URI pattern
     Given collection content:
-      | title                 | logo     | state     | uri                                                            |
-      | Persistent collection | logo.png | published | http://data.europa.eu/w21/37b8103e-26e5-4c81-8ce5-43ced02ff7d0 |
+      | title                 | logo     | uri                                                            |
+      | Persistent collection | logo.png | http://data.europa.eu/w21/37b8103e-26e5-4c81-8ce5-43ced02ff7d0 |
     And solution content:
-      | title               | collection            | description                     | state     | uri                                                            |
-      | Persistent solution | Persistent collection | Persistent solution description | published | http://data.europa.eu/w21/ffb0ffc9-7704-45d3-95b3-42706b6320e5 |
+      | title               | collection            | description                     | uri                                                            |
+      | Persistent solution | Persistent collection | Persistent solution description | http://data.europa.eu/w21/ffb0ffc9-7704-45d3-95b3-42706b6320e5 |
     And release content:
-      | title              | release number | release notes      | is version of       | state     | uri                                                            |
-      | Persistent release | 23             | Persistent release | Persistent solution | published | http://data.europa.eu/w21/98004ec9-62f3-4734-a1b6-af7e4838b09c |
+      | title              | release number | release notes      | is version of       | uri                                                            |
+      | Persistent release | 23             | Persistent release | Persistent solution | http://data.europa.eu/w21/98004ec9-62f3-4734-a1b6-af7e4838b09c |
     And distribution content:
       | title                   | description             | access url | solution            | uri                                                            |
       | Persistent distribution | Persistent distribution | test.zip   | Persistent solution | http://data.europa.eu/w21/643a2a52-da3b-4594-92bb-295d8134e1fb |
@@ -35,20 +35,20 @@ Feature:
       | http://data.europa.eu/dr8/Dream/Domain | Dream Domain | You're safe from pain in the dream domain. |
 
     And discussion content:
-      | title                 | body                  | collection            | state     |
-      | Persistent discussion | Persistent discussion | Persistent collection | published |
+      | title                 | body                  | collection            |
+      | Persistent discussion | Persistent discussion | Persistent collection |
     And document content:
-      | title               | field_paragraphs_body | collection            | state     |
-      | Persistent document | Persistent document   | Persistent collection | published |
+      | title               | field_paragraphs_body | collection            |
+      | Persistent document | Persistent document   | Persistent collection |
     And event content:
-      | title            | field_paragraphs_body | collection            | state     |
-      | Persistent event | Persistent event      | Persistent collection | published |
+      | title            | field_paragraphs_body | collection            |
+      | Persistent event | Persistent event      | Persistent collection |
     And news content:
-      | title           | body            | collection            | state     |
-      | Persistent news | Persistent news | Persistent collection | published |
+      | title           | body            | collection            |
+      | Persistent news | Persistent news | Persistent collection |
     And custom_page content:
-      | title           | body            | collection            | state     |
-      | Persistent page | Persistent page | Persistent collection | published |
+      | title           | body            | collection            |
+      | Persistent page | Persistent page | Persistent collection |
 
     When I go to the "Persistent release" release
     Then the persistent url should contain "http://data.europa.eu/w21"
diff --git a/tests/features/joinup_core/plusbutton.feature b/tests/features/joinup_core/plusbutton.feature
index 422a1fbf0d..166ae022d9 100644
--- a/tests/features/joinup_core/plusbutton.feature
+++ b/tests/features/joinup_core/plusbutton.feature
@@ -6,8 +6,8 @@ Feature: Plus button
 
   Scenario: Plus button shown when actions are available.
     Given solution content:
-      | title            | description                              | state     |
-      | Simple solutions | Conplex problems call for easy solutions | published |
+      | title            | description                              |
+      | Simple solutions | Conplex problems call for easy solutions |
 
     When I am logged in as a facilitator of the "Simple solutions" solution
     And I go to the homepage of the "Simple solutions" solution
diff --git a/tests/features/joinup_core/reporting.feature b/tests/features/joinup_core/reporting.feature
index 20dd81f017..8394335658 100644
--- a/tests/features/joinup_core/reporting.feature
+++ b/tests/features/joinup_core/reporting.feature
@@ -56,14 +56,14 @@ Feature:
   # This scenario is a light test to avoid regressions.
   Scenario: Moderators can access the list of published solutions and filter them by dates and type.
     Given collection content:
-      | title               | state     |
-      | Monday's Artificial | published |
-      | Restless Burst      | published |
+      | title               |
+      | Monday's Artificial |
+      | Restless Burst      |
     Given solution content:
-      | title           | collection          | state     | creation date    | modification date | solution type                                   |
-      | Worthy Puppet   | Monday's Artificial | published | 2003-01-31T23:00 | 2015-12-07T13:57  | Interoperability Specification, Logging Service |
-      | Long Artificial | Restless Burst      | published | 2012-09-14T00:00 | 2012-12-04T16:19  | Networking Infrastructure Enablers              |
-      | Beta Frozen     | Restless Burst      | published | 2017-10-15T14:54 | 2017-11-24T12:43  | Data Owner                                      |
+      | title           | collection          | creation date    | modification date | solution type                                   |
+      | Worthy Puppet   | Monday's Artificial | 2003-01-31T23:00 | 2015-12-07T13:57  | Interoperability Specification, Logging Service |
+      | Long Artificial | Restless Burst      | 2012-09-14T00:00 | 2012-12-04T16:19  | Networking Infrastructure Enablers              |
+      | Beta Frozen     | Restless Burst      | 2017-10-15T14:54 | 2017-11-24T12:43  | Data Owner                                      |
 
     Given I am logged in as a moderator
     And I click "Reporting" in the "Administration toolbar" region
diff --git a/tests/features/joinup_core/social_share.feature b/tests/features/joinup_core/social_share.feature
index 349273b3a5..1f8260e24f 100644
--- a/tests/features/joinup_core/social_share.feature
+++ b/tests/features/joinup_core/social_share.feature
@@ -6,11 +6,11 @@ Feature: Sharing content on social networks
 
   Scenario Outline: Sharing content on Facebook, Twitter and Linkedin.
     Given collection content:
-      | title           | state     |
-      | Social networks | published |
+      | title           |
+      | Social networks |
     And <content type> content:
-      | title                 | collection      | state     |
-      | Important information | Social networks | published |
+      | title                 | collection      |
+      | Important information | Social networks |
 
     When I am an anonymous user
     And I go to the content page of the type "<content type>" with the title "Important information"
@@ -33,11 +33,11 @@ Feature: Sharing content on social networks
 
   Scenario: Sharing solutions on social media.
     Given collection content:
-      | title           | state     |
-      | Social networks | published |
+      | title           |
+      | Social networks |
     Given solution content:
-      | title              | collection      | state     |
-      | Important solution | Social networks | published |
+      | title              | collection      |
+      | Important solution | Social networks |
 
     When I am logged in as a user with the "authenticated" role
     And I go to "/solutions"
diff --git a/tests/features/joinup_core/transfer_group_ownership.feature b/tests/features/joinup_core/transfer_group_ownership.feature
index 7b1169f376..fc6de84c62 100644
--- a/tests/features/joinup_core/transfer_group_ownership.feature
+++ b/tests/features/joinup_core/transfer_group_ownership.feature
@@ -13,8 +13,8 @@ Feature: As a group (collection or solution) owner or site moderator
       | light    | moderator               | Bjartur    | Jóhannsson    |
       | frozen   |                         | Edda       | Agnarsdóttir  |
     And collection content:
-      | title                       | state     |
-      | Intensive Language Learning | published |
+      | title                       |
+      | Intensive Language Learning |
     And the following collection user memberships:
       | collection                  | user   | roles       |
       | Intensive Language Learning | loner  |             |
@@ -22,8 +22,8 @@ Feature: As a group (collection or solution) owner or site moderator
       | Intensive Language Learning | shy    | facilitator |
       | Intensive Language Learning | frozen | owner       |
     And solution content:
-      | title                   | state     |
-      | Learn German in 1 Month | published |
+      | title                   |
+      | Learn German in 1 Month |
     And the following solution user memberships:
       | solution                | user   | roles       |
       | Learn German in 1 Month | loner  |             |
@@ -86,13 +86,13 @@ Feature: As a group (collection or solution) owner or site moderator
       | body      | <full name> has changed your role in <type> "<title>" to facilitator. |
 
     Examples:
-      | user  | option exists | type       | type capitalized | title                       | full name               | user name            |
-      | happy | contain       | collection | Collection       | Intensive Language Learning | The Portal Support Team | Saga Þórirsdóttir    |
-      | light | contain       | collection | Collection       | Intensive Language Learning | The Portal Support Team | Bjartur Jóhannsson   |
-      | cruel | not contain   | collection | Collection       | Intensive Language Learning | Finnur Robertsson       | Finnur Robertsson    |
-      | happy | contain       | solution   | Solution         | Learn German in 1 Month     | The Portal Support Team | Saga Þórirsdóttir    |
-      | light | contain       | solution   | Solution         | Learn German in 1 Month     | The Portal Support Team | Bjartur Jóhannsson   |
-      | cruel | not contain   | solution   | Solution         | Learn German in 1 Month     | Finnur Robertsson       | Finnur Robertsson    |
+      | user  | option exists | type       | type capitalized | title                       | full name               | user name          |
+      | happy | contain       | collection | Collection       | Intensive Language Learning | The Portal Support Team | Saga Þórirsdóttir  |
+      | light | contain       | collection | Collection       | Intensive Language Learning | The Portal Support Team | Bjartur Jóhannsson |
+      | cruel | not contain   | collection | Collection       | Intensive Language Learning | Finnur Robertsson       | Finnur Robertsson  |
+      | happy | contain       | solution   | Solution         | Learn German in 1 Month     | The Portal Support Team | Saga Þórirsdóttir  |
+      | light | contain       | solution   | Solution         | Learn German in 1 Month     | The Portal Support Team | Bjartur Jóhannsson |
+      | cruel | not contain   | solution   | Solution         | Learn German in 1 Month     | Finnur Robertsson       | Finnur Robertsson  |
 
   Scenario Outline: Group facilitators do not have access to transfer ownership.
     Given I am logged in as "shy"
@@ -106,11 +106,11 @@ Feature: As a group (collection or solution) owner or site moderator
 
   Scenario: Collection owner cannot transfer ownership of a child solution, neither viceversa.
     Given collection content:
-      | title   | state     |
-      | Babylon | published |
+      | title   |
+      | Babylon |
     And solution content:
-      | title             | collection | state     |
-      | Rivers Of Babylon | Babylon    | published |
+      | title             | collection |
+      | Rivers Of Babylon | Babylon    |
     And collection user membership:
       | collection | user  | roles       |
       | Babylon    | shy   | owner       |
diff --git a/tests/features/joinup_discussion/discussion.view.feature b/tests/features/joinup_discussion/discussion.view.feature
index dc9c1f68cc..f1dc989f74 100644
--- a/tests/features/joinup_discussion/discussion.view.feature
+++ b/tests/features/joinup_discussion/discussion.view.feature
@@ -4,11 +4,11 @@ Feature: View discussion API
 
   Scenario: Programmatically create a discussion
     And collection content:
-      | title                | state     |
-      | Parallel programming | published |
+      | title                |
+      | Parallel programming |
     Given discussion content:
-      | title                | content                  | collection           | state     |
-      | Fearless concurrency | Let us have a discussion | Parallel programming | published |
+      | title                | content                  | collection           |
+      | Fearless concurrency | Let us have a discussion | Parallel programming |
     Then I should have a "Discussion" page titled "Fearless concurrency"
 
     # Check that the basic fields are visible.
diff --git a/tests/features/joinup_discussion/last_activity.feature b/tests/features/joinup_discussion/last_activity.feature
index d3aed8cc21..9ba665be5d 100644
--- a/tests/features/joinup_discussion/last_activity.feature
+++ b/tests/features/joinup_discussion/last_activity.feature
@@ -5,12 +5,12 @@ Feature: Last Activity feature
 
   Scenario: The discussion tile should show the last activity box.
     Given collection content:
-      | title                         | description       | state     |
-      | Development through bricolage | Bricolage 101.    | published |
-      | Carrots love tomatoes         | Truth is out now. | published |
+      | title                         | description       |
+      | Development through bricolage | Bricolage 101.    |
+      | Carrots love tomatoes         | Truth is out now. |
     And discussion content:
-      | title         | state     | collection                    | shared on             | created    | changed    |
-      | Tools cabinet | published | Development through bricolage | Carrots love tomatoes | 01-01-2023 | 01-01-2023 |
+      | title         | collection                    | shared on             | created    | changed    |
+      | Tools cabinet | Development through bricolage | Carrots love tomatoes | 01-01-2023 | 01-01-2023 |
     And users:
       | Username     | Roles | E-mail                   | First name | Family name |
       | alicia__1997 |       | AliciaPotter@example.com | Alicia     | Potter      |
diff --git a/tests/features/joinup_discussion/pin_discussion.feature b/tests/features/joinup_discussion/pin_discussion.feature
index 86a22b4f78..b975cfdfd4 100644
--- a/tests/features/joinup_discussion/pin_discussion.feature
+++ b/tests/features/joinup_discussion/pin_discussion.feature
@@ -6,18 +6,18 @@ Feature: Pinning discussion entities
 
   Background:
     Given collection content:
-      | title                   | state     |
-      | Green Wrench collection | published |
+      | title                   |
+      | Green Wrench collection |
     Given solution content:
-      | title                | state     |
-      | Blue Wrench solution | published |
+      | title                |
+      | Blue Wrench solution |
 
   @javascript
   Scenario Outline: Pinned discussions should show a visual cue in discussions page.
     Given discussion content:
-      | title       | headline    | solution   | collection   | state     | pinned |
-      | Lantern FAQ | Lantern FAQ | <solution> | <collection> | published | yes    |
-      | Lantern TCA | Lantern TCA | <solution> | <collection> | published | no     |
+      | title       | headline    | solution   | collection   | pinned |
+      | Lantern FAQ | Lantern FAQ | <solution> | <collection> | yes    |
+      | Lantern TCA | Lantern TCA | <solution> | <collection> | no     |
 
     When I go to the discussions page of "<parent>"
     Then the "Lantern FAQ" tile should be marked as pinned
diff --git a/tests/features/joinup_distribution/add_asset_distribution.feature b/tests/features/joinup_distribution/add_asset_distribution.feature
index 31aa61598a..365ff9c849 100644
--- a/tests/features/joinup_distribution/add_asset_distribution.feature
+++ b/tests/features/joinup_distribution/add_asset_distribution.feature
@@ -6,14 +6,14 @@ Feature: Add distribution through the UI
 
   Background:
     Given collection content:
-      | title                   | logo     | state     |
-      | Asset Distribution Test | logo.png | published |
+      | title                   | logo     |
+      | Asset Distribution Test | logo.png |
     And solution content:
-      | title                  | collection              | description                      | state     |
-      | Solution random x name | Asset Distribution Test | Some reusable random description | published |
+      | title                  | collection              | description                      |
+      | Solution random x name | Asset Distribution Test | Some reusable random description |
     And release content:
-      | title                | release notes        | release number | creation date    | is version of          | status    | state     |
-      | Authoritarian Alpaca | First public release | 1.0.0          | 2019-11-19 20:45 | Solution random x name | Completed | published |
+      | title                | release notes        | release number | creation date    | is version of          | status    |
+      | Authoritarian Alpaca | First public release | 1.0.0          | 2019-11-19 20:45 | Solution random x name | Completed |
     And licence content:
       | title              | description                                              | deprecated |
       | WTFPL              | The WTFPL is a rather permissive licence                 | no         |
@@ -143,8 +143,8 @@ Feature: Add distribution through the UI
 
   Scenario: Adding a distribution with a duplicate title
     Given solution content:
-      | title               | description             | state     |
-      | Solubility of gases | Affected by temperature | published |
+      | title               | description             |
+      | Solubility of gases | Affected by temperature |
     And release content:
       | title                | release notes        | is version of       |
       | 1.0.0 Adolf Sieverts | First public release | Solubility of gases |
@@ -175,8 +175,8 @@ Feature: Add distribution through the UI
 
   Scenario: Distributions with the same name should not be allowed within the same solution.
     Given distribution content:
-      | title            | description        | access url | solution               | state     |
-      | Windows - source | Sample description | test.zip   | Solution random x name | published |
+      | title            | description        | access url | solution               |
+      | Windows - source | Sample description | test.zip   | Solution random x name |
     And I am logged in as a facilitator of the "Solution random x name" solution
     When I go to the homepage of the "Solution random x name" solution
     And I click "Add distribution" in the plus button menu
@@ -190,9 +190,9 @@ Feature: Add distribution through the UI
       | title                  | description                                                                    |
       | Boost Software License | It is a permissive license in the style of the BSD license and the MIT license |
     And distribution content:
-      | title        | licence                | solution               | state     | creation date    | modification date |
-      | Hot Snake    | WTFPL                  | Solution random x name | published | 2019-11-19 20:45 | 2021-11-19 20:45  |
-      | Quality Yard | Boost Software License | Solution random x name | published | 2019-12-19 20:45 | 2021-12-19 20:45  |
+      | title        | licence                | solution               | creation date    | modification date |
+      | Hot Snake    | WTFPL                  | Solution random x name | 2019-11-19 20:45 | 2021-11-19 20:45  |
+      | Quality Yard | Boost Software License | Solution random x name | 2019-12-19 20:45 | 2021-12-19 20:45  |
 
     When I go to the homepage of the "Solution random x name" solution
     # Distributions are still shown in the solution page and so the License text will be visible in the page.
@@ -211,8 +211,8 @@ Feature: Add distribution through the UI
   # Regression test for ticket ISAICP-9239
   Scenario Outline: Check distribution cannot be serialized to JsonLD object.
     Given distribution content:
-      | title   | description        | access url   | solution               | state     |
-      | <title> | Sample description | <access url> | Solution random x name | published |
+      | title   | description        | access url   | solution               |
+      | <title> | Sample description | <access url> | Solution random x name |
     When I go to the "<title>" distribution
     And the page should contain the html text '<script type="application/ld+json">'
 
diff --git a/tests/features/joinup_distribution/asset_distribution.archive.feature b/tests/features/joinup_distribution/asset_distribution.archive.feature
index 4555da75c8..a9d8413870 100644
--- a/tests/features/joinup_distribution/asset_distribution.archive.feature
+++ b/tests/features/joinup_distribution/asset_distribution.archive.feature
@@ -3,8 +3,8 @@ Feature: Asset distribution content archival.
 
   Scenario: Asset distribution content can be archived any time.
     Given solution content:
-      | title            | state     |
-      | Some AD solution | published |
+      | title            |
+      | Some AD solution |
     And licence content:
       | title  | description                               | deprecated |
       | WTFPLA | The WTFPLA is a rather permissive licence | no         |
diff --git a/tests/features/joinup_distribution/asset_distribution.delete.feature b/tests/features/joinup_distribution/asset_distribution.delete.feature
index 7f9ecc9248..c587869a21 100644
--- a/tests/features/joinup_distribution/asset_distribution.delete.feature
+++ b/tests/features/joinup_distribution/asset_distribution.delete.feature
@@ -6,8 +6,8 @@ Feature: Asset distribution deleting.
 
   Scenario: "Delete" button should be shown to facilitators of the related solution.
     Given solution content:
-      | title                 | description        | state     |
-      | Rough valentine's day | Sample description | published |
+      | title                 | description        |
+      | Rough valentine's day | Sample description |
     And users:
       | Username   | E-mail                |
       | Papa Roach | paparoach@example.com |
@@ -15,8 +15,8 @@ Feature: Asset distribution deleting.
       | solution              | user       | roles                      |
       | Rough valentine's day | Papa roach | administrator, facilitator |
     And distribution content:
-      | title            | description    | access url | solution              | state     |
-      | Francesco's cats | Sample content | test.zip   | Rough valentine's day | published |
+      | title            | description    | access url | solution              |
+      | Francesco's cats | Sample content | test.zip   | Rough valentine's day |
 
     When I am logged in as a facilitator of the "Rough valentine's day" solution
     And I go to the homepage of the "Francesco's cats" distribution
@@ -26,5 +26,5 @@ Feature: Asset distribution deleting.
     And I press "Delete"
     Then the following email should have been sent:
       | recipient | Papa Roach                                                                                        |
-      | subject   | Interoperable Europe Portal: A distribution has been deleted                                                           |
+      | subject   | Interoperable Europe Portal: A distribution has been deleted                                      |
       | body      | The distribution Francesco's cats of the solution Rough valentine's day was successfully deleted. |
diff --git a/tests/features/joinup_distribution/asset_distribution.edit.feature b/tests/features/joinup_distribution/asset_distribution.edit.feature
index 61f7c259ce..67f61baa8f 100644
--- a/tests/features/joinup_distribution/asset_distribution.edit.feature
+++ b/tests/features/joinup_distribution/asset_distribution.edit.feature
@@ -10,12 +10,12 @@ Feature: Asset distribution editing.
       | Gregg Hill   | Gregg.Hill@example.com   | Gregg      | Hill        |       |
       | Pedro Torres | Pedro.Torres@example.com | Pedro      | Torres      |       |
     And collection content:
-      | title              | state     |
-      | Collection example | published |
+      | title              |
+      | Collection example |
     Given solution content:
-      | title      | collection         | description        | state     |
-      | Solution A | Collection example | Sample description | published |
-      | Solution B | Collection example | Sample description | published |
+      | title      | collection         | description        |
+      | Solution A | Collection example | Sample description |
+      | Solution B | Collection example | Sample description |
     And licence content:
       | title | description                         | deprecated |
       | LGPL  | The LGPL more permisssive than GPL. | yes        |
@@ -23,8 +23,8 @@ Feature: Asset distribution editing.
       | title                 | release number | release notes       | is version of |
       | Asset release example | C3PO           | Release description | Solution A    |
     And distribution content:
-      | title                      | description        | licence | access url | release               | state     | published at     | modification date |
-      | Asset distribution example | Sample description | LGPL    | test.zip   | Asset release example | published | 2019-11-19       | 2021-11-19        |
+      | title                      | description        | licence | access url | release               | published at | modification date |
+      | Asset distribution example | Sample description | LGPL    | test.zip   | Asset release example | 2019-11-19   | 2021-11-19        |
     And the following solution user membership:
       | solution   | user         | roles       |
       | Solution A | Gregg Hill   | owner       |
@@ -73,9 +73,9 @@ Feature: Asset distribution editing.
     Then I should see the heading "Asset distribution example revised"
     And the following email should have been sent:
       | recipient | Gregg Hill                                                                                                                                          |
-      | subject   | Interoperable Europe Portal: A distribution has been updated                                                                                                             |
+      | subject   | Interoperable Europe Portal: A distribution has been updated                                                                                        |
       | body      | The distribution Asset distribution example revised of the release Asset release example, C3PO of the solution Solution A was successfully updated. |
     And the following email should have been sent:
       | recipient | Pedro Torres                                                                                                                                        |
-      | subject   | Interoperable Europe Portal: A distribution has been updated                                                                                                             |
+      | subject   | Interoperable Europe Portal: A distribution has been updated                                                                                        |
       | body      | The distribution Asset distribution example revised of the release Asset release example, C3PO of the solution Solution A was successfully updated. |
diff --git a/tests/features/joinup_distribution/track_download.feature b/tests/features/joinup_distribution/track_download.feature
index 2e2acb0e7a..1524808a41 100644
--- a/tests/features/joinup_distribution/track_download.feature
+++ b/tests/features/joinup_distribution/track_download.feature
@@ -10,19 +10,19 @@ Feature: Asset distribution editing.
       | title            | description                          | licence type  |
       | Postcard licence | Send a postcard from where you live. | Public domain |
     And collection content:
-      | title                           | state     |
-      | Berkeley Software Distributions | published |
+      | title                           |
+      | Berkeley Software Distributions |
     And solution content:
-      | title   | collection                      | state     |
-      | OpenBSD | Berkeley Software Distributions | published |
+      | title   | collection                      |
+      | OpenBSD | Berkeley Software Distributions |
     And release content:
-      | title        | release number | is version of | state     |
-      | Winter of 95 | 6.1            | OpenBSD       | published |
+      | title        | release number | is version of |
+      | Winter of 95 | 6.1            | OpenBSD       |
     And distribution content:
-      | title          | description                 | solution | release      | access url                                                  | licence          | state     |
-      | i386           | The i386 version            |          | Winter of 95 | https://mirrors.evowise.com/pub/OpenBSD/6.1/i386/random.iso | Postcard licence | published |
-      | Changelog      | Detailed Changelog          |          | Winter of 95 | text.pdf                                                    | Postcard licence | published |
-      | OpenBSD images | Images for logos and flyers | OpenBSD  |              | test.zip                                                    | Postcard licence | published |
+      | title          | description                 | solution | release      | access url                                                  | licence          |
+      | i386           | The i386 version            |          | Winter of 95 | https://mirrors.evowise.com/pub/OpenBSD/6.1/i386/random.iso | Postcard licence |
+      | Changelog      | Detailed Changelog          |          | Winter of 95 | text.pdf                                                    | Postcard licence |
+      | OpenBSD images | Images for logos and flyers | OpenBSD  |              | test.zip                                                    | Postcard licence |
     And users:
       | Username       | E-mail                     |
       | Bradley Emmett | bradley.emmett@example.com |
@@ -89,16 +89,16 @@ Feature: Asset distribution editing.
       | user1    | user1@example.com |
       | user2    | user2@example.com |
     And solution content:
-      | title    | state     |
-      | Solution | published |
+      | title    |
+      | Solution |
     And release content:
-      | title     | is version of | state     |
-      | Release 1 | Solution      | published |
+      | title     | is version of |
+      | Release 1 | Solution      |
     And distribution content:
-      | title          | solution | release   | access url | state     |
-      | Distribution 1 |          | Release 1 | text.pdf   | published |
-      | Distribution 2 | Solution |           | test.zip   | published |
-      | Distribution 3 | Solution |           | test1.zip  | published |
+      | title          | solution | release   | access url |
+      | Distribution 1 |          | Release 1 | text.pdf   |
+      | Distribution 2 | Solution |           | test.zip   |
+      | Distribution 3 | Solution |           | test1.zip  |
     And the following distribution download events:
       | distribution   | user                |
       | Distribution 1 | visitor@example.com |
diff --git a/tests/features/joinup_document/add_document.collection.feature b/tests/features/joinup_document/add_document.collection.feature
index 75f74a5ca6..adc72d07ff 100644
--- a/tests/features/joinup_document/add_document.collection.feature
+++ b/tests/features/joinup_document/add_document.collection.feature
@@ -6,9 +6,9 @@ Feature: "Add document" visibility options.
 
   Scenario: "Add document" button should not be shown to normal members, authenticated users and anonymous users.
     Given collection content:
-      | title                   | logo     | state     |
-      | Ring of Truth           | logo.png | published |
-      | The Storms of the Waves | logo.png | published |
+      | title                   | logo     |
+      | Ring of Truth           | logo.png |
+      | The Storms of the Waves | logo.png |
 
     When I am logged in as an "authenticated user"
     And I go to the homepage of the "Ring of Truth" collection
@@ -41,8 +41,8 @@ Feature: "Add document" visibility options.
       | Family name | Andries           |
       | E-mail      | eandr@example.com |
     And collection content:
-      | title                | logo     | state     |
-      | Hunter in the Swords | logo.png | published |
+      | title                | logo     |
+      | Hunter in the Swords | logo.png |
     And the following collection user membership:
       | collection           | user      | roles       |
       | Hunter in the Swords | napcheese | facilitator |
@@ -95,14 +95,14 @@ Feature: "Add document" visibility options.
   # @see https://citnet.tech.ec.europa.eu/CITnet/jira/browse/ISAICP-3670
   Scenario: Remote URLs can be used in documents.
     Given collection content:
-      | title         | state     |
-      | Strong Lasers | published |
+      | title         |
+      | Strong Lasers |
     And licence content:
       | title                 | description                                                         | licence type  |
       | Creative Commons Zero | CC0 is a legal tool for waiving as many rights as legally possible. | Public domain |
     And document content:
-      | title       | document type | short title | file type | file                   | abstract | field_paragraphs_body | licence               | state     | collection    |
-      | Laser types | document      | L-Types     | remote    | http://www.example.com | Abstract | List of laser types.  | Creative Commons Zero | published | Strong Lasers |
+      | title       | document type | short title | file type | file                   | abstract | field_paragraphs_body | licence               | collection    |
+      | Laser types | document      | L-Types     | remote    | http://www.example.com | Abstract | List of laser types.  | Creative Commons Zero | Strong Lasers |
 
     When I am logged in as a facilitator of the "Strong Lasers" collection
     And I go to the "Laser types" document
@@ -112,14 +112,14 @@ Feature: "Add document" visibility options.
 
   Scenario: Increase attachment file size limit in Documents.
     Given collection content:
-      | title      | state     |
-      | Red blaser | published |
+      | title      |
+      | Red blaser |
     And licence content:
       | title                 | description                                                         | licence type  |
       | Creative Commons Zero | CC0 is a legal tool for waiving as many rights as legally possible. | Public domain |
     And document content:
-      | title            | document type | short title | abstract | field_paragraphs_body | licence               | state     | collection |
-      | Red blaser types | document      | RL-Types    | Abstract | List of laser types.  | Creative Commons Zero | published | Red blaser |
+      | title            | document type | short title | abstract | field_paragraphs_body | licence               | collection |
+      | Red blaser types | document      | RL-Types    | Abstract | List of laser types.  | Creative Commons Zero | Red blaser |
 
     When I am logged in as a facilitator of the "Red blaser" collection
     And I go to the "Red blaser types" document
diff --git a/tests/features/joinup_document/add_document.solution.feature b/tests/features/joinup_document/add_document.solution.feature
index 077509e3b3..70ebe4cefe 100644
--- a/tests/features/joinup_document/add_document.solution.feature
+++ b/tests/features/joinup_document/add_document.solution.feature
@@ -6,12 +6,12 @@ Feature: "Add document" visibility options.
 
   Scenario: "Add document" button should not be shown to normal members, authenticated users and anonymous users.
     Given collection content:
-      | title                   | logo     | state     |
-      | Collective Seventh Name | logo.png | published |
+      | title                   | logo     |
+      | Collective Seventh Name | logo.png |
     Given solution content:
-      | title               | collection              | logo     | state     |
-      | Seventh Name        | Collective Seventh Name | logo.png | published |
-      | The Obsessed Stream | Collective Seventh Name | logo.png | published |
+      | title               | collection              | logo     |
+      | Seventh Name        | Collective Seventh Name | logo.png |
+      | The Obsessed Stream | Collective Seventh Name | logo.png |
 
     When I am logged in as an "authenticated user"
     And I go to the homepage of the "Seventh Name" solution
@@ -34,11 +34,11 @@ Feature: "Add document" visibility options.
 
   Scenario: Add document as a facilitator.
     Given collection content:
-      | title                          | logo     | state     |
-      | Collective Winter of Beginning | logo.png | published |
+      | title                          | logo     |
+      | Collective Winter of Beginning | logo.png |
     Given solution content:
-      | title               | collection                     | logo     | state     |
-      | Winter of Beginning | Collective Winter of Beginning | logo.png | published |
+      | title               | collection                     | logo     |
+      | Winter of Beginning | Collective Winter of Beginning | logo.png |
     And I am logged in as a facilitator of the "Winter of Beginning" solution
 
     When I go to the homepage of the "Winter of Beginning" solution
diff --git a/tests/features/joinup_document/document.edit.feature b/tests/features/joinup_document/document.edit.feature
index 197fe51fa0..34f2a51fa9 100644
--- a/tests/features/joinup_document/document.edit.feature
+++ b/tests/features/joinup_document/document.edit.feature
@@ -9,14 +9,14 @@ Feature: "Document page" editing.
       | Username |
       | <user>   |
     And collection content:
-      | title        | description        | state     |
-      | <collection> | Sample description | published |
+      | title        | description        |
+      | <collection> | Sample description |
     And the following collection user memberships:
       | collection   | user   | roles  |
       | <collection> | <user> | <role> |
     And "document" content:
-      | title      | author | collection   | state     |
-      | <document> | <user> | <collection> | published |
+      | title      | author | collection   |
+      | <document> | <user> | <collection> |
     When I am logged in as "<user>"
     And I go to the "<document>" document
     Then I should see the link "Edit" in the "Entity actions" region
@@ -34,14 +34,14 @@ Feature: "Document page" editing.
       | Username    |
       | Peter Floyd |
     Given solution content:
-      | title                  | description        | state     |
-      | Predator in the Future | Sample description | published |
+      | title                  | description        |
+      | Predator in the Future | Sample description |
     And the following solution user memberships:
       | solution               | user        | roles       |
       | Predator in the Future | Peter Floyd | facilitator |
     And "document" content:
-      | title        | author      | solution               | state     |
-      | Prized Cloud | Peter Floyd | Predator in the Future | published |
+      | title        | author      | solution               |
+      | Prized Cloud | Peter Floyd | Predator in the Future |
     When I am logged in as "Peter Floyd"
     And I go to the "Prized Cloud" document
     Then I should see the link "Edit" in the "Entity actions" region
diff --git a/tests/features/joinup_document/document.overview.feature b/tests/features/joinup_document/document.overview.feature
index 6df7023234..48e56b68a8 100644
--- a/tests/features/joinup_document/document.overview.feature
+++ b/tests/features/joinup_document/document.overview.feature
@@ -10,12 +10,12 @@ Feature: "Document" overview.
       | title        | description                                      | licence type  |
       | Beer licence | Offer a beer to the developer when you meet him. | Public domain |
     And collection content:
-      | title           | state     |
-      | Traveller tools | published |
+      | title           |
+      | Traveller tools |
     And document content:
-      | title                      | document type | short title           | file type | file                                                        | field_paragraphs_body                           | collection      | licence      | state     |
-      | VAT refund sample document | document      | VAT refund fac-simile | upload    | text.pdf                                                    | Valid for people living outside the EU.         | Traveller tools | Beer licence | published |
-      | Local maps archive         | document      | Local maps            | remote    | https://github.com/ec-europa/joinup-dev/archive/develop.zip | Contains maps with the top locations in the EU. | Traveller tools | Beer licence | published |
+      | title                      | document type | short title           | file type | file                                                        | field_paragraphs_body                           | collection      | licence      |
+      | VAT refund sample document | document      | VAT refund fac-simile | upload    | text.pdf                                                    | Valid for people living outside the EU.         | Traveller tools | Beer licence |
+      | Local maps archive         | document      | Local maps            | remote    | https://github.com/ec-europa/joinup-dev/archive/develop.zip | Contains maps with the top locations in the EU. | Traveller tools | Beer licence |
 
     When I go to the homepage of the "Traveller tools" collection
     Then I should see the "VAT refund sample document" tile
diff --git a/tests/features/joinup_event/add_event.collection.feature b/tests/features/joinup_event/add_event.collection.feature
index 1651a27c18..96753420c4 100644
--- a/tests/features/joinup_event/add_event.collection.feature
+++ b/tests/features/joinup_event/add_event.collection.feature
@@ -6,9 +6,9 @@ Feature: "Add event" visibility options.
 
   Scenario: "Add event" button should not be shown to normal members, authenticated users and anonymous users.
     Given collection content:
-      | title               | logo     | state     |
-      | The Stripped Stream | logo.png | published |
-      | Years in the Nobody | logo.png | published |
+      | title               | logo     |
+      | The Stripped Stream | logo.png |
+      | Years in the Nobody | logo.png |
 
     When I am logged in as an "authenticated user"
     And I go to the homepage of the "The Stripped Stream" collection
@@ -36,8 +36,8 @@ Feature: "Add event" visibility options.
   @uploadFiles:test.zip
   Scenario: Add event as a facilitator.
     Given collection content:
-      | title            | logo     | state     |
-      | Stream of Dreams | logo.png | published |
+      | title            | logo     |
+      | Stream of Dreams | logo.png |
     And I am logged in as a facilitator of the "Stream of Dreams" collection
 
     When I go to the homepage of the "Stream of Dreams" collection
@@ -82,9 +82,9 @@ Feature: "Add event" visibility options.
 
     When I fill in "Physical location" with "Rue Belliard 28, Brussels, Belgium"
     And I enter the following for the "Virtual location" link field:
-      | URL                          | Title           |
+      | URL                                        | Title                                |
       | https://interoperable-europe.ec.europa.eu/ | Interoperable Europe Portal homepage |
-      | https://drupal.org/          |                 |
+      | https://drupal.org/                        |                                      |
     And I select "EU and European Policies" from "Topic"
     And I press "Save as draft"
     Then I should see the heading "An amazing event"
@@ -120,11 +120,11 @@ Feature: "Add event" visibility options.
   @javascript @generateMedia @generateMediaTypes:event_logo @uploadFiles:logo.png
   Scenario: Test the image library widget.
     Given collection content:
-      | title            | state     |
-      | Stream of Dreams | published |
+      | title            |
+      | Stream of Dreams |
     And event content:
-      | title             | abstract | collection       | field_paragraphs_body | online location              | state     |
-      | The Great Opening | abstract | Stream of Dreams | It opens!             | webinar - http://example.com | published |
+      | title             | abstract | collection       | field_paragraphs_body | online location              |
+      | The Great Opening | abstract | Stream of Dreams | It opens!             | webinar - http://example.com |
 
     And I am logged in as a moderator
 
diff --git a/tests/features/joinup_event/add_event.solution.feature b/tests/features/joinup_event/add_event.solution.feature
index ca9611ede9..1e5630ade7 100644
--- a/tests/features/joinup_event/add_event.solution.feature
+++ b/tests/features/joinup_event/add_event.solution.feature
@@ -6,13 +6,12 @@ Feature: "Add event" visibility options.
 
   Scenario: "Add event" button should not be shown to normal members, authenticated users and anonymous users.
     Given collection content:
-      | title                   | logo     | state     |
-      | Collective Ragged tower | logo.png | published |
+      | title                   | logo     |
+      | Collective Ragged tower | logo.png |
     Given solution content:
-      | title           | collection              | logo     | state     |
-      | Ragged Tower    | Collective Ragged tower | logo.png | published |
-      | Prince of Magic | Collective Ragged tower | logo.png | published |
-
+      | title           | collection              | logo     |
+      | Ragged Tower    | Collective Ragged tower | logo.png |
+      | Prince of Magic | Collective Ragged tower | logo.png |
     When I am logged in as an "authenticated user"
     And I go to the homepage of the "Ragged Tower" solution
     Then I should not see the link "Add event"
@@ -35,11 +34,11 @@ Feature: "Add event" visibility options.
   @uploadFiles:test.zip
   Scenario: Add event as a facilitator.
     Given collection content:
-      | title                           | logo     | state     |
-      | Collective The Luscious Bridges | logo.png | published |
+      | title                           | logo     |
+      | Collective The Luscious Bridges | logo.png |
     Given solution content:
-      | title                | collection                      | logo     | state     |
-      | The Luscious Bridges | Collective The Luscious Bridges | logo.png | published |
+      | title                | collection                      | logo     |
+      | The Luscious Bridges | Collective The Luscious Bridges | logo.png |
     And I am logged in as a facilitator of the "The Luscious Bridges" solution
     When I go to the homepage of the "The Luscious Bridges" solution
     And I click "Add event" in the plus button menu
diff --git a/tests/features/joinup_event/event.edit.feature b/tests/features/joinup_event/event.edit.feature
index de95bd2527..17bd9bd3de 100644
--- a/tests/features/joinup_event/event.edit.feature
+++ b/tests/features/joinup_event/event.edit.feature
@@ -6,7 +6,7 @@ Feature: "Event page" editing.
 
   Scenario: Add and remove map
     Given collection content:
-      | title  | logo     | state     |
+      | title  | logo     |
       | Heroes | logo.png | published |
     And I am logged in as a facilitator of the "Heroes" collection
     When I go to the homepage of the "Heroes" collection
@@ -35,13 +35,13 @@ Feature: "Event page" editing.
       | Username |
       | <user>   |
     And collection content:
-      | title        | description        | state     | moderation |
-      | <collection> | Sample description | published | yes        |
+      | title        | description        | moderation |
+      | <collection> | Sample description | yes        |
     And the following collection user memberships:
       | collection   | user   | roles  |
       | <collection> | <user> | <role> |
     And "event" content:
-      | title   | author | collection   | state     |
+      | title   | author | collection   |
       | <event> | <user> | <collection> | published |
     When I am logged in as "<user>"
     And I go to the "<event>" event
@@ -61,8 +61,8 @@ Feature: "Event page" editing.
       | Username       |
       | Krista Garrett |
     Given solution content:
-      | title                | description        | state     | moderation |
-      | Dreamer in the Snake | Sample description | published | no         |
+      | title                | description        | moderation |
+      | Dreamer in the Snake | Sample description | no         |
     And the following solution user memberships:
       | solution             | user           | roles       |
       | Dreamer in the Snake | Krista Garrett | facilitator |
diff --git a/tests/features/joinup_event/event.view.feature b/tests/features/joinup_event/event.view.feature
index d37685dbb4..0e57012592 100644
--- a/tests/features/joinup_event/event.view.feature
+++ b/tests/features/joinup_event/event.view.feature
@@ -4,11 +4,11 @@ Feature: View discussion API
 
   Scenario: User view view Event entity
     Given collection content:
-      | title            | state     |
-      | Le Event Heureux | published |
+      | title            |
+      | Le Event Heureux |
     And event content:
-      | title       | state     | short title | field_paragraphs_body                    | collection       | start date          | end date            | field_event_contact_email |
-      | Dummy Event | published | Short       | This is some dummy content like foo:bar. | Le Event Heureux | 2016-03-15T11:12:12 | 2016-03-15T11:12:12 | reach.me@example.com      |
+      | title       | short title | field_paragraphs_body                    | collection       | start date          | end date            | field_event_contact_email |
+      | Dummy Event | Short       | This is some dummy content like foo:bar. | Le Event Heureux | 2016-03-15T11:12:12 | 2016-03-15T11:12:12 | reach.me@example.com      |
 
     When I go to the "Dummy Event" event
     And I should see the link "reach.me@example.com"
diff --git a/tests/features/joinup_group/announcements.feature b/tests/features/joinup_group/announcements.feature
index 76f495ed56..2f80623f02 100644
--- a/tests/features/joinup_group/announcements.feature
+++ b/tests/features/joinup_group/announcements.feature
@@ -142,20 +142,20 @@ Feature: Messaging group announcements
     When I press "Preview"
     Then I should see the success message "A sample announcement has been delivered to sonsoftweets@example.com."
     And the email sent to "Sons of tweets" with subject "The Big Opening is postponed" contains the following lines of text:
-      | Dear Sons of tweets,                                                                                                                                                                                                                                       |
-      | Fail pension <group> has an announcement for its members:                                                                                                                                                                                                  |
-      | The Big Opening is postponed                                                                                                                                                                                                                               |
-      | In this email we are testing the available arguments:                                                                                                                                                                                                      |
-      | The <group> members page URL                                                                                                                                                                                                                               |
-      | The recipient's full name: Sons of tweets                                                                                                                                                                                                                  |
-      | The recipient's profile URL                                                                                                                                                                                                                                |
-      | The recipient's profile edit URL                                                                                                                                                                                                                           |
-      | The recipient's subscriptions page URL                                                                                                                                                                                                                     |
-      | Kind regards,                                                                                                                                                                                                                                              |
-      | The Fail pension <group> team                                                                                                                                                                                                                              |
+      | Dear Sons of tweets,                                                                                                                                                                                                                                                            |
+      | Fail pension <group> has an announcement for its members:                                                                                                                                                                                                                       |
+      | The Big Opening is postponed                                                                                                                                                                                                                                                    |
+      | In this email we are testing the available arguments:                                                                                                                                                                                                                           |
+      | The <group> members page URL                                                                                                                                                                                                                                                    |
+      | The recipient's full name: Sons of tweets                                                                                                                                                                                                                                       |
+      | The recipient's profile URL                                                                                                                                                                                                                                                     |
+      | The recipient's profile edit URL                                                                                                                                                                                                                                                |
+      | The recipient's subscriptions page URL                                                                                                                                                                                                                                          |
+      | Kind regards,                                                                                                                                                                                                                                                                   |
+      | The Fail pension <group> team                                                                                                                                                                                                                                                   |
       | You received this e-mail because, as a registered user of Interoperable Europe Portal and a member of Fail pension <group>, you agreed to receive information sent to you by the Fail pension <group> owner/administrator (based on Article 5(d) of Regulation (EU) 2018/1725). |
-      | In case you do not want to receive such e-mails, you can unsubscribe from group announcement notifications or manage all your subscription notifications from the user subscriptions page.                                                                 |
-      | This is an unmonitored email address, please do not reply. You can contact directly Fail pension <group> via the Overview page.                                                                                                                            |
+      | In case you do not want to receive such e-mails, you can unsubscribe from group announcement notifications or manage all your subscription notifications from the user subscriptions page.                                                                                      |
+      | This is an unmonitored email address, please do not reply. You can contact directly Fail pension <group> via the Overview page.                                                                                                                                                 |
 
     When I press "Send for approval"
     Then I should see the success message "Your announcement has been sent for validation by Interoperable Europe Portal moderators. Once approved, will reach the Fail pension <group> members."
@@ -205,21 +205,21 @@ Feature: Messaging group announcements
     When I press "Preview"
     Then I should see the success message "A sample announcement has been delivered to check.edit.moderator@example.com."
     And the email sent to "Check edit moderator" with subject "The Big Opening is postponed" contains the following lines of text:
-      | Dear Check edit moderator,                                                                                                                                                                                                                                 |
-      | Fail pension <group> has an announcement for its members:                                                                                                                                                                                                  |
-      | The Big Opening is postponed                                                                                                                                                                                                                               |
-      | In this email we are testing the available arguments:                                                                                                                                                                                                      |
-      | The <group> landing page URL                                                                                                                                                                                                                               |
-      | The <group> members page URL                                                                                                                                                                                                                               |
-      | The recipient's full name: Check edit moderator                                                                                                                                                                                                            |
-      | The recipient's profile URL                                                                                                                                                                                                                                |
-      | The recipient's profile edit URL                                                                                                                                                                                                                           |
-      | The recipient's subscriptions page URL                                                                                                                                                                                                                     |
-      | Kind regards,                                                                                                                                                                                                                                              |
-      | The Fail pension <group> team                                                                                                                                                                                                                              |
+      | Dear Check edit moderator,                                                                                                                                                                                                                                                      |
+      | Fail pension <group> has an announcement for its members:                                                                                                                                                                                                                       |
+      | The Big Opening is postponed                                                                                                                                                                                                                                                    |
+      | In this email we are testing the available arguments:                                                                                                                                                                                                                           |
+      | The <group> landing page URL                                                                                                                                                                                                                                                    |
+      | The <group> members page URL                                                                                                                                                                                                                                                    |
+      | The recipient's full name: Check edit moderator                                                                                                                                                                                                                                 |
+      | The recipient's profile URL                                                                                                                                                                                                                                                     |
+      | The recipient's profile edit URL                                                                                                                                                                                                                                                |
+      | The recipient's subscriptions page URL                                                                                                                                                                                                                                          |
+      | Kind regards,                                                                                                                                                                                                                                                                   |
+      | The Fail pension <group> team                                                                                                                                                                                                                                                   |
       | You received this e-mail because, as a registered user of Interoperable Europe Portal and a member of Fail pension <group>, you agreed to receive information sent to you by the Fail pension <group> owner/administrator (based on Article 5(d) of Regulation (EU) 2018/1725). |
-      | In case you do not want to receive such e-mails, you can unsubscribe from group announcement notifications or manage all your subscription notifications from the user subscriptions page.                                                                 |
-      | This is an unmonitored email address, please do not reply. You can contact directly Fail pension <group> via the Overview page.                                                                                                                            |
+      | In case you do not want to receive such e-mails, you can unsubscribe from group announcement notifications or manage all your subscription notifications from the user subscriptions page.                                                                                      |
+      | This is an unmonitored email address, please do not reply. You can contact directly Fail pension <group> via the Overview page.                                                                                                                                                 |
 
     Given I am logged in as "Sons of tweets"
 
@@ -266,53 +266,53 @@ Feature: Messaging group announcements
 
     # Groups having up to 50 members are receiving the announcements instantly.
     And the email sent to "Mogul" with subject "The Big Opening is postponed" contains the following lines of text:
-      | Dear Mogul,                                                                                                                                                                                                                                                |
-      | Fail pension <group> has an announcement for its members:                                                                                                                                                                                                  |
-      | The Big Opening is postponed                                                                                                                                                                                                                               |
-      | In this email we are testing the available arguments:                                                                                                                                                                                                      |
-      | The <group> landing page URL                                                                                                                                                                                                                               |
-      | The <group> members page URL                                                                                                                                                                                                                               |
-      | The recipient's full name: Mogul                                                                                                                                                                                                                           |
-      | The recipient's profile URL                                                                                                                                                                                                                                |
-      | The recipient's profile edit URL                                                                                                                                                                                                                           |
-      | The recipient's subscriptions page URL                                                                                                                                                                                                                     |
-      | Kind regards,                                                                                                                                                                                                                                              |
-      | The Fail pension <group> team                                                                                                                                                                                                                              |
+      | Dear Mogul,                                                                                                                                                                                                                                                                     |
+      | Fail pension <group> has an announcement for its members:                                                                                                                                                                                                                       |
+      | The Big Opening is postponed                                                                                                                                                                                                                                                    |
+      | In this email we are testing the available arguments:                                                                                                                                                                                                                           |
+      | The <group> landing page URL                                                                                                                                                                                                                                                    |
+      | The <group> members page URL                                                                                                                                                                                                                                                    |
+      | The recipient's full name: Mogul                                                                                                                                                                                                                                                |
+      | The recipient's profile URL                                                                                                                                                                                                                                                     |
+      | The recipient's profile edit URL                                                                                                                                                                                                                                                |
+      | The recipient's subscriptions page URL                                                                                                                                                                                                                                          |
+      | Kind regards,                                                                                                                                                                                                                                                                   |
+      | The Fail pension <group> team                                                                                                                                                                                                                                                   |
       | You received this e-mail because, as a registered user of Interoperable Europe Portal and a member of Fail pension <group>, you agreed to receive information sent to you by the Fail pension <group> owner/administrator (based on Article 5(d) of Regulation (EU) 2018/1725). |
-      | In case you do not want to receive such e-mails, you can unsubscribe from group announcement notifications or manage all your subscription notifications from the user subscriptions page.                                                                 |
-      | This is an unmonitored email address, please do not reply. You can contact directly Fail pension <group> via the Overview page.                                                                                                                            |
+      | In case you do not want to receive such e-mails, you can unsubscribe from group announcement notifications or manage all your subscription notifications from the user subscriptions page.                                                                                      |
+      | This is an unmonitored email address, please do not reply. You can contact directly Fail pension <group> via the Overview page.                                                                                                                                                 |
     And the email sent to "Greedy" with subject "The Big Opening is postponed" contains the following lines of text:
-      | Dear Greedy,                                                                                                                                                                                                                                               |
-      | Fail pension <group> has an announcement for its members:                                                                                                                                                                                                  |
-      | The Big Opening is postponed                                                                                                                                                                                                                               |
-      | In this email we are testing the available arguments:                                                                                                                                                                                                      |
-      | The <group> landing page URL                                                                                                                                                                                                                               |
-      | The <group> members page URL                                                                                                                                                                                                                               |
-      | The recipient's full name: Greedy                                                                                                                                                                                                                          |
-      | The recipient's profile URL                                                                                                                                                                                                                                |
-      | The recipient's profile edit URL                                                                                                                                                                                                                           |
-      | The recipient's subscriptions page URL                                                                                                                                                                                                                     |
-      | Kind regards,                                                                                                                                                                                                                                              |
-      | The Fail pension <group> team                                                                                                                                                                                                                              |
+      | Dear Greedy,                                                                                                                                                                                                                                                                    |
+      | Fail pension <group> has an announcement for its members:                                                                                                                                                                                                                       |
+      | The Big Opening is postponed                                                                                                                                                                                                                                                    |
+      | In this email we are testing the available arguments:                                                                                                                                                                                                                           |
+      | The <group> landing page URL                                                                                                                                                                                                                                                    |
+      | The <group> members page URL                                                                                                                                                                                                                                                    |
+      | The recipient's full name: Greedy                                                                                                                                                                                                                                               |
+      | The recipient's profile URL                                                                                                                                                                                                                                                     |
+      | The recipient's profile edit URL                                                                                                                                                                                                                                                |
+      | The recipient's subscriptions page URL                                                                                                                                                                                                                                          |
+      | Kind regards,                                                                                                                                                                                                                                                                   |
+      | The Fail pension <group> team                                                                                                                                                                                                                                                   |
       | You received this e-mail because, as a registered user of Interoperable Europe Portal and a member of Fail pension <group>, you agreed to receive information sent to you by the Fail pension <group> owner/administrator (based on Article 5(d) of Regulation (EU) 2018/1725). |
-      | In case you do not want to receive such e-mails, you can unsubscribe from group announcement notifications or manage all your subscription notifications from the user subscriptions page.                                                                 |
-      | This is an unmonitored email address, please do not reply. You can contact directly Fail pension <group> via the Overview page.                                                                                                                            |
+      | In case you do not want to receive such e-mails, you can unsubscribe from group announcement notifications or manage all your subscription notifications from the user subscriptions page.                                                                                      |
+      | This is an unmonitored email address, please do not reply. You can contact directly Fail pension <group> via the Overview page.                                                                                                                                                 |
     And the email sent to "Sons of tweets" with subject "The Big Opening is postponed" contains the following lines of text:
-      | Dear Sons of tweets,                                                                                                                                                                                                                                       |
-      | Fail pension <group> has an announcement for its members:                                                                                                                                                                                                  |
-      | The Big Opening is postponed                                                                                                                                                                                                                               |
-      | In this email we are testing the available arguments:                                                                                                                                                                                                      |
-      | The <group> landing page URL                                                                                                                                                                                                                               |
-      | The <group> members page URL                                                                                                                                                                                                                               |
-      | The recipient's full name: Sons of tweets                                                                                                                                                                                                                  |
-      | The recipient's profile URL                                                                                                                                                                                                                                |
-      | The recipient's profile edit URL                                                                                                                                                                                                                           |
-      | The recipient's subscriptions page URL                                                                                                                                                                                                                     |
-      | Kind regards,                                                                                                                                                                                                                                              |
-      | The Fail pension <group> team                                                                                                                                                                                                                              |
+      | Dear Sons of tweets,                                                                                                                                                                                                                                                            |
+      | Fail pension <group> has an announcement for its members:                                                                                                                                                                                                                       |
+      | The Big Opening is postponed                                                                                                                                                                                                                                                    |
+      | In this email we are testing the available arguments:                                                                                                                                                                                                                           |
+      | The <group> landing page URL                                                                                                                                                                                                                                                    |
+      | The <group> members page URL                                                                                                                                                                                                                                                    |
+      | The recipient's full name: Sons of tweets                                                                                                                                                                                                                                       |
+      | The recipient's profile URL                                                                                                                                                                                                                                                     |
+      | The recipient's profile edit URL                                                                                                                                                                                                                                                |
+      | The recipient's subscriptions page URL                                                                                                                                                                                                                                          |
+      | Kind regards,                                                                                                                                                                                                                                                                   |
+      | The Fail pension <group> team                                                                                                                                                                                                                                                   |
       | You received this e-mail because, as a registered user of Interoperable Europe Portal and a member of Fail pension <group>, you agreed to receive information sent to you by the Fail pension <group> owner/administrator (based on Article 5(d) of Regulation (EU) 2018/1725). |
-      | In case you do not want to receive such e-mails, you can unsubscribe from group announcement notifications or manage all your subscription notifications from the user subscriptions page.                                                                 |
-      | This is an unmonitored email address, please do not reply. You can contact directly Fail pension <group> via the Overview page.                                                                                                                            |
+      | In case you do not want to receive such e-mails, you can unsubscribe from group announcement notifications or manage all your subscription notifications from the user subscriptions page.                                                                                      |
+      | This is an unmonitored email address, please do not reply. You can contact directly Fail pension <group> via the Overview page.                                                                                                                                                 |
     # Accepted 'Legal notice' but it's not subscribed to group announcements.
     But no email has been sent to "Envious"
     # Subscribed to group announcements but didn't accept the 'Legal notice'.
@@ -413,14 +413,14 @@ Feature: Messaging group announcements
   @javascript @group-e
   Scenario: Announcement moderation
     Given collection content:
-      | title       | state     |
-      | Collection1 | published |
-      | Collection2 | published |
+      | title       |
+      | Collection1 |
+      | Collection2 |
     And solution content:
-      | title                 | collection  | state     |
-      | Collection1 Solution1 | Collection1 | published |
-      | Collection1 Solution2 | Collection1 | published |
-      | Collection2 Solution1 | Collection2 | published |
+      | title                 | collection  |
+      | Collection1 Solution1 | Collection1 |
+      | Collection1 Solution2 | Collection1 |
+      | Collection2 Solution1 | Collection2 |
     And users:
       | Username         | E-mail                      | Roles     |
       | Rian Lee         | rian-lee@example.com        |           |
diff --git a/tests/features/joinup_group/group_reports.feature b/tests/features/joinup_group/group_reports.feature
index 9174c6faa3..f603c63be5 100644
--- a/tests/features/joinup_group/group_reports.feature
+++ b/tests/features/joinup_group/group_reports.feature
@@ -16,13 +16,13 @@ Feature:
       | hoshiko  |       | Hoshiko    | Watanabe    |
       | takehiko |       | Takehiko   | Moto        |
     And collection content:
-      | title                    | state     |
-      | Muscle tissue formation  | published |
-      | Cultured meat technology | published |
+      | title                    |
+      | Muscle tissue formation  |
+      | Cultured meat technology |
     Given solution content:
-      | title                         | state     | collection               |
-      | Aligning myotubes             | published | Muscle tissue formation  |
-      | Increasing global meat demand | published | Cultured meat technology |
+      | title                         | collection               |
+      | Aligning myotubes             | Muscle tissue formation  |
+      | Increasing global meat demand | Cultured meat technology |
     And collection user memberships:
       | collection               | user   | roles       |
       | Muscle tissue formation  | keiko  | facilitator |
diff --git a/tests/features/joinup_group/landing_page.feature b/tests/features/joinup_group/landing_page.feature
index 0154470c19..7136d9c71a 100644
--- a/tests/features/joinup_group/landing_page.feature
+++ b/tests/features/joinup_group/landing_page.feature
@@ -13,14 +13,14 @@ Feature: Tests the group landing page customization.
   # - As a group facilitator, when I visit my group, I can set a landing page.
 
     Given <group> content:
-      | title               | state     | description                         |
-      | <group> group       | published | The <group> arbitrary description   |
-      | other <group> group | published | Other <group> arbitrary description |
+      | title               | description                         |
+      | <group> group       | The <group> arbitrary description   |
+      | other <group> group | Other <group> arbitrary description |
     And "custom_page" content:
-      | title         | <group>       | body                      | state     |
-      | Custom Page 1 | <group> group | The custom page 1 content | published |
-      | Custom Page 2 | <group> group | The custom page 2 content | published |
-      | Custom Page 3 | <group> group | The custom page 3 content | published |
+      | title         | <group>       | body                      |
+      | Custom Page 1 | <group> group | The custom page 1 content |
+      | Custom Page 2 | <group> group | The custom page 2 content |
+      | Custom Page 3 | <group> group | The custom page 3 content |
     Given I am not logged in
     When I go to the homepage of the "<group> group" <group>
     Then I should not see the link "Settings"
@@ -115,11 +115,11 @@ Feature: Tests the group landing page customization.
   # See https://citnet.tech.ec.europa.eu/CITnet/jira/browse/ISAICP-7223
   Scenario: As a group facilitator I cannot set the landing page.
     Given collection content:
-      | title            | state     | description                          |
-      | collection group | published | The collection arbitrary description |
+      | title            | description                          |
+      | collection group | The collection arbitrary description |
     Given solution content:
-      | title          | state     | description                        |
-      | solution group | published | The solution arbitrary description |
+      | title          | description                        |
+      | solution group | The solution arbitrary description |
 
     Given I am logged in as a facilitator of the "collection group" collection
     When I go to the homepage of the "collection group" collection
@@ -132,13 +132,13 @@ Feature: Tests the group landing page customization.
 
   Scenario: Do not allow to unpublish or delete a custom page set as landing page
     Given collection content:
-      | title          | state     |
-      | Rally fanatics | published |
-      | My own book    | published |
+      | title          |
+      | Rally fanatics |
+      | My own book    |
     And "custom_page" content:
-      | title         | collection     | body                      | state     |
-      | Custom Page 1 | Rally fanatics | The custom page 1 content | published |
-      | Custom Page 2 | My own book    | The custom page 2 content | published |
+      | title         | collection     | body                      |
+      | Custom Page 1 | Rally fanatics | The custom page 1 content |
+      | Custom Page 2 | My own book    | The custom page 2 content |
     Given I am logged in as a moderator
     When I go to the homepage of the "Rally fanatics" collection
     And I click "Settings"
@@ -164,11 +164,11 @@ Feature: Tests the group landing page customization.
 
   Scenario: Landing custom page redirects to group page.
     Given collection content:
-      | title         | state     |
-      | United States | published |
+      | title         |
+      | United States |
     And "custom_page" content:
-      | title    | collection    | body                                                                                 | state     |
-      | Michigan | United States | Michigan is a state in the Great Lakes region of the Upper Midwestern United States. | published |
+      | title    | collection    | body                                                                                 |
+      | Michigan | United States | Michigan is a state in the Great Lakes region of the Upper Midwestern United States. |
 
     When I go to the "Michigan" custom page
     Then I should be on "/collection/united-states/michigan"
diff --git a/tests/features/joinup_group/metadata_banner_disabled.feature b/tests/features/joinup_group/metadata_banner_disabled.feature
index cbc1363388..dc8d206662 100644
--- a/tests/features/joinup_group/metadata_banner_disabled.feature
+++ b/tests/features/joinup_group/metadata_banner_disabled.feature
@@ -6,12 +6,12 @@ Feature: Collections/Solutions settings Metadata Banner disabled
 
   Scenario: Moderator or collection/solution owner is able to disable or enable metadata from banner in collections/solutions
     Given collection content:
-      | title          | state     |
-      | Rally fanatics | published |
-      | Legion of Doom | published |
+      | title          |
+      | Rally fanatics |
+      | Legion of Doom |
     And solution content:
-      | title        | state     | collection     |
-      | Klop mirubes | published | Rally fanatics |
+      | title        | collection     |
+      | Klop mirubes | Rally fanatics |
     And users:
       | Username         | E-mail                     | First name | Family name |
       | Ferners Lee      | ferners-lee@example.com    | Ferners    | Lee         |
@@ -26,11 +26,11 @@ Feature: Collections/Solutions settings Metadata Banner disabled
       | solution     | user      | roles |
       | Klop mirubes | Plot user | owner |
     And "news" content:
-      | title                   | headline                | body | state     | author | collection     |
-      | Creating Justice League | 6 Members to start with | TBD  | published | Eagle  | Rally fanatics |
+      | title                   | headline                | body | author | collection     |
+      | Creating Justice League | 6 Members to start with | TBD  | Eagle  | Rally fanatics |
     And "news" content:
-      | title             | headline                                    | body                                                              | state     | author | solution     |
-      | Hawkgirl is a spy | Her race lies in another part of the galaxy | Hawkgirl has been giving information about Earth to Thanagarians. | published | Eagle  | Klop mirubes |
+      | title             | headline                                    | body                                                              | author | solution     |
+      | Hawkgirl is a spy | Her race lies in another part of the galaxy | Hawkgirl has been giving information about Earth to Thanagarians. | Eagle  | Klop mirubes |
 
     Given I am logged in as "Ferners Lee"
     When I go to the "Rally fanatics" collection
diff --git a/tests/features/joinup_group/revoke_privileges.feature b/tests/features/joinup_group/revoke_privileges.feature
index b572e0c9d5..1b6e0824fc 100644
--- a/tests/features/joinup_group/revoke_privileges.feature
+++ b/tests/features/joinup_group/revoke_privileges.feature
@@ -9,14 +9,14 @@ Feature: Revoke privileges from former and blocked members
       | Username  |
       | Lord Hong |
     And collection content:
-      | title             | state     |
-      | Interesting times | published |
+      | title             |
+      | Interesting times |
     And the following collection user memberships:
       | collection        | user      |
       | Interesting times | Lord Hong |
     And news content:
-      | title             | body               | author    | state     | collection        |
-      | Join the Red Army | Free the prisoners | Lord Hong | published | Interesting times |
+      | title             | body               | author    | collection        |
+      | Join the Red Army | Free the prisoners | Lord Hong | Interesting times |
 
   Scenario: A blocked user cannot edit their own group content.
     Given I am logged in as "Lord Hong"
diff --git a/tests/features/joinup_release/release.overview.feature b/tests/features/joinup_release/release.overview.feature
index bd7856d1df..8f56f2f8bb 100644
--- a/tests/features/joinup_release/release.overview.feature
+++ b/tests/features/joinup_release/release.overview.feature
@@ -28,11 +28,11 @@ Feature: Asset distribution overview on solution.
       | Thief in the Angels   | text.pdf      | 2              | Notes 2       | 28-01-1995 12:06 | 29-01-1995 12:06 | Lovely Butterfly | published |
       | The Child of the Past | text.pdf      | 1              | Notes 1       | 29-01-1996 12:05 | 29-01-1996 12:05 | Lovely Butterfly | published |
     And distribution content:
-      | title       | access url                          | creation date    | solution         | release               | state     |
-      | Linux       | test.zip                            | 28-01-1995 12:05 |                  | Thief in the Angels   | published |
-      | Windows     | http://www.example.org/download.php | 28-01-1995 12:06 |                  | The Child of the Past | published |
-      | User manual | test.zip                            | 28-01-1995 11:07 | Lovely Butterfly |                       | published |
-      | Solaris     | test.zip                            | 28-01-1995 12:08 |                  | Hidden spies          | published |
+      | title       | access url                          | creation date    | solution         | release               |
+      | Linux       | test.zip                            | 28-01-1995 12:05 |                  | Thief in the Angels   |
+      | Windows     | http://www.example.org/download.php | 28-01-1995 12:06 |                  | The Child of the Past |
+      | User manual | test.zip                            | 28-01-1995 11:07 | Lovely Butterfly |                       |
+      | Solaris     | test.zip                            | 28-01-1995 12:08 |                  | Hidden spies          |
 
     When I go to the homepage of the "Lovely Butterfly" solution
     And I click "Release history"
diff --git a/tests/features/joinup_replicate/replicate.feature b/tests/features/joinup_replicate/replicate.feature
index 8f399f43f4..dce7a7e3cf 100644
--- a/tests/features/joinup_replicate/replicate.feature
+++ b/tests/features/joinup_replicate/replicate.feature
@@ -3,27 +3,27 @@ Feature: Cloning of entities
 
   Background:
     Given collection content:
-      | title      | state     |
-      | Collection | published |
+      | title      |
+      | Collection |
     Given solution content:
-      | title    | collection | state     |
-      | Solution | Collection | published |
+      | title    | collection |
+      | Solution | Collection |
     And "custom_page" content:
-      | title                  | collection | field_paragraphs_body          | state     |
-      | Collection custom page | Collection | Collection custom page content | published |
-      | Solution custom page   | Solution   | Solution custom page content   | published |
+      | title                  | collection | field_paragraphs_body          |
+      | Collection custom page | Collection | Collection custom page content |
+      | Solution custom page   | Solution   | Solution custom page content   |
     And "event" content:
-      | title            | collection | state     |
-      | Collection event | Collection | published |
-      | Solution event   | Solution   | published |
+      | title            | collection |
+      | Collection event | Collection |
+      | Solution event   | Solution   |
     And "news" content:
-      | title           | collection | state     |
-      | Collection news | Collection | published |
-      | Solution news   | Solution   | published |
+      | title           | collection |
+      | Collection news | Collection |
+      | Solution news   | Solution   |
     And "document" content:
-      | title               | collection | state     |
-      | Collection document | Collection | published |
-      | Solution document   | Solution   | published |
+      | title               | collection |
+      | Collection document | Collection |
+      | Solution document   | Solution   |
     Given users:
       | Username               | Roles     |
       | Authenticated          |           |
@@ -78,8 +78,8 @@ Feature: Cloning of entities
 
   Scenario Outline: Only custom page, document, event and news nodes should have the "Clone content" link
     Given <type> content:
-      | title               | state     |
-      | Test <type> content | published |
+      | title               |
+      | Test <type> content |
     When I am logged in as a moderator
     And I go to the "Test <type> content" <type>
     Then I <link availability> the link "Clone content" in the "Entity actions" region
diff --git a/tests/features/joinup_rss/solution_feed.feature b/tests/features/joinup_rss/solution_feed.feature
index 4fe912664d..7c3fad5e89 100644
--- a/tests/features/joinup_rss/solution_feed.feature
+++ b/tests/features/joinup_rss/solution_feed.feature
@@ -9,8 +9,8 @@ Feature: Solution RSS feed.
       | Username | First name | Family name |
       | scorlan  | Sartin     | Corlan      |
     And collection content:
-      | title                 | state     |
-      | Unrandomed collection | published |
+      | title                 |
+      | Unrandomed collection |
     Given solution content:
       | title             | state     | author  | creation date    | collection            |
       | Lantern Domestic  | published | scorlan | 2018-12-18 08:00 | Unrandomed collection |
@@ -20,20 +20,20 @@ Feature: Solution RSS feed.
       | Lantern Domestic  | scorlan | facilitator |
       | Deuteron Lonesome | scorlan | facilitator |
     And news content:
-      | title                                  | field_paragraphs_body                                    | state     | author  | created          | solution          |
-      | Monkeys worst indigo amongst colors    | Research results are out.                                | published | scorlan | 2019-01-21 12:36 | Lantern Domestic  |
-      | Proton lonesomeness doesn't reach peak | More than 200 thousand protons were interviewed.         | published | scorlan | 2019-01-07 12:00 | Deuteron Lonesome |
-      | Old metal alloy improves scissors      | It improves sharpness but they are more subject to rust. | published | scorlan | 2018-04-11 09:00 | Lantern Domestic  |
+      | title                                  | field_paragraphs_body                                    | author  | created          | solution          |
+      | Monkeys worst indigo amongst colors    | Research results are out.                                | scorlan | 2019-01-21 12:36 | Lantern Domestic  |
+      | Proton lonesomeness doesn't reach peak | More than 200 thousand protons were interviewed.         | scorlan | 2019-01-07 12:00 | Deuteron Lonesome |
+      | Old metal alloy improves scissors      | It improves sharpness but they are more subject to rust. | scorlan | 2018-04-11 09:00 | Lantern Domestic  |
     And event content:
-      | title                      | field_paragraphs_body                                                                                                                                                                                                                                                                                                                                           | state     | author  | created          | solution         |
-      | Scissor sharpening funeral | <p>The place where to be if you want to keep <strong>cutting</strong> the paper at the best of your scissors <a href="http://www.example.com/">possibilities</a>.</p> <table><tr><td>Lorem ipsum dolor sit amet consectetur adipiscing elit. Etiam sed consectetur turpis. In porta lectus sit amet nulla feugiat et viverra massa fringilla.</td></tr></table> | published | scorlan | 2017-11-26 14:18 | Lantern Domestic |
+      | title                      | field_paragraphs_body                                                                                                                                                                                                                                                                                                                                           | author  | created          | solution         |
+      | Scissor sharpening funeral | <p>The place where to be if you want to keep <strong>cutting</strong> the paper at the best of your scissors <a href="http://www.example.com/">possibilities</a>.</p> <table><tr><td>Lorem ipsum dolor sit amet consectetur adipiscing elit. Etiam sed consectetur turpis. In porta lectus sit amet nulla feugiat et viverra massa fringilla.</td></tr></table> | scorlan | 2017-11-26 14:18 | Lantern Domestic |
     And discussion content:
-      | title                                           | body                                                                                   | state     | author  | created          | solution          |
-      | Is the indigo coloration caused by their smile? | I was reading the technical paper and it seems their main food is the indigo cherries. | published | scorlan | 2019-01-21 13:00 | Deuteron Lonesome |
+      | title                                           | body                                                                                   | author  | created          | solution          |
+      | Is the indigo coloration caused by their smile? | I was reading the technical paper and it seems their main food is the indigo cherries. | scorlan | 2019-01-21 13:00 | Deuteron Lonesome |
     And custom_page content:
-      | title             | body                                            | state     | author  | created          | solution          |
-      | Indigo variations | The four major tones of indigo are listed here. | published | scorlan | 2017-10-15 19:30 | Lantern Domestic  |
-      | List of devices   | Available remote electrical devices.            | published | scorlan | 2019-02-08 10:00 | Deuteron Lonesome |
+      | title             | body                                            | author  | created          | solution          |
+      | Indigo variations | The four major tones of indigo are listed here. | scorlan | 2017-10-15 19:30 | Lantern Domestic  |
+      | List of devices   | Available remote electrical devices.            | scorlan | 2019-02-08 10:00 | Deuteron Lonesome |
 
     When I am an anonymous user
     And I go to the homepage of the "Lantern Domestic" solution
diff --git a/tests/features/joinup_search/group_search.feature b/tests/features/joinup_search/group_search.feature
index eb4ac1f063..a97c147e50 100644
--- a/tests/features/joinup_search/group_search.feature
+++ b/tests/features/joinup_search/group_search.feature
@@ -28,9 +28,9 @@ Feature: Search inside groups
       | Natural materials | Materials natural | Ground feel           | Chalet construction |                      |
       | Still frozen      | Frozen still      | Maybe next week       |                     | Inclined foundations |
     And custom_page content:
-      | title     | body                             | collection          | solution             | state     |
-      | Resources | Here are some interesting links. | Chalet construction |                      | published |
-      | Geography | A collection of height maps.     |                     | Inclined foundations | published |
+      | title     | body                             | collection          | solution             |
+      | Resources | Here are some interesting links. | Chalet construction |                      |
+      | Geography | A collection of height maps.     |                     | Inclined foundations |
     And release content:
       | title     | release number | release notes              | is version of        |
       | Pre-alpha | 0.0-alpha0     | Only works on flat ground. | Inclined foundations |
diff --git a/tests/features/joinup_search/interoperable.feature b/tests/features/joinup_search/interoperable.feature
index ce20be6328..26f1291071 100644
--- a/tests/features/joinup_search/interoperable.feature
+++ b/tests/features/joinup_search/interoperable.feature
@@ -5,12 +5,12 @@ Feature: Global Interoperable search
   @javascript
   Scenario: User can find Interoperable items
     Given collection content:
-      | title          | state     |
-      | Open standards | published |
+      | title          |
+      | Open standards |
     Given solution content:
-      | title           | state     | collection     | description                                                                  |
-      | eGovernment     | published | Open standards | It refers to the collaboration ability of cross-border services for citizens |
-      | Military forces | published | Open standards | the ability of the forces of two or more nations to train                    |
+      | title           | collection     | description                                                                  |
+      | eGovernment     | Open standards | It refers to the collaboration ability of cross-border services for citizens |
+      | Military forces | Open standards | the ability of the forces of two or more nations to train                    |
 
     Given I am logged in as a user with the "interoperability_validator" role
     When I go to the homepage of the "eGovernment" solution
diff --git a/tests/features/joinup_search/multilingual.feature b/tests/features/joinup_search/multilingual.feature
index 13d494b748..308fca0aa9 100644
--- a/tests/features/joinup_search/multilingual.feature
+++ b/tests/features/joinup_search/multilingual.feature
@@ -5,8 +5,8 @@ Feature: Multilingual search
   Scenario: Anonymous user sees English version only
     Given the language "ca" is enabled
     And collection content:
-      | title                        | logo     | moderation | topic      | spatial coverage | state     |
-      | Molecular cooking collection | logo.png | no         | Demography | Belgium          | published |
+      | title                        | logo     | moderation | topic      | spatial coverage |
+      | Molecular cooking collection | logo.png | no         | Demography | Belgium          |
     And the multilingual "El celler de Can Roca" solution of "Molecular cooking collection" collection
     When I go to the "Molecular cooking collection" collection
     Then I should see 1 tile
diff --git a/tests/features/joinup_seo/discussion.feature b/tests/features/joinup_seo/discussion.feature
index b1a28d3b78..c7f4399745 100644
--- a/tests/features/joinup_seo/discussion.feature
+++ b/tests/features/joinup_seo/discussion.feature
@@ -6,14 +6,14 @@ Feature: SEO for discussion forum posts.
 
   Scenario: Basic metatags are attached as JSON schema on the page.
     Given collection content:
-      | title                            | state     |
-      | Interoperable Europe Portal SEO discussion collection | published |
+      | title                                                 |
+      | Interoperable Europe Portal SEO discussion collection |
     And users:
-      | Username          | E-mail                 | First name | Family name |
+      | Username                               | E-mail                 | First name | Family name |
       | Interoperable Europe Portal SEO author | joinup.seo@example.com | Kindle     | eReader     |
     And "discussion" content:
-      | title                           | published at              | changed                   | content                                                      | author            | attachments         | keywords                       | state     | collection                       |
-      | Discussions are now forum posts | Wed, 25 Dec 2019 13:00:00 | Wed, 01 Jan 2020 13:00:00 | This discussion is to ensure that SEO tags are set properly. | Interoperable Europe Portal SEO author | test.zip, test1.zip | seo, tags, metatag, schema.org | published | Interoperable Europe Portal SEO discussion collection |
+      | title                           | published at              | changed                   | content                                                      | author                                 | attachments         | keywords                       | collection                                            |
+      | Discussions are now forum posts | Wed, 25 Dec 2019 13:00:00 | Wed, 01 Jan 2020 13:00:00 | This discussion is to ensure that SEO tags are set properly. | Interoperable Europe Portal SEO author | test.zip, test1.zip | seo, tags, metatag, schema.org | Interoperable Europe Portal SEO discussion collection |
 
     When I visit the "Discussions are now forum posts" discussion
     Then the metatag JSON should be attached in the page
@@ -36,8 +36,8 @@ Feature: SEO for discussion forum posts.
       | 2        | metatag    |
       | 3        | schema.org |
     And the metatag graph of the item with "name" "Discussions are now forum posts" should have the following "image" properties:
-      | property | value                                                                                                                    |
-      | @type    | http://schema.org/ImageObject                                                                                            |
+      | property | value                                                                                                                                  |
+      | @type    | http://schema.org/ImageObject                                                                                                          |
       # Discussions don't have an image field but an image is required by google. Add the Interoperable Europe Portal logo as the image of
       # all discussions.
       | url      | https://interoperable-europe.ec.europa.eu/sites/default/files/styles/logo/public/collection/logo/2019-04/190404-logo-JOINUP-blue-2.png |
diff --git a/tests/features/joinup_seo/document.feature b/tests/features/joinup_seo/document.feature
index 99962361a0..9853da5677 100644
--- a/tests/features/joinup_seo/document.feature
+++ b/tests/features/joinup_seo/document.feature
@@ -6,8 +6,8 @@ Feature: SEO for document content.
 
   Background:
     Given collection content:
-      | title                                               | state     |
-      | Interoperable Europe Portal SEO document collection | published |
+      | title                                               |
+      | Interoperable Europe Portal SEO document collection |
     And licence content:
       | uri                          | title        | licence type  |
       | https://example.com/license1 | Some license | Public domain |
@@ -17,8 +17,8 @@ Feature: SEO for document content.
 
   Scenario: Basic metatags are attached as JSON schema on the page.
     Given document content:
-      | title        | author                                 | document type | document publication date | changed                   | keywords         | short title | file type | file     | field_paragraphs_body | licence      | state     | collection                                          | abstract |
-      | SEO document | Interoperable Europe Portal SEO author | document      | Wed, 25 Dec 2019 13:00:00 | Wed, 01 Jan 2020 13:00:00 | key1, key2, key3 | SEO         | upload    | test.zip | Document test1.zip    | Some license | published | Interoperable Europe Portal SEO document collection |          |
+      | title        | author                                 | document type | document publication date | changed                   | keywords         | short title | file type | file     | field_paragraphs_body | licence      | collection                                          | abstract |
+      | SEO document | Interoperable Europe Portal SEO author | document      | Wed, 25 Dec 2019 13:00:00 | Wed, 01 Jan 2020 13:00:00 | key1, key2, key3 | SEO         | upload    | test.zip | Document test1.zip    | Some license | Interoperable Europe Portal SEO document collection |          |
 
     When I visit the "SEO document" document
     Then the metatag JSON should be attached in the page
@@ -75,8 +75,8 @@ Feature: SEO for document content.
 
   Scenario: Metatags for remote URL in documents.
     Given document content:
-      | title        | author                                 | document publication date | changed                   | file type | file                                       | abstract                    | field_paragraphs_body   | state     | collection                                          |
-      | SEO document | Interoperable Europe Portal SEO author | Wed, 25 Dec 2019 13:00:00 | Wed, 01 Jan 2020 13:00:00 | remote    | http://example.com/some-file-url.extension | Remote url example abstract | Remote url example body | published | Interoperable Europe Portal SEO document collection |
+      | title        | author                                 | document publication date | changed                   | file type | file                                       | abstract                    | field_paragraphs_body   | collection                                          |
+      | SEO document | Interoperable Europe Portal SEO author | Wed, 25 Dec 2019 13:00:00 | Wed, 01 Jan 2020 13:00:00 | remote    | http://example.com/some-file-url.extension | Remote url example abstract | Remote url example body | Interoperable Europe Portal SEO document collection |
 
     When I visit the "SEO document" document
     Then the metatag JSON should be attached in the page
diff --git a/tests/features/joinup_seo/event.feature b/tests/features/joinup_seo/event.feature
index 1942cf7881..ce5afc94b6 100644
--- a/tests/features/joinup_seo/event.feature
+++ b/tests/features/joinup_seo/event.feature
@@ -6,14 +6,14 @@ Feature: SEO for news articles.
 
   Scenario Outline: Basic metatags are attached as JSON schema on the page.
     Given collection content:
-      | title                       | state     |
-      | Joinup SEO event collection | published |
+      | title                       |
+      | Joinup SEO event collection |
     And users:
       | Username          | E-mail                 | First name | Family name |
       | Joinup SEO author | joinup.seo@example.com | Patrick    | Stewart     |
     And "event" content:
-      | title            | short title   | web url   | start date                | end date                  | body           | logo     | agenda        | location   | online location                                          | organisation        | scope         | keywords | collection                  | state     | abstract |
-      | Joinup SEO event | JOINUPSEO2020 | <web url> | Wed, 25 Dec 2019 13:00:00 | Wed, 01 Jan 2020 13:00:00 | Body of event. | logo.png | Event agenda. | <location> | 0: Some title - 1: http://example.com/some-online-meetup | European Commission | International | Alphabet | Joinup SEO event collection | published |          |
+      | title            | short title   | web url   | start date                | end date                  | body           | logo     | agenda        | location   | online location                                          | organisation        | scope         | keywords | collection                  | abstract |
+      | Joinup SEO event | JOINUPSEO2020 | <web url> | Wed, 25 Dec 2019 13:00:00 | Wed, 01 Jan 2020 13:00:00 | Body of event. | logo.png | Event agenda. | <location> | 0: Some title - 1: http://example.com/some-online-meetup | European Commission | International | Alphabet | Joinup SEO event collection |          |
     When I visit the "Joinup SEO event" event
     Then the metatag JSON should be attached in the page
     And 1 metatag graph of type "http://schema.org/Event" should exist in the page
@@ -89,14 +89,14 @@ Feature: SEO for news articles.
 
   Scenario: Events without physical address but with online location should still show the online location.
     Given collection content:
-      | title                       | state     |
-      | Joinup SEO event collection | published |
+      | title                       |
+      | Joinup SEO event collection |
     And users:
       | Username          | E-mail                 | First name | Family name |
       | Joinup SEO author | joinup.seo@example.com | Patrick    | Stewart     |
     And "event" content:
-      | title            | short title   | online location                                          | collection                  | state     |
-      | Joinup SEO event | JOINUPSEO2021 | 0: Some title - 1: http://example.com/some-online-meetup | Joinup SEO event collection | published |
+      | title            | short title   | online location                                          | collection                  |
+      | Joinup SEO event | JOINUPSEO2021 | 0: Some title - 1: http://example.com/some-online-meetup | Joinup SEO event collection |
 
     When I visit the "Joinup SEO event" event
     Then the metatag JSON should be attached in the page
diff --git a/tests/features/joinup_seo/news.feature b/tests/features/joinup_seo/news.feature
index 70a85033c0..e1139062fc 100644
--- a/tests/features/joinup_seo/news.feature
+++ b/tests/features/joinup_seo/news.feature
@@ -6,14 +6,14 @@ Feature: SEO for news articles.
 
   Scenario: Basic metatags are attached as JSON schema on the page.
     Given collection content:
-      | title                                           | state     |
-      | Interoperable Europe Portal SEO news collection | published |
+      | title                                           |
+      | Interoperable Europe Portal SEO news collection |
     And users:
       | Username                               | E-mail                 | First name | Family name |
       | Interoperable Europe Portal SEO author | joinup.seo@example.com | Kurk       | Smith       |
     And news content:
-      | title                                | headline                                         | logo     | field_paragraphs_body | created                   | published at              | changed                   | state     | author                                 | collection                                      | abstract |
-      | Interoperable Europe Portal SEO news | Headline of Interoperable Europe Portal SEO news | logo.png | Body of news.         | Sun, 01 Dec 2019 13:00:00 | Wed, 25 Dec 2019 13:00:00 | Wed, 01 Jan 2020 13:00:00 | published | Interoperable Europe Portal SEO author | Interoperable Europe Portal SEO news collection |          |
+      | title                                | headline                                         | logo     | field_paragraphs_body | created                   | published at              | changed                   | author                                 | collection                                      | abstract |
+      | Interoperable Europe Portal SEO news | Headline of Interoperable Europe Portal SEO news | logo.png | Body of news.         | Sun, 01 Dec 2019 13:00:00 | Wed, 25 Dec 2019 13:00:00 | Wed, 01 Jan 2020 13:00:00 | Interoperable Europe Portal SEO author | Interoperable Europe Portal SEO news collection |          |
 
     When I visit the "Interoperable Europe Portal SEO news" news
     Then the metatag JSON should be attached in the page
diff --git a/tests/features/joinup_seo/rdf_entity.feature b/tests/features/joinup_seo/rdf_entity.feature
index 247d25bd29..f3596b186e 100644
--- a/tests/features/joinup_seo/rdf_entity.feature
+++ b/tests/features/joinup_seo/rdf_entity.feature
@@ -6,8 +6,8 @@ Feature: SEO for RDF entities.
 
   Scenario Outline: Basic JSON meta information for collections and solutions.
     Given <type> content:
-      | title      | state     |
-      | SEO entity | published |
+      | title      |
+      | SEO entity |
 
     When I visit the "SEO entity" <type>
     And the metatag graph of the item with "title" "SEO entity" should be present
@@ -27,14 +27,14 @@ Feature: SEO for RDF entities.
 
   Scenario: Basic JSON meta information for releases and distributions.
     Given solution content:
-      | title        | state     |
-      | SEO solution | published |
+      | title        |
+      | SEO solution |
     And release content:
-      | title       | is version of | state     |
-      | SEO release | SEO solution  | published |
+      | title       | is version of |
+      | SEO release | SEO solution  |
     And distribution content:
-      | title            | release     | state     |
-      | SEO distribution | SEO release | published |
+      | title            | release     |
+      | SEO distribution | SEO release |
 
     When I go to the "SEO release" release
     Then the metatag graph of the item with title "SEO release" should be present
diff --git a/tests/features/joinup_subscription/collection.subscribe-on-join.feature b/tests/features/joinup_subscription/collection.subscribe-on-join.feature
index 50978bbf77..6ecbbfb63b 100644
--- a/tests/features/joinup_subscription/collection.subscribe-on-join.feature
+++ b/tests/features/joinup_subscription/collection.subscribe-on-join.feature
@@ -7,11 +7,11 @@ Feature: Subscribing to a collection after joining
   @javascript
   Scenario: Show a modal dialog asking a user to subscribe after joining
     Given collection content:
-      | title            | abstract                       | closed | description                          | state     |
-      | Sapient Pearwood | Grows in magic-polluted areas  | no     | This tree is impervious to magic.    | published |
-      | Drop bears       | Predator from the koala family | no     | Drops from a tree onto its prey.     | published |
-      | Troll ducks      | Stone ducks don't float        | yes    | They sink to the bottom and walk.    | published |
-      | Swamp dragons    | Explode when overexcited       | yes    | Bred for the hotness of their flame. | published |
+      | title            | abstract                       | closed | description                          |
+      | Sapient Pearwood | Grows in magic-polluted areas  | no     | This tree is impervious to magic.    |
+      | Drop bears       | Predator from the koala family | no     | Drops from a tree onto its prey.     |
+      | Troll ducks      | Stone ducks don't float        | yes    | They sink to the bottom and walk.    |
+      | Swamp dragons    | Explode when overexcited       | yes    | Bred for the hotness of their flame. |
     And users:
       | Username          |
       | Echinoid Blacksly |
diff --git a/tests/features/joinup_subscription/community.content.subscriptions.feature b/tests/features/joinup_subscription/community.content.subscriptions.feature
index a6bbc3cd70..d41e647637 100644
--- a/tests/features/joinup_subscription/community.content.subscriptions.feature
+++ b/tests/features/joinup_subscription/community.content.subscriptions.feature
@@ -6,12 +6,12 @@ Feature: Subscribing to community content in collections and solutions
 
   Background:
     Given collection content:
-      | title              | state     |
-      | Black hole imaging | published |
+      | title              |
+      | Black hole imaging |
     Given solution content:
-      | title                 | state     | collection         |
-      | Null geodesics        | published | Black hole imaging |
-      | Bolometric appearance | published | Black hole imaging |
+      | title                 | collection         |
+      | Null geodesics        | Black hole imaging |
+      | Bolometric appearance | Black hole imaging |
     And users:
       | Username  | E-mail               | First name  | Family name | Notification frequency |
       | jpluminet | jpluminet@example.fr | Jean-Pierre | Luminet     | daily                  |
@@ -39,14 +39,14 @@ Feature: Subscribing to community content in collections and solutions
       | Active galactic nuclei | A thin relativistic accretion disk | Black hole imaging |                | published | junfukue |
       | Light diffusion        | Photons emitted at constant radius |                    | Null geodesics | archived  | junfukue |
     And document content:
-      | title             | abstract         | field_paragraphs_body           | collection         | solution              | state     | author   |
-      | Doppler effect    |                  | Caused by disk rotation         | Black hole imaging |                       | published | junfukue |
-      | Distant observers | Distant abstract | Distribution of bolometric flux |                    | Bolometric appearance | published | junfukue |
-      | Close observers   |                  | Close observers body            |                    | Bolometric appearance | published | junfukue |
+      | title             | abstract         | field_paragraphs_body           | collection         | solution              | author   |
+      | Doppler effect    |                  | Caused by disk rotation         | Black hole imaging |                       | junfukue |
+      | Distant observers | Distant abstract | Distribution of bolometric flux |                    | Bolometric appearance | junfukue |
+      | Close observers   |                  | Close observers body            |                    | Bolometric appearance | junfukue |
     And event content:
-      | title               | field_paragraphs_body | collection         | solution       | state     | author   | start date          | end date            |abstract |
-      | Effective potential | Schwarzschild metric  | Black hole imaging |                | published | junfukue | 2019-11-28T11:12:13 | 2019-11-28T11:12:13 |         |
-      | Deflected rays      | Marginally trapped    |                    | Null geodesics | published | junfukue | 2019-12-05T12:00:00 | 2019-12-15T12:00:00 |         |
+      | title               | field_paragraphs_body | collection         | solution       | author   | start date          | end date            | abstract |
+      | Effective potential | Schwarzschild metric  | Black hole imaging |                | junfukue | 2019-11-28T11:12:13 | 2019-11-28T11:12:13 |          |
+      | Deflected rays      | Marginally trapped    |                    | Null geodesics | junfukue | 2019-12-05T12:00:00 | 2019-12-15T12:00:00 |          |
     And news content:
       | title             | field_paragraphs_body      | collection         | solution              | state     | author | abstract |
       | The periastron    | Jacobian elliptic integral | Black hole imaging |                       | published | bisera |          |
@@ -81,35 +81,35 @@ Feature: Subscribing to community content in collections and solutions
       | Deflected rays         |
 
     And the email sent to jpluminet with subject "Interoperable Europe Portal: Daily digest message" contains the following lines of text:
-      | Daily digest message                                                     |
-      | Dear Jean-Pierre,                                                        |
-      | New content published in Black hole imaging                              |
-      | Active galactic nuclei                                                   |
-      | A thin relativistic accretion disk                                       |
-      | Read more                                                                |
-      | Doppler effect                                                           |
-      | Caused by disk rotation                                                  |
-      | Read more                                                                |
-      | 28 November 2019                                                         |
-      | Effective potential                                                      |
-      | Schwarzschild metric                                                     |
-      | Read more                                                                |
-      | The periastron                                                           |
-      | Jacobian elliptic integral                                               |
-      | Read more                                                                |
-      | New content published in Bolometric appearance                           |
-      | Distant observers                                                        |
-      | Distant abstract                                                         |
-      | Read more                                                                |
-      | Close observers                                                          |
-      | Close observers body                                                     |
-      | Read more                                                                |
-      | New content published in Null geodesics                                  |
-      | 05 to 15 December 2019                                                   |
-      | Deflected rays                                                           |
-      | Marginally trapped                                                       |
-      | Read more                                                                |
-      | Kind regards,                                                            |
-      | The Portal Support Team                                                  |
+      | Daily digest message                                                                          |
+      | Dear Jean-Pierre,                                                                             |
+      | New content published in Black hole imaging                                                   |
+      | Active galactic nuclei                                                                        |
+      | A thin relativistic accretion disk                                                            |
+      | Read more                                                                                     |
+      | Doppler effect                                                                                |
+      | Caused by disk rotation                                                                       |
+      | Read more                                                                                     |
+      | 28 November 2019                                                                              |
+      | Effective potential                                                                           |
+      | Schwarzschild metric                                                                          |
+      | Read more                                                                                     |
+      | The periastron                                                                                |
+      | Jacobian elliptic integral                                                                    |
+      | Read more                                                                                     |
+      | New content published in Bolometric appearance                                                |
+      | Distant observers                                                                             |
+      | Distant abstract                                                                              |
+      | Read more                                                                                     |
+      | Close observers                                                                               |
+      | Close observers body                                                                          |
+      | Read more                                                                                     |
+      | New content published in Null geodesics                                                       |
+      | 05 to 15 December 2019                                                                        |
+      | Deflected rays                                                                                |
+      | Marginally trapped                                                                            |
+      | Read more                                                                                     |
+      | Kind regards,                                                                                 |
+      | The Portal Support Team                                                                       |
       | You received this email because you opted in for Interoperable Europe Portal digest messages. |
-      | Manage your subscription notifications or unsubscribe from all.          |
+      | Manage your subscription notifications or unsubscribe from all.                               |
diff --git a/tests/features/joinup_subscription/solution.subscriptions.feature b/tests/features/joinup_subscription/solution.subscriptions.feature
index 62d7061b35..3576561d0a 100644
--- a/tests/features/joinup_subscription/solution.subscriptions.feature
+++ b/tests/features/joinup_subscription/solution.subscriptions.feature
@@ -6,11 +6,11 @@ Feature: Subscribing to a solution
 
   Background:
     Given collection content:
-      | title                  | abstract | description | closed | state     |
-      | Some parent collection | Abstract | Description | yes    | published |
+      | title                  | abstract | description | closed |
+      | Some parent collection | Abstract | Description | yes    |
     And solution content:
-      | title                      | state     | collection             |
-      | Some solution to subscribe | published | Some parent collection |
+      | title                      | collection             |
+      | Some solution to subscribe | Some parent collection |
     And users:
       | Username          |
       | Cornilius Darcias |
diff --git a/tests/features/joinup_subscription/subscribers_report.feature b/tests/features/joinup_subscription/subscribers_report.feature
index e4132e8b23..cd3bc874df 100644
--- a/tests/features/joinup_subscription/subscribers_report.feature
+++ b/tests/features/joinup_subscription/subscribers_report.feature
@@ -16,13 +16,13 @@ Feature: Subscribers report
       | young    |       | Young      | G           |
       | lil      |       | Lil        | Mama        |
     And collection content:
-      | title             | state     |
-      | Marine ecosystems | published |
-      | Plant science     | published |
+      | title             |
+      | Marine ecosystems |
+      | Plant science     |
     Given solution content:
-      | title                 | state     | collection        |
-      | Seagrass meadows      | published | Marine ecosystems |
-      | Intertidal seagrasses | published | Plant science     |
+      | title                 | collection        |
+      | Seagrass meadows      | Marine ecosystems |
+      | Intertidal seagrasses | Plant science     |
     And collection user memberships:
       | collection        | user    | roles       |
       | Marine ecosystems | busta   | facilitator |
diff --git a/tests/features/local_actions.feature b/tests/features/local_actions.feature
index 76809e73f7..83c2367f12 100644
--- a/tests/features/local_actions.feature
+++ b/tests/features/local_actions.feature
@@ -9,24 +9,24 @@ Feature:
     Given I am logged in as a developer
 
     Given collection content:
-      | title           | state     |
-      | Test collection | published |
+      | title           |
+      | Test collection |
     When I go to the "Test collection" collection
     Then I should not see the link "View" in the "Entity actions" region
     When I click "Metadata" in the "Entity actions" region
     Then I should see the link "View" in the "Entity actions" region
 
     Given solution content:
-      | title         | collection      | state     |
-      | Test solution | Test collection | published |
+      | title         | collection      |
+      | Test solution | Test collection |
     When I go to the "Test solution" solution
     Then I should not see the link "View" in the "Entity actions" region
     When I click "Metadata" in the "Entity actions" region
     Then I should see the link "View" in the "Entity actions" region
 
     Given release content:
-      | title        | is version of | state     |
-      | Test release | Test solution | published |
+      | title        | is version of |
+      | Test release | Test solution |
     When I go to the "Test release" release
     Then I should not see the link "View" in the "Entity actions" region
     And I should not see the link "Manage content"
@@ -35,8 +35,8 @@ Feature:
     Then I should see the link "View" in the "Entity actions" region
 
     Given distribution content:
-      | title             | release      | state     |
-      | Test distribution | Test release | published |
+      | title             | release      |
+      | Test distribution | Test release |
     When I go to the "Test distribution" distribution
     Then I should not see the link "View" in the "Entity actions" region
     And I should not see the link "Manage content"
@@ -55,32 +55,32 @@ Feature:
     # Then I should see the link "View" in the "Entity actions" region
 
     Given discussion content:
-      | title           | collection      | state     |
-      | Test discussion | Test collection | published |
+      | title           | collection      |
+      | Test discussion | Test collection |
     When I go to the "Test discussion" discussion
     Then I should not see the link "View" in the "Entity actions" region
     When I click "Delete" in the "Entity actions" region
     Then I should see the link "View" in the "Entity actions" region
 
     Given document content:
-      | title         | collection      | state     |
-      | Test document | Test collection | published |
+      | title         | collection      |
+      | Test document | Test collection |
     When I go to the "Test document" document
     Then I should not see the link "View" in the "Entity actions" region
     When I click "Delete" in the "Entity actions" region
     Then I should see the link "View" in the "Entity actions" region
 
     Given event content:
-      | title      | collection      | state     |
-      | Test event | Test collection | published |
+      | title      | collection      |
+      | Test event | Test collection |
     When I go to the "Test event" event
     Then I should not see the link "View" in the "Entity actions" region
     When I click "Delete" in the "Entity actions" region
     Then I should see the link "View" in the "Entity actions" region
 
     Given news content:
-      | title     | collection      | state     |
-      | Test news | Test collection | published |
+      | title     | collection      |
+      | Test news | Test collection |
     When I go to the "Test news" news
     Then I should not see the link "View" in the "Entity actions" region
     When I click "Delete" in the "Entity actions" region
diff --git a/tests/features/machine_translation.feature b/tests/features/machine_translation.feature
index 686bba6897..27eef99e23 100644
--- a/tests/features/machine_translation.feature
+++ b/tests/features/machine_translation.feature
@@ -7,29 +7,29 @@ Feature: Machine translation
   @javascript
   Scenario: Translation link is only visible on content focused pages
     Given collection content:
-      | title  | state     |
-      | Brexit | published |
+      | title  |
+      | Brexit |
     And event content:
-      | title                      | collection | state     |
-      | Confiscating of sandwiches | Brexit     | published |
+      | title                      | collection |
+      | Confiscating of sandwiches | Brexit     |
     And news content:
-      | title                   | collection | state     |
-      | Supply chain disruption | Brexit     | published |
+      | title                   | collection |
+      | Supply chain disruption | Brexit     |
     And document content:
-      | title                           | collection | state     |
-      | Increased postal delivery costs | Brexit     | published |
+      | title                           | collection |
+      | Increased postal delivery costs | Brexit     |
     And discussion content:
-      | title                                    | collection | state     |
-      | Restriction on animal-based food imports | Brexit     | published |
+      | title                                    | collection |
+      | Restriction on animal-based food imports | Brexit     |
     And custom_page content:
-      | title                      | collection | state     |
-      | Increased credit card fees | Brexit     | published |
+      | title                      | collection |
+      | Increased credit card fees | Brexit     |
     And glossary content:
       | title               | abbreviation | summary                 | definition                | collection |
       | Digital portability | DP           | Availability of content | Across streaming services | Brexit     |
     And solution content:
-      | title         | state     | collection |
-      | Rejoin the EU | published | Brexit     |
+      | title         | collection |
+      | Rejoin the EU | Brexit     |
 
     When I am logged in as a moderator
     # Inside a collection sidebar, only custom pages, glossary terms (but not
diff --git a/tests/features/outdated_content.feature b/tests/features/outdated_content.feature
index 7d9d30428d..3a33158a1c 100644
--- a/tests/features/outdated_content.feature
+++ b/tests/features/outdated_content.feature
@@ -6,20 +6,20 @@ Feature:
   Scenario: Test moderator and anonymous user perspectives.
 
     Given collection content:
-      | title            | state     |
-      | Outdated content | published |
+      | title            |
+      | Outdated content |
     Given solution content:
-      | title             | collection       | state     |
-      | Recent solution   | Outdated content | published |
-      | Outdated solution | Outdated content | published |
+      | title             | collection       |
+      | Recent solution   | Outdated content |
+      | Outdated solution | Outdated content |
     And discussion content:
-      | title                         | collection       | published at     | created   | state     |
-      | Recent published discussion   | Outdated content | -2 years         | -2 years  | published |
-      | Outdated published discussion | Outdated content | -11 years        | -11 years | published |
-      | Not published discussion      | Outdated content |                  | -12 years | draft     |
+      | title                         | collection       | published at | created   | state     |
+      | Recent published discussion   | Outdated content | -2 years     | -2 years  | published |
+      | Outdated published discussion | Outdated content | -11 years    | -11 years | published |
+      | Not published discussion      | Outdated content |              | -12 years | draft     |
     And document content:
-      | title             | collection       | document publication date | state     |
-      | Very old document | Outdated content | 1985-03-04                | published |
+      | title             | collection       | document publication date |
+      | Very old document | Outdated content | 1985-03-04                |
     And event content:
       | title                    | collection       | published at     | created          | state     |
       | Recent published event   | Outdated content | -3 months        | -3 months        | published |
diff --git a/tests/features/pin_in_collection.feature b/tests/features/pin_in_collection.feature
index 0055029b19..2910f8a902 100644
--- a/tests/features/pin_in_collection.feature
+++ b/tests/features/pin_in_collection.feature
@@ -6,13 +6,13 @@ Feature: Pinning entities inside collections
 
   Background:
     Given collection content:
-      | title         | state     |
-      | Orange Wrench | published |
-      | Cloudy Beam   | published |
-      | Green Wrench  | published |
+      | title         |
+      | Orange Wrench |
+      | Cloudy Beam   |
+      | Green Wrench  |
     And solution content:
-      | title        | state     |
-      | Space Silver | published |
+      | title        |
+      | Space Silver |
     And users:
       | Username        | E-mail                      |
       | Rozanne Minett  | rozanne.minett@example.com  |
@@ -31,12 +31,12 @@ Feature: Pinning entities inside collections
 
   Scenario Outline: Facilitators can pin and unpin community content inside their collections.
     Given news content:
-      | title                       | collection    | state     |
-      | What is the HEX for orange? | Orange Wrench | published |
+      | title                       | collection    |
+      | What is the HEX for orange? | Orange Wrench |
     And <content type> content:
-      | title              | headline           | collection    | state     | pinned |
-      | Very important     | Important very     | Orange Wrench | published | yes    |
-      | Useful information | Information useful | Orange Wrench | published | no     |
+      | title              | headline           | collection    | pinned |
+      | Very important     | Important very     | Orange Wrench | yes    |
+      | Useful information | Information useful | Orange Wrench | no     |
 
     When I am an anonymous user
     And I go to the homepage of the "Orange Wrench" collection
@@ -106,12 +106,12 @@ Feature: Pinning entities inside collections
 
   Scenario: Facilitators can pin and unpin community news content inside their collections.
     Given news content:
-      | title                      | collection   | state     |
-      | What is the HEX for green? | Green Wrench | published |
+      | title                      | collection   |
+      | What is the HEX for green? | Green Wrench |
     And news content:
-      | title              | headline           | collection   | state     | pinned |
-      | Very important     | Important very     | Green Wrench | published | yes    |
-      | Useful information | Information useful | Green Wrench | published | no     |
+      | title              | headline           | collection   | pinned |
+      | Very important     | Important very     | Green Wrench | yes    |
+      | Useful information | Information useful | Green Wrench | no     |
 
     When I am an anonymous user
     And I go to the homepage of the "Green Wrench" collection
@@ -168,14 +168,14 @@ Feature: Pinning entities inside collections
 
   Scenario: Facilitators can pin and unpin solutions inside their collections.
     Given news content:
-      | title                         | collection    | state     | pinned | created    |
-      | Where can I find this wrench? | Orange Wrench | published | no     | 2017-11-20 |
-      | Any thoughts about blue?      | Orange Wrench | published | yes    | 2017-10-03 |
-      | Multi stratus beaming         | Cloudy Beam   | published | no     | 2017-11-05 |
+      | title                         | collection    | pinned | created    |
+      | Where can I find this wrench? | Orange Wrench | no     | 2017-11-20 |
+      | Any thoughts about blue?      | Orange Wrench | yes    | 2017-10-03 |
+      | Multi stratus beaming         | Cloudy Beam   | no     | 2017-11-05 |
     Given solution content:
-      | title            | collection    | state     | pinned in     | creation date | shared on     |
-      | Wrench catalogue | Orange Wrench | published | Orange Wrench | 2017-10-12    |               |
-      | Orange estimator | Cloudy Beam   | published |               | 2017-10-02    | Orange Wrench |
+      | title            | collection    | pinned in     | creation date | shared on     |
+      | Wrench catalogue | Orange Wrench | Orange Wrench | 2017-10-12    |               |
+      | Orange estimator | Cloudy Beam   |               | 2017-10-02    | Orange Wrench |
 
     When I am an anonymous user
     And I go to the homepage of the "Orange Wrench" collection
@@ -258,15 +258,15 @@ Feature: Pinning entities inside collections
   @javascript
   Scenario: Last update time of a solution is not affected by (un)pinning.
     Given collection content:
-      | title              | state     | creation date | modification date |
-      | Orange Screwdriver | published | 2018-10-15    | 2019-10-15T23:03  |
-      | Green Screwdriver  | published | 2018-11-05    | 2019-11-05T23:03  |
+      | title              | creation date | modification date |
+      | Orange Screwdriver | 2018-10-15    | 2019-10-15T23:03  |
+      | Green Screwdriver  | 2018-11-05    | 2019-11-05T23:03  |
     Given discussion content:
-      | title                             | collection         | state     | pinned | created    | changed    |
-      | What kind of screwdriver is this? | Orange Screwdriver | published | no     | 2017-11-20 | 2018-11-20 |
+      | title                             | collection         | pinned | created    | changed    |
+      | What kind of screwdriver is this? | Orange Screwdriver | no     | 2017-11-20 | 2018-11-20 |
     Given solution content:
-      | title                    | collection         | state     | pinned in          | creation date | modification date |
-      | Drop forged screwdrivers | Orange Screwdriver | published | Orange Screwdriver | 2017-10-12    | 2018-10-12T23:03  |
+      | title                    | collection         | pinned in          | creation date | modification date |
+      | Drop forged screwdrivers | Orange Screwdriver | Orange Screwdriver | 2017-10-12    | 2018-10-12T23:03  |
     And the following collection user memberships:
       | collection         | user           | roles       |
       | Orange Screwdriver | Rozanne Minett | facilitator |
@@ -316,9 +316,9 @@ Feature: Pinning entities inside collections
   @javascript
   Scenario Outline: Pinned content tiles should show a visual cue only in their collection homepage.
     Given <content type> content:
-      | title         | headline      | collection    | state     | pinned | shared on   |
-      | Lantern FAQs  | Lantern FAQs  | Orange Wrench | published | yes    | Cloudy Beam |
-      | Lantern terms | Lantern terms | Orange Wrench | published | no     |             |
+      | title         | headline      | collection    | pinned | shared on   |
+      | Lantern FAQs  | Lantern FAQs  | Orange Wrench | yes    | Cloudy Beam |
+      | Lantern terms | Lantern terms | Orange Wrench | no     |             |
 
     When I go to the homepage of the "Orange Wrench" collection
     Then the "Lantern FAQs" tile should be marked as pinned
diff --git a/tests/features/pin_in_solution.feature b/tests/features/pin_in_solution.feature
index a71651a575..a91f094819 100644
--- a/tests/features/pin_in_solution.feature
+++ b/tests/features/pin_in_solution.feature
@@ -6,9 +6,9 @@ Feature: Pinning content entities inside solutions
 
   Background:
     Given solution content:
-      | title       | state     |
-      | Blue Wrench | published |
-      | Sunny Beam  | published |
+      | title       |
+      | Blue Wrench |
+      | Sunny Beam  |
     And users:
       | Username          | E-mail                        |
       | Sara Jessica      | sara.jessica@example.com      |
@@ -25,12 +25,12 @@ Feature: Pinning content entities inside solutions
 
   Scenario Outline: Facilitators can pin and unpin community content inside their solutions.
     Given news content:
-      | title                      | solution    | state     | created    |
-      | What is the HEX for lemon? | Blue Wrench | published | 2018-12-13 |
+      | title                      | solution    | created    |
+      | What is the HEX for lemon? | Blue Wrench | 2018-12-13 |
     And <content type> content:
-      | title              | headline           | solution    | state     | pinned | created    |
-      | Very important     | Very important     | Blue Wrench | published | yes    | 2018-11-03 |
-      | Useful information | Useful information | Blue Wrench | published | no     | 2018-12-03 |
+      | title              | headline           | solution    | pinned | created    |
+      | Very important     | Very important     | Blue Wrench | yes    | 2018-11-03 |
+      | Useful information | Useful information | Blue Wrench | no     | 2018-12-03 |
 
     When I am an anonymous user
     And I go to the homepage of the "Blue Wrench" solution
@@ -102,9 +102,9 @@ Feature: Pinning content entities inside solutions
   @javascript
   Scenario Outline: Pinned content tiles should show a visual cue only in their solution homepage.
     Given <content type> content:
-      | title       | headline    | solution    | state     | pinned |
-      | Lantern FAQ | Lantern FAQ | Blue Wrench | published | yes    |
-      | Lantern TCA | Lantern TCA | Blue Wrench | published | no     |
+      | title       | headline    | solution    | pinned |
+      | Lantern FAQ | Lantern FAQ | Blue Wrench | yes    |
+      | Lantern TCA | Lantern TCA | Blue Wrench | no     |
 
     When I go to the homepage of the "Blue Wrench" solution
     Then the "Lantern FAQ" tile should be marked as pinned
diff --git a/tests/features/rdf_sync.feature b/tests/features/rdf_sync.feature
index d2b4b83b72..7bacd22c50 100644
--- a/tests/features/rdf_sync.feature
+++ b/tests/features/rdf_sync.feature
@@ -38,8 +38,8 @@ Feature: RDF synchronization of contents.
       | http://example.com/collection1 | Syncing collection | Owner of all | Abstract. | Description of the collection. | http://www.example.com/msm/ | logo.png | Syncing contact     | Syncing owner | 2016-06-13T13:00 | 2016-07-13T13:00 | 2017-06-30T11:27  | no     | facilitators and authors | no         | Demography | Atlantis         | published | no       |
       | http://example.com/collection2 | Syncing collection | Owner of all | Abstract. | Description of the collection. | http://www.example.com/msm/ | logo.png | Syncing contact     | Syncing owner | 2016-06-13T13:00 | 2016-07-13T13:00 | 2017-06-30T11:27  | no     | facilitators and authors | no         | Demography | Atlantis         | draft     | no       |
     Given solution content:
-      | uri                          | title            | collection         | author       | description    | logo     | owner         | contact information | creation date   | published at    | modification date | documentation | content creation | keywords         | landing page                    | language | metrics page                    | moderation | topic                    | related solutions | solution type                      | spatial coverage | status    | state     | featured |
-      | http://example.com/solution1 | Syncing solution | Syncing collection | Owner of all | <p>content</p> | logo.png | Syncing owner | Syncing contact     | 2017-10-01T8:00 | 2017-11-01T8:00 | 2017-12-01T8:43   | text.pdf      | registered users | ADMS, validation | http://www.example.com/landing1 | Atlantic | http://www.example.org/metrics1 | no         | EU and European Policies |                   | Networking Infrastructure Enablers | Atlantis         | Completed | published | no       |
+      | uri                          | title            | collection         | author       | description    | logo     | owner         | contact information | creation date   | published at    | modification date | documentation | content creation | keywords         | landing page                    | language | metrics page                    | moderation | topic                    | related solutions | solution type                      | spatial coverage | status    | featured |
+      | http://example.com/solution1 | Syncing solution | Syncing collection | Owner of all | <p>content</p> | logo.png | Syncing owner | Syncing contact     | 2017-10-01T8:00 | 2017-11-01T8:00 | 2017-12-01T8:43   | text.pdf      | registered users | ADMS, validation | http://www.example.com/landing1 | Atlantic | http://www.example.org/metrics1 | no         | EU and European Policies |                   | Networking Infrastructure Enablers | Atlantis         | Completed | no       |
     And release content:
       | uri                         | title           | documentation | release number | release notes | creation date    | published at     | changed          | is version of    | state     | status    | spatial coverage | keywords | language |
       | http://example.com/release1 | Syncing release | text.pdf      | 3.0.0          | New 3.0       | 2017-11-10T11:11 | 2017-11-11T11:11 | 2017-11-12T11:11 | Syncing solution | published | Completed | Atlantis         | food     | Atlantic |
diff --git a/tests/features/report.feature b/tests/features/report.feature
index d13cb8233b..f75ff75230 100644
--- a/tests/features/report.feature
+++ b/tests/features/report.feature
@@ -6,11 +6,11 @@ Feature: Report inappropriate content
 
   Scenario Outline: Report inappropriate community content
     Given collection content:
-      | title            | state     |
-      | Deployment tools | published |
+      | title            |
+      | Deployment tools |
     And "<type>" content:
-      | title   | body   | collection       | state   |
-      | <title> | <body> | Deployment tools | <state> |
+      | title   | body   | collection       |
+      | <title> | <body> | Deployment tools |
     Given I am not logged in
     When I go to the content page of the type "<type>" with the title "<title>"
     And I click "Report"
@@ -30,9 +30,9 @@ Feature: Report inappropriate content
     Then I should see the heading "<title>"
 
     Examples:
-      | type        | title                        | body                    | state     |
-      | discussion  | Git is not a deployment tool | Use tarballs to deploy. | published |
-      | custom_page | The best tools               | Current best-in-class.  | published |
-      | news        | Now deploying to containers  | Long awaited feature.   | published |
-      | document    | Deployment strategies        | Deploy faster.          | published |
-      | event       | GovDeploy Bootcamp 2017      | Submit your session.    | published |
+      | type        | title                        | body                    |
+      | discussion  | Git is not a deployment tool | Use tarballs to deploy. |
+      | custom_page | The best tools               | Current best-in-class.  |
+      | news        | Now deploying to containers  | Long awaited feature.   |
+      | document    | Deployment strategies        | Deploy faster.          |
+      | event       | GovDeploy Bootcamp 2017      | Submit your session.    |
diff --git a/tests/features/solution/solution_overview.feature b/tests/features/solution/solution_overview.feature
index e896f45e8e..4b9879d100 100644
--- a/tests/features/solution/solution_overview.feature
+++ b/tests/features/solution/solution_overview.feature
@@ -160,20 +160,20 @@ Feature: Solutions Overview
       | Ryker Brandon   | ryker.brandon@example.com   |
       | Joann Womack    | joann.womack@example.com    |
     And collection content:
-      | title                 | state     |
-      | Insane Wooden Crystal | published |
+      | title                 |
+      | Insane Wooden Crystal |
     Given solution content:
-      | title                        | collection            | state     | featured | author          |
-      | Subdivision Morbid           | Insane Wooden Crystal | published | yes      | Marjorie Parker |
-      | Long Tungsten                | Insane Wooden Crystal | published | no       | Ryker Brandon   |
-      | Hungry Disappointed Tungsten | Insane Wooden Crystal | published | yes      | Marjorie Parker |
-      | Lost Yard                    | Insane Wooden Crystal | published | no       | Joann Womack    |
-      | Lost Scattered Fish          | Insane Wooden Crystal | published | no       | Joann Womack    |
-      | Silver Gravel                | Insane Wooden Crystal | published | no       | Joann Womack    |
+      | title                        | collection            | featured | author          |
+      | Subdivision Morbid           | Insane Wooden Crystal | yes      | Marjorie Parker |
+      | Long Tungsten                | Insane Wooden Crystal | no       | Ryker Brandon   |
+      | Hungry Disappointed Tungsten | Insane Wooden Crystal | yes      | Marjorie Parker |
+      | Lost Yard                    | Insane Wooden Crystal | no       | Joann Womack    |
+      | Lost Scattered Fish          | Insane Wooden Crystal | no       | Joann Womack    |
+      | Silver Gravel                | Insane Wooden Crystal | no       | Joann Womack    |
     # Technical: use a separate step to create a collection associated to the anonymous user.
     And solution content:
-      | title      | collection            | state     | featured |
-      | Flag Rough | Insane Wooden Crystal | published | no       |
+      | title      | collection            | featured |
+      | Flag Rough | Insane Wooden Crystal | no       |
 
     When I am logged in as "Joann Womack"
     And I visit the solution overview
diff --git a/tests/features/taxonomy/curated_homepage_topics.feature b/tests/features/taxonomy/curated_homepage_topics.feature
index f75e186d1b..26ff8925d0 100644
--- a/tests/features/taxonomy/curated_homepage_topics.feature
+++ b/tests/features/taxonomy/curated_homepage_topics.feature
@@ -163,8 +163,8 @@ Feature:
 
   Scenario: Description and summary are displayed accordingly.
     Given news content:
-      | title  | headline | state     |
-      | News 1 | News 1   | published |
+      | title  | headline |
+      | News 1 | News 1   |
     And the following topics are enabled in the homepage:
       | Economy and Welfare     |
       | Info                    |
@@ -200,11 +200,11 @@ Feature:
       | title      |
       | Collection |
     Given news content:
-      | title  | headline | state     | collection |
-      | News 1 | News 1   | published | Collection |
+      | title  | headline | collection |
+      | News 1 | News 1   | Collection |
     And custom_page content:
-      | title          | state     | collection |
-      | Popular quotes | published | Collection |
+      | title          | collection |
+      | Popular quotes | Collection |
     And I append "text" to "field_paragraphs_body" field in "node" entity with following "Popular Quotes" title:
       | field_body:value  |     That's one small step for a&nbsp;man, a giant leap for mankind. |
       | field_body:format | text_html                                                           |
@@ -276,8 +276,8 @@ Feature:
   @javascript
   Scenario: Long descriptions in topic inner page should be partially hidden.
     Given news content:
-      | title  | headline | state     |
-      | News 1 | News 1   | published |
+      | title  | headline |
+      | News 1 | News 1   |
     And the following topics are enabled in the homepage:
       | Economy and Welfare     |
       | Info                    |
@@ -311,16 +311,16 @@ Feature:
   @javascript
   Scenario: Regression test to ensure order of entities.
     Given news content:
-      | title  | headline | body              | state     | created    | changed    | topic     |
-      | News 1 | News 1   | Test              | published | 01-01-2023 | 03-02-2023 | E-justice |
-      | News 2 | News 2   | Test              | published | 02-01-2023 | 02-02-2023 | E-justice |
-      | News 3 | News 3   | Test              | published | 03-01-2023 | 01-02-2023 | E-justice |
-      | News 4 | News 4   | Should not appear | published | 04-01-2023 | 01-01-2023 | E-health  |
+      | title  | headline | body              | created    | changed    | topic     |
+      | News 1 | News 1   | Test              | 01-01-2023 | 03-02-2023 | E-justice |
+      | News 2 | News 2   | Test              | 02-01-2023 | 02-02-2023 | E-justice |
+      | News 3 | News 3   | Test              | 03-01-2023 | 01-02-2023 | E-justice |
+      | News 4 | News 4   | Should not appear | 04-01-2023 | 01-01-2023 | E-health  |
     And event content:
-      | title   | field_paragraphs_body | start date   | end date    | created    | state     | topic     |
-      | Event 1 | Test                  | now -8 days  | now -9 days | now -4 day | published | E-justice |
-      | Event 2 | Test                  | now -9 days  | now -8 days | now -3 day | published | E-justice |
-      | Event 3 | Test                  | now -10 days | now -7 days | now -5 day | published | E-justice |
+      | title   | field_paragraphs_body | start date   | end date    | created    | topic     |
+      | Event 1 | Test                  | now -8 days  | now -9 days | now -4 day | E-justice |
+      | Event 2 | Test                  | now -9 days  | now -8 days | now -3 day | E-justice |
+      | Event 3 | Test                  | now -10 days | now -7 days | now -5 day | E-justice |
     And the following topics are enabled in the homepage:
       | Economy and Welfare |
       | E-justice           |
@@ -433,8 +433,8 @@ Feature:
   @javascript
   Scenario Outline: Images should be shown for tile-two view modes.
     Given <type> content:
-      | title       | headline    | short title | state   | logo       | published |
-      | Custom tile | Custom tile | Custom tile | <state> | linus.jpeg | yes       |
+      | title       | headline    | short title | logo       |
+      | Custom tile | Custom tile | Custom tile | linus.jpeg | yes |
     And the following topics are enabled in the homepage:
       | E-justice |
     And I am logged in as a moderator
@@ -458,24 +458,24 @@ Feature:
     Then there should be "<image count>" image in the "Custom tile" tile
 
     Examples:
-      | type        | image count | list style | state     |
-      | custom_page | 1           | list       | published |
-      | custom_page | 1           | grid       | published |
-      | news        | 1           | list       | published |
-      | news        | 1           | grid       | published |
-      | event       | 1           | list       | published |
-      | event       | 1           | grid       | published |
-      | document    | 1           | list       | published |
-      | document    | 1           | grid       | published |
-      | discussion  | 1           | list       | published |
-      | discussion  | 1           | grid       | published |
+      | type        | image count | list style |
+      | custom_page | 1           | list       |
+      | custom_page | 1           | grid       |
+      | news        | 1           | list       |
+      | news        | 1           | grid       |
+      | event       | 1           | list       |
+      | event       | 1           | grid       |
+      | document    | 1           | list       |
+      | document    | 1           | grid       |
+      | discussion  | 1           | list       |
+      | discussion  | 1           | grid       |
 
   @javascript
   Scenario: Up to 4 topics should be shown for tile-two view modes.
     Given news content:
-      | title  | headline | body             | state     | created    | changed    | topic                                                                    |
-      | News 1 | News 1   | Test             | published | 01-01-2023 | 03-02-2023 | E-justice, Finance in EU, Supplier exchange, HR, Statistics and Analysis |
-      | News 2 | News 2   | Test longer body | published | 02-01-2023 | 03-02-2023 | E-justice, Finance in EU, Supplier exchange, Statistics and Analysis     |
+      | title  | headline | body             | created    | changed    | topic                                                                    |
+      | News 1 | News 1   | Test             | 01-01-2023 | 03-02-2023 | E-justice, Finance in EU, Supplier exchange, HR, Statistics and Analysis |
+      | News 2 | News 2   | Test longer body | 02-01-2023 | 03-02-2023 | E-justice, Finance in EU, Supplier exchange, Statistics and Analysis     |
     And the following topics are enabled in the homepage:
       | E-justice |
 
@@ -515,8 +515,8 @@ Feature:
   @javascript
   Scenario: A configurable listing with no results should not print its title.
     Given news content:
-      | title  | headline | state     |
-      | News 1 | News 1   | published |
+      | title  | headline |
+      | News 1 | News 1   |
     And the following topics are enabled in the homepage:
       | E-justice |
     And I am logged in as a moderator
@@ -541,8 +541,8 @@ Feature:
   @javascript
   Scenario: Ampersand character is not decoded properly under a topic page.
     Given custom_page content:
-      | title                    | state     |
-      | Legislation & Technology | published |
+      | title                    |
+      | Legislation & Technology |
     And the following topics are enabled in the homepage:
       | E-justice |
     And I am logged in as a moderator
@@ -567,13 +567,13 @@ Feature:
   @javascript
   Scenario: Show abstract instead of description in Collection/Solution tiles.
     Given collection content:
-      | title                | abstract         | closed | description                          | state     |
-      | Col with abstract    | Magic abstract   | no     | This tree is impervious description. | published |
-      | Col without abstract | Another abstract | no     | Magic description.                   | published |
+      | title                | abstract         | closed | description                          |
+      | Col with abstract    | Magic abstract   | no     | This tree is impervious description. |
+      | Col without abstract | Another abstract | no     | Magic description.                   |
     Given solution content:
-      | title             | description              | state     | collection        | abstract                         |
-      | Another rough day | Lorem description issum  | published | Col with abstract |                                  |
-      | Just another solt | Second description issum | published | Col with abstract | This is an soltion with abstract |
+      | title             | description              | collection        | abstract                         |
+      | Another rough day | Lorem description issum  | Col with abstract |                                  |
+      | Just another solt | Second description issum | Col with abstract | This is an soltion with abstract |
     And the following topics are enabled in the homepage:
       | E-justice |
     And I am logged in as a moderator
diff --git a/tests/features/taxonomy/topic.term_redirect.feature b/tests/features/taxonomy/topic.term_redirect.feature
index 80671a5f3c..5378d4802a 100644
--- a/tests/features/taxonomy/topic.term_redirect.feature
+++ b/tests/features/taxonomy/topic.term_redirect.feature
@@ -6,8 +6,8 @@ Feature: Topic terms are redirected to search page.
       | uri                                 | tid  | name     |
       | http://joinup.eu/ontology/topic#foo | 5000 | Foo term |
     And collection content:
-      | title          | state     | topic    |
-      | Bar collection | published | Foo term |
+      | title          | topic    |
+      | Bar collection | Foo term |
 
   Scenario Outline: Topic terms are redirected to search page.
     Given I go to "<inbound url>"
diff --git a/tests/features/user/cancel.feature b/tests/features/user/cancel.feature
index b99252b1aa..d3c3aa2c2d 100644
--- a/tests/features/user/cancel.feature
+++ b/tests/features/user/cancel.feature
@@ -35,11 +35,11 @@ Feature:
 
   Scenario: A moderator deletes a user using the administrative UI.
     Given collection content:
-      | title           | state     |
-      | Test collection | published |
+      | title           |
+      | Test collection |
     And news content:
-      | title     | author       | collection      | state     |
-      | News item | alicia__1997 | Test collection | published |
+      | title     | author       | collection      |
+      | News item | alicia__1997 | Test collection |
 
     Given I am logged in as a moderator
     And I click "People"
@@ -75,17 +75,17 @@ Feature:
 
   Scenario: Cancel own account.
     Given collection content:
-      | title           | state     |
-      | Test collection | published |
+      | title           |
+      | Test collection |
     And news content:
-      | title     | author       | collection      | state     |
-      | News item | alicia__1997 | Test collection | published |
+      | title     | author       | collection      |
+      | News item | alicia__1997 | Test collection |
     And document content:
-      | title | author       | collection      | state     |
-      | Docky | alicia__1997 | Test collection | published |
+      | title | author       | collection      |
+      | Docky | alicia__1997 | Test collection |
     And discussion content:
-      | title  | collection      | state     |
-      | Disqus | Test collection | published |
+      | title  | collection      |
+      | Disqus | Test collection |
     And comments:
       | subject  | field_body   | author       | parent |
       | Awesome! | Let's use it | alicia__1997 | Disqus |
diff --git a/tests/features/user/cancel_group_owner.feature b/tests/features/user/cancel_group_owner.feature
index 6be574a9c8..40b37331ed 100644
--- a/tests/features/user/cancel_group_owner.feature
+++ b/tests/features/user/cancel_group_owner.feature
@@ -8,12 +8,12 @@ Feature:
       | Hazel Olson   |       | HazelOlson@example.com   | Hazel      | Olson       |
       | Amelia Barker |       | AmeliaBarker@example.com | Amelia     | Barker      |
     And collection content:
-      | title                   | state     |
-      | Lugia was just released | published |
-      | Articuno is hunted      | published |
+      | title                   |
+      | Lugia was just released |
+      | Articuno is hunted      |
     Given solution content:
-      | title                        | state     |
-      | Random chat machine learning | published |
+      | title                        |
+      | Random chat machine learning |
     # Assign facilitator role in order to allow creation of a solution.
     # In UAT this can be done by creating the collection through the UI
     # with the related user.
diff --git a/tests/features/video/embed.feature b/tests/features/video/embed.feature
index 254773c0f6..792356dba3 100644
--- a/tests/features/video/embed.feature
+++ b/tests/features/video/embed.feature
@@ -6,8 +6,8 @@ Feature: Embed of videos into the page.
 
   Background:
     Given collection content:
-      | title                    | description                          | state     |
-      | Beer brewing corporation | Beer is the real nectar of the gods. | published |
+      | title                    | description                          |
+      | Beer brewing corporation | Beer is the real nectar of the gods. |
 
   Scenario: As a community content editor I can embed video iframes from allowed domains into the content field.
     Given I am logged in as a "facilitator" of the "Beer brewing corporation" collection
@@ -69,6 +69,6 @@ Feature: Embed of videos into the page.
     And I see the "iframe" element with the "title" attribute set to "<title attribute>" in the "Content" region
 
     Examples:
-      | url                                                                                                                                                   | embed url                                                           | title attribute                 |
-      | https://www.youtube.com/watch?v=YTaLmMsaLOg                                                                                                           | /media/oembed?url=https%3A//www.youtube.com/watch%3Fv%3DYTaLmMsaLOg | New Joinup (1/7)                |
-      | https://vimeo.com/7073899                                                                                                                             | /media/oembed?url=https%3A//vimeo.com/7073899                       | Drupal Rap Video - Schipulcon09 |
+      | url                                         | embed url                                                           | title attribute                 |
+      | https://www.youtube.com/watch?v=YTaLmMsaLOg | /media/oembed?url=https%3A//www.youtube.com/watch%3Fv%3DYTaLmMsaLOg | New Joinup (1/7)                |
+      | https://vimeo.com/7073899                   | /media/oembed?url=https%3A//vimeo.com/7073899                       | Drupal Rap Video - Schipulcon09 |
-- 
GitLab


From 43946d0e436b2ddc2fda71a2525c524a5f467849 Mon Sep 17 00:00:00 2001
From: "micha.jakubowski" <micha.jakubowski@ffwagency.com>
Date: Mon, 16 Dec 2024 14:44:50 +0100
Subject: [PATCH 067/137] ISAICP-8780: Fix input_filter.feature

---
 tests/features/joinup_core/input_filter.feature | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/tests/features/joinup_core/input_filter.feature b/tests/features/joinup_core/input_filter.feature
index 296a1d89a1..a277b61e38 100644
--- a/tests/features/joinup_core/input_filter.feature
+++ b/tests/features/joinup_core/input_filter.feature
@@ -78,7 +78,7 @@ Feature: Input filter
   @backtrackLimit
   Scenario: Ensure really long HTML tag (e.g. < img > with src:data/image...) does not generate a fatal error.
     Given discussion content:
-      | title         | headline       | body                        | collection    | state |
+      | title         | headline       | body                        | collection    |
       | Famous actors | Famous peoples | Article about famous actors | Netflix group |
     And I set long body of "Famous actors" discussion
 
-- 
GitLab


From bfd8b88b46d7a1e2debe337aafa08a02f97637b9 Mon Sep 17 00:00:00 2001
From: "micha.jakubowski" <micha.jakubowski@ffwagency.com>
Date: Mon, 16 Dec 2024 15:26:13 +0100
Subject: [PATCH 068/137] ISAICP-8780: Fix curated_homepage_topics.feature and
 event.edit.feature

---
 tests/features/joinup_event/event.edit.feature          | 4 ++--
 tests/features/taxonomy/curated_homepage_topics.feature | 4 ++--
 2 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/tests/features/joinup_event/event.edit.feature b/tests/features/joinup_event/event.edit.feature
index 17bd9bd3de..ad14fd595e 100644
--- a/tests/features/joinup_event/event.edit.feature
+++ b/tests/features/joinup_event/event.edit.feature
@@ -7,7 +7,7 @@ Feature: "Event page" editing.
   Scenario: Add and remove map
     Given collection content:
       | title  | logo     |
-      | Heroes | logo.png | published |
+      | Heroes | logo.png |
     And I am logged in as a facilitator of the "Heroes" collection
     When I go to the homepage of the "Heroes" collection
     And I click "Add event" in the plus button menu
@@ -42,7 +42,7 @@ Feature: "Event page" editing.
       | <collection> | <user> | <role> |
     And "event" content:
       | title   | author | collection   |
-      | <event> | <user> | <collection> | published |
+      | <event> | <user> | <collection> |
     When I am logged in as "<user>"
     And I go to the "<event>" event
     Then I should see the link "Edit" in the "Entity actions" region
diff --git a/tests/features/taxonomy/curated_homepage_topics.feature b/tests/features/taxonomy/curated_homepage_topics.feature
index 26ff8925d0..0ee8700613 100644
--- a/tests/features/taxonomy/curated_homepage_topics.feature
+++ b/tests/features/taxonomy/curated_homepage_topics.feature
@@ -433,8 +433,8 @@ Feature:
   @javascript
   Scenario Outline: Images should be shown for tile-two view modes.
     Given <type> content:
-      | title       | headline    | short title | logo       |
-      | Custom tile | Custom tile | Custom tile | linus.jpeg | yes |
+      | title       | headline    | short title | logo       | published |
+      | Custom tile | Custom tile | Custom tile | linus.jpeg | yes       |
     And the following topics are enabled in the homepage:
       | E-justice |
     And I am logged in as a moderator
-- 
GitLab


From 94863a5e3f5221585c8d557e8342f12c0fa1d1b3 Mon Sep 17 00:00:00 2001
From: "micha.jakubowski" <micha.jakubowski@ffwagency.com>
Date: Mon, 16 Dec 2024 16:29:16 +0100
Subject: [PATCH 069/137] ISAICP-8780: Fix search.feature

---
 tests/features/joinup_search/search.feature | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/tests/features/joinup_search/search.feature b/tests/features/joinup_search/search.feature
index ddda77daf5..37614f9f84 100644
--- a/tests/features/joinup_search/search.feature
+++ b/tests/features/joinup_search/search.feature
@@ -338,7 +338,7 @@ Feature: Global search
     When I go to the homepage
     And I enter "contact" in the search bar and press enter
     # The Portal collection is included
-    Then the page should show the tiles "The Portal, Solution alpha, Release Alpha"
+    Then the page should show the tiles "The Portal, Solution alpha, Release Alpha, Collection alpha, Col for Sol"
 
     # Users should be found by first name, family name and organisation.
     When I enter "Jenessa" in the search bar and press enter
-- 
GitLab


From 4847849ce3b3ccc0b0cf63b87b23c9b8e62daa12 Mon Sep 17 00:00:00 2001
From: Ilias Dimopoulos <idimopoulos@hotmail.com>
Date: Tue, 17 Dec 2024 18:51:34 +0200
Subject: [PATCH 070/137] ISAICP-8780: Attempt to remove more state fields from
 being declared in tests.

---
 .../community_content/archive.feature         |  4 +--
 tests/features/homepage.feature               | 16 ++++-----
 .../joinup_log/actions_log_report.feature     |  8 ++---
 .../joinup_rss/collection_feed.feature        | 36 +++++++++----------
 tests/features/legal/legal_notice.feature     |  4 +--
 tests/features/media/media.feature            |  6 ++--
 tests/features/menus/quick_links.feature      |  4 +--
 tests/features/menus/support_menu.feature     |  4 +--
 tests/features/menus/whats_new.feature        |  8 ++---
 .../curated_content_listings.feature          | 28 +++++++--------
 .../moderator/rdf_id_converter.feature        |  4 +--
 .../moderator/solutions_by_licence.feature    | 20 +++++------
 .../owner/collection_with_owner.feature       |  4 +--
 tests/features/paragraphs/accordion.feature   |  8 ++---
 tests/features/paragraphs/block.feature       | 14 ++++----
 .../paragraphs/call_to_action.feature         |  8 ++---
 .../paragraphs/custom_page.paragraphs.feature | 12 +++----
 tests/features/paragraphs/github_feed.feature |  8 ++---
 tests/features/paragraphs/image.feature       |  8 ++---
 .../paragraphs/layout_paragraphs.feature      |  4 +--
 tests/features/paragraphs/map.feature         |  4 +--
 tests/features/paragraphs/quote.feature       |  8 ++---
 .../features/paragraphs/social_media.feature  | 12 +++----
 tests/features/paragraphs/webform.feature     |  4 +--
 24 files changed, 118 insertions(+), 118 deletions(-)

diff --git a/tests/features/community_content/archive.feature b/tests/features/community_content/archive.feature
index bd9a79eb46..30f0eea672 100644
--- a/tests/features/community_content/archive.feature
+++ b/tests/features/community_content/archive.feature
@@ -71,8 +71,8 @@ Feature: Content archival.
       | title             | state    |
       | Cartridge cleaner | archived |
     Given <type> content:
-      | title                | state    | solution          | state    |
-      | Test archived <type> | archived | Cartridge cleaner | archived |
+      | title                | state    | solution          |
+      | Test archived <type> | archived | Cartridge cleaner |
 
     When I am logged in as a moderator
     And I go to the edit form of the "Test archived <type>" <type>
diff --git a/tests/features/homepage.feature b/tests/features/homepage.feature
index 31471839ea..56b6acd141 100644
--- a/tests/features/homepage.feature
+++ b/tests/features/homepage.feature
@@ -65,8 +65,8 @@ Feature: Homepage
 
   Scenario Outline: Community content can be placed "In the spotlight" on the homepage
     Given collection content:
-      | title         | state     |
-      | Mice in space | published |
+      | title         |
+      | Mice in space |
     And news content:
       | title       | headline       | collection    | topic                                                 | logo       | field_paragraphs_body |
       | New muscles | Muscle atrophy | Mice in space | Finance in EU, Supplier exchange, E-health, E-justice | blaise.jpg | <news body>           |
@@ -133,8 +133,8 @@ Feature: Homepage
 
   Scenario: An event in the highlighted content on the homepage should display the start date.
     Given event content:
-      | title            | start date       | end date         | state     | field_paragraphs_body | abstract                |
-      | Light and height | 2021-06-04T20:00 | 2021-06-05T22:00 | published | High and lite         | Abstract: High and lite |
+      | title            | start date       | end date         | field_paragraphs_body | abstract                |
+      | Light and height | 2021-06-04T20:00 | 2021-06-05T22:00 | High and lite         | Abstract: High and lite |
     And the "Highlighted content" content listing contains:
       | type    | label            |
       | content | Light and height |
@@ -152,8 +152,8 @@ Feature: Homepage
 
   Scenario: An event can be highlighted on the homepage
     Given event content:
-      | title                     | start date       | end date         | state     |
-      | Florentine steak festival | 2021-06-04T20:00 | 2021-06-05T22:00 | published |
+      | title                     | start date       | end date         |
+      | Florentine steak festival | 2021-06-04T20:00 | 2021-06-05T22:00 |
     And the "Highlighted event" content listing contains:
       | type    | label                     |
       | content | Florentine steak festival |
@@ -209,8 +209,8 @@ Feature: Homepage
 
   Scenario: Search box is shown in the main content
     Given collection content:
-      | title        | state     |
-      | RNA vaccines | published |
+      | title        |
+      | RNA vaccines |
     And I am on the homepage
     Then I should see the "Search" field in the Featured region
     When I enter "RNA" in the search bar and press enter
diff --git a/tests/features/joinup_log/actions_log_report.feature b/tests/features/joinup_log/actions_log_report.feature
index af6b2ac0e7..6872cf75b6 100644
--- a/tests/features/joinup_log/actions_log_report.feature
+++ b/tests/features/joinup_log/actions_log_report.feature
@@ -6,11 +6,11 @@ Feature: Actions log
 
   Background:
     Given collection content:
-      | title         | state     |
-      | Tilt and Turn | published |
+      | title         |
+      | Tilt and Turn |
     Given solution content:
-      | title    | state     | collection    |
-      | Skylight | published | Tilt and Turn |
+      | title    | collection    |
+      | Skylight | Tilt and Turn |
 
   Scenario: Access to report is limited.
     Given I am not logged in
diff --git a/tests/features/joinup_rss/collection_feed.feature b/tests/features/joinup_rss/collection_feed.feature
index 01aa2b491b..87ba95f686 100644
--- a/tests/features/joinup_rss/collection_feed.feature
+++ b/tests/features/joinup_rss/collection_feed.feature
@@ -21,29 +21,29 @@ Feature: Collection RSS feed.
       | Indigo Monkey    | forest  | facilitator |
       | Dreaded Scissors | otto    | facilitator |
     Given solution content:
-      | title           | state     | author  | creation date    | collection       |
-      | Lantern Global  | published | alejake | 2018-12-18 08:00 | Indigo Monkey    |
-      | Proton Lonesome | published | alejake | 2019-01-05 10:00 | Indigo Monkey    |
-      | Shiny Ray       | published | otto    | 2018-08-14 17:36 | Dreaded Scissors |
+      | title           | author  | creation date    | collection       |
+      | Lantern Global  | alejake | 2018-12-18 08:00 | Indigo Monkey    |
+      | Proton Lonesome | alejake | 2019-01-05 10:00 | Indigo Monkey    |
+      | Shiny Ray       | otto    | 2018-08-14 17:36 | Dreaded Scissors |
     And news content:
-      | title                                   | field_paragraphs_body                                    | state     | author  | created          | collection       | solution        |
-      | Monkeys favourite indigo amongst colors | Research results are out.                                | published | alejake | 2019-01-21 12:36 | Indigo Monkey    |                 |
-      | Proton lonesomeness reaches peak        | More than 200 thousand protons were interviewed.         | published | forest  | 2019-01-07 12:00 |                  | Proton Lonesome |
-      | New metal alloy improves scissors       | It improves sharpness but they are more subject to rust. | published | otto    | 2018-04-11 09:00 | Dreaded Scissors |                 |
+      | title                                   | field_paragraphs_body                                    | author  | created          | collection       | solution        |
+      | Monkeys favourite indigo amongst colors | Research results are out.                                | alejake | 2019-01-21 12:36 | Indigo Monkey    |                 |
+      | Proton lonesomeness reaches peak        | More than 200 thousand protons were interviewed.         | forest  | 2019-01-07 12:00 |                  | Proton Lonesome |
+      | New metal alloy improves scissors       | It improves sharpness but they are more subject to rust. | otto    | 2018-04-11 09:00 | Dreaded Scissors |                 |
     And event content:
-      | title                    | abstract | field_paragraphs_body                                                                                                                                                                                                                                                                                                                                           | state     | author | created          | collection       |
-      | Banana tasting           | abstract | Testing more than 20 varities of bananas from all over the world.                                                                                                                                                                                                                                                                                               | published | forest | 2018-09-14 07:36 | Indigo Monkey    |
-      | Scissor sharpening party | abstract | <p>The place where to be if you want to keep <strong>cutting</strong> the paper at the best of your scissors <a href="http://www.example.com/">possibilities</a>.</p> <table><tr><td>Lorem ipsum dolor sit amet consectetur adipiscing elit. Etiam sed consectetur turpis. In porta lectus sit amet nulla feugiat et viverra massa fringilla.</td></tr></table> | published | otto   | 2017-11-26 14:18 | Dreaded Scissors |
+      | title                    | abstract | field_paragraphs_body                                                                                                                                                                                                                                                                                                                                           | author | created          | collection       |
+      | Banana tasting           | abstract | Testing more than 20 varities of bananas from all over the world.                                                                                                                                                                                                                                                                                               | forest | 2018-09-14 07:36 | Indigo Monkey    |
+      | Scissor sharpening party | abstract | <p>The place where to be if you want to keep <strong>cutting</strong> the paper at the best of your scissors <a href="http://www.example.com/">possibilities</a>.</p> <table><tr><td>Lorem ipsum dolor sit amet consectetur adipiscing elit. Etiam sed consectetur turpis. In porta lectus sit amet nulla feugiat et viverra massa fringilla.</td></tr></table> | otto   | 2017-11-26 14:18 | Dreaded Scissors |
     And document content:
-      | title                  | field_paragraphs_body                                    | state     | author  | created          | collection    |
-      | Indigo technical paper | All technical information about the rare indigo monkeys. | published | alejake | 2016-05-30 12:21 | Indigo Monkey |
+      | title                  | field_paragraphs_body                                    | author  | created          | collection    |
+      | Indigo technical paper | All technical information about the rare indigo monkeys. | alejake | 2016-05-30 12:21 | Indigo Monkey |
     And discussion content:
-      | title                                          | body                                                                                   | state     | author  | created          | collection    |
-      | Is the indigo coloration caused by their food? | I was reading the technical paper and it seems their main food is the indigo cherries. | published | alejake | 2019-01-21 13:00 | Indigo Monkey |
+      | title                                          | body                                                                                   | author  | created          | collection    |
+      | Is the indigo coloration caused by their food? | I was reading the technical paper and it seems their main food is the indigo cherries. | alejake | 2019-01-21 13:00 | Indigo Monkey |
     And custom_page content:
-      | title             | body                                            | state     | author | created          | collection        |
-      | Indigo variations | The four major tones of indigo are listed here. | published | forest | 2017-10-15 18:30 | Indigo Monkey     |
-      | List of devices   | Available remote electrical devices.            | published |        | 2019-02-08 09:00 | Remote Electrical |
+      | title             | body                                            | author | created          | collection        |
+      | Indigo variations | The four major tones of indigo are listed here. | forest | 2017-10-15 18:30 | Indigo Monkey     |
+      | List of devices   | Available remote electrical devices.            |        | 2019-02-08 09:00 | Remote Electrical |
 
     When I am an anonymous user
     And I go to the homepage of the "Indigo Monkey" collection
diff --git a/tests/features/legal/legal_notice.feature b/tests/features/legal/legal_notice.feature
index 084510197f..c177528f00 100644
--- a/tests/features/legal/legal_notice.feature
+++ b/tests/features/legal/legal_notice.feature
@@ -179,8 +179,8 @@ Feature:
       | Username        | E-mail                  | Password | Local username  |
       | Sergeant Pepper | pepper@royalnavy.mod.uk | p3pp3r   | Sergeant Pepper |
     And collection content:
-      | title              | state     |
-      | Land of submarines | published |
+      | title              |
+      | Land of submarines |
 
     Given I am an anonymous user
     When I go to the homepage of the "Land of submarines" collection
diff --git a/tests/features/media/media.feature b/tests/features/media/media.feature
index 956365ae8f..ed0ccdf323 100644
--- a/tests/features/media/media.feature
+++ b/tests/features/media/media.feature
@@ -8,9 +8,9 @@ Feature: Administer media.
       | joe      |           |
       | theOne   | moderator |
     And collection content:
-      | title | state     |
-      | Mars  | published |
-      | Venus | published |
+      | title |
+      | Mars  |
+      | Venus |
     And the following "Collection logo" media:
       | name                | owner | image                       |
       | The Collection Logo | joe   | library/collection-logo.png |
diff --git a/tests/features/menus/quick_links.feature b/tests/features/menus/quick_links.feature
index b263714232..ecb331a4e0 100644
--- a/tests/features/menus/quick_links.feature
+++ b/tests/features/menus/quick_links.feature
@@ -79,8 +79,8 @@ Feature: Test the visibility of the quick links menu.
 
     # Lets not test all links in a separate list of steps to save time.
     Given release content:
-      | title        | is version of | state     |
-      | Some release | Some solution | published |
+      | title        | is version of |
+      | Some release | Some solution |
     And I go to the edit form of the "Some solution" solution
     And I fill in the following:
       | Landing page | http://www.example.com |
diff --git a/tests/features/menus/support_menu.feature b/tests/features/menus/support_menu.feature
index 233b9c67e9..f660dfdf57 100644
--- a/tests/features/menus/support_menu.feature
+++ b/tests/features/menus/support_menu.feature
@@ -38,8 +38,8 @@ Feature:
   Scenario Outline: Test user support menu usage.
 
     Given collection content:
-      | title            | state     |
-      | Hotel California | published |
+      | title            |
+      | Hotel California |
 
     Given I am <role>
 
diff --git a/tests/features/menus/whats_new.feature b/tests/features/menus/whats_new.feature
index e51478f9cb..8ba0eb77ea 100644
--- a/tests/features/menus/whats_new.feature
+++ b/tests/features/menus/whats_new.feature
@@ -8,11 +8,11 @@ Feature:
 
   Background:
     Given collection content:
-      | title               | state     |
-      | Flagging collection | published |
+      | title               |
+      | Flagging collection |
     And news content:
-      | title      | headline   | state     | collection          |
-      | Some title | Some title | published | Flagging collection |
+      | title      | headline   | collection          |
+      | Some title | Some title | Flagging collection |
 
   Scenario: Only content entity internal URLs are allowed for flagging menu items.
     When I am logged in as a moderator
diff --git a/tests/features/moderator/curated_content_listings.feature b/tests/features/moderator/curated_content_listings.feature
index f77401e880..a7fb95240d 100644
--- a/tests/features/moderator/curated_content_listings.feature
+++ b/tests/features/moderator/curated_content_listings.feature
@@ -57,20 +57,20 @@ Feature: Curated content listings
   See https://citnet.tech.ec.europa.eu/CITnet/jira/browse/ISAICP-6658
 
     Given collection content:
-      | title           | state     |
-      | Spacex in space | published |
+      | title           |
+      | Spacex in space |
     And news content:
-      | title          | collection      | topic                                      | state     |
-      | Cardio atrophy | Spacex in space | Finance in EU, Supplier exchange, E-health | published |
+      | title          | collection      | topic                                      |
+      | Cardio atrophy | Spacex in space | Finance in EU, Supplier exchange, E-health |
     And discussion content:
-      | title                | collection      | topic                            | state     |
-      | Reference of gravity | Spacex in space | Employment and Support Allowance | published |
+      | title                | collection      | topic                            |
+      | Reference of gravity | Spacex in space | Employment and Support Allowance |
     And document content:
-      | title        | collection      | topic                                  | state     |
-      | Licrogravity | Spacex in space | HR, Statistics and Analysis, E-justice | published |
+      | title        | collection      | topic                                  |
+      | Licrogravity | Spacex in space | HR, Statistics and Analysis, E-justice |
     And event content:
-      | title           | collection      | topic                    | state     |
-      | Stay at the CSS | Spacex in space | EU and European Policies | published |
+      | title           | collection      | topic                    |
+      | Stay at the CSS | Spacex in space | EU and European Policies |
     And the "Highlighted event" content listing contains:
       | type    | label           |
       | content | Stay at the CSS |
@@ -120,11 +120,11 @@ Feature: Curated content listings
   See https://citnet.tech.ec.europa.eu/CITnet/jira/browse/ISAICP-8152
 
     Given collection content:
-      | title           | state     |
-      | Spacex in space | published |
+      | title           |
+      | Spacex in space |
     And news content:
-      | title          | collection      | topic                                      | state     |
-      | Cardio atrophy | Spacex in space | Finance in EU, Supplier exchange, E-health | published |
+      | title          | collection      | topic                                      |
+      | Cardio atrophy | Spacex in space | Finance in EU, Supplier exchange, E-health |
 
     Given I am logged in as a "moderator"
     When there are no preexisting log records on the site
diff --git a/tests/features/moderator/rdf_id_converter.feature b/tests/features/moderator/rdf_id_converter.feature
index 76f18b7a18..d81d59cf18 100644
--- a/tests/features/moderator/rdf_id_converter.feature
+++ b/tests/features/moderator/rdf_id_converter.feature
@@ -17,8 +17,8 @@ Feature:
 
   Scenario Outline: Convert a URL of an entity.
     Given collection content:
-      | uri   | title     | state     |
-      | <uri> | <heading> | published |
+      | uri   | title     |
+      | <uri> | <heading> |
 
     When I am logged in as a moderator
     And I am on the homepage
diff --git a/tests/features/moderator/solutions_by_licence.feature b/tests/features/moderator/solutions_by_licence.feature
index ba638c4c42..8c23be3275 100644
--- a/tests/features/moderator/solutions_by_licence.feature
+++ b/tests/features/moderator/solutions_by_licence.feature
@@ -23,21 +23,21 @@ Feature: Solutions by licence report
       | Commercial     |
       | Not applicable |
     Given solution content:
-      | title                 | state     |
-      | Solution by licence 1 | published |
-      | Solution by licence 2 | published |
+      | title                 |
+      | Solution by licence 1 |
+      | Solution by licence 2 |
     And release content:
-      | title                         | release number | is version of         | state     |
-      | Solution by licence 2 release | 1              | Solution by licence 2 | published |
+      | title                         | release number | is version of         |
+      | Solution by licence 2 release | 1              | Solution by licence 2 |
     # Distribution linked to the solution directly.
     And distribution content:
-      | title                     | licence      | solution              | state     |
-      | Solution_by_licence_1.tar | Open source  | Solution by licence 1 | published |
-      | Solution_by_licence_1.exe | Free for all | Solution by licence 1 | published |
+      | title                     | licence      | solution              |
+      | Solution_by_licence_1.tar | Open source  | Solution by licence 1 |
+      | Solution_by_licence_1.exe | Free for all | Solution by licence 1 |
     # Distribution that belongs to the release of a solution.
     And distribution content:
-      | title                     | licence    | release                       | state     |
-      | Solution_by_licence_2.tar | Commercial | Solution by licence 2 release | published |
+      | title                     | licence    | release                       |
+      | Solution_by_licence_2.tar | Commercial | Solution by licence 2 release |
 
     When I am logged in as a moderator
     And I click "Reporting" in the "Administration toolbar" region
diff --git a/tests/features/owner/collection_with_owner.feature b/tests/features/owner/collection_with_owner.feature
index a4dad14ac1..62a93864b6 100644
--- a/tests/features/owner/collection_with_owner.feature
+++ b/tests/features/owner/collection_with_owner.feature
@@ -86,8 +86,8 @@ Feature: Creation of owners through UI
       | name      | owner type |
       | Makinator | Company    |
     Given collection content:
-      | title    | state     | owner     |
-      | Jump Mak | published | Makinator |
+      | title    | owner     |
+      | Jump Mak | Makinator |
     When I am logged in as a "facilitator" of the "Jump Mak" collection
     Then I go to the edit form of the "Jump Mak" collection
     When I press "Remove" at the "Owner" field
diff --git a/tests/features/paragraphs/accordion.feature b/tests/features/paragraphs/accordion.feature
index 20cd15b29c..7866e05e54 100644
--- a/tests/features/paragraphs/accordion.feature
+++ b/tests/features/paragraphs/accordion.feature
@@ -5,8 +5,8 @@ Feature:
 
   Background:
     Given collection content:
-      | title                 | state     | topic |
-      | Paragraphs collection | published | HR    |
+      | title                 | topic |
+      | Paragraphs collection | HR    |
 
   Scenario Outline: Add an accordion to the custom page.
     Given I am logged in as a <role>
@@ -62,8 +62,8 @@ Feature:
     # Regression test for ticket #ISAICP-8233.
 
     Given custom_page content:
-      | title             | collection            | state     | abstract             |
-      | Nested paragraphs | Paragraphs collection | published | Nested page abstract |
+      | title             | collection            | abstract             |
+      | Nested paragraphs | Paragraphs collection | Nested page abstract |
     And I append "layout" to "field_paragraphs_body" field in "node" entity with following "Nested paragraphs" title:
       | behavior_settings | a:3:{s:17:"layout_paragraphs";a:4:{s:6:"layout";s:13:"layout_onecol";s:6:"config";a:1:{s:5:"label";s:0:"";}s:11:"parent_uuid";N;s:6:"region";N;}s:16:"background_theme";a:0:{}s:11:"extra_class";a:0:{}} |
 
diff --git a/tests/features/paragraphs/block.feature b/tests/features/paragraphs/block.feature
index ce02944b7f..0ed60f74a8 100644
--- a/tests/features/paragraphs/block.feature
+++ b/tests/features/paragraphs/block.feature
@@ -4,15 +4,15 @@ Feature: Block paragraph tests.
   @javascript
   Scenario: Recommended solutions
     Given collection content:
-      | title            | state     |
-      | Block collection | published |
+      | title            |
+      | Block collection |
     Given solution content:
-      | title        | collection       | state     |
-      | Early Omega  | Block collection | published |
-      | Snake Timely | Block collection | published |
+      | title        | collection       |
+      | Early Omega  | Block collection |
+      | Snake Timely | Block collection |
     And custom_page content:
-      | title                 | collection       | state     | abstract             |
-      | Recommended solutions | Block collection | published | Recommended abstract |
+      | title                 | collection       | abstract             |
+      | Recommended solutions | Block collection | Recommended abstract |
     And I append "block" to "field_paragraphs_body" field in "node" entity with following "Recommended solutions" title:
       | paragraph_block | views_block:recommended_solutions-recommended |
 
diff --git a/tests/features/paragraphs/call_to_action.feature b/tests/features/paragraphs/call_to_action.feature
index ec0c27caf7..d759c42bf7 100644
--- a/tests/features/paragraphs/call_to_action.feature
+++ b/tests/features/paragraphs/call_to_action.feature
@@ -5,14 +5,14 @@ Feature:
 
   Background:
     Given collection content:
-      | title                 | state     |
-      | Paragraphs collection | published |
+      | title                 |
+      | Paragraphs collection |
 
   @javascript
   Scenario: Call to action(s) has alignment setting.
     Given custom_page content:
-      | title               | collection            | state     | abstract          |
-      | Call to action page | Paragraphs collection | published | CTA page abstract |
+      | title               | collection            | abstract          |
+      | Call to action page | Paragraphs collection | CTA page abstract |
     And I append "layout" to "field_paragraphs_body" field in "node" entity with following "Call to action page" title:
       | behavior_settings | a:3:{s:17:"layout_paragraphs";a:4:{s:6:"layout";s:13:"layout_onecol";s:6:"config";a:1:{s:5:"label";s:0:"";}s:11:"parent_uuid";N;s:6:"region";N;}s:16:"background_theme";a:0:{}s:11:"extra_class";a:0:{}} |
 
diff --git a/tests/features/paragraphs/custom_page.paragraphs.feature b/tests/features/paragraphs/custom_page.paragraphs.feature
index 80028eaaa3..dce97fbcdf 100644
--- a/tests/features/paragraphs/custom_page.paragraphs.feature
+++ b/tests/features/paragraphs/custom_page.paragraphs.feature
@@ -6,14 +6,14 @@ Feature:
 
   Background:
     Given collection content:
-      | title                 | state     | topic |
-      | Paragraphs collection | published | HR    |
+      | title                 | topic |
+      | Paragraphs collection | HR    |
 
   @javascript
   Scenario: Paragraph sections are multivalue and sort-able.
     Given custom_page content:
-      | title           | collection            | state     | topic | abstract                 |
-      | Paragraphs page | Paragraphs collection | published | HR    | Paragraphs page abstract |
+      | title           | collection            | topic | abstract                 |
+      | Paragraphs page | Paragraphs collection | HR    | Paragraphs page abstract |
     And I append "layout" to "field_paragraphs_body" field in "node" entity with following "Paragraphs page" title:
       | behavior_settings | a:3:{s:17:"layout_paragraphs";a:4:{s:6:"layout";s:13:"layout_onecol";s:6:"config";a:1:{s:5:"label";s:0:"";}s:11:"parent_uuid";N;s:6:"region";N;}s:16:"background_theme";a:0:{}s:11:"extra_class";a:0:{}} |
 
@@ -48,8 +48,8 @@ Feature:
   @javascript
   Scenario Outline: Privileged users can add paragraphs.
     Given <group type> content:
-      | title                 | state     |
-      | Paragraphs group type | published |
+      | title                 |
+      | Paragraphs group type |
     And users:
       | Username |
       | Zohan    |
diff --git a/tests/features/paragraphs/github_feed.feature b/tests/features/paragraphs/github_feed.feature
index 8ec38f39bc..352d290ecc 100644
--- a/tests/features/paragraphs/github_feed.feature
+++ b/tests/features/paragraphs/github_feed.feature
@@ -6,11 +6,11 @@ Feature: Github feed paragraph tests.
   @javascript
   Scenario Outline: Test the Github feed paragraph.
     Given <group> content:
-      | title              | state     |
-      | Paragraphs <group> | published |
+      | title              |
+      | Paragraphs <group> |
     And custom_page content:
-      | title                   | <group>            | state     | topic                   | abstract                |
-      | Catalogue of paragraphs | Paragraphs <group> | published | Statistics and Analysis | Catalogue page abstract |
+      | title                   | <group>            | topic                   | abstract                |
+      | Catalogue of paragraphs | Paragraphs <group> | Statistics and Analysis | Catalogue page abstract |
     And I append "layout" to "field_paragraphs_body" field in "node" entity with following "Catalogue of paragraphs" title:
       | behavior_settings | a:3:{s:17:"layout_paragraphs";a:4:{s:6:"layout";s:13:"layout_onecol";s:6:"config";a:1:{s:5:"label";s:0:"";}s:11:"parent_uuid";N;s:6:"region";N;}s:16:"background_theme";a:0:{}s:11:"extra_class";a:0:{}} |
 
diff --git a/tests/features/paragraphs/image.feature b/tests/features/paragraphs/image.feature
index cdbc1b1fd4..6941e5eaec 100644
--- a/tests/features/paragraphs/image.feature
+++ b/tests/features/paragraphs/image.feature
@@ -5,14 +5,14 @@ Feature:
 
   Background:
     Given collection content:
-      | title                 | state     |
-      | Paragraphs collection | published |
+      | title                 |
+      | Paragraphs collection |
 
   @javascript @uploadFiles:logo.png
   Scenario: User should be able to add image paragraph.
     Given custom_page content:
-      | title                | collection            | state     | abstract            |
-      | Image paragraph page | Paragraphs collection | published | Image page abstract |
+      | title                | collection            | abstract            |
+      | Image paragraph page | Paragraphs collection | Image page abstract |
     And I append "layout" to "field_paragraphs_body" field in "node" entity with following "Image paragraph page" title:
       | behavior_settings | a:3:{s:17:"layout_paragraphs";a:4:{s:6:"layout";s:13:"layout_onecol";s:6:"config";a:1:{s:5:"label";s:0:"";}s:11:"parent_uuid";N;s:6:"region";N;}s:16:"background_theme";a:0:{}s:11:"extra_class";a:0:{}} |
 
diff --git a/tests/features/paragraphs/layout_paragraphs.feature b/tests/features/paragraphs/layout_paragraphs.feature
index c1cb97d50a..88a3333352 100644
--- a/tests/features/paragraphs/layout_paragraphs.feature
+++ b/tests/features/paragraphs/layout_paragraphs.feature
@@ -6,8 +6,8 @@ Feature:
 
   Background:
     Given collection content:
-      | title         | state     |
-      | Plaster molds | published |
+      | title         |
+      | Plaster molds |
     And custom_page content:
       | title                  | collection    | abstract             | state       |
       | Layout paragraphs test | Plaster molds | Layout page abstract | unpublished |
diff --git a/tests/features/paragraphs/map.feature b/tests/features/paragraphs/map.feature
index 68634dabe0..fe0599cb02 100644
--- a/tests/features/paragraphs/map.feature
+++ b/tests/features/paragraphs/map.feature
@@ -5,8 +5,8 @@ Feature:
 
   Background:
     Given collection content:
-      | title                 | state     | topic |
-      | Paragraphs collection | published | HR    |
+      | title                 | topic |
+      | Paragraphs collection | HR    |
 
   @javascript
   Scenario: Moderator can manage map.
diff --git a/tests/features/paragraphs/quote.feature b/tests/features/paragraphs/quote.feature
index 92fcea3dbc..f89736a759 100644
--- a/tests/features/paragraphs/quote.feature
+++ b/tests/features/paragraphs/quote.feature
@@ -3,13 +3,13 @@ Feature: Quote paragraph tests.
 
   Background:
     Given collection content:
-      | title                 | state     | topic |
-      | Paragraphs collection | published | HR    |
+      | title                 | topic |
+      | Paragraphs collection | HR    |
 
   Scenario: View quote paragraph in the custom page.
     Given custom_page content:
-      | title          | collection            | state     | abstract             |
-      | Popular quotes | Paragraphs collection | published | quotes page abstract |
+      | title          | collection            | abstract             |
+      | Popular quotes | Paragraphs collection | quotes page abstract |
     And I append "quote" to "field_paragraphs_body" field in "node" entity with following "Popular Quotes" title:
       | paragraph_quote | That's one small step for a man, a giant leap for mankind. |
 
diff --git a/tests/features/paragraphs/social_media.feature b/tests/features/paragraphs/social_media.feature
index 01dbaab165..5f91437a34 100644
--- a/tests/features/paragraphs/social_media.feature
+++ b/tests/features/paragraphs/social_media.feature
@@ -5,14 +5,14 @@ Feature:
 
   Background:
     Given collection content:
-      | title                 | state     |
-      | Paragraphs collection | published |
+      | title                 |
+      | Paragraphs collection |
 
   @javascript
   Scenario: Call to action(s) has alignment setting.
     Given custom_page content:
-      | title             | collection            | state     | abstract             |
-      | Social media page | Paragraphs collection | published | Social page abstract |
+      | title             | collection            | abstract             |
+      | Social media page | Paragraphs collection | Social page abstract |
     And I append "layout" to "field_paragraphs_body" field in "node" entity with following "Social media page" title:
       | behavior_settings | a:3:{s:17:"layout_paragraphs";a:4:{s:6:"layout";s:13:"layout_onecol";s:6:"config";a:1:{s:5:"label";s:0:"";}s:11:"parent_uuid";N;s:6:"region";N;}s:16:"background_theme";a:0:{}s:11:"extra_class";a:0:{}} |
 
@@ -34,8 +34,8 @@ Feature:
   @javascript
   Scenario Outline: A paragraph of social media links is available.
     Given custom_page content:
-      | title        | collection            | state     |
-      | Social media | Paragraphs collection | published |
+      | title        | collection            |
+      | Social media | Paragraphs collection |
     And I append "social_media" to "field_paragraphs_body" field in "node" entity with following "Social media" title:
       | field_paragraphs_social_media:platform | <platform> |
       | field_paragraphs_social_media:value    | <value>    |
diff --git a/tests/features/paragraphs/webform.feature b/tests/features/paragraphs/webform.feature
index a655984edb..b1c218ad7d 100644
--- a/tests/features/paragraphs/webform.feature
+++ b/tests/features/paragraphs/webform.feature
@@ -5,8 +5,8 @@ Feature:
 
   Background:
     Given collection content:
-      | title              | state     |
-      | Webform collection | published |
+      | title              |
+      | Webform collection |
     And users:
       | Username   | E-mail                 | First name | Family name |
       | john.smith | john.smith@example.com | John       | Smith       |
-- 
GitLab


From f3f05694491f86b43e1406478e215da586e40fed Mon Sep 17 00:00:00 2001
From: Ilias Dimopoulos <idimopoulos@hotmail.com>
Date: Tue, 17 Dec 2024 21:40:10 +0200
Subject: [PATCH 071/137] ISAICP-8780: Do not leave the value empty if others
 exist. Do not allow top level EIRA terms to be selected.

---
 .../joinup_publication_date/publication_date.feature  |  6 +++---
 tests/src/Traits/RandomGeneratorTrait.php             | 11 ++++++++---
 2 files changed, 11 insertions(+), 6 deletions(-)

diff --git a/tests/features/joinup_publication_date/publication_date.feature b/tests/features/joinup_publication_date/publication_date.feature
index 49a74c580c..7531be2886 100644
--- a/tests/features/joinup_publication_date/publication_date.feature
+++ b/tests/features/joinup_publication_date/publication_date.feature
@@ -7,9 +7,9 @@ Feature: Publication date works as expected on RDF entities
       | Collection to publish | draft     |
       | Published collection  | published |
     Given solution content:
-      | title               | state | collection           |
-      | Solution to publish | draft | Published collection |
-      | Published solution  |       | Published collection |
+      | title               | state     | collection           |
+      | Solution to publish | draft     | Published collection |
+      | Published solution  | published | Published collection |
     And release content:
       | title              | state | release number | release notes              | is version of      |
       | Release to publish | draft | 1.0.0          | Only works on flat ground. | Published solution |
diff --git a/tests/src/Traits/RandomGeneratorTrait.php b/tests/src/Traits/RandomGeneratorTrait.php
index 064a84e69b..908c0ee74e 100644
--- a/tests/src/Traits/RandomGeneratorTrait.php
+++ b/tests/src/Traits/RandomGeneratorTrait.php
@@ -38,9 +38,14 @@ public function getRandomUri(): string {
   protected function getRandomTerm(string $vocabulary): EntityInterface {
     $storage = \Drupal::entityTypeManager()->getStorage('taxonomy_term');
 
-    $tids = array_values($storage->getQuery()->accessCheck(FALSE)
-      ->condition('vid', $vocabulary)
-      ->execute());
+    $query = $storage->getQuery()->accessCheck(FALSE)
+      ->condition('vid', $vocabulary);
+    // Only get last level terms for the EIRA vocabulary.
+    if ($vocabulary === 'eira') {
+      $query->condition('parent', '0', '<>');
+    }
+
+    $tids = array_values($query->execute());
     return $storage->load($tids[array_rand($tids)]);
   }
 
-- 
GitLab


From 00a075a40e0d4c7f1da6048cfe79bfcbb18f4a04 Mon Sep 17 00:00:00 2001
From: Herve Donner <hervedonner@gmail.com>
Date: Wed, 18 Dec 2024 17:20:22 +0100
Subject: [PATCH 072/137] ISAICP-8839: Unify or simplify notification events.

---
 .../src/Entity/Distribution.php               |  8 +++
 .../src/Entity/DistributionInterface.php      |  8 +++
 .../joinup_notification.module                | 55 +------------------
 .../joinup_notification.services.yml          |  4 +-
 .../EventSubscriber/CollectionSubscriber.php  | 16 +++---
 .../CommunityContentSubscriber.php            | 28 +++++++++-
 .../DistributionSubscriber.php                | 43 +++++----------
 ...dfSubscriber.php => ReleaseSubscriber.php} | 21 ++++---
 .../SolutionNotificationSubscriber.php        | 19 ++++---
 .../src/NotificationEvents.php                | 21 ++-----
 .../GroupContentSubscriptionSubscriber.php    | 19 ++-----
 11 files changed, 97 insertions(+), 145 deletions(-)
 rename web/modules/custom/joinup_notification/src/EventSubscriber/{ReleaseRdfSubscriber.php => ReleaseSubscriber.php} (96%)

diff --git a/web/modules/custom/joinup_distribution/src/Entity/Distribution.php b/web/modules/custom/joinup_distribution/src/Entity/Distribution.php
index 8399b2a8c6..f9f89d03ba 100644
--- a/web/modules/custom/joinup_distribution/src/Entity/Distribution.php
+++ b/web/modules/custom/joinup_distribution/src/Entity/Distribution.php
@@ -171,6 +171,14 @@ public function getParent(): DistributionsParentInterface {
     return $parent;
   }
 
+  /**
+   * {@inheritdoc}
+   */
+  public function hasParent(): bool {
+    $parent = $this->get('parent')->entity;
+    return $parent instanceof DistributionsParentInterface;
+  }
+
   /**
    * {@inheritdoc}
    */
diff --git a/web/modules/custom/joinup_distribution/src/Entity/DistributionInterface.php b/web/modules/custom/joinup_distribution/src/Entity/DistributionInterface.php
index e3be62275b..ce3b2b2a1a 100644
--- a/web/modules/custom/joinup_distribution/src/Entity/DistributionInterface.php
+++ b/web/modules/custom/joinup_distribution/src/Entity/DistributionInterface.php
@@ -34,6 +34,14 @@ interface DistributionInterface extends NodeInterface, RdfSyncEntityInterface, C
    */
   public function getParent(): DistributionsParentInterface;
 
+  /**
+   * Returns whether the entity has a parent.
+   *
+   * @return bool
+   *   TRUE if the entity has a parent.
+   */
+  public function hasParent(): bool;
+
   /**
    * Checks whether the distribution parent is a solution rather than a release.
    *
diff --git a/web/modules/custom/joinup_notification/joinup_notification.module b/web/modules/custom/joinup_notification/joinup_notification.module
index c05f11a647..69da4513d9 100644
--- a/web/modules/custom/joinup_notification/joinup_notification.module
+++ b/web/modules/custom/joinup_notification/joinup_notification.module
@@ -11,10 +11,7 @@
 use Drupal\Core\Render\Markup;
 use Drupal\joinup_community_content\Entity\CommunityContentInterface;
 use Drupal\joinup_distribution\Entity\DistributionInterface;
-use Drupal\joinup_distribution\Exception\MissingDistributionParentException;
-use Drupal\joinup_group\Entity\GroupContentInterface;
 use Drupal\joinup_group\Entity\GroupInterface;
-use Drupal\joinup_group\Exception\MissingGroupException;
 use Drupal\joinup_notification\Event\NotificationEvent;
 use Drupal\joinup_notification\NotificationEvents;
 use Drupal\joinup_release\Entity\ReleaseInterface;
@@ -26,13 +23,7 @@
  * Sends notifications when community content is updated.
  */
 function joinup_notification_node_insert(EntityInterface $entity): void {
-  // @todo To be unified in ISAICP-8839 - maybe create a new interface?.
-  if ($entity instanceof CommunityContentInterface || $entity instanceof DistributionInterface || $entity instanceof ReleaseInterface) {
-    joinup_notification_dispatch_notification('create', NotificationEvents::COMMUNITY_CONTENT_CREATE, $entity);
-  }
-  if ($entity instanceof GroupInterface) {
-    joinup_notification_dispatch_notification('create', NotificationEvents::RDF_ENTITY_CRUD, $entity);
-  }
+  joinup_notification_dispatch_notification('create', NotificationEvents::NODE_CREATE, $entity);
 }
 
 /**
@@ -70,17 +61,7 @@ function joinup_notification_node_presave(EntityInterface $entity): void {
  * Sends notifications when community content is updated.
  */
 function joinup_notification_node_update(EntityInterface $entity): void {
-  $event_name = match(TRUE) {
-    $entity instanceof CommunityContentInterface => NotificationEvents::COMMUNITY_CONTENT_UPDATE,
-    // @todo To be unified in ISAICP-8839 - maybe create a new interface?.
-    $entity instanceof DistributionInterface => NotificationEvents::RDF_ENTITY_CRUD,
-    $entity instanceof ReleaseInterface => NotificationEvents::RDF_ENTITY_CRUD,
-    $entity instanceof GroupInterface => NotificationEvents::RDF_ENTITY_CRUD,
-    default => NULL,
-  };
-  if ($event_name) {
-    joinup_notification_dispatch_notification('update', $event_name, $entity);
-  }
+  joinup_notification_dispatch_notification('update', NotificationEvents::NODE_UPDATE, $entity);
 }
 
 /**
@@ -92,37 +73,7 @@ function joinup_notification_node_update(EntityInterface $entity): void {
  * into the delete hooks which can lead into false data e.g. wrong state.
  */
 function joinup_notification_node_predelete(EntityInterface $entity): void {
-  // Avoid sending notifications when orphaned distributions are deleted.
-  if ($entity instanceof DistributionInterface) {
-    try {
-      $entity->getParent();
-    }
-    catch (MissingDistributionParentException $e) {
-      return;
-    }
-  }
-
-  $event_name = match(TRUE) {
-    $entity instanceof CommunityContentInterface => NotificationEvents::COMMUNITY_CONTENT_DELETE,
-    // @todo To be unified in ISAICP-8839 - maybe create a new interface?.
-    $entity instanceof DistributionInterface => NotificationEvents::RDF_ENTITY_CRUD,
-    $entity instanceof ReleaseInterface => NotificationEvents::RDF_ENTITY_CRUD,
-    default => NULL,
-  };
-  if ($event_name) {
-    joinup_notification_dispatch_notification('delete', $event_name, $entity);
-  }
-
-  if ($entity instanceof GroupContentInterface) {
-    try {
-      $entity->getGroup();
-    }
-    catch (MissingGroupException $e) {
-      return;
-    }
-  }
-
-  joinup_notification_dispatch_notification('delete', NotificationEvents::RDF_ENTITY_CRUD, $entity);
+  joinup_notification_dispatch_notification('delete', NotificationEvents::NODE_DELETE, $entity);
 }
 
 /**
diff --git a/web/modules/custom/joinup_notification/joinup_notification.services.yml b/web/modules/custom/joinup_notification/joinup_notification.services.yml
index 1a5e1b77c7..1da548d7f8 100644
--- a/web/modules/custom/joinup_notification/joinup_notification.services.yml
+++ b/web/modules/custom/joinup_notification/joinup_notification.services.yml
@@ -24,8 +24,8 @@ services:
     parent: joinup_notification.notification_subscriber_base
     tags:
       - { name: event_subscriber }
-  joinup_notification.release.rdf.subscriber:
-    class: Drupal\joinup_notification\EventSubscriber\ReleaseRdfSubscriber
+  joinup_notification.release.subscriber:
+    class: Drupal\joinup_notification\EventSubscriber\ReleaseSubscriber
     parent: joinup_notification.notification_subscriber_base
     tags:
       - { name: event_subscriber }
diff --git a/web/modules/custom/joinup_notification/src/EventSubscriber/CollectionSubscriber.php b/web/modules/custom/joinup_notification/src/EventSubscriber/CollectionSubscriber.php
index 82686da383..b2d989122b 100644
--- a/web/modules/custom/joinup_notification/src/EventSubscriber/CollectionSubscriber.php
+++ b/web/modules/custom/joinup_notification/src/EventSubscriber/CollectionSubscriber.php
@@ -65,16 +65,14 @@ class CollectionSubscriber extends NotificationSubscriberBase {
    * {@inheritdoc}
    */
   public static function getSubscribedEvents(): array {
-    $events[NotificationEvents::RDF_ENTITY_CRUD] = [
-      // Notification id 1 - Propose new collection.
-      ['onCreate'],
-      // All notification Ids.
-      ['onUpdate'],
-      // Notification id 9, 12, 13, 14.
-      ['onDelete'],
+    return [
+      // Notification ID 1 - Propose new collection.
+      NotificationEvents::NODE_CREATE => ['onCreate'],
+      // All notification IDs.
+      NotificationEvents::NODE_UPDATE => ['onUpdate'],
+      // Notification ID 9, 12, 13, 14.
+      NotificationEvents::NODE_DELETE => ['onDelete'],
     ];
-
-    return $events;
   }
 
   /**
diff --git a/web/modules/custom/joinup_notification/src/EventSubscriber/CommunityContentSubscriber.php b/web/modules/custom/joinup_notification/src/EventSubscriber/CommunityContentSubscriber.php
index 6c808e8505..05e0848764 100644
--- a/web/modules/custom/joinup_notification/src/EventSubscriber/CommunityContentSubscriber.php
+++ b/web/modules/custom/joinup_notification/src/EventSubscriber/CommunityContentSubscriber.php
@@ -8,12 +8,15 @@
 use Drupal\Core\Entity\EntityInterface;
 use Drupal\Core\Entity\EntityTypeManagerInterface;
 use Drupal\Core\Session\AccountProxy;
+use Drupal\joinup_community_content\Entity\CommunityContentInterface;
 use Drupal\joinup_discussion\Entity\Discussion;
+use Drupal\joinup_distribution\Entity\DistributionInterface;
 use Drupal\joinup_group\JoinupGroupHelper;
 use Drupal\joinup_notification\Event\NotificationEvent;
 use Drupal\joinup_notification\JoinupMessageDeliveryInterface;
 use Drupal\joinup_notification\MessageArgumentGenerator;
 use Drupal\joinup_notification\NotificationEvents;
+use Drupal\joinup_release\Entity\ReleaseInterface;
 use Drupal\joinup_workflow\EntityWorkflowStateInterface;
 use Drupal\joinup_workflow\WorkflowHelperInterface;
 use Drupal\og\MembershipManager;
@@ -90,9 +93,9 @@ public function __construct(
    */
   public static function getSubscribedEvents(): array {
     return [
-      NotificationEvents::COMMUNITY_CONTENT_CREATE => ['onCreate'],
-      NotificationEvents::COMMUNITY_CONTENT_UPDATE => ['onUpdate'],
-      NotificationEvents::COMMUNITY_CONTENT_DELETE => ['onDelete'],
+      NotificationEvents::NODE_CREATE => ['onCreate'],
+      NotificationEvents::NODE_UPDATE => ['onUpdate'],
+      NotificationEvents::NODE_DELETE => ['onDelete'],
     ];
   }
 
@@ -142,6 +145,13 @@ public function onCreate(NotificationEvent $event): void {
    *   Whether the event applies.
    */
   protected function appliesOnCreate(): bool {
+    // @todo Old logic, does it even make sense?
+    if (!$this->entity instanceof CommunityContentInterface
+      && !$this->entity instanceof DistributionInterface
+      && !$this->entity instanceof ReleaseInterface) {
+      return FALSE;
+    }
+
     // If there is no original version, then it is not an update.
     if (isset($this->entity->original)) {
       return FALSE;
@@ -211,6 +221,10 @@ public function onUpdate(NotificationEvent $event): void {
    *   Whether the event applies.
    */
   protected function appliesOnUpdate(): bool {
+    if (!$this->entity instanceof CommunityContentInterface) {
+      return FALSE;
+    }
+
     // If there is no original version, then it is not an update.
     if ($this->entity->isNew()) {
       return FALSE;
@@ -260,6 +274,14 @@ public function onDelete(NotificationEvent $event): void {
    *   Whether the event applies.
    */
   protected function appliesOnDelete(): bool {
+    if (!$this->entity instanceof CommunityContentInterface) {
+      return FALSE;
+    }
+
+    if (!$this->entity->hasGroup()) {
+      return FALSE;
+    }
+
     // If any of the workflow related properties are empty, return early.
     if (!$this->entity instanceof EntityWorkflowStateInterface) {
       return FALSE;
diff --git a/web/modules/custom/joinup_notification/src/EventSubscriber/DistributionSubscriber.php b/web/modules/custom/joinup_notification/src/EventSubscriber/DistributionSubscriber.php
index 304eb9a03a..196e64551e 100644
--- a/web/modules/custom/joinup_notification/src/EventSubscriber/DistributionSubscriber.php
+++ b/web/modules/custom/joinup_notification/src/EventSubscriber/DistributionSubscriber.php
@@ -33,35 +33,14 @@ class DistributionSubscriber extends NotificationSubscriberBase {
   const string TEMPLATE_UPDATE = 'distribution_update';
   const string TEMPLATE_DELETE = 'distribution_delete';
 
-  /**
-   * The notification event.
-   *
-   * @var \Drupal\joinup_notification\Event\NotificationEvent
-   */
-  protected NotificationEvent $event;
-
   /**
    * {@inheritdoc}
    */
   public static function getSubscribedEvents(): array {
-    $events[NotificationEvents::RDF_ENTITY_CRUD] = [
-      ['onUpdate'],
-      ['onDelete'],
+    return [
+      NotificationEvents::NODE_UPDATE => ['onUpdate'],
+      NotificationEvents::NODE_DELETE => ['onDelete'],
     ];
-
-    return $events;
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  protected function initialize(NotificationEvent $event): void {
-    parent::initialize($event);
-    if ($this->entity->bundle() !== 'distribution') {
-      return;
-    }
-
-    $this->event = $event;
   }
 
   /**
@@ -151,6 +130,16 @@ protected function appliesOnDelete(): bool {
       return FALSE;
     }
 
+    // Avoid sending notifications when orphaned distributions are deleted.
+    \assert($this->entity instanceof DistributionInterface);
+    if (!$this->entity->hasParent()) {
+      return FALSE;
+    }
+
+    if (!$this->entity->hasGroup()) {
+      return FALSE;
+    }
+
     return TRUE;
   }
 
@@ -161,11 +150,7 @@ protected function appliesOnDelete(): bool {
    *   Whether the event applies.
    */
   protected function appliesOnDistributions(): bool {
-    if ($this->entity->getEntityTypeId() !== 'node') {
-      return FALSE;
-    }
-
-    if ($this->entity->bundle() !== 'distribution') {
+    if (!$this->entity instanceof DistributionInterface) {
       return FALSE;
     }
 
diff --git a/web/modules/custom/joinup_notification/src/EventSubscriber/ReleaseRdfSubscriber.php b/web/modules/custom/joinup_notification/src/EventSubscriber/ReleaseSubscriber.php
similarity index 96%
rename from web/modules/custom/joinup_notification/src/EventSubscriber/ReleaseRdfSubscriber.php
rename to web/modules/custom/joinup_notification/src/EventSubscriber/ReleaseSubscriber.php
index 3ce937ad2a..ebd3dad258 100644
--- a/web/modules/custom/joinup_notification/src/EventSubscriber/ReleaseRdfSubscriber.php
+++ b/web/modules/custom/joinup_notification/src/EventSubscriber/ReleaseSubscriber.php
@@ -38,7 +38,7 @@
  *   Recipients: owner
  * @codingStandardsIgnoreEnd
  */
-class ReleaseRdfSubscriber extends NotificationSubscriberBase {
+class ReleaseSubscriber extends NotificationSubscriberBase {
 
   const string TEMPLATE_UPDATE_PUBLISHED = 'release_update';
   const string TEMPLATE_DELETE = 'release_delete';
@@ -91,12 +91,10 @@ class ReleaseRdfSubscriber extends NotificationSubscriberBase {
    * {@inheritdoc}
    */
   public static function getSubscribedEvents(): array {
-    $events[NotificationEvents::RDF_ENTITY_CRUD] = [
-      ['onUpdate'],
-      ['onDelete'],
+    return [
+      NotificationEvents::NODE_UPDATE => ['onUpdate'],
+      NotificationEvents::NODE_DELETE => ['onDelete'],
     ];
-
-    return $events;
   }
 
   /**
@@ -265,6 +263,11 @@ protected function appliesOnDelete(): bool {
       return FALSE;
     }
 
+    \assert($this->entity instanceof ReleaseInterface);
+    if (!$this->entity->hasGroup()) {
+      return FALSE;
+    }
+
     return TRUE;
   }
 
@@ -275,11 +278,7 @@ protected function appliesOnDelete(): bool {
    *   Whether the event applies.
    */
   protected function appliesOnReleases(): bool {
-    if ($this->entity->getEntityTypeId() !== 'node') {
-      return FALSE;
-    }
-
-    if ($this->entity->bundle() !== 'release') {
+    if (!$this->entity instanceof ReleaseInterface) {
       return FALSE;
     }
 
diff --git a/web/modules/custom/joinup_notification/src/EventSubscriber/SolutionNotificationSubscriber.php b/web/modules/custom/joinup_notification/src/EventSubscriber/SolutionNotificationSubscriber.php
index 56a4dd639b..e8ee34a1bc 100644
--- a/web/modules/custom/joinup_notification/src/EventSubscriber/SolutionNotificationSubscriber.php
+++ b/web/modules/custom/joinup_notification/src/EventSubscriber/SolutionNotificationSubscriber.php
@@ -122,16 +122,12 @@ class SolutionNotificationSubscriber extends NotificationSubscriberBase {
    * {@inheritdoc}
    */
   public static function getSubscribedEvents(): array {
-    $events[NotificationEvents::RDF_ENTITY_CRUD] = [
-      ['onCreate'],
-      ['onUpdate'],
-      ['onDelete'],
+    return [
+      NotificationEvents::NODE_CREATE => ['onCreate'],
+      NotificationEvents::NODE_UPDATE => ['onUpdate'],
+      NotificationEvents::NODE_DELETE => ['onDelete'],
+      NotificationEvents::GROUP_ENTITY_ARCHIVE_COMPLETED => ['onCompleteArchival'],
     ];
-    $events[NotificationEvents::GROUP_ENTITY_ARCHIVE_COMPLETED] = [
-      ['onCompleteArchival'],
-    ];
-
-    return $events;
   }
 
   /**
@@ -395,6 +391,11 @@ protected function appliesOnDelete(): bool {
       return FALSE;
     }
 
+    \assert($this->entity instanceof SolutionInterface);
+    if (!$this->entity->hasGroup()) {
+      return FALSE;
+    }
+
     return TRUE;
   }
 
diff --git a/web/modules/custom/joinup_notification/src/NotificationEvents.php b/web/modules/custom/joinup_notification/src/NotificationEvents.php
index 89297a6781..23656d7f78 100644
--- a/web/modules/custom/joinup_notification/src/NotificationEvents.php
+++ b/web/modules/custom/joinup_notification/src/NotificationEvents.php
@@ -10,40 +10,31 @@
 final class NotificationEvents {
 
   /**
-   * An event for sending notifications on community content creation.
+   * An event for sending notifications on node creation.
    *
    * @Event
    *
    * @var string
    */
-  const string COMMUNITY_CONTENT_CREATE = 'joinup_notification.cc.create';
+  const string NODE_CREATE = 'joinup_notification.node.create';
 
   /**
-   * An event for sending notifications on community content update.
+   * An event for sending notifications on node update.
    *
    * @Event
    *
    * @var string
    */
-  const string COMMUNITY_CONTENT_UPDATE = 'joinup_notification.cc.update';
+  const string NODE_UPDATE = 'joinup_notification.node.update';
 
   /**
-   * An event for sending notifications on community content deletion.
+   * An event for sending notifications on node deletion.
    *
    * @Event
    *
    * @var string
    */
-  const string COMMUNITY_CONTENT_DELETE = 'joinup_notification.cc.delete';
-
-  /**
-   * An event that sends notifications on RDF entity CRUD operations.
-   *
-   * @Event
-   *
-   * @var string
-   */
-  const string RDF_ENTITY_CRUD = 'joinup_notification.rdf.notify';
+  const string NODE_DELETE = 'joinup_notification.node.delete';
 
   /**
    * An event that sends notifications on comment CRUD operations.
diff --git a/web/modules/custom/joinup_subscription/src/EventSubscriber/GroupContentSubscriptionSubscriber.php b/web/modules/custom/joinup_subscription/src/EventSubscriber/GroupContentSubscriptionSubscriber.php
index 4edd6f4845..7fb68ab186 100644
--- a/web/modules/custom/joinup_subscription/src/EventSubscriber/GroupContentSubscriptionSubscriber.php
+++ b/web/modules/custom/joinup_subscription/src/EventSubscriber/GroupContentSubscriptionSubscriber.php
@@ -9,7 +9,6 @@
 use Drupal\Core\Logger\LoggerChannelFactoryInterface;
 use Drupal\collection\Entity\CollectionContentInterface;
 use Drupal\joinup_group\Entity\GroupContentInterface;
-use Drupal\joinup_group\Exception\MissingGroupException;
 use Drupal\joinup_notification\Event\NotificationEvent;
 use Drupal\joinup_notification\JoinupMessageDeliveryInterface;
 use Drupal\joinup_notification\NotificationEvents;
@@ -66,9 +65,8 @@ public function __construct(EntityTypeManagerInterface $entityTypeManager, Joinu
    */
   public static function getSubscribedEvents(): array {
     return [
-      NotificationEvents::COMMUNITY_CONTENT_CREATE => 'notifyOnCommunityContentCreation',
-      NotificationEvents::COMMUNITY_CONTENT_UPDATE => 'notifyOnCommunityContentPublication',
-      NotificationEvents::RDF_ENTITY_CRUD => 'notifyOnRdfEntityCrudOperation',
+      NotificationEvents::NODE_CREATE => ['notifyOnCommunityContentCreation', 'notifyOnGroupEntityCrudOperation'],
+      NotificationEvents::NODE_UPDATE => ['notifyOnCommunityContentPublication', 'notifyOnGroupEntityCrudOperation'],
     ];
   }
 
@@ -124,13 +122,7 @@ public function notifyOnCommunityContentPublication(NotificationEvent $event): v
    * @param \Drupal\joinup_notification\Event\NotificationEvent $event
    *   The event object.
    */
-  public function notifyOnRdfEntityCrudOperation(NotificationEvent $event): void {
-    // Only act on entities that are being created or updated. Subscribers are
-    // not notified about entities that are being removed.
-    if (!in_array($event->getOperation(), ['create', 'update'])) {
-      return;
-    }
-
+  public function notifyOnGroupEntityCrudOperation(NotificationEvent $event): void {
     // Ignore content that does not belong to a group, and content that is not
     // published.
     $entity = $event->getEntity();
@@ -160,10 +152,7 @@ public function notifyOnRdfEntityCrudOperation(NotificationEvent $event): void {
     }
 
     // Avoid including orphaned group content in the digest.
-    try {
-      $group = $entity->getGroup();
-    }
-    catch (MissingGroupException $e) {
+    if (!$entity->hasGroup()) {
       return;
     }
 
-- 
GitLab


From 42371f484fd5208cc3481422c0d7616c23b0b18e Mon Sep 17 00:00:00 2001
From: Herve Donner <hervedonner@gmail.com>
Date: Wed, 18 Dec 2024 21:36:44 +0100
Subject: [PATCH 073/137] ISAICP-8839: Fix previous logic...

---
 .../src/EventSubscriber/CommunityContentSubscriber.php     | 7 +------
 1 file changed, 1 insertion(+), 6 deletions(-)

diff --git a/web/modules/custom/joinup_notification/src/EventSubscriber/CommunityContentSubscriber.php b/web/modules/custom/joinup_notification/src/EventSubscriber/CommunityContentSubscriber.php
index 05e0848764..9cf29ca482 100644
--- a/web/modules/custom/joinup_notification/src/EventSubscriber/CommunityContentSubscriber.php
+++ b/web/modules/custom/joinup_notification/src/EventSubscriber/CommunityContentSubscriber.php
@@ -10,13 +10,11 @@
 use Drupal\Core\Session\AccountProxy;
 use Drupal\joinup_community_content\Entity\CommunityContentInterface;
 use Drupal\joinup_discussion\Entity\Discussion;
-use Drupal\joinup_distribution\Entity\DistributionInterface;
 use Drupal\joinup_group\JoinupGroupHelper;
 use Drupal\joinup_notification\Event\NotificationEvent;
 use Drupal\joinup_notification\JoinupMessageDeliveryInterface;
 use Drupal\joinup_notification\MessageArgumentGenerator;
 use Drupal\joinup_notification\NotificationEvents;
-use Drupal\joinup_release\Entity\ReleaseInterface;
 use Drupal\joinup_workflow\EntityWorkflowStateInterface;
 use Drupal\joinup_workflow\WorkflowHelperInterface;
 use Drupal\og\MembershipManager;
@@ -145,10 +143,7 @@ public function onCreate(NotificationEvent $event): void {
    *   Whether the event applies.
    */
   protected function appliesOnCreate(): bool {
-    // @todo Old logic, does it even make sense?
-    if (!$this->entity instanceof CommunityContentInterface
-      && !$this->entity instanceof DistributionInterface
-      && !$this->entity instanceof ReleaseInterface) {
+    if (!$this->entity instanceof CommunityContentInterface) {
       return FALSE;
     }
 
-- 
GitLab


From 75b1cf7d91b1f2332a1421c3550f2b33b31cd076 Mon Sep 17 00:00:00 2001
From: Zoltan Horvath <zoltan.horvath@ext.ec.europa.eu>
Date: Fri, 20 Dec 2024 10:19:56 +0100
Subject: [PATCH 074/137] ISAICP-9310: Remove already applied update,
 post-update and deploy tasks

---
 .../joinup_assessment.deploy.php              | 108 ------------------
 .../custom/joinup_core/joinup_core.deploy.php | 108 ------------------
 .../custom/joinup_core/joinup_core.install    |  32 ------
 .../joinup_core/joinup_core.post_update.php   |  23 ----
 .../custom/joinup_rdf/joinup_rdf.deploy.php   |   8 --
 5 files changed, 279 deletions(-)

diff --git a/web/modules/custom/joinup_assessment/joinup_assessment.deploy.php b/web/modules/custom/joinup_assessment/joinup_assessment.deploy.php
index 9753860b5c..bf274fc659 100644
--- a/web/modules/custom/joinup_assessment/joinup_assessment.deploy.php
+++ b/web/modules/custom/joinup_assessment/joinup_assessment.deploy.php
@@ -6,111 +6,3 @@
  */
 
 declare(strict_types=1);
-
-use Drupal\collection\Entity\CollectionInterface;
-use Drupal\custom_page\Entity\CustomPageInterface;
-use Drupal\joinup_assessment\AssessmentInterface;
-
-/**
- * Update 'Assessment reports' custom page.
- */
-function joinup_assessment_deploy_200100(): void {
-  $layoutUuid = 'c97d143d-f012-4680-a816-dc4b2eee2ee2';
-  $storage = \Drupal::entityTypeManager()->getStorage('paragraph');
-
-  $customPage = \Drupal::getContainer()->get('entity.repository')
-    ->loadEntityByUuid('node', AssessmentInterface::ASSESSMENT_REPORTS_UUID);
-  if (!$customPage instanceof CustomPageInterface) {
-    throw new \RuntimeException("Can't load a custom page with UUID '" . AssessmentInterface::ASSESSMENT_REPORTS_UUID . "'");
-  }
-
-  $layout = $storage->create([
-    'type' => 'layout',
-    'uuid' => $layoutUuid,
-    'behavior_settings' => [
-      'layout_paragraphs' => [
-        'layout' => 'layout_onecol',
-        'config' => ['label' => ''],
-        'parent_uuid' => NULL,
-        'region' => NULL,
-      ],
-      'background_theme' => [],
-      'extra_class' => [],
-    ],
-  ]);
-  $block = $storage->create([
-    'type' => 'block',
-    'paragraph_block' => [
-      'plugin_id' => 'views_block:assessment_reports-list',
-      'settings' => [
-        'id' => 'views_block:assessment_reports-list',
-        'label' => '',
-        'label_display' => FALSE,
-        'provider' => 'views',
-        'views_label' => '',
-        'items_per_page' => 10,
-      ],
-    ],
-    'behavior_settings' => [
-      'layout_paragraphs' => [
-        'parent_uuid' => $layoutUuid,
-        'region' => 'content',
-      ],
-    ],
-  ]);
-
-  $customPage
-    ->set('title', 'Assessment reports')
-    ->set('abstract', 'Interoperability assessment reports')
-    ->set('field_paragraphs_body', [$layout, $block])
-    ->save();
-}
-
-/**
- * Update 'Assessments' collection content listing.
- */
-function joinup_assessment_deploy_200101(): void {
-  $collection = \Drupal::getContainer()->get('entity.repository')
-    ->loadEntityByUuid('node', AssessmentInterface::GROUP_UUID);
-  if (!$collection instanceof CollectionInterface) {
-    throw new \RuntimeException("Can't load a collection with UUID '" . AssessmentInterface::GROUP_UUID . "'");
-  }
-  $listing = $collection->get('listing_content')->getValue();
-  $listing[0]['value']['query_presets'] = 'entity_bundle|assessment_report|<>';
-  $collection->set('listing_content', $listing);
-  $collection->skip_notification = TRUE;
-  $collection->save();
-}
-
-/**
- * Update user content listing.
- */
-function joinup_assessment_deploy_200102(?array &$sandbox = NULL): string {
-  $db = \Drupal::database();
-  if (!isset($sandbox['data'])) {
-    $sandbox['data'] = $db->select('user__field_user_content', 'u')
-      ->fields('u', ['entity_id', 'field_user_content_value'])
-      ->execute()
-      ->fetchAll(\PDO::FETCH_NUM);
-    $sandbox['total'] = count($sandbox['data']);
-    $sandbox['processed'] = 0;
-  }
-
-  $data = array_splice($sandbox['data'], 0, 100);
-  foreach ($data as [$uid, $listing]) {
-    $listing = unserialize($listing, ['allowed_classes' => FALSE]);
-
-    // Append to potential existing value.
-    $query = trim($listing['query_presets'] ?? '') . "\nentity_bundle|assessment_report|<>";
-    $listing['query_presets'] = trim($query);
-
-    $db->update('user__field_user_content')
-      ->fields(['field_user_content_value' => serialize($listing)])
-      ->condition('entity_id', $uid)
-      ->execute();
-    $sandbox['processed']++;
-  };
-
-  $sandbox['#finished'] = (int) empty($sandbox['data']);
-  return "{$sandbox['processed']} out of {$sandbox['total']} users processed";
-}
diff --git a/web/modules/custom/joinup_core/joinup_core.deploy.php b/web/modules/custom/joinup_core/joinup_core.deploy.php
index 9218789060..33814e44ab 100644
--- a/web/modules/custom/joinup_core/joinup_core.deploy.php
+++ b/web/modules/custom/joinup_core/joinup_core.deploy.php
@@ -13,111 +13,3 @@
  */
 
 declare(strict_types=1);
-
-/**
- * Fix solution nodes having wrong default_langcode after joinup 2.0 migration.
- */
-function joinup_core_deploy_200100(): void {
-  $database = \Drupal::database();
-  $tables = ['node_field_data', 'node_field_revision'];
-  foreach ($tables as $table) {
-    $database->query("
-      UPDATE {{$table}} n
-      JOIN (SELECT nid, vid FROM {{$table}} GROUP BY nid, vid HAVING COUNT(*) = 1) AS grouped
-      ON n.nid = grouped.nid AND n.vid = grouped.vid
-      SET n.default_langcode = 1;
-    ");
-  }
-}
-
-/**
- * Case diff emails.
- */
-function joinup_core_deploy_200101(): void {
-  // Query taken from https://www.drupal.org/node/3486109.
-  $query = <<<QUERY
-    SELECT ufd.uid, ufd.name, ufd.mail, ufd.status
-    FROM users_field_data ufd
-    JOIN (
-      SELECT LOWER(mail) AS lower_mail
-      FROM users_field_data
-      GROUP BY LOWER(mail)
-      HAVING COUNT(uid) > 1
-    ) duplicates ON LOWER(ufd.mail) = duplicates.lower_mail
-    ORDER BY LOWER(ufd.mail), ufd.uid;
-    QUERY;
-
-  $records = \Drupal::database()->query($query)->fetchAll();
-  $content = ['UserID, Username, Email, Status'];
-  foreach ($records as $record) {
-    $content[] = sprintf('%s, "%s", %s, %s', $record->uid, $record->name, $record->mail, $record->status);
-  }
-  $uri = 'private://duplicates.csv';
-  file_put_contents($uri, implode("\n", $content));
-
-  $entityTypeManager = \Drupal::entityTypeManager();
-
-  // Store data in the private file-system wrapped into a message.
-  $entityTypeManager->getStorage('message')->create([
-    'template' => 'contact_form_submission',
-    'field_contact_category' => 'usage',
-    'field_contact_subject' => 'Emails varying only by case',
-    'field_contact_attachment' => $entityTypeManager->getStorage('file')->create([
-      'uri' => $uri,
-      'status' => TRUE,
-    ]),
-  ])->save();
-}
-
-/**
- * Clean up db.
- */
-function joinup_core_deploy_200102(): void {
-  $deletedStorage = \Drupal::service('entity_field.deleted_fields_repository');
-
-  $fieldStorages = [
-    'meta_entity.field_ss_related_solutions',
-    'message.field_group_content',
-  ];
-  /** @var \Drupal\field\Entity\FieldStorageConfig $fieldStorageDefinition */
-  foreach ($deletedStorage->getFieldStorageDefinitions() as $fieldStorageDefinition) {
-    if (in_array($fieldStorageDefinition->id(), $fieldStorages, TRUE)) {
-      $deletedStorage->removeFieldStorageDefinition($fieldStorageDefinition);
-    }
-  }
-
-  $fieldConfigs = [
-    'meta_entity.solution_settings.field_ss_related_solutions',
-  ];
-  /** @var \Drupal\field\Entity\FieldConfig $fieldDefinition */
-  foreach ($deletedStorage->getFieldDefinitions() as $fieldConfig) {
-    if (in_array($fieldConfig->id(), $fieldConfigs, TRUE)) {
-      $deletedStorage->removeFieldDefinition($fieldConfig);
-    }
-  }
-
-  $database = \Drupal::database();
-  $tables = [
-    // meta_entity.field_ss_related_solutions.
-    'field_deleted_data_e581954d71',
-    // message.field_group_content.
-    'field_deleted_data_aa42a47f4e',
-  ];
-  foreach ($tables as $table) {
-    if ($database->schema()->tableExists($table)) {
-      $database->schema()->dropTable($table);
-    }
-  }
-
-  // Clean keyvalue collection for tracking the installed schema.
-  $storageKeys = [
-    'meta_entity.field_schema_data.field_ss_related_solutions',
-    'message.field_schema_data.field_group_content',
-  ];
-  $entityStorageSchemaSql = \Drupal::keyValue('entity.storage_schema.sql');
-  foreach ($storageKeys as $storageKey) {
-    if ($entityStorageSchemaSql->has($storageKey)) {
-      $entityStorageSchemaSql->delete($storageKey);
-    }
-  }
-}
diff --git a/web/modules/custom/joinup_core/joinup_core.install b/web/modules/custom/joinup_core/joinup_core.install
index 1cb4b940b8..70d2539fc0 100644
--- a/web/modules/custom/joinup_core/joinup_core.install
+++ b/web/modules/custom/joinup_core/joinup_core.install
@@ -56,35 +56,3 @@ function joinup_core_requirements($phase): array {
 
   return $requirements;
 }
-
-/**
- * Config ignore changes.
- */
-function joinup_core_update_200100(): void {
-  $configFactory = \Drupal::configFactory();
-
-  // Delete the current assessment webform.
-  $configFactory->getEditable('webform.webform.online_form_for_assessments')
-    ->delete();
-
-  // Set permissions to all other UI managed webforms.
-  foreach ($configFactory->listAll('webform.webform.') as $name) {
-    $configFactory->getEditable($name)
-      ->set('access.administer.permissions', ['administer webform via ui'])
-      ->save();
-  }
-
-  // Should be operational before config sync starts.
-  $configFactory->getEditable('config_ignore.settings')
-    ->set('ignored_config_entities', [
-      'cas_mock_server.settings',
-      'composer_deploy.settings',
-      'core.menu.static_menu_link_overrides',
-      'joinup_core.outdated_content_threshold',
-      'memcache_admin.settings',
-      'update.settings',
-      'upgrade_status.settings',
-      'webform.webform.*',
-      '~webform.webform.assessment',
-    ])->save(TRUE);
-}
diff --git a/web/modules/custom/joinup_core/joinup_core.post_update.php b/web/modules/custom/joinup_core/joinup_core.post_update.php
index 3d98a89448..60c416114e 100644
--- a/web/modules/custom/joinup_core/joinup_core.post_update.php
+++ b/web/modules/custom/joinup_core/joinup_core.post_update.php
@@ -14,26 +14,3 @@
  */
 
 declare(strict_types=1);
-
-/**
- * Unify the spatial coverage field.
- */
-function joinup_core_post_update_200100(): void {
-  $new_field = 'spatial_coverage';
-  $old_fields = [
-    'field_document_spatial_coverage',
-    'field_news_spatial_coverage',
-    'field_event_spatial_coverage',
-  ];
-
-  $database = \Drupal::database();
-  foreach ($old_fields as $old_field) {
-    $database->insert("node__{$new_field}")
-      ->from($database->select("node__{$old_field}", 'f')->fields('f'))
-      ->execute();
-
-    $database->insert("node_revision__{$new_field}")
-      ->from($database->select("node_revision__{$old_field}", 'f')->fields('f'))
-      ->execute();
-  }
-}
diff --git a/web/modules/custom/joinup_rdf/joinup_rdf.deploy.php b/web/modules/custom/joinup_rdf/joinup_rdf.deploy.php
index 4bd39e9335..fac8699635 100644
--- a/web/modules/custom/joinup_rdf/joinup_rdf.deploy.php
+++ b/web/modules/custom/joinup_rdf/joinup_rdf.deploy.php
@@ -6,11 +6,3 @@
  */
 
 declare(strict_types=1);
-
-/**
- * Remove http://adms-definition RDF graph.
- */
-function joinup_rdf_deploy_200100(): void {
-  \Drupal::getContainer()->get('rdf_sync.connection')
-    ->update('CLEAR GRAPH <http://adms-definition>;');
-}
-- 
GitLab


From b08007c6044e898e2ef5ebe8ca52726109f2b502 Mon Sep 17 00:00:00 2001
From: Zoltan Horvath <zoltan.horvath@ext.ec.europa.eu>
Date: Fri, 20 Dec 2024 10:54:28 +0100
Subject: [PATCH 075/137] ISAICP-9310: Prepare update to drupal/autologout
 2.0.1 - remove patches of resolved issues

---
 composer.json                                 |   4 -
 .../php/drupal/autologout/3372010-29.patch    | 237 ------------------
 .../patch/php/drupal/autologout/3443711.diff  |  54 ----
 3 files changed, 295 deletions(-)
 delete mode 100644 resources/patch/php/drupal/autologout/3372010-29.patch
 delete mode 100644 resources/patch/php/drupal/autologout/3443711.diff

diff --git a/composer.json b/composer.json
index 92e5a715b0..8dd9255fa0 100644
--- a/composer.json
+++ b/composer.json
@@ -295,10 +295,6 @@
             "drupal/addtocal": {
                 "Uncaught TypeError: $(...).once is not a function @see https://www.drupal.org/project/addtocal/issues/3372354": "resources/patch/php/drupal/addtocal/3372354.patch"
             },
-            "drupal/autologout": {
-                "Warning: Undefined array key @see https://www.drupal.org/project/autologout/issues/3372010": "resources/patch/php/drupal/autologout/3372010-29.patch",
-                "Users with no roles are logged out @see https://www.drupal.org/project/autologout/issues/3443711": "resources/patch/php/drupal/autologout/3443711.diff"
-            },
             "drupal/cas_mock_server": {
                 "Missing langcode in cas_mock_server.settings @see https://www.drupal.org/i/3463553": "resources/patch/php/drupal/cas_mock_server/3463553.diff"
             },
diff --git a/resources/patch/php/drupal/autologout/3372010-29.patch b/resources/patch/php/drupal/autologout/3372010-29.patch
deleted file mode 100644
index 613337d0ee..0000000000
--- a/resources/patch/php/drupal/autologout/3372010-29.patch
+++ /dev/null
@@ -1,237 +0,0 @@
-diff --git a/src/EventSubscriber/AutologoutSubscriber.php b/src/EventSubscriber/AutologoutSubscriber.php
-index c40f33e79..7ea8044f1 100644
---- a/src/EventSubscriber/AutologoutSubscriber.php
-+++ b/src/EventSubscriber/AutologoutSubscriber.php
-@@ -118,46 +118,22 @@ public function onRequest(RequestEvent $event) {
-     }
-
-     // If user is not anonymous.
--    if ($uid != 0) {
--      $session = $this->requestStack->getCurrentRequest()->getSession();
--      $auto_redirect = $session->get('auto_redirect');
--
--      // Get http referer.
--      $referer = "";
--      $request = $this->requestStack->getCurrentRequest();
--      if ($request->server->get('HTTP_REFERER')) {
--        $referer = $request->server->get('HTTP_REFERER');
--      }
--      // Get query string from http referer url.
--      $parse_url = parse_url($referer, PHP_URL_QUERY);
--      // If http referer url has 'destination' and session is not set,
--      // then only redirect to user page if uid dosen't match.
--      if (
--        $parse_url !== NULL &&
--        (strpos($parse_url, 'destination') !== FALSE &&
--        strpos($parse_url, 'destinations') === FALSE) &&
--        empty($auto_redirect)
--      ) {
--        parse_str($parse_url, $output);
--        $destination_uid = explode("/", $output['destination']);
--
--        // If array contains language code, remove it.
--        $languagecode = $this->languageManager->getCurrentLanguage()->getId();
--        if ($destination_uid[1] === $languagecode) {
--          unset($destination_uid[1]);
--          $destination_uid = array_values($destination_uid);
--        }
--
--        // If destination uid and actual uid does not match then,
--        // redirect to loggedin user page.
--        if (($destination_uid[1] == "user") && ($destination_uid[2] != $uid)) {
--          $auto_redirect = $session->set('auto_redirect', 1);
--          $login_url = Url::fromRoute('user.page', [], ['absolute' => TRUE])->toString();
--
--          // Redirect user to user page.
--          $response = new RedirectResponse($login_url);
--          $event->setResponse($response);
--        }
-+    $session = $this->requestStack->getCurrentRequest()->getSession();
-+    $auto_redirect = $session->get('auto_redirect');
-+
-+    // If http referer url has 'destination' and session is not set,
-+    // then only redirect to user page if uid doesn't match.
-+    if (empty($auto_redirect) && ($destination = $this->getDestination())) {
-+      $match = preg_match('#^destination=(/[a-z])?/user/([0-9])$#', $destination, $matches);
-+
-+      if ($match && $matches[2] != $uid) {
-+        $session->set('auto_redirect', 1);
-+        $login_url = Url::fromRoute('user.page', [], ['absolute' => TRUE])
-+          ->toString();
-+
-+        // Redirect user to user page.
-+        $response = new RedirectResponse($login_url);
-+        $event->setResponse($response);
-       }
-     }
-
-@@ -170,11 +146,15 @@ public function onRequest(RequestEvent $event) {
-     // javascript but will keep the login alive whilst that page is opened.
-     $refresh_only = $autologout_manager->refreshOnly();
-     $timeout = $autologout_manager->getUserTimeout();
--    $timeout_padding = $this->config->get('autologout.settings')->get('padding');
--    $is_altlogout = strpos($event->getRequest()->getRequestUri(), '/autologout_alt_logout') !== FALSE;
-+    $timeout_padding = $this->config->get('autologout.settings')
-+      ->get('padding');
-+    $is_altlogout = strpos($event->getRequest()
-+        ->getRequestUri(), '/autologout_alt_logout') !== FALSE;
-
-     // We need a backup plan if JS is disabled.
--    $session = $this->requestStack->getCurrentRequest()->getSession()->get('autologout_last');
-+    $session = $this->requestStack->getCurrentRequest()
-+      ->getSession()
-+      ->get('autologout_last');
-     if (!$is_altlogout && !$refresh_only && isset($session)) {
-       // If time since last access is > timeout + padding, log them out.
-       $diff = $now - $session;
-@@ -189,11 +169,15 @@ public function onRequest(RequestEvent $event) {
-         $autologout_manager->inactivityMessage();
-       }
-       else {
--        $this->requestStack->getCurrentRequest()->getSession()->set('autologout_last', $now);
-+        $this->requestStack->getCurrentRequest()
-+          ->getSession()
-+          ->set('autologout_last', $now);
-       }
-     }
-     else {
--      $this->requestStack->getCurrentRequest()->getSession()->set('autologout_last', $now);
-+      $this->requestStack->getCurrentRequest()
-+        ->getSession()
-+        ->set('autologout_last', $now);
-     }
-   }
-
-@@ -206,4 +190,23 @@ public static function getSubscribedEvents(): array {
-     return $events;
-   }
-
-+  /**
-+   * Get destination from referer.
-+   *
-+   * @return string|null
-+   *   The destination query string or null.
-+   */
-+  private function getDestination(): ?string {
-+    $request = $this->requestStack->getCurrentRequest();
-+    if (!$referer = $request->server->get('HTTP_REFERER')) {
-+      return NULL;
-+    }
-+    // Get query string from http referer url.
-+    $referer_parts = parse_url($referer, PHP_URL_QUERY);
-+    if (!empty($referer_parts) && str_contains($referer_parts, 'destination')) {
-+      return $referer_parts;
-+    }
-+    return FALSE;
-+  }
-+
- }
-diff --git a/tests/src/FunctionalJavascript/UserDestinationLogoutTest.php b/tests/src/FunctionalJavascript/UserDestinationLogoutTest.php
-new file mode 100644
-index 000000000..9edd30700
---- /dev/null
-+++ b/tests/src/FunctionalJavascript/UserDestinationLogoutTest.php
-@@ -0,0 +1,103 @@
-+<?php
-+
-+namespace Drupal\Tests\autologout\FunctionalJavascript;
-+
-+use Drupal\Core\Config\Config;
-+use Drupal\Core\Url;
-+use Drupal\FunctionalJavascriptTests\WebDriverTestBase;
-+use Drupal\user\Entity\User;
-+
-+/**
-+ * Tests that user is redirected to its own profile.
-+ *
-+ * @group Autologout
-+ */
-+class UserDestinationLogoutTest extends WebDriverTestBase {
-+
-+  /**
-+   * Modules to enable.
-+   *
-+   * @var array
-+   */
-+  protected static $modules = [
-+    'system',
-+    'user',
-+    'autologout',
-+  ];
-+
-+  /**
-+   * {@inheritdoc}
-+   */
-+  protected $defaultTheme = 'stark';
-+
-+  /**
-+   * Config factory.
-+   *
-+   * @var \Drupal\Core\Config\Config
-+   */
-+  protected Config $moduleConfig;
-+
-+  /**
-+   * User to logout.
-+   *
-+   * @var bool|\Drupal\user\Entity\User|false
-+   */
-+  protected $privilegedUser;
-+
-+  /**
-+   * User to login.
-+   *
-+   * @var \Drupal\user\Entity\User
-+   */
-+  protected User $testUser;
-+
-+  /**
-+   * {@inheritdoc}
-+   */
-+  protected function setUp(): void {
-+    parent::setUp();
-+
-+    $this->baseUrl = Url::fromRoute('<front>', [], ['absolute' => TRUE])
-+      ->toString();
-+
-+    $this->privilegedUser = $this->drupalCreateUser();
-+    $this->testUser = $this->drupalCreateUser();
-+
-+    $this->moduleConfig = $this->container->get('config.factory')
-+      ->getEditable('autologout.settings');
-+
-+    // For testing purposes set the timeout to 5 seconds.
-+    $this->moduleConfig->set('timeout', 5)->set('padding', 2)->save();
-+
-+    $this->drupalLogin($this->privilegedUser);
-+  }
-+
-+  /**
-+   * Tests that redirection is correct when destination is set.
-+   *
-+   * If destination is set for user/login test that user is redirected to its
-+   * own profile when logged in again.
-+   */
-+  public function testDestinationUserLogout(): void {
-+    // Check that first user is logged in.
-+    self::assertTrue($this->drupalUserIsLoggedIn($this->privilegedUser));
-+    $this->drupalGet('user/' . $this->privilegedUser->id());
-+    // Used later because of the way that the url is built.
-+    $user_uri = Url::fromRoute('entity.user.canonical', ['user' => $this->privilegedUser->id()])
-+      ->toString();
-+    // Wait for timeout.
-+    $this->getSession()->wait(10000);
-+    // Check that destination is set after logout and privilegedUser user
-+    // is logged out.
-+    $this->assertSession()->addressEquals($this->getUrl());
-+    $this->assertStringContainsString('/user/login?destination=' . $user_uri, $this->getSession()
-+      ->getCurrentUrl());
-+    self::assertFalse($this->drupalUserIsLoggedIn($this->privilegedUser));
-+
-+    // Login testUser and check that user was redirected to its own profile.
-+    $this->drupalLogin($this->testUser);
-+    $this->assertSession()
-+      ->addressEquals($this->baseUrl . '/user/' . $this->testUser->id());
-+  }
-+
-+}
diff --git a/resources/patch/php/drupal/autologout/3443711.diff b/resources/patch/php/drupal/autologout/3443711.diff
deleted file mode 100644
index 66e319f6bd..0000000000
--- a/resources/patch/php/drupal/autologout/3443711.diff
+++ /dev/null
@@ -1,54 +0,0 @@
-diff --git a/src/Form/AutologoutSettingsForm.php b/src/Form/AutologoutSettingsForm.php
-index a1f38236f02f9e33d3caeeee34e38a99e49812e8..9713a3c89d12e5695b45959a7038a5e10994a264 100644
---- a/src/Form/AutologoutSettingsForm.php
-+++ b/src/Form/AutologoutSettingsForm.php
-@@ -9,6 +9,7 @@ use Drupal\Core\Extension\ModuleHandlerInterface;
- use Drupal\Core\Form\ConfigFormBase;
- use Drupal\Core\Form\FormStateInterface;
- use Drupal\Core\Messenger\MessengerInterface;
-+use Drupal\Core\Session\AccountInterface;
- use Drupal\user\UserData;
- use Symfony\Component\DependencyInjection\ContainerInterface;
- 
-@@ -330,7 +331,7 @@ class AutologoutSettingsForm extends ConfigFormBase {
-     ];
- 
-     foreach ($this->entityTypeManager->getStorage('user_role')->loadMultiple() as $key => $role) {
--      if ($key != 'authenticated') {
-+      if ($key !== AccountInterface::ANONYMOUS_ROLE) {
-         $form['role_container']['table'][$key] = [
-           'enabled' => [
-             '#type' => 'checkbox',
-diff --git a/src/Plugin/Block/AutologoutWarningBlock.php b/src/Plugin/Block/AutologoutWarningBlock.php
-index 3e0e50de8ebdcbd2301ccb27a007cc72309892b3..cb689f71aae6ecfc75550024920f910f204b4737 100644
---- a/src/Plugin/Block/AutologoutWarningBlock.php
-+++ b/src/Plugin/Block/AutologoutWarningBlock.php
-@@ -98,7 +98,7 @@ class AutologoutWarningBlock extends BlockBase implements ContainerFactoryPlugin
-       $container->get('date.formatter'),
-       $container->get('config.factory')->get('autologout.settings'),
-       $container->get('autologout.manager'),
--      $container->get('form_builder')
-+      $container->get('form_builder'),
-     );
-   }
- 
-diff --git a/tests/src/Kernel/SettingsFormTest.php b/tests/src/Kernel/SettingsFormTest.php
-index 4e906384079f4423b48b9fe338975b4807ca4539..4c07e4fcf4754e29a3877c9eae81dbb1e09ad56a 100644
---- a/tests/src/Kernel/SettingsFormTest.php
-+++ b/tests/src/Kernel/SettingsFormTest.php
-@@ -7,6 +7,7 @@ use Drupal\Core\Form\FormState;
- use Drupal\Core\StringTranslation\StringTranslationTrait;
- use Drupal\KernelTests\KernelTestBase;
- use Drupal\Tests\user\Traits\UserCreationTrait;
-+use Drupal\user\RoleInterface;
- 
- /**
-  * Tests the settings form.
-@@ -89,6 +90,7 @@ class SettingsFormTest extends KernelTestBase {
-     $form_builder = $this->container->get('form_builder');
-     $settings = $this->configFactory->getEditable('autologout.settings');
-     $roles = $this->entityTypeManager->getStorage('user_role')->loadMultiple();
-+    unset($roles[RoleInterface::ANONYMOUS_ID]);
-     $settings->set('max_timeout', 1000)->save();
- 
-     // Test that it is possible to set a value above the max_timeout threshold.
-- 
GitLab


From d2e6265f887e0eb658917fa658f50e1707b3a29f Mon Sep 17 00:00:00 2001
From: Zoltan Horvath <zoltan.horvath@ext.ec.europa.eu>
Date: Fri, 20 Dec 2024 10:55:23 +0100
Subject: [PATCH 076/137] ISAICP-9310: Prepare update to drupal/core 10.3.10 -
 remove patches of resolved issues

---
 composer.json                                |   1 -
 resources/patch/php/drupal/core/3487031.diff | 169 -------------------
 2 files changed, 170 deletions(-)
 delete mode 100644 resources/patch/php/drupal/core/3487031.diff

diff --git a/composer.json b/composer.json
index 8dd9255fa0..d58e789363 100644
--- a/composer.json
+++ b/composer.json
@@ -327,7 +327,6 @@
                 "Allow ChangedItem to skip updating the entity's \"changed\" timestamp when synchronizing @see https://drupal.org/i/2329253": "resources/patch/php/drupal/core/2329253-10.x.patch",
                 "Unserialize(): Passing null to parameter #1 ($data) of type string is deprecated @see https://drupal.org/i/3300404": "resources/patch/php/drupal/core/3300404.patch",
                 "JS errors from Drupal.dialog.resetSize when rapidly closing dialogs @see https://www.drupal.org/i/3472624": "resources/patch/php/drupal/core/3472624-4d97ff80.diff",
-                "Performance Degraded after update to twig 3.14.2 @see https://www.drupal.org/i/3487031": "resources/patch/php/drupal/core/3487031.diff",
                 "Can only intentionally re-render an entity with references 20 times @see https://www.drupal.org/i/2940605": "resources/patch/php/drupal/core/2940605.diff"
             },
             "drupal/default_content": {
diff --git a/resources/patch/php/drupal/core/3487031.diff b/resources/patch/php/drupal/core/3487031.diff
deleted file mode 100644
index 09b74f544b..0000000000
--- a/resources/patch/php/drupal/core/3487031.diff
+++ /dev/null
@@ -1,169 +0,0 @@
-diff --git a/core/lib/Drupal/Core/Template/RemoveCheckToStringNodeVisitor.php b/core/lib/Drupal/Core/Template/RemoveCheckToStringNodeVisitor.php
-new file mode 100644
-index 0000000000000000000000000000000000000000..568b22ace9d48ff91c2d50a70cccd419c358382a
---- /dev/null
-+++ b/core/lib/Drupal/Core/Template/RemoveCheckToStringNodeVisitor.php
-@@ -0,0 +1,56 @@
-+<?php
-+
-+declare(strict_types=1);
-+
-+namespace Drupal\Core\Template;
-+
-+use Twig\Environment;
-+use Twig\Node\CheckToStringNode;
-+use Twig\Node\Node;
-+use Twig\NodeVisitor\NodeVisitorInterface;
-+
-+/**
-+ * Defines a TwigNodeVisitor that replaces CheckToStringNodes.
-+ *
-+ * Twig 3.14.1 resulted in a performance regression in Drupal due to checking if
-+ * __toString is an allowed method on objects. __toString is allowed on all
-+ * objects when Drupal's default SandboxPolicy is active. Therefore, Twig's
-+ * SandboxExtension checks are unnecessary.
-+ */
-+final class RemoveCheckToStringNodeVisitor implements NodeVisitorInterface {
-+
-+  /**
-+   * {@inheritdoc}
-+   */
-+  public function enterNode(Node $node, Environment $env): Node {
-+    if ($node instanceof CheckToStringNode) {
-+      // Replace CheckToStringNode with the faster equivalent, __toString is an
-+      // allowed method so any checking of __toString on a per-object basis is
-+      // performance overhead.
-+      $new = new TwigSimpleCheckToStringNode($node->getNode('expr'));
-+      // @todo https://www.drupal.org/project/drupal/issues/3488584 Update for
-+      //   Twig 4 as the spread attribute has been removed there.
-+      if ($node->hasAttribute('spread')) {
-+        $new->setAttribute('spread', $node->getAttribute('spread'));
-+      }
-+      return $new;
-+    }
-+    return $node;
-+  }
-+
-+  /**
-+   * {@inheritdoc}
-+   */
-+  public function leaveNode(Node $node, Environment $env): ?Node {
-+    return $node;
-+  }
-+
-+  /**
-+   * {@inheritdoc}
-+   */
-+  public function getPriority() {
-+    // Runs after sandbox visitor.
-+    return 1;
-+  }
-+
-+}
-diff --git a/core/lib/Drupal/Core/Template/TwigExtension.php b/core/lib/Drupal/Core/Template/TwigExtension.php
-index cd34aec44973bc8b2a2baf1044c8f2982cdf1ae5..b5a6a5c2ee097667117a554f45694ad9014756c2 100644
---- a/core/lib/Drupal/Core/Template/TwigExtension.php
-+++ b/core/lib/Drupal/Core/Template/TwigExtension.php
-@@ -158,10 +158,18 @@ public function getFilters() {
-   public function getNodeVisitors() {
-     // The node visitor is needed to wrap all variables with
-     // render_var -> TwigExtension->renderVar() function.
--    return [
-+    $visitors = [
-       new TwigNodeVisitor(),
-       new TwigNodeVisitorCheckDeprecations(),
-     ];
-+    if (\in_array('__toString', TwigSandboxPolicy::getMethodsAllowedOnAllObjects(), TRUE)) {
-+      // When __toString is an allowed method, there is no point in running
-+      // \Twig\Extension\SandboxExtension::ensureToStringAllowed, so we add a
-+      // node visitor to remove any CheckToStringNode nodes added by the
-+      // sandbox extension.
-+      $visitors[] = new RemoveCheckToStringNodeVisitor();
-+    }
-+    return $visitors;
-   }
- 
-   /**
-diff --git a/core/lib/Drupal/Core/Template/TwigSandboxPolicy.php b/core/lib/Drupal/Core/Template/TwigSandboxPolicy.php
-index 2a8dfe7dae64a62cd228290ab722b21ed28f1cfb..67d04d5d7f2c5afb59cfefd86eef473b48706033 100644
---- a/core/lib/Drupal/Core/Template/TwigSandboxPolicy.php
-+++ b/core/lib/Drupal/Core/Template/TwigSandboxPolicy.php
-@@ -57,15 +57,7 @@ public function __construct() {
-     // Flip the array so we can check using isset().
-     $this->allowed_classes = array_flip($allowed_classes);
- 
--    $allowed_methods = Settings::get('twig_sandbox_allowed_methods', [
--      // Only allow idempotent methods.
--      'id',
--      'label',
--      'bundle',
--      'get',
--      '__toString',
--      'toString',
--    ]);
-+    $allowed_methods = static::getMethodsAllowedOnAllObjects();
-     // Flip the array so we can check using isset().
-     $this->allowed_methods = array_flip($allowed_methods);
- 
-@@ -112,4 +104,22 @@ public function checkMethodAllowed($obj, $method): void {
-     throw new SecurityError(sprintf('Calling "%s" method on a "%s" object is not allowed.', $method, get_class($obj)));
-   }
- 
-+  /**
-+   * Gets the list of allowed methods on all objects.
-+   *
-+   * @return string[]
-+   *   The list of allowed methods on all objects.
-+   */
-+  public static function getMethodsAllowedOnAllObjects(): array {
-+    return Settings::get('twig_sandbox_allowed_methods', [
-+      // Only allow idempotent methods.
-+      'id',
-+      'label',
-+      'bundle',
-+      'get',
-+      '__toString',
-+      'toString',
-+    ]);
-+  }
-+
- }
-diff --git a/core/lib/Drupal/Core/Template/TwigSimpleCheckToStringNode.php b/core/lib/Drupal/Core/Template/TwigSimpleCheckToStringNode.php
-new file mode 100644
-index 0000000000000000000000000000000000000000..42f32a5d469415e661589a66167fdc6bf36a5941
---- /dev/null
-+++ b/core/lib/Drupal/Core/Template/TwigSimpleCheckToStringNode.php
-@@ -0,0 +1,33 @@
-+<?php
-+
-+declare(strict_types=1);
-+
-+namespace Drupal\Core\Template;
-+
-+use Twig\Compiler;
-+use Twig\Node\CheckToStringNode;
-+
-+/**
-+ * Defines a twig node for simplifying CheckToStringNode.
-+ *
-+ * Drupal's sandbox policy is very permissive with checking whether an object
-+ * can be converted to a string. We allow any object with a __toString method.
-+ * This means that the array traversal in the default SandboxExtension
-+ * implementation added by the parent class is a performance overhead we don't
-+ * need.
-+ *
-+ * @see \Drupal\Core\Template\TwigSandboxPolicy
-+ * @see \Drupal\Core\Template\RemoveCheckToStringNodeVisitor
-+ */
-+final class TwigSimpleCheckToStringNode extends CheckToStringNode {
-+
-+  /**
-+   * {@inheritdoc}
-+   */
-+  public function compile(Compiler $compiler): void {
-+    $expr = $this->getNode('expr');
-+    $compiler
-+      ->subcompile($expr);
-+  }
-+
-+}
-- 
GitLab


From bde91a1c69ac1ad87a4237700904068cf7bc543c Mon Sep 17 00:00:00 2001
From: Zoltan Horvath <zoltan.horvath@ext.ec.europa.eu>
Date: Fri, 20 Dec 2024 10:57:17 +0100
Subject: [PATCH 077/137] ISAICP-9310: Prepare update to drupal/facets
 3.0.0-beta4 - remove patches of resolved issues

---
 composer.json                                 |    6 +-
 .../patch/php/drupal/facets/3259836-8.patch   |   27 -
 .../patch/php/drupal/facets/3379445.patch     | 1629 -----------------
 .../patch/php/drupal/facets/3459093.patch     |   26 -
 .../drupal/facets/sa-contrib-2024-047.patch   |   39 -
 5 files changed, 1 insertion(+), 1726 deletions(-)
 delete mode 100644 resources/patch/php/drupal/facets/3259836-8.patch
 delete mode 100644 resources/patch/php/drupal/facets/3379445.patch
 delete mode 100644 resources/patch/php/drupal/facets/3459093.patch
 delete mode 100644 resources/patch/php/drupal/facets/sa-contrib-2024-047.patch

diff --git a/composer.json b/composer.json
index d58e789363..4ba65a69ec 100644
--- a/composer.json
+++ b/composer.json
@@ -357,12 +357,8 @@
                 "Creation of dynamic property deprecated in PHP 8.2 @see https://www.drupal.org/i/3376919": "resources/patch/php/drupal/error_page/3376919.patch"
             },
             "drupal/facets": {
-                "Facets breaks all AJAX views that uses pagers even without facets @see https://www.drupal.org/i/3379445": "resources/patch/php/drupal/facets/3379445.patch",
                 "Facet Summary for Facet Items with a set dependency. @see https://www.drupal.org/i/2873480": "resources/patch/php/drupal/facets/2873480.patch",
-                "Add 0 option in 'Soft limit' and apply soft limit to facet root li tags and add. @see https://www.drupal.org/i/3208580 and https://www.drupal.org/i/3307082": "resources/patch/php/drupal/facets/3208580-and-3307082.patch",
-                "Config validation error for facets_processor.* @see https://www.drupal.org/project/facets/issues/3459093": "resources/patch/php/drupal/facets/3459093.patch",
-                "Fix FacetsHierarchy config schema issue @see https://www.drupal.org/project/facets/issues/3259836": "resources/patch/php/drupal/facets/3259836-8.patch",
-                "Facets - Critical - Cross Site Scripting - SA-CONTRIB-2024-047 @see https://www.drupal.org/sa-contrib-2024-047": "resources/patch/php/drupal/facets/sa-contrib-2024-047.patch"
+                "Add 0 option in 'Soft limit' and apply soft limit to facet root li tags and add. @see https://www.drupal.org/i/3208580 and https://www.drupal.org/i/3307082": "resources/patch/php/drupal/facets/3208580-and-3307082.patch"
             },
             "drupal/field_delimiter": {
                 "Doesn't work in layout builder. @see https://www.drupal.org/i/3099580": "resources/patch/php/drupal/field_delimiter/3099580.patch",
diff --git a/resources/patch/php/drupal/facets/3259836-8.patch b/resources/patch/php/drupal/facets/3259836-8.patch
deleted file mode 100644
index c14282be08..0000000000
--- a/resources/patch/php/drupal/facets/3259836-8.patch
+++ /dev/null
@@ -1,27 +0,0 @@
-diff --git a/config/schema/facets.facet.schema.yml b/config/schema/facets.facet.schema.yml
-index a3e63079e8a8554de2e4674a98ccf28f73c2eb91..342f1c148465c62bde42dff496ef2676bef33281 100644
---- a/config/schema/facets.facet.schema.yml
-+++ b/config/schema/facets.facet.schema.yml
-@@ -52,7 +52,7 @@ facets.facet.*:
-           type: string
-           label: 'Plugin id'
-         config:
--          type: facets.facet.[%parent.type]
-+          type: plugin.plugin_configuration.facets_hierarchy.[%parent.type]
-           label: 'Configuration'
-     expand_hierarchy:
-       type: boolean
-diff --git a/config/schema/facets.processor.schema.yml b/config/schema/facets.processor.schema.yml
-index 045106e1de94b452ebd8f4aadce39b3a7bdfd998..929dfed548240d6f08ecb883523b45b6ffd572c5 100644
---- a/config/schema/facets.processor.schema.yml
-+++ b/config/schema/facets.processor.schema.yml
-@@ -1,6 +1,9 @@
- plugin.plugin_configuration.facets_processor.*:
-   type: mapping
- 
-+plugin.plugin_configuration.facets_hierarchy.*:
-+  type: mapping
-+
- plugin.plugin_configuration.facets_processor.count_widget_widget_order:
-   type: mapping
-   label: 'Count widget order'
diff --git a/resources/patch/php/drupal/facets/3379445.patch b/resources/patch/php/drupal/facets/3379445.patch
deleted file mode 100644
index 804e020fd5..0000000000
--- a/resources/patch/php/drupal/facets/3379445.patch
+++ /dev/null
@@ -1,1629 +0,0 @@
-diff --git a/composer.json b/composer.json
-index 11ccc31..a1b1ce7 100644
---- a/composer.json
-+++ b/composer.json
-@@ -12,9 +12,9 @@
-   "support": {
-     "issues": "https://www.drupal.org/project/issues/facets",
-     "irc": "irc://irc.freenode.org/drupal-search-api",
--    "source": "git://git.drupal.org/project/facets.git"
-+    "source": "https://git.drupalcode.org/project/facets.git"
-   },
--  "license": "GPL-2.0+",
-+  "license": "GPL-2.0-or-later",
-   "require-dev": {
-     "drupal/search_api": "^1.28||1.x-dev",
-     "drupal/jquery_ui_slider": "~2.0",
-@@ -26,6 +26,7 @@
-     "drupal/jquery_ui_touch_punch": "Required for the 'Facets Range Widget' module to work"
-   },
-   "conflict": {
-+    "drupal/core": "<10.1.0",
-     "drupal/search_api": "<1.14"
-   }
- }
-diff --git a/facets.info.yml b/facets.info.yml
-index f943533..0cd74a8 100644
---- a/facets.info.yml
-+++ b/facets.info.yml
-@@ -1,7 +1,7 @@
- name: 'Facets'
- type: module
- description: 'Faceted search interfaces that can be used on Search API searchers.'
--core_version_requirement: ^9.3 || ^10.0
-+core_version_requirement: ^10.1
- package: Search
- configure: entity.facets_facet.collection
- test_dependencies:
-diff --git a/facets.module b/facets.module
-index 66e8412..0841aa6 100644
---- a/facets.module
-+++ b/facets.module
-@@ -383,23 +383,3 @@ function facets_theme_suggestions_facets_result_item(array $variables) {
-   }
-   return $suggestions;
- }
--
--/**
-- * Implements hook_views_data_alter().
-- */
--function facets_views_data_alter(array &$data) {
--
--  /** @var \Drupal\search_api\IndexInterface $index */
--  foreach (Index::loadMultiple() as $index) {
--    $data['search_api_index_' . $index->id()]['facets'] = [
--      'title' => t('Facets'),
--      'help' => t('Displays facets in a filter or area.'),
--      'filter' => [
--        'id' => 'facets_filter',
--      ],
--      'area' => [
--        'id' => 'facets_area',
--      ],
--    ];
--  }
--}
-diff --git a/facets.services.yml b/facets.services.yml
-index ba34b70..bb29dbc 100644
---- a/facets.services.yml
-+++ b/facets.services.yml
-@@ -39,10 +39,6 @@ services:
-     arguments: ['@plugin.manager.block']
-     tags:
-       - { name: event_subscriber }
--  facets.route_alter:
--    class: \Drupal\facets\EventSubscriber\RouteAlterSubscriber
--    tags:
--      - { name: event_subscriber }
-   facets.search_api_subscriber:
-     class: Drupal\facets\EventSubscriber\SearchApiSubscriber
-     arguments: ['@facets.manager']
-diff --git a/js/base-widget.js b/js/base-widget.js
-index de99c03..3a868d7 100644
---- a/js/base-widget.js
-+++ b/js/base-widget.js
-@@ -14,8 +14,7 @@
-    * class: "js-facets-widget".
-    *
-    * Events are doing following:
--   * "facets_filter" - widget should trigger this event. The facets module will
--   *   handle it accordingly in case of AJAX and Non-AJAX views.
-+   * "facets_filter" - widget should trigger this event.
-    * "facets_filtering" - The facets module will trigger this event before
-    *   filter is executed.
-    *
-diff --git a/js/checkbox-widget.js b/js/checkbox-widget.js
-index 6dbb652..4430b93 100644
---- a/js/checkbox-widget.js
-+++ b/js/checkbox-widget.js
-@@ -88,21 +88,12 @@
-     var label = $('<label for="' + id + '">' + description + '</label>');
-
-     checkbox.on('change.facets', function (e) {
--      if ($link.data('drupal-facet-ajax') == 0) {
--        e.preventDefault();
-+      e.preventDefault();
-
--        var $widget = $(this).closest('.js-facets-widget');
-+      var $widget = $(this).closest('.js-facets-widget');
-
--        Drupal.facets.disableFacet($widget);
--        $widget.trigger('facets_filter', [href]);
--      }
--      else {
--        var current = $(this);
--        if (current.is(':checked') && current.hasClass(single_selection_group)) {
--          var $widget = current.closest('.js-facets-widget');
--          $widget.find('input.' + single_selection_group + ':not(#' + current.attr('id') + ')').prop('checked', false);
--        }
--      }
-+      Drupal.facets.disableFacet($widget);
-+      $widget.trigger('facets_filter', [href]);
-     });
-
-     if (active) {
-diff --git a/js/dropdown-widget.js b/js/dropdown-widget.js
-index ecc0588..59d070c 100644
---- a/js/dropdown-widget.js
-+++ b/js/dropdown-widget.js
-@@ -53,7 +53,7 @@
-         .text(default_option_label);
-       $dropdown.append($default_option);
-
--      $ul.prepend('<li class="default-option"><a href="' + window.location.href.split('?')[0] + '" data-drupal-facet-ajax="' + $ul.data('drupal-facet-ajax') +'">' + Drupal.checkPlain(default_option_label) + '</a></li>');
-+      $ul.prepend('<li class="default-option"><a href="' + window.location.href.split('?')[0] + '">' + Drupal.checkPlain(default_option_label) + '</a></li>');
-
-       var has_active = false;
-       $links.each(function () {
-@@ -89,10 +89,8 @@
-       $dropdown.on('change.facets', function () {
-         var anchor = $($ul).find("[data-drupal-facet-item-id='" + $(this).find(':selected').data('drupalFacetItemId') + "']");
-         var $linkElement = (anchor.length > 0) ? $(anchor) : $ul.find('.default-option a');
--        if ($linkElement.data('drupal-facet-ajax') == 0) {
--          var url = $linkElement.attr('href');
--          $(this).trigger('facets_filter', [ url ]);
--        }
-+        var url = $linkElement.attr('href');
-+        $(this).trigger('facets_filter', [ url ]);
-       });
-
-       // Append empty text option.
-diff --git a/js/soft-limit.js b/js/soft-limit.js
-index d07e85e..a203352 100644
---- a/js/soft-limit.js
-+++ b/js/soft-limit.js
-@@ -43,7 +43,8 @@
-
-     // Hide facets over the limit.
-     facetsList.each(function () {
--      $(once('applysoftlimit', $(this).children('li:gt(' + zero_based_limit + ')'))).hide();
-+      var allLiElements = $(this).find('li');
-+      $(once('applysoftlimit', allLiElements.slice(zero_based_limit + 1))).hide();
-     });
-
-     // Add "Show more" / "Show less" links.
-diff --git a/modules/facets_exposed_filters/facets_exposed_filters.info.yml b/modules/facets_exposed_filters/facets_exposed_filters.info.yml
-new file mode 100644
-index 0000000..db9ce5f
---- /dev/null
-+++ b/modules/facets_exposed_filters/facets_exposed_filters.info.yml
-@@ -0,0 +1,11 @@
-+name: 'Facets exposed filters (Experimental)'
-+type: module
-+description: 'Render facets in exposed filters.'
-+core_version_requirement: ^9.2 || ^10.1
-+package: Search
-+configure: entity.facets_facet.collection
-+dependencies:
-+  - search_api:search_api
-+  - facets:facets
-+  - drupal:views
-+  - better_exposed_filters:better_exposed_filters
-diff --git a/modules/facets_exposed_filters/facets_exposed_filters.module b/modules/facets_exposed_filters/facets_exposed_filters.module
-new file mode 100644
-index 0000000..2c02efb
---- /dev/null
-+++ b/modules/facets_exposed_filters/facets_exposed_filters.module
-@@ -0,0 +1,46 @@
-+<?php
-+
-+use Drupal\Core\Form\FormStateInterface;
-+use Drupal\search_api\Entity\Index;
-+
-+/**
-+ * Implements hook_views_data_alter().
-+ */
-+function facets_exposed_filters_views_data_alter(array &$data) {
-+  /** @var \Drupal\search_api\IndexInterface $index */
-+  foreach (Index::loadMultiple() as $index) {
-+    $data['search_api_index_' . $index->id()]['facets'] = [
-+      'title' => t('Facets'),
-+      'help' => t('Displays facets in a filter or area.'),
-+      'filter' => [
-+        'id' => 'facets_filter',
-+      ],
-+      'area' => [
-+        'id' => 'facets_area',
-+      ],
-+    ];
-+  }
-+}
-+
-+function facets_exposed_filters_form_facets_facet_edit_form_alter(&$form, FormStateInterface $form_state) {
-+  $facet = \Drupal::routeMatch()->getParameter('facets_facet');
-+  $facetsource_config = $facet->getFacetSourceConfig();
-+
-+  // Only alter form when views_exposed_filters url processor is active.
-+  if (substr($facetsource_config->getUrlProcessorName(), 0, 21) === 'views_exposed_filters') {
-+    // Hide processors who do not apply when using views_exposed_filters.
-+    $form['widget'] = ['#type' => 'hidden', '#value' => 'views_exposed_filter'];
-+
-+    $form["facet_settings"]["only_visible_when_facet_source_is_visible"]['#access'] = FALSE;
-+    $form["facet_settings"]["only_visible_when_facet_source_is_visible"]['#value'] = FALSE;
-+
-+    $form["facet_settings"]["url_alias"]['#access'] = FALSE;
-+    $form["facet_settings"]["show_title"]['#access'] = FALSE;
-+    $form["facet_settings"]["show_only_one_result"]['#access'] = FALSE;
-+    $form["facet_settings"]["show_only_one_result"]['#value'] = FALSE;
-+
-+    $form["facet_settings"]["empty_behavior"]['#access'] = FALSE;
-+    unset($form["facet_settings"]["show_only_one_result"]);
-+  }
-+}
-+
-diff --git a/modules/facets_exposed_filters/src/Plugin/facets/url_processor/ViewsExposedFilters.php b/modules/facets_exposed_filters/src/Plugin/facets/url_processor/ViewsExposedFilters.php
-new file mode 100644
-index 0000000..6ba8c54
---- /dev/null
-+++ b/modules/facets_exposed_filters/src/Plugin/facets/url_processor/ViewsExposedFilters.php
-@@ -0,0 +1,122 @@
-+<?php
-+
-+namespace Drupal\facets_exposed_filters\Plugin\facets\url_processor;
-+
-+use Drupal\Core\Cache\UnchangingCacheableDependencyTrait;
-+use Drupal\Core\Entity\EntityTypeManagerInterface;
-+use Drupal\Core\Url;
-+use Drupal\facets\FacetInterface;
-+use Drupal\facets\UrlProcessor\UrlProcessorPluginBase;
-+use Drupal\views\Entity\View;
-+use Symfony\Component\DependencyInjection\ContainerInterface;
-+use Symfony\Component\HttpFoundation\Request;
-+
-+/**
-+ * Query string URL processor.
-+ *
-+ * @FacetsUrlProcessor(
-+ *   id = "views_exposed_filters",
-+ *   label = @Translation("Views exposed filters"),
-+ *   description = @Translation("Views exposed filters moves all url logic to
-+ *   Views, which provides a better AJAX/Views integration.")
-+ * )
-+ */
-+class ViewsExposedFilters extends UrlProcessorPluginBase {
-+
-+  use UnchangingCacheableDependencyTrait;
-+
-+  /**
-+   * {@inheritdoc}
-+   */
-+  public function __construct(array $configuration, $plugin_id, $plugin_definition, Request $request, EntityTypeManagerInterface $entity_type_manager) {
-+    parent::__construct($configuration, $plugin_id, $plugin_definition, $request, $entity_type_manager);
-+    $this->initializeActiveFilters();
-+  }
-+
-+  /**
-+   * {@inheritdoc}
-+   */
-+  public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
-+    return new static(
-+      $configuration,
-+      $plugin_id,
-+      $plugin_definition,
-+      $container->get('request_stack')->getCurrentRequest(),
-+      $container->get('entity_type.manager'),
-+    );
-+  }
-+
-+  /**
-+   * {@inheritdoc}
-+   */
-+  public function buildUrls(FacetInterface $facet, array $results) {
-+    // No results are found for this facet, so don't try to create urls.
-+    if (empty($results)) {
-+      return [];
-+    }
-+
-+    $display_id = $this->configuration['facet']->getFacetSource()->pluginDefinition["display_id"];
-+    $parts = explode(':', $display_id);
-+    $views_info = explode('__', $parts[1]);
-+    $views_name = $views_info[0];
-+    $views_display = $views_info[1];
-+
-+    // We dont build real urls here. Views will handle this part for us. However
-+    // our code still depends on the url being set, so we set all results to use
-+    // the views display url.
-+    $url = Url::fromRoute('view.' . $views_name . '.' . $views_display);
-+    foreach ($results as $key => $result) {
-+      $results[$key]->setUrl($url);
-+    }
-+
-+    return $results;
-+  }
-+
-+  /**
-+   * Initializes the active filters from the request query.
-+   *
-+   * Get all the filters that are active by checking the request query and store
-+   * them in activeFilters which is an array where key is the facet id and value
-+   * is an array of raw values.
-+   */
-+  protected function initializeActiveFilters() {
-+    $url_parameters = $this->request->query;
-+    $active_filters = [];
-+    $display_id = $this->configuration['facet']->getFacetSource()->pluginDefinition["display_id"];
-+    $parts = explode(':', $display_id);
-+    $views_info = explode('__', $parts[1]);
-+    $views_name = $views_info[0];
-+    $views_display = $views_info[1];
-+    $view = View::load($views_name);
-+    $display = $view->getDisplay($views_display);
-+    if (!isset($display["display_options"]["filters"])) {
-+      $display = $view->getDisplay('default');
-+    }
-+    foreach ($display["display_options"]["filters"] as $filter) {
-+      if ($filter["plugin_id"] == 'facets_filter') {
-+        $facet_id = $filter['facet'];
-+        $identifier = $filter["expose"]["identifier"];
-+        $query_params = $url_parameters->all();
-+        if (isset($query_params[$identifier]) && $query_params[$identifier]) {
-+          if ($filter["expose"]["multiple"]) {
-+            $active_filters[$facet_id] = $url_parameters->all()[$identifier];
-+          }
-+          else {
-+            if ($url_parameters->all()[$identifier] != 'All') {
-+              $active_filters[$facet_id][] = $url_parameters->all()[$identifier];
-+            }
-+          }
-+        }
-+      }
-+    }
-+    $this->activeFilters = $active_filters;
-+  }
-+
-+  /**
-+   * {@inheritdoc}
-+   */
-+  public function getCacheContexts() {
-+    return ['url.query_args'];
-+  }
-+
-+}
-diff --git a/modules/facets_exposed_filters/src/Plugin/facets/widget/ViewsExposedFilterWidget.php b/modules/facets_exposed_filters/src/Plugin/facets/widget/ViewsExposedFilterWidget.php
-new file mode 100644
-index 0000000..3196206
---- /dev/null
-+++ b/modules/facets_exposed_filters/src/Plugin/facets/widget/ViewsExposedFilterWidget.php
-@@ -0,0 +1,49 @@
-+<?php
-+
-+namespace Drupal\facets_exposed_filters\Plugin\facets\widget;
-+
-+use Drupal\facets\FacetInterface;
-+use Drupal\facets\Widget\WidgetPluginBase;
-+
-+/**
-+ * A specific widget used with the views_exposed_filters url processor.
-+ *
-+ * @FacetsWidget(
-+ *   id = "views_exposed_filter",
-+ *   label = @Translation("Views exposed filters"),
-+ * )
-+ */
-+class ViewsExposedFilterWidget extends WidgetPluginBase {
-+
-+  /**
-+   * {@inheritdoc}
-+   */
-+  public function build(FacetInterface $facet) {
-+    $results = $facet->getResults();
-+    return $this->buildOneLevel($results);
-+  }
-+
-+  /**
-+   * Builds one level from results.
-+   *
-+   * @param \Drupal\facets\Result\ResultInterface[] $results
-+   *   A list of results.
-+   *
-+   * @return array
-+   *   Generated build.
-+   */
-+  protected function buildOneLevel(array $results): array {
-+    $items = [];
-+
-+    foreach ($results as $result) {
-+      $label = $result->getDisplayValue();
-+      if ($this->getConfiguration()['show_numbers'] && $result->getCount() !== FALSE) {
-+        $label .= ' ('. $result->getCount() .')';
-+      }
-+      $items[$result->getRawValue()] = $label;
-+    }
-+
-+    return $items;
-+  }
-+
-+}
-diff --git a/modules/facets_exposed_filters/src/Plugin/views/FacetsViewsPluginTrait.php b/modules/facets_exposed_filters/src/Plugin/views/FacetsViewsPluginTrait.php
-new file mode 100644
-index 0000000..0241793
---- /dev/null
-+++ b/modules/facets_exposed_filters/src/Plugin/views/FacetsViewsPluginTrait.php
-@@ -0,0 +1,78 @@
-+<?php
-+
-+namespace Drupal\facets_exposed_filters\Plugin\views;
-+
-+use Drupal\Core\Form\FormStateInterface;
-+
-+/**
-+ * Helper for the main Views plugin.
-+ */
-+trait FacetsViewsPluginTrait {
-+
-+  /**
-+   * Builds the options form.
-+   *
-+   * @param array $form
-+   *   The form array that is being added to.
-+   * @param \Drupal\Core\Form\FormStateInterface $form_state
-+   *   The form state object.
-+   */
-+  public function facetsViewsBuildOptionsForm(array &$form, FormStateInterface $form_state) {
-+    $options = [];
-+
-+    /** @var \Drupal\facets\Entity\Facet[] $facets */
-+    $facets = $this->facetStorage->loadMultiple();
-+
-+    $format = 'search_api:views_%s__%s__%s';
-+    $source = sprintf($format, $this->view->getDisplay()
-+      ->getPluginId(), $this->view->id(), $this->view->current_display);
-+    foreach ($facets as $facet) {
-+      if ($facet->getFacetSourceId() === $source) {
-+        $options[$facet->id()] = $facet->label();
-+      }
-+    }
-+
-+    $form['facet'] = [
-+      '#title' => 'Facet',
-+      '#options' => $options,
-+      '#type' => 'radios',
-+      '#required' => TRUE,
-+      '#default_value' => isset($this->options['facet']) ? $this->options['facet'] : NULL,
-+    ];
-+  }
-+
-+  /**
-+   * Gets the facets to render.
-+   *
-+   * @return array
-+   *   The facet blocks to be output, in render array format.
-+   */
-+  public function facetsViewsGetFacets() {
-+    $build = [];
-+
-+    if (!$this->options['facet']) {
-+      return $build;
-+    }
-+
-+    /** @var \Drupal\facets\Entity\Facet $facet */
-+    $facet = $this->facetStorage->load($this->options['facet']);
-+    $facet_build = $this->facetManager->build($facet);
-+
-+    if (!isset($facet_build[0]) || !$facet_build[0]) {
-+      return $build;
-+    }
-+
-+    $options = [];
-+    // Empty behavior is not supported. Ensure we have actual results.
-+    if (isset($facet_build[0]) && !isset($facet_build[0]["#type"])) {
-+      $build = [
-+        '#type' => 'select',
-+        '#options' => $facet_build[0],
-+        '#multiple' => $this->options["expose"]["multiple"],
-+      ];
-+    }
-+
-+    return $build;
-+  }
-+
-+}
-diff --git a/src/Plugin/views/area/FacetsArea.php b/modules/facets_exposed_filters/src/Plugin/views/area/FacetsArea.php
-similarity index 95%
-rename from src/Plugin/views/area/FacetsArea.php
-rename to modules/facets_exposed_filters/src/Plugin/views/area/FacetsArea.php
-index f3e7f59..fc5ed95 100644
---- a/src/Plugin/views/area/FacetsArea.php
-+++ b/modules/facets_exposed_filters/src/Plugin/views/area/FacetsArea.php
-@@ -1,12 +1,12 @@
- <?php
-
--namespace Drupal\facets\Plugin\views\area;
-+namespace Drupal\facets_exposed_filters\Plugin\views\area;
-
- use Drupal\Core\Block\BlockPluginInterface;
- use Drupal\Core\Entity\EntityStorageInterface;
- use Drupal\Core\Form\FormStateInterface;
- use Drupal\facets\FacetManager\DefaultFacetManager;
--use Drupal\facets\Plugin\views\FacetsViewsPluginTrait;
-+use Drupal\facets_exposed_filters\Plugin\views\FacetsViewsPluginTrait;
- use Drupal\views\Plugin\views\area\AreaPluginBase;
- use Symfony\Component\DependencyInjection\ContainerInterface;
-
-diff --git a/src/Plugin/views/filter/FacetsFilter.php b/modules/facets_exposed_filters/src/Plugin/views/filter/FacetsFilter.php
-similarity index 84%
-rename from src/Plugin/views/filter/FacetsFilter.php
-rename to modules/facets_exposed_filters/src/Plugin/views/filter/FacetsFilter.php
-index bd44301..4be699a 100644
---- a/src/Plugin/views/filter/FacetsFilter.php
-+++ b/modules/facets_exposed_filters/src/Plugin/views/filter/FacetsFilter.php
-@@ -1,15 +1,14 @@
- <?php
-
--namespace Drupal\facets\Plugin\views\filter;
-+namespace Drupal\facets_exposed_filters\Plugin\views\filter;
-
- use Drupal\Component\Utility\Random;
- use Drupal\Core\Block\BlockPluginInterface;
- use Drupal\Core\Entity\EntityStorageInterface;
- use Drupal\Core\Form\FormStateInterface;
- use Drupal\facets\FacetManager\DefaultFacetManager;
--use Drupal\facets\Plugin\views\FacetsViewsPluginTrait;
-+use Drupal\facets_exposed_filters\Plugin\views\FacetsViewsPluginTrait;
- use Drupal\views\Plugin\views\filter\FilterPluginBase;
--use Drupal\views\Plugin\views\HandlerBase;
- use Symfony\Component\DependencyInjection\ContainerInterface;
-
- /**
-@@ -84,7 +83,8 @@ class FacetsFilter extends FilterPluginBase {
-     $options = parent::defineOptions();
-     $options['exposed'] = ['default' => TRUE];
-     $options['expose']['contains']['identifier'] = ['default' => 'facet_' . $random->name()];
--    $options['facets']['default'] = [];
-+    $options['expose']['contains']['multiple'] = ['default' => TRUE];
-+    $options['facet']['default'] = NULL;
-     $options['label_display']['default'] = BlockPluginInterface::BLOCK_LABEL_VISIBLE;
-     return $options;
-   }
-@@ -93,7 +93,7 @@ class FacetsFilter extends FilterPluginBase {
-    * {@inheritdoc}
-    */
-   public function buildOptionsForm(&$form, FormStateInterface $form_state) {
--    HandlerBase::buildOptionsForm($form, $form_state);
-+    parent::buildOptionsForm($form, $form_state);
-     $this->facetsViewsBuildOptionsForm($form, $form_state);
-   }
-
-@@ -101,17 +101,26 @@ class FacetsFilter extends FilterPluginBase {
-    * {@inheritdoc}
-    */
-   public function adminSummary() {
--    return implode(', ', array_filter($this->options['facets']));
-+    return $this->options['facet'];
-   }
-
-   /**
-    * {@inheritdoc}
-    */
-   public function valueForm(&$form, FormStateInterface $form_state) {
-+
-+    // Dirty check if we are in views UI. Return no values as it removes
-+    // settings from the view when editing settings for an existing facet
-+    // filter.
-+    if(isset($form["admin_label"])) {
-+      $form['value'] = [];
-+      return;
-+    }
-+
-     static $is_processing = NULL;
-
-     if ($is_processing) {
--      $form_state->facets_not_built = TRUE;
-+      $form_state->set('facets_not_built', TRUE);
-       $form['value'] = [];
-       return;
-     }
-diff --git a/modules/facets_range_widget/facets_range_widget.libraries.yml b/modules/facets_range_widget/facets_range_widget.libraries.yml
-index d994ac8..5c41972 100644
---- a/modules/facets_range_widget/facets_range_widget.libraries.yml
-+++ b/modules/facets_range_widget/facets_range_widget.libraries.yml
-@@ -23,6 +23,7 @@ slider:
-   dependencies:
-     - core/drupal
-     - core/drupalSettings
--    - core/jquery.once
-+    - core/jquery
-+    - core/once
-     - facets_range_widget/jquery.ui.slider.pips
-     - jquery_ui_touch_punch/touch-punch
-diff --git a/modules/facets_range_widget/src/Plugin/facets/processor/RangeSliderProcessor.php b/modules/facets_range_widget/src/Plugin/facets/processor/RangeSliderProcessor.php
-index 62cf04a..b166fd8 100644
---- a/modules/facets_range_widget/src/Plugin/facets/processor/RangeSliderProcessor.php
-+++ b/modules/facets_range_widget/src/Plugin/facets/processor/RangeSliderProcessor.php
-@@ -52,13 +52,16 @@ class RangeSliderProcessor extends SliderProcessor implements PreQueryProcessorI
-       unset($active_filters['']);
-     }
-
-+    /** @var \Drupal\facets\Utility\FacetsUrlGenerator $url_generator */
-+    $url_generator = \Drupal::service('facets.utility.url_generator');
-+
-     /** @var \Drupal\facets\Result\ResultInterface[] $results */
-     foreach ($results as &$result) {
-       $new_active_filters = $active_filters;
-       unset($new_active_filters[$facet->id()]);
-       // Add one generic query filter with the min and max placeholder.
-       $new_active_filters[$facet->id()][] = '(min:__range_slider_min__,max:__range_slider_max__)';
--      $url = \Drupal::service('facets.utility.url_generator')->getUrl($new_active_filters, FALSE);
-+      $url = $url_generator->getUrl($new_active_filters, FALSE);
-       $result->setUrl($url);
-     }
-
-diff --git a/modules/facets_searchbox_widget/facets_searchbox_widget.libraries.yml b/modules/facets_searchbox_widget/facets_searchbox_widget.libraries.yml
-index 468f213..c315e94 100755
---- a/modules/facets_searchbox_widget/facets_searchbox_widget.libraries.yml
-+++ b/modules/facets_searchbox_widget/facets_searchbox_widget.libraries.yml
-@@ -8,4 +8,5 @@ searchbox:
-   dependencies:
-     - core/drupal
-     - core/drupalSettings
--    - core/jquery.once
-+    - core/jquery
-+    - core/once
-diff --git a/modules/facets_summary/src/Entity/FacetsSummary.php b/modules/facets_summary/src/Entity/FacetsSummary.php
-index ee3bd7c..b2e438a 100644
---- a/modules/facets_summary/src/Entity/FacetsSummary.php
-+++ b/modules/facets_summary/src/Entity/FacetsSummary.php
-@@ -3,6 +3,7 @@
- namespace Drupal\facets_summary\Entity;
-
- use Drupal\Core\Config\Entity\ConfigEntityBase;
-+use Drupal\facets\Entity\Facet;
- use Drupal\facets_summary\FacetsSummaryInterface;
-
- /**
-@@ -316,6 +317,11 @@ class FacetsSummary extends ConfigEntityBase implements FacetsSummaryInterface {
-       $this->addDependencies($facet_source_dependencies);
-     }
-
-+    foreach (array_keys($this->getFacets() ?? []) as $facet_id) {
-+      $facet = Facet::load($facet_id);
-+      $this->addDependency('config', $facet->getConfigDependencyName());
-+    }
-+
-     return $this;
-   }
-
-diff --git a/src/Cache/Context/FacetsFilterCacheContext.php b/src/Cache/Context/FacetsFilterCacheContext.php
-index 4fc20f5..e9f3341 100644
---- a/src/Cache/Context/FacetsFilterCacheContext.php
-+++ b/src/Cache/Context/FacetsFilterCacheContext.php
-@@ -7,7 +7,7 @@ use Drupal\Core\Cache\Context\CalculatedCacheContextInterface;
- use Drupal\Core\Cache\Context\RequestStackCacheContextBase;
-
- /**
-- * Defines the FacetsAjaxArgsCacheContext service, for per facets args caching.
-+ * Defines the FacetsFilterCacheContext service, for per facets args caching.
-  *
-  * Cache context ID: 'facets_filter' (to vary by all request arguments).
-  * Calculated cache context ID: 'facets_filter:%key', e.g.'facets_filter:f'
-@@ -33,7 +33,7 @@ class FacetsFilterCacheContext extends RequestStackCacheContextBase implements C
-       return http_build_query($value);
-     }
-     elseif ($this->requestStack->getCurrentRequest()->request->has($arg)) {
--      $value = $this->requestStack->getCurrentRequest()->request->get($arg);
-+      $value = $this->requestStack->getCurrentRequest()->request->all()[$arg] ?? NULL;
-       if (is_array($value)) {
-         return http_build_query($value);
-       }
-diff --git a/src/Controller/FacetsViewsAjaxController.php b/src/Controller/FacetsViewsAjaxController.php
-deleted file mode 100644
-index 157a81e..0000000
---- a/src/Controller/FacetsViewsAjaxController.php
-+++ /dev/null
-@@ -1,88 +0,0 @@
--<?php
--
--namespace Drupal\facets\Controller;
--
--use Drupal\Core\Ajax\ReplaceCommand;
--use Drupal\Core\Cache\CacheableMetadata;
--use Drupal\Core\Cache\CacheableResponseInterface;
--use Drupal\Core\Render\BubbleableMetadata;
--use Drupal\Core\Render\RenderContext;
--use Drupal\views\Ajax\ViewAjaxResponse;
--use Drupal\views\Controller\ViewAjaxController;
--use Symfony\Component\HttpFoundation\Request;
--
--/**
-- * Controller that allows for to replace exposed forms in blocks.
-- */
--class FacetsViewsAjaxController extends ViewAjaxController {
--
--  /**
--   * {@inheritdoc}
--   */
--  public function ajaxView(Request $request) {
--    $this->facetsRemoveQueryParams($request);
--    $response = parent::ajaxView($request);
--
--    $view = $response->getView();
--    $display = $view->getDisplay();
--    if ($display->getOption('exposed_block') && $display->usesExposedFormInBlock()) {
--      $metadata = $this->addExposedBlockToResponse($response);
--      if ($response instanceof CacheableResponseInterface) {
--        $response->addCacheableDependency($metadata);
--      }
--    }
--
--    return $response;
--  }
--
--  /**
--   * If there's an AJAX request, remove the 'f' and 'page' key.
--   *
--   * ... in case they are in the current browser URL.
--   *
--   * This only applies when the method is POST.
--   *
--   * @param \Symfony\Component\HttpFoundation\Request $request
--   *   The request object to process.
--   */
--  protected function facetsRemoveQueryParams(Request $request) {
--    if ($request->isXmlHttpRequest()) {
--      // @todo replace hardcoded 'f' by facet setting.
--      foreach (['f', 'page', 'fulltext'] as $key) {
--        if ($request->query->has($key)) {
--          $request->query->remove($key);
--        }
--      }
--    }
--  }
--
--  /**
--   * Adds the exposed form to the response if necessary.
--   */
--  protected function addExposedBlockToResponse(ViewAjaxResponse $response): CacheableMetadata {
--    $view = $response->getView();
--    $context = new RenderContext();
--    $exposed_block = $this->renderer->executeInRenderContext($context, function () use ($view) {
--      $output = $view->display_handler->viewExposedFormBlocks();
--      if (is_array($output) && !empty($output)) {
--        return $output;
--      }
--
--      return [];
--    });
--
--    if (!$context->isEmpty() && !empty($exposed_block)) {
--      $bubbleable_metadata = $context->pop();
--      BubbleableMetadata::createFromRenderArray($exposed_block)
--        ->merge($bubbleable_metadata)
--        ->applyTo($exposed_block);
--    }
--
--    // Replace exposed block.
--    $selector = 'views-exposed-form-' . strtr($view->id(), '_', '-') . '-' . strtr($view->current_display, '_', '-');
--    $response->addCommand(new ReplaceCommand("#" . $selector, $exposed_block));
--
--    return CacheableMetadata::createFromRenderArray($exposed_block);
--  }
--
--}
-diff --git a/src/Entity/Facet.php b/src/Entity/Facet.php
-index 7e232a3..4deb3d2 100644
---- a/src/Entity/Facet.php
-+++ b/src/Entity/Facet.php
-@@ -1116,7 +1116,11 @@ class Facet extends ConfigEntityBase implements FacetInterface {
-    */
-   public function postSave(EntityStorageInterface $storage, $update = TRUE) {
-     parent::postSave($storage, $update);
--    if (!$update) {
-+    // If a facet is new, update the caching metadata of the facet source.
-+    // But only if the facet has been created via the UI and not via config
-+    // import.
-+    // @see https://www.drupal.org/project/facets/issues/3395567
-+    if (!$update && !\Drupal::service('config.installer')->isSyncing()) {
-       self::clearBlockCache();
-       // Register newly created facet within its source, for the caching.
-       if (($source = $this->getFacetSource()) && $source->getCacheMaxAge() !== 0) {
-diff --git a/src/EventSubscriber/RouteAlterSubscriber.php b/src/EventSubscriber/RouteAlterSubscriber.php
-deleted file mode 100644
-index 4d8fc9b..0000000
---- a/src/EventSubscriber/RouteAlterSubscriber.php
-+++ /dev/null
-@@ -1,32 +0,0 @@
--<?php
--
--namespace Drupal\facets\EventSubscriber;
--
--use Drupal\Core\Routing\RouteBuildEvent;
--use Drupal\Core\Routing\RoutingEvents;
--use Symfony\Component\EventDispatcher\EventSubscriberInterface;
--
--/**
-- * Modify certain routes.
-- */
--class RouteAlterSubscriber implements EventSubscriberInterface {
--
--  /**
--   * {@inheritdoc}
--   */
--  public function onRouteAlter(RouteBuildEvent $event) {
--    $collection = $event->getRouteCollection();
--    if ($route = $collection->get('views.ajax')) {
--      $route->setDefault('_controller', '\Drupal\facets\Controller\FacetsViewsAjaxController::ajaxView');
--    }
--  }
--
--  /**
--   * {@inheritdoc}
--   */
--  public static function getSubscribedEvents() {
--    $events[RoutingEvents::ALTER][] = ['onRouteAlter', -100];
--    return $events;
--  }
--
--}
-diff --git a/src/FacetManager/DefaultFacetManager.php b/src/FacetManager/DefaultFacetManager.php
-index 4282368..e07eefa 100644
---- a/src/FacetManager/DefaultFacetManager.php
-+++ b/src/FacetManager/DefaultFacetManager.php
-@@ -448,21 +448,6 @@ class DefaultFacetManager {
-           ],
-         ];
-       }
--      else {
--        // If the facet has no results, but it is being rendered trough AJAX it
--        // should render an empty container. This is because the JavaScript
--        // needs to be able to find a div to replace with the new content.
--        return [
--          [
--            0 => $build,
--            '#type' => 'container',
--            '#attributes' => [
--              'data-drupal-facet-id' => $built_facet->id(),
--              'class' => ['facet-empty', 'facet-hidden'],
--            ],
--          ],
--        ];
--      }
-     }
-
-     return [$build];
-diff --git a/src/Plugin/Block/FacetBlock.php b/src/Plugin/Block/FacetBlock.php
-index 63c1c8e..5f561a2 100644
---- a/src/Plugin/Block/FacetBlock.php
-+++ b/src/Plugin/Block/FacetBlock.php
-@@ -93,11 +93,6 @@ class FacetBlock extends BlockBase implements ContainerFactoryPluginInterface {
-     if (!empty($build)) {
-       CacheableMetadata::createFromObject($this)->applyTo($build);
-
--      // Add extra elements from facet source, for example, ajax scripts.
--      // @see Drupal\facets\Plugin\facets\facet_source\SearchApiDisplay
--      /** @var \Drupal\facets\FacetSource\FacetSourcePluginInterface $facet_source */
--      $facet_source = $facet->getFacetSource();
--
-       // Add contextual links only when we have results.
-       $build['#contextual_links']['facets_facet'] = [
-         'route_parameters' => ['facets_facet' => $facet->id()],
-diff --git a/src/Plugin/better_exposed_filters/filter/Facets.php b/src/Plugin/better_exposed_filters/filter/Facets.php
-deleted file mode 100644
-index 0f059e6..0000000
---- a/src/Plugin/better_exposed_filters/filter/Facets.php
-+++ /dev/null
-@@ -1,81 +0,0 @@
--<?php
--
--namespace Drupal\facets\Plugin\better_exposed_filters\filter;
--
--use Drupal\better_exposed_filters\Plugin\better_exposed_filters\filter\FilterWidgetBase;
--use Drupal\Core\Cache\CacheableMetadata;
--use Drupal\Core\Form\FormStateInterface;
--
--/**
-- * Default widget implementation.
-- *
-- * @BetterExposedFiltersFilterWidget(
-- *   id = "facets",
-- *   label = @Translation("Facets"),
-- * )
-- */
--class Facets extends FilterWidgetBase {
--
--  /**
--   * {@inheritdoc}
--   */
--  public function exposedFormAlter(array &$form, FormStateInterface $form_state) {
--    if ($form_state->facets_not_built ?? FALSE) {
--      return;
--    }
--
--    $field_id = $this->getExposedFilterFieldId();
--    if (!empty($form[$field_id]) && !empty($form[$field_id]['#content'])) {
--      $metadata = new CacheableMetadata();
--      if (isset($form['#cache'])) {
--        $metadata = CacheableMetadata::createFromRenderArray($form);
--      }
--
--      foreach ($form[$field_id]['#content'] as &$facet_content) {
--        /** @var \Drupal\facets\FacetInterface $facet */
--        $facet = $facet_content['content'][0]['#facet'] ?? NULL;
--        if (!$facet) {
--          continue;
--        }
--
--        switch ($facet->getWidgetInstance()->getPluginId()) {
--          case 'array':
--            // Not supported here.
--            break;
--
--          case 'checkbox':
--          case 'dropdown':
--          case 'links':
--          default:
--            parent::exposedFormAlter($form, $form_state);
--
--            /** @var \Drupal\views\Plugin\views\filter\FilterPluginBase $filter */
--            $filter = $this->handler;
--
--            if ($filter->view->ajaxEnabled() || $filter->view->display_handler->ajaxEnabled()) {
--              array_walk_recursive( $facet_content, function(&$value, $key) {
--                if ($key === 'data-drupal-facet-ajax') {
--                  $value = '1';
--                }
--              });
--            }
--
--            $metadata = $metadata->merge(CacheableMetadata::createFromRenderArray($facet_content));
--
--            break;
--        }
--      }
--      unset($facet_content);
--
--      $metadata->applyTo($form);
--    }
--  }
--
--  public static function isApplicable($filter = NULL, array $filter_options = []) {
--    $is_applicable = parent::isApplicable($filter, $filter_options);
--    if (is_a($filter, 'Drupal\facets\Plugin\views\filter\FacetsFilter')) {
--      $is_applicable = TRUE;
--    }
--    return $is_applicable;
--  }
--}
-diff --git a/src/Plugin/facets/processor/BooleanItemProcessor.php b/src/Plugin/facets/processor/BooleanItemProcessor.php
-index 070d39f..f9c0c2c 100644
---- a/src/Plugin/facets/processor/BooleanItemProcessor.php
-+++ b/src/Plugin/facets/processor/BooleanItemProcessor.php
-@@ -62,7 +62,7 @@ class BooleanItemProcessor extends ProcessorPluginBase implements BuildProcessor
-       '#title' => $this->t('On value'),
-       '#type' => 'textfield',
-       '#default_value' => $config['on_value'],
--      '#description' => $this->t('Use this label instead of <em>0</em> for the <em>On</em> or <em>True</em> value. Leave empty to hide this item.'),
-+      '#description' => $this->t('Use this label instead of <em>1</em> for the <em>On</em> or <em>True</em> value. Leave empty to hide this item.'),
-       '#states' => [
-         'required' => ['input[name="facet_settings[boolean_item][settings][off_value]"' => ['empty' => TRUE]],
-       ],
-@@ -72,7 +72,7 @@ class BooleanItemProcessor extends ProcessorPluginBase implements BuildProcessor
-       '#title' => $this->t('Off value'),
-       '#type' => 'textfield',
-       '#default_value' => $config['off_value'],
--      '#description' => $this->t('Use this label instead of <em>1</em> for the <em>Off</em> or <em>False</em> value. Leave empty to hide this item.'),
-+      '#description' => $this->t('Use this label instead of <em>0</em> for the <em>Off</em> or <em>False</em> value. Leave empty to hide this item.'),
-       '#states' => [
-         'required' => ['input[name="facet_settings[boolean_item][settings][on_value]"' => ['empty' => TRUE]],
-       ],
-diff --git a/src/Plugin/facets/processor/DisplayValueWidgetOrderProcessor.php b/src/Plugin/facets/processor/DisplayValueWidgetOrderProcessor.php
-index c148580..f92f46c 100644
---- a/src/Plugin/facets/processor/DisplayValueWidgetOrderProcessor.php
-+++ b/src/Plugin/facets/processor/DisplayValueWidgetOrderProcessor.php
-@@ -68,18 +68,18 @@ class DisplayValueWidgetOrderProcessor extends SortProcessorPluginBase implement
-    */
-   public function sortResults(Result $a, Result $b) {
-     // Get the transliterate values only once.
--    if (!isset($a->transliterateDisplayValue)) {
--      $a->transliterateDisplayValue = $this->transliteration->removeDiacritics($a->getDisplayValue());
-+    if (!$a->get('transliterateDisplayValue')) {
-+      $a->set('transliterateDisplayValue', $this->transliteration->removeDiacritics($a->getDisplayValue()));
-     }
--    if (!isset($b->transliterateDisplayValue)) {
--      $b->transliterateDisplayValue = $this->transliteration->removeDiacritics($b->getDisplayValue());
-+    if (!$b->get('transliterateDisplayValue')) {
-+      $b->set('transliterateDisplayValue', $this->transliteration->removeDiacritics($b->getDisplayValue()));
-     }
-
-     // Return the sort value.
--    if ($a->transliterateDisplayValue == $b->transliterateDisplayValue) {
-+    if ($a->get('transliterateDisplayValue') == $b->get('transliterateDisplayValue')) {
-       return 0;
-     }
--    return strnatcasecmp($a->transliterateDisplayValue, $b->transliterateDisplayValue);
-+    return strnatcasecmp($a->get('transliterateDisplayValue'), $b->get('transliterateDisplayValue'));
-   }
-
- }
-diff --git a/src/Plugin/facets/processor/HideNonNarrowingResultProcessor.php b/src/Plugin/facets/processor/HideNonNarrowingResultProcessor.php
-index 010a737..25fef5f 100644
---- a/src/Plugin/facets/processor/HideNonNarrowingResultProcessor.php
-+++ b/src/Plugin/facets/processor/HideNonNarrowingResultProcessor.php
-@@ -27,16 +27,34 @@ class HideNonNarrowingResultProcessor extends ProcessorPluginBase implements Bui
-    * {@inheritdoc}
-    */
-   public function build(FacetInterface $facet, array $results) {
--    $facet_results = $facet->getResults();
--    $result_count = 0;
--    foreach ($facet_results as $result) {
--      if ($result->isActive()) {
--        $result_count += $result->getCount();
-+    $facetSource = $facet->getFacetSource();
-+
-+    if ($facetSource) {
-+      $result_count = $facetSource->getCount();
-+    }
-+    else {
-+      // @todo Backward compatibility, should be removed!
-+      $facet_results = $facet->getResults();
-+      $result_count = 0;
-+      foreach ($facet_results as $result) {
-+        if ($result->isActive()) {
-+          $result_count += $result->getCount();
-+        }
-       }
-     }
-
-     /** @var \Drupal\facets\Result\ResultInterface $result */
-     foreach ($results as $id => $result) {
-+      $children_results = $result->getChildren();
-+
-+      if ($children_results) {
-+        $reduced_children_results = $this->build($facet, $children_results);
-+        $result->setChildren($reduced_children_results);
-+        if ($reduced_children_results) {
-+          continue;
-+        }
-+      }
-+
-       if ((($result->getCount() == $result_count) || ($result->getCount() == 0)) && !$result->isActive() && !$result->hasActiveChildren()) {
-         unset($results[$id]);
-       }
-diff --git a/src/Plugin/facets/processor/TermWeightWidgetOrderProcessor.php b/src/Plugin/facets/processor/TermWeightWidgetOrderProcessor.php
-index bedfb2b..3b56512 100644
---- a/src/Plugin/facets/processor/TermWeightWidgetOrderProcessor.php
-+++ b/src/Plugin/facets/processor/TermWeightWidgetOrderProcessor.php
-@@ -71,38 +71,38 @@ class TermWeightWidgetOrderProcessor extends SortProcessorPluginBase implements
-    */
-   public function sortResults(Result $a, Result $b) {
-     // Get the term weight once.
--    if (!isset($a->termWeight) || !isset($b->termWeight)) {
-+    if ($a->get('termWeight') === NULL || $b->get('termWeight') === NULL) {
-       $ids = [];
--      if (!isset($a->termWeight)) {
-+      if ($a->get('termWeight') === NULL) {
-         $a_raw = $a->getRawValue();
-         $ids[] = $a_raw;
-       }
--      if (!isset($b->termWeight)) {
-+      if ($b->get('termWeight') === NULL) {
-         $b_raw = $b->getRawValue();
-         $ids[] = $b_raw;
-       }
-       $entities = $this->entityTypeManager
-         ->getStorage('taxonomy_term')
-         ->loadMultiple($ids);
--      if (!isset($a->termWeight)) {
-+      if ($a->get('termWeight') === NULL) {
-         if (empty($entities[$a_raw])) {
-           return 0;
-         }
--        $a->termWeight = $entities[$a_raw]->getWeight();
-+        $a->set('termWeight', $entities[$a_raw]->getWeight());
-       }
--      if (!isset($b->termWeight)) {
-+      if ($b->get('termWeight') === NULL) {
-         if (empty($entities[$b_raw])) {
-           return 0;
-         }
--        $b->termWeight = $entities[$b_raw]->getWeight();
-+        $b->set('termWeight', $entities[$b_raw]->getWeight());
-       }
-     }
-
-     // Return the sort value.
--    if ($a->termWeight === $b->termWeight) {
-+    if ($a->get('termWeight') === $b->get('termWeight')) {
-       return 0;
-     }
--    return ($a->termWeight < $b->termWeight) ? -1 : 1;
-+    return ($a->get('termWeight') < $b->get('termWeight')) ? -1 : 1;
-   }
-
-   /**
-diff --git a/src/Plugin/views/FacetsViewsPluginTrait.php b/src/Plugin/views/FacetsViewsPluginTrait.php
-deleted file mode 100644
-index df61f33..0000000
---- a/src/Plugin/views/FacetsViewsPluginTrait.php
-+++ /dev/null
-@@ -1,111 +0,0 @@
--<?php
--
--namespace Drupal\facets\Plugin\views;
--
--use Drupal\Core\Block\BlockPluginInterface;
--use Drupal\Core\Cache\CacheableMetadata;
--use Drupal\Core\Form\FormStateInterface;
--
--/**
-- * Helper for the main Views plugin.
-- */
--trait FacetsViewsPluginTrait {
--
--  /**
--   * Builds the options form.
--   *
--   * @param array $form
--   *   The form array that is being added to.
--   * @param \Drupal\Core\Form\FormStateInterface $form_state
--   *   The form state object.
--   */
--  public function facetsViewsBuildOptionsForm(array &$form, FormStateInterface $form_state) {
--    $options = [];
--
--    /** @var \Drupal\facets\Entity\Facet[] $facets */
--    $facets = $this->facetStorage->loadMultiple();
--
--    $format = 'search_api:views_%s__%s__%s';
--    $source = sprintf($format, $this->view->getDisplay()->getPluginId(), $this->view->id(), $this->view->current_display);
--    foreach ($facets as $facet) {
--      if ($facet->getFacetSourceId() === $source) {
--        $options[$facet->id()] = $facet->label();
--      }
--    }
--
--    $form['facets'] = [
--      '#title' => 'Facets',
--      '#options' => $options,
--      '#type' => 'checkboxes',
--      '#required' => TRUE,
--      '#default_value' => isset($this->options['facets']) ? $this->options['facets'] : [],
--    ];
--
--    $form['label_display'] = [
--      '#type' => 'checkbox',
--      '#title' => $this->t('Display block title'),
--      '#default_value' => ($this->options['label_display'] === BlockPluginInterface::BLOCK_LABEL_VISIBLE),
--      '#return_value' => BlockPluginInterface::BLOCK_LABEL_VISIBLE,
--    ];
--  }
--
--  /**
--   * Gets the facets to render.
--   *
--   * @return array
--   *   The facet blocks to be output, in render array format.
--   */
--  public function facetsViewsGetFacets() {
--    $build = [];
--
--    /** @var \Drupal\facets\Entity\Facet[] $facets */
--    $items = [];
--    $facets = $this->facetStorage->loadMultiple(array_filter($this->options['facets']));
--    foreach ($facets as $facet) {
--      $facet_build = $this->facetManager->build($facet);
--      if (!empty($facet_build)) {
--        $item = [
--          '#theme' => 'block',
--          '#configuration' => [
--            'provider' => 'facets',
--            'label' => $facet->label(),
--            'label_display' => ($this->options['label_display'] === BlockPluginInterface::BLOCK_LABEL_VISIBLE),
--          ],
--          '#id' => $facet->id(),
--          '#plugin_id' => 'facet_block:' . $facet->id(),
--          '#base_plugin_id' => 'facet_block',
--          '#derivative_plugin_id' => $facet->id(),
--          '#weight' => $facet->getWeight(),
--          'content' => $facet_build,
--        ];
--
--        $metadata = CacheableMetadata::createFromObject($facet);
--        foreach (array_keys($this->view->getExposedInput()) as $input_key) {
--          if ($input_key) {
--            // Fulltext searches anf other exposed filters might influence a
--            // facet.
--            $metadata->addCacheContexts(['facets_filter:' . $input_key]);
--          }
--        }
--
--        $metadata->applyTo($item);
--        if  ($metadata->getCacheMaxAge() != 0) {
--          // Try to cache the rendered facet.
--          $item['#cache']['keys'] = ['facet', $facet->id()];
--        }
--
--        $items[] = $item;
--      }
--    }
--
--    if (!empty($items)) {
--      $build = [
--        '#theme' => 'facets_views_plugin',
--        '#content' => $items,
--      ];
--    }
--
--    return $build;
--  }
--
--}
-diff --git a/src/Result/Result.php b/src/Result/Result.php
-index 334dc68..40a0c2e 100644
---- a/src/Result/Result.php
-+++ b/src/Result/Result.php
-@@ -2,6 +2,7 @@
-
- namespace Drupal\facets\Result;
-
-+use Drupal\Component\Utility\NestedArray;
- use Drupal\Core\Url;
- use Drupal\facets\FacetInterface;
-
-@@ -10,6 +11,13 @@ use Drupal\facets\FacetInterface;
-  */
- class Result implements ResultInterface {
-
-+  /**
-+   * The facet transliterate display value.
-+   *
-+   * @var string
-+   */
-+  public $transliterateDisplayValue;
-+
-   /**
-    * The facet related to the result.
-    *
-@@ -73,6 +81,13 @@ class Result implements ResultInterface {
-    */
-   protected $children = [];
-
-+  /**
-+   * Storage for implementation-specific data.
-+   *
-+   * @var array
-+   */
-+  protected $storage = [];
-+
-   /**
-    * Constructs a new result value object.
-    *
-@@ -221,4 +236,34 @@ class Result implements ResultInterface {
-     return $this->facet;
-   }
-
-+  /**
-+   * {@inheritdoc}
-+   */
-+  public function getStorage() {
-+    return $this->storage;
-+  }
-+
-+  /**
-+   * {@inheritdoc}
-+   */
-+  public function setStorage(array $storage) {
-+    $this->storage = $storage;
-+    return $this;
-+  }
-+
-+  /**
-+   * {@inheritdoc}
-+   */
-+  public function get($property) {
-+    return NestedArray::getValue($this->storage, (array) $property);
-+  }
-+
-+  /**
-+   * {@inheritdoc}
-+   */
-+  public function set($property, $value) {
-+    NestedArray::setValue($this->storage, (array) $property, $value, TRUE);
-+    return $this;
-+  }
-+
- }
-diff --git a/src/Result/ResultInterface.php b/src/Result/ResultInterface.php
-index 3e23b63..36fbf18 100644
---- a/src/Result/ResultInterface.php
-+++ b/src/Result/ResultInterface.php
-@@ -145,4 +145,52 @@ interface ResultInterface {
-    */
-   public function getChildren();
-
-+  /**
-+   * Returns the entire set of arbitrary data.
-+   *
-+   * @return array
-+   *   The entire set of arbitrary data storage for this result.
-+   */
-+  public function getStorage();
-+
-+  /**
-+   * Sets the entire set of arbitrary data.
-+   *
-+   * @param array $storage
-+   *   The entire set of arbitrary data to store for this result.
-+   *
-+   * @return $this
-+   */
-+  public function setStorage(array $storage);
-+
-+  /**
-+   * Gets any arbitrary property.
-+   *
-+   * @param string|array $property
-+   *   Properties are often stored as multi-dimensional associative arrays. If
-+   *   $property is a string, it will return $storage[$property]. If $property
-+   *   is an array, each element of the array will be used as a nested key. If
-+   *   $property = ['foo', 'bar'] it will return $storage['foo']['bar'].
-+   *
-+   * @return mixed
-+   *   The property, or the default if the property does not exist.
-+   */
-+  public function get($property);
-+
-+  /**
-+   * Sets a value to an arbitrary property.
-+   *
-+   * @param string|array $property
-+   *   Properties are often stored as multi-dimensional associative arrays. If
-+   *   $property is a string, it will use $storage[$property] = $value. If
-+   *   $property is an array, each element of the array will be used as a nested
-+   *   key. If $property = ['foo', 'bar'] it will use
-+   *   $storage['foo']['bar'] = $value.
-+   * @param mixed $value
-+   *   The value to set.
-+   *
-+   * @return $this
-+   */
-+  public function set($property, $value);
-+
- }
-diff --git a/src/Widget/WidgetPluginBase.php b/src/Widget/WidgetPluginBase.php
-index 1dc23b9..0d1a9d5 100644
---- a/src/Widget/WidgetPluginBase.php
-+++ b/src/Widget/WidgetPluginBase.php
-@@ -67,7 +67,6 @@ abstract class WidgetPluginBase extends PluginBase implements WidgetPluginInterf
-         'data-drupal-facet-filter-key' => $url_processor->getFilterKey(),
-         'data-drupal-facet-id' => $facet->id(),
-         'data-drupal-facet-alias' => $facet->getUrlAlias(),
--        'data-drupal-facet-ajax' => '0',
-         'class' => [$facet->getActiveItems() ? 'facet-active' : 'facet-inactive'],
-       ],
-       '#context' => !empty($widget['type']) ? ['list_style' => $widget['type']] : [],
-@@ -197,7 +196,6 @@ abstract class WidgetPluginBase extends PluginBase implements WidgetPluginInterf
-     $items['#attributes']['data-drupal-facet-item-value'] = $result->getRawValue();
-     $items['#attributes']['data-drupal-facet-item-count'] = $result->getCount();
-     $items['#attributes']['data-drupal-facet-filter-value'] = $facet->getUrlAlias() . $url_processor->getSeparator() . $result->getRawValue();
--    $items['#attributes']['data-drupal-facet-ajax'] = '0';
-
-     if ($facet->getShowOnlyOneResult()) {
-       $items['#attributes']['data-drupal-facet-single-selection-group'] = Html::getClass($facet->getUrlAlias());
-diff --git a/tests/src/Functional/FacetsUrlGeneratorTest.php b/tests/src/Functional/FacetsUrlGeneratorTest.php
-index 3b1ac62..a29b13e 100644
---- a/tests/src/Functional/FacetsUrlGeneratorTest.php
-+++ b/tests/src/Functional/FacetsUrlGeneratorTest.php
-@@ -64,7 +64,7 @@ class FacetsUrlGeneratorTest extends FacetsTestBase {
-
-     $url = $this->urlGenerator->getUrl(['test_facet' => ['fuzzy']]);
-
--    $this->assertEquals('route:view.search_api_test_view.page_1;arg_0&arg_1&arg_2?f%5B0%5D=owl%3Afuzzy', $url->toUriString());
-+    $this->assertEquals('route:view.search_api_test_view.page_1;arg_0&arg_1&arg_2&view_id=search_api_test_view&display_id=page_1?f%5B0%5D=owl%3Afuzzy', $url->toUriString());
-
-     // Setup search page URL with contextual parameters as current request and
-     // path.
-@@ -76,7 +76,7 @@ class FacetsUrlGeneratorTest extends FacetsTestBase {
-     \Drupal::service('path.current')->setPath($path);
-     $url = $this->urlGenerator->getUrl(['test_facet' => ['fuzzy']]);
-
--    $this->assertEquals('route:view.search_api_test_view.page_1;arg_0=entity%3Aentity_test_mulrev_changed&arg_1=entity_test_mulrev_changed&arg_2?f%5B0%5D=owl%3Afuzzy', $url->toUriString());
-+    $this->assertEquals('route:view.search_api_test_view.page_1;arg_0=entity%3Aentity_test_mulrev_changed&arg_1=entity_test_mulrev_changed&arg_2&view_id=search_api_test_view&display_id=page_1?f%5B0%5D=owl%3Afuzzy', $url->toUriString());
-     \Drupal::requestStack()->pop();
-   }
-
-@@ -93,7 +93,7 @@ class FacetsUrlGeneratorTest extends FacetsTestBase {
-     $facet->save();
-
-     $url = $this->urlGenerator->getUrl(['owl' => ['foo']]);
--    $this->assertEquals('route:view.search_api_test_view.page_1;arg_0&arg_1&arg_2?f%5B0%5D=donkey%3Afoo', $url->toUriString());
-+    $this->assertEquals('route:view.search_api_test_view.page_1;arg_0&arg_1&arg_2&view_id=search_api_test_view&display_id=page_1?f%5B0%5D=donkey%3Afoo', $url->toUriString());
-
-     // This won't work without it being in the request, so we need to do this
-     // from a block. We first click the link, check that the "orange" facet is
-diff --git a/tests/src/FunctionalJavascript/AjaxBehaviorTest.php b/tests/src/FunctionalJavascript/AjaxBehaviorTest.php
-index 3a638c1..cd5a53a 100644
---- a/tests/src/FunctionalJavascript/AjaxBehaviorTest.php
-+++ b/tests/src/FunctionalJavascript/AjaxBehaviorTest.php
-@@ -24,163 +24,6 @@ class AjaxBehaviorTest extends JsBase {
-     $view->save();
-   }
-
--  /**
--   * Tests ajax links.
--   */
--  public function testAjaxLinks() {
--    // Create facets.
--    $this->createFacet('owl');
--    $this->createFacet('duck', 'keywords');
--
--    // Go to the views page.
--    $this->drupalGet('search-api-test-fulltext');
--
--    // Make sure the blocks are shown on the page.
--    $page = $this->getSession()->getPage();
--    $block_owl = $page->findById('block-owl-block');
--    $block_owl->isVisible();
--    $block_duck = $page->findById('block-duck-block');
--    $block_duck->isVisible();
--    $this->assertSession()->pageTextContains('Displaying 5 search results');
--
--    // Check that the article link exists (and is formatted like a facet) link.
--    $links = $this->xpath('//a//span[normalize-space(text())=:label]', [':label' => 'article']);
--    $this->assertNotEmpty($links);
--
--    // Click the item facets.
--    $owl_link = $this->assertSession()->elementExists("xpath", "//label[@for='owl-item']/span[1]");
--    $owl_link->click();
--
--    $this->assertSession()->assertWaitOnAjaxRequest();
--    $this->assertSession()->pageTextContains('Displaying 3 search results');
--
--    // Check that the article facet is now gone.
--    $links = $this->xpath('//a//span[normalize-space(text())=:label]', [':label' => 'article']);
--    $this->assertEmpty($links);
--
--    // Click the item facet again, and check that the article facet is back.
--    $owl_link->click();
--    $this->assertSession()->assertWaitOnAjaxRequest();
--    $this->assertSession()->pageTextContains('Displaying 5 search results');
--    $links = $this->xpath('//a//span[normalize-space(text())=:label]', [':label' => 'article']);
--    $this->assertNotEmpty($links);
--
--    // Check that the strawberry link disappears when filtering on items.
--    $links = $this->xpath('//a//span[normalize-space(text())=:label]', [':label' => 'strawberry']);
--    $this->assertNotEmpty($links);
--
--    $owl_link->click();
--    $this->assertSession()->assertWaitOnAjaxRequest();
--    $links = $this->xpath('//a//span[normalize-space(text())=:label]', [':label' => 'strawberry']);
--    $this->assertEmpty($links);
--  }
--
--  /**
--   * Tests ajax dropdown.
--   */
--  public function testAjaxDropdown() {
--    // Create facets.
--    $this->createFacet('owl');
--    $this->createFacet('duck', 'category', 'dropdown', []);
--
--    // Go to the views page.
--    $this->drupalGet('search-api-test-fulltext');
--
--    // Make sure the blocks are shown on the page.
--    $page = $this->getSession()->getPage();
--    $block_owl = $page->findById('block-owl-block');
--    $block_owl->isVisible();
--    $block_duck = $page->findById('block-duck-block');
--    $block_duck->isVisible();
--    $this->assertSession()->pageTextContains('Displaying 5 search results');
--
--    // Check that the article_category option disappears when filtering on item.
--    $dropdown_entry = $this->xpath('//*[@id="block-duck-block"]/div/select/option[normalize-space(text())=:label]', [':label' => 'article_category']);
--    $this->assertNotEmpty($dropdown_entry);
--    $owl_link = $this->assertSession()->elementExists("xpath", "//label[@for='owl-item']/span[1]");
--    $owl_link->click();
--    $this->assertSession()->assertWaitOnAjaxRequest();
--    $dropdown_entry = $this->xpath('//*[@id="block-duck-block"]/div/select/option[normalize-space(text())=:label]', [':label' => 'article_category']);
--    $this->assertEmpty($dropdown_entry);
--
--    // Click the item facet again.
--    $owl_link->click();
--    $this->assertSession()->assertWaitOnAjaxRequest();
--
--    // Select the article_category in the dropdown.
--    $dropdown = $this->xpath('//*[@id="block-duck-block"]/div/select');
--    $dropdown[0]->selectOption('article_category');
--    $this->assertSession()->assertWaitOnAjaxRequest();
--
--    $this->assertSession()->pageTextContains('Displaying 2 search results');
--
--    // Check that the article link exists (and is formatted like a facet) link.
--    $links = $this->xpath('//a//span[normalize-space(text())=:label]', [':label' => 'article']);
--    $this->assertNotEmpty($links);
--    // Check that the item link didn't exists.
--    $links = $this->xpath('//a//span[normalize-space(text())=:label]', [':label' => 'item']);
--    $this->assertEmpty($links);
--  }
--
--  /**
--   * Tests ajax checkbox.
--   */
--  public function testAjaxCheckbox() {
--    // Create facets.
--    $this->createFacet('owl');
--    $this->createFacet('duck', 'keywords', 'checkbox');
--
--    // Go to the views page.
--    $this->drupalGet('search-api-test-fulltext');
--
--    // Make sure the blocks are shown on the page.
--    $page = $this->getSession()->getPage();
--    $block_owl = $page->findById('block-owl-block');
--    $block_owl->isVisible();
--    $block_duck = $page->findById('block-duck-block');
--    $block_duck->isVisible();
--    $this->assertSession()->pageTextContains('Displaying 5 search results');
--
--    // Check that the article link exists (and is formatted like a facet) link.
--    $links = $this->xpath('//a//span[normalize-space(text())=:label]', [':label' => 'article']);
--    $this->assertNotEmpty($links);
--
--    // Click the item facet.
--    $owl_link = $this->assertSession()->elementExists("xpath", "//label[@for='owl-item']/span[1]");
--    $owl_link->click();
--
--    $this->assertSession()->assertWaitOnAjaxRequest();
--    $this->assertSession()->pageTextContains('Displaying 3 search results');
--
--    // Check that the article facet is now gone.
--    $links = $this->xpath('//a//span[normalize-space(text())=:label]', [':label' => 'article']);
--    $this->assertEmpty($links);
--
--    // Click the item facet again, and check that the article facet is back.
--    $owl_link->click();
--    $this->assertSession()->assertWaitOnAjaxRequest();
--    $this->assertSession()->pageTextContains('Displaying 5 search results');
--    $links = $this->xpath('//a//span[normalize-space(text())=:label]', [':label' => 'article']);
--    $this->assertNotEmpty($links);
--
--    // Check that the strawberry link disappears when filtering on items.
--    $links = $this->xpath('//a//span[normalize-space(text())=:label]', [':label' => 'strawberry']);
--    $this->assertNotEmpty($links);
--    $owl_link->click();
--    $this->assertSession()->assertWaitOnAjaxRequest();
--    $links = $this->xpath('//a//span[normalize-space(text())=:label]', [':label' => 'strawberry']);
--    $this->assertEmpty($links);
--    $owl_link->click();
--
--    $this->getSession()->getPage()->checkField('strawberry');
--    // Check that the article link exists (and is formatted like a facet) link.
--    $links = $this->xpath('//a//span[normalize-space(text())=:label]', [':label' => 'article']);
--    $this->assertNotEmpty($links);
--    // Check that the item link didn't exists.
--    $links = $this->xpath('//a//span[normalize-space(text())=:label]', [':label' => 'item']);
--    $this->assertEmpty($links);
--  }
--
-   /**
-    * Tests links with exposed filters.
-    */
-diff --git a/tests/src/Kernel/FacetManager/DefaultFacetManagerTest.php b/tests/src/Kernel/FacetManager/DefaultFacetManagerTest.php
-index 878da30..183c6fa 100644
---- a/tests/src/Kernel/FacetManager/DefaultFacetManagerTest.php
-+++ b/tests/src/Kernel/FacetManager/DefaultFacetManagerTest.php
-@@ -336,6 +336,7 @@ class DefaultFacetManagerTest extends EntityKernelTestBase {
-         // Added by views view source plugin.
-         'config:views.view.search_api_test_view',
-         'config:search_api.index.database_search_index',
-+        'search_api_list:database_search_index',
-       ],
-     ];
-     return [
-@@ -348,15 +349,7 @@ class DefaultFacetManagerTest extends EntityKernelTestBase {
-       // strategy.
-       [
-         'search_api:views_page__search_api_test_view__page_2_sapi_tag',
--        array_merge_recursive(
--          $basic,
--          [
--            'tags' => [
--              'search_api_list:database_search_index',
--            ],
--            'max-age' => Cache::PERMANENT,
--          ]
--        ),
-+        $basic + ['max-age' => Cache::PERMANENT],
-       ],
-       // Expected cacheability for the facet with a source that has TIME cache
-       // strategy.
-diff --git a/tests/src/Unit/Result/ResultTest.php b/tests/src/Unit/Result/ResultTest.php
-index b70c844..e52c955 100644
---- a/tests/src/Unit/Result/ResultTest.php
-+++ b/tests/src/Unit/Result/ResultTest.php
-@@ -43,6 +43,15 @@ class ResultTest extends UnitTestCase {
-     $url = new Url('foo');
-     $result->setUrl($url);
-     $this->assertSame($url, $result->getUrl());
-+
-+    $property = ['foo', 'bar'];
-+    $value = 'baz';
-+    $result->set($property, $value);
-+    $this->assertSame($value, $result->get($property));
-+
-+    $storage = ['foo' => ['bar']];
-+    $result->setStorage($storage);
-+    $this->assertSame($storage, $result->getStorage());
-   }
-
- }
diff --git a/resources/patch/php/drupal/facets/3459093.patch b/resources/patch/php/drupal/facets/3459093.patch
deleted file mode 100644
index 3e2a8db3fe..0000000000
--- a/resources/patch/php/drupal/facets/3459093.patch
+++ /dev/null
@@ -1,26 +0,0 @@
-diff --git a/config/schema/facets.processor.schema.yml b/config/schema/facets.processor.schema.yml
-index 7154952fbac82c9b61dec65dc10f31ecfcb98479..045106e1de94b452ebd8f4aadce39b3a7bdfd998 100644
---- a/config/schema/facets.processor.schema.yml
-+++ b/config/schema/facets.processor.schema.yml
-@@ -1,5 +1,5 @@
- plugin.plugin_configuration.facets_processor.*:
--  type: config_object
-+  type: mapping
- 
- plugin.plugin_configuration.facets_processor.count_widget_widget_order:
-   type: mapping
-diff --git a/modules/facets_summary/config/schema/facets_summary.processor.schema.yml b/modules/facets_summary/config/schema/facets_summary.processor.schema.yml
-index 13ef5949fbe6d3072f1e63610e8da7030faa0eb9..83a2009b79c951e7eaa774a2c8c410443e87c931 100644
---- a/modules/facets_summary/config/schema/facets_summary.processor.schema.yml
-+++ b/modules/facets_summary/config/schema/facets_summary.processor.schema.yml
-@@ -1,8 +1,8 @@
- plugin.plugin_configuration.facets_summary_processor.show_summary:
--  type: config_object
-+  type: mapping
- 
- plugin.plugin_configuration.facets_summary_processor.show_count:
--  type: config_object
-+  type: mapping
- 
- plugin.plugin_configuration.facets_summary_processor.show_text_when_empty:
-   type: mapping
diff --git a/resources/patch/php/drupal/facets/sa-contrib-2024-047.patch b/resources/patch/php/drupal/facets/sa-contrib-2024-047.patch
deleted file mode 100644
index 8c0788d3c2..0000000000
--- a/resources/patch/php/drupal/facets/sa-contrib-2024-047.patch
+++ /dev/null
@@ -1,39 +0,0 @@
-From 718741fc321f7e2eef486c8233b4ea604149ce80 Mon Sep 17 00:00:00 2001
-From: Jimmy Henderickx <jimmyhdx@gmail.com>
-Date: Wed, 9 Oct 2024 09:23:41 +0200
-Subject: [PATCH] Facets Summary refactor
-
----
- .../FacetsSummaryManager/DefaultFacetsSummaryManager.php | 9 +++++++++
- 1 file changed, 9 insertions(+)
-
-diff --git a/modules/facets_summary/src/FacetsSummaryManager/DefaultFacetsSummaryManager.php b/modules/facets_summary/src/FacetsSummaryManager/DefaultFacetsSummaryManager.php
-index bfb236cb..13408b96 100644
---- a/modules/facets_summary/src/FacetsSummaryManager/DefaultFacetsSummaryManager.php
-+++ b/modules/facets_summary/src/FacetsSummaryManager/DefaultFacetsSummaryManager.php
-@@ -12,6 +12,7 @@ use Drupal\facets_summary\Processor\BuildProcessorInterface;
- use Drupal\facets_summary\Processor\ProcessorInterface;
- use Drupal\facets_summary\Processor\ProcessorPluginManager;
- use Drupal\facets_summary\FacetsSummaryInterface;
-+use Drupal\Component\Utility\Xss;
- 
- /**
-  * The facet summary manager.
-@@ -156,6 +157,14 @@ class DefaultFacetsSummaryManager {
-       $build = $processor->build($facets_summary, $build, $facets);
-     }
- 
-+    if (isset($build["#items"])) {
-+      foreach ($build["#items"] as &$item) {
-+        if (isset($item["#title"]) and is_string($item["#title"])) {
-+          $item["#title"] = Xss::filter($item["#title"]);
-+        }
-+      }
-+    }
-+
-     return $build;
-   }
- 
--- 
-GitLab
-
-- 
GitLab


From fe493a643044d25f1d5be7a984b94635a662caa6 Mon Sep 17 00:00:00 2001
From: Zoltan Horvath <zoltan.horvath@ext.ec.europa.eu>
Date: Fri, 20 Dec 2024 10:58:23 +0100
Subject: [PATCH 078/137] ISAICP-9310: Prepare update to drupal/svg_image 3.2.0
 - remove patches of resolved issues

---
 composer.json                                 |   3 +-
 .../patch/php/drupal/svg_image/3275057.patch  | 264 ------------------
 2 files changed, 1 insertion(+), 266 deletions(-)
 delete mode 100644 resources/patch/php/drupal/svg_image/3275057.patch

diff --git a/composer.json b/composer.json
index 4ba65a69ec..8260acf6c1 100644
--- a/composer.json
+++ b/composer.json
@@ -445,8 +445,7 @@
                 "Do not force default state in options. @see https://www.drupal.org/project/state_machine/issues/2746091": "resources/patch/php/drupal/state_machine/2746091.diff"
             },
             "drupal/svg_image": {
-                "SVG is not valid or cannot be sanitized, return an error. @see https://www.drupal.org/i/3350696": "resources/patch/php/drupal/svg_image/3350696.patch",
-                "The 'image_loading' attribute is not respected - https://www.drupal.org/project/svg_image/issues/3275057": "resources/patch/php/drupal/svg_image/3275057.patch"
+                "SVG is not valid or cannot be sanitized, return an error. @see https://www.drupal.org/i/3350696": "resources/patch/php/drupal/svg_image/3350696.patch"
             },
             "drupal/stage_file_proxy": {
                 "Fetching does not respect use_imagecache_root when using converted webp image styles @see https://www.drupal.org/i/3402972": "resources/patch/php/drupal/stage_file_proxy/stage_file_proxy-3402972-MR-28f616d8--without-method.diff"
diff --git a/resources/patch/php/drupal/svg_image/3275057.patch b/resources/patch/php/drupal/svg_image/3275057.patch
deleted file mode 100644
index 951d7e8dfb..0000000000
--- a/resources/patch/php/drupal/svg_image/3275057.patch
+++ /dev/null
@@ -1,264 +0,0 @@
-diff --git a/modules/svg_image_responsive/src/Plugin/Field/FieldFormatter/SvgResponsiveImageFormatter.php b/modules/svg_image_responsive/src/Plugin/Field/FieldFormatter/SvgResponsiveImageFormatter.php
-index 56771e55f5b8c58c298cbff2daafe08113fd8523..ac0bda9e6aabb4f29159aea167464367003612a4 100755
---- a/modules/svg_image_responsive/src/Plugin/Field/FieldFormatter/SvgResponsiveImageFormatter.php
-+++ b/modules/svg_image_responsive/src/Plugin/Field/FieldFormatter/SvgResponsiveImageFormatter.php
-@@ -59,95 +59,26 @@ class SvgResponsiveImageFormatter extends ResponsiveImageFormatter {
-    * {@inheritdoc}
-    */
-   public function viewElements(FieldItemListInterface $items, $langcode) {
--    $elements = [];
--    /** @var \Drupal\file\Entity\File[] $files */
--    $files = $this->getEntitiesToView($items, $langcode);
--
--    // Early opt-out if the field is empty.
--    if (empty($files)) {
-+    $elements = parent::viewElements($items, $langcode);
-+    if (empty($elements)) {
-       return $elements;
-     }
--
--    $url = NULL;
--    $imageLinkSetting = $this->getSetting('image_link');
--    // Check if the formatter involves a link.
--    if ($imageLinkSetting === 'content') {
--      $entity = $items->getEntity();
--      if (!$entity->isNew()) {
--        $url = $entity->toUrl();
--      }
--    }
--    elseif ($imageLinkSetting === 'file') {
--      $linkFile = TRUE;
--    }
--
--    // Collect cache tags to be added for each item in the field.
--    $responsiveImageStyle = $this->responsiveImageStyleStorage->load($this->getSetting('responsive_image_style'));
--    $imageStylesToLoad = [];
--    $cacheTags = [];
--    if ($responsiveImageStyle) {
--      $cacheTags = Cache::mergeTags($cacheTags, $responsiveImageStyle->getCacheTags());
--      $imageStylesToLoad = $responsiveImageStyle->getImageStyleIds();
--    }
--
--    $imageStyles = $this->imageStyleStorage->loadMultiple($imageStylesToLoad);
--    foreach ($imageStyles as $image_style) {
--      $cacheTags = Cache::mergeTags($cacheTags, $image_style->getCacheTags());
--    }
--
-+    /** @var \Drupal\file\Entity\File[] $files */
-+    $files = $this->getEntitiesToView($items, $langcode);
-     $svgAttributes = $this->getSetting('svg_attributes');
-+    $svgRenderAsImage = $this->getSetting('svg_render_as_image');
-+
-     foreach ($files as $delta => $file) {
--      $attributes = [];
-       $isSvg = svg_image_is_file_svg($file);
--
--      if ($isSvg) {
--        $attributes = $svgAttributes;
--      }
--
--      $cacheContexts = [];
--      if (isset($linkFile)) {
--        $imageUri = $file->getFileUri();
--        $url = $this->fileUrlGenerator->generate($imageUri);
--        $cacheContexts[] = 'url.site';
--      }
--      $cacheTags = Cache::mergeTags($cacheTags, $file->getCacheTags());
--
--      // Link the <picture> element to the original file.
--      if (isset($linkFile)) {
--        $url = $this->fileUrlGenerator->generateString($file->getFileUri());
--      }
--      // Extract field item attributes for the theme function, and unset them
--      // from the $item so that the field template does not re-render them.
--      $item = $file->_referringItem;
--      if (isset($item->_attributes)) {
--        $attributes += $item->_attributes;
--      }
--      unset($item->_attributes);
--
-       if (!$isSvg) {
--        $elements[$delta] = [
--          '#theme' => 'responsive_image_formatter',
--          '#item' => $item,
--          '#item_attributes' => $attributes,
--          '#responsive_image_style_id' => $responsiveImageStyle ? $responsiveImageStyle->id() : '',
--          '#url' => $url,
--          '#cache' => [
--            'tags' => $cacheTags,
--          ],
--        ];
-+        continue;
-       }
--      elseif ($this->getSetting('svg_render_as_image')) {
--        $elements[$delta] = [
--          '#theme' => 'image_formatter',
--          '#item' => $item,
--          '#item_attributes' => $attributes,
--          '#image_style' => NULL,
--          '#url' => $url,
--          '#cache' => [
--            'tags' => $cacheTags,
--            'contexts' => $cacheContexts,
--          ],
--        ];
-+
-+      if ($svgRenderAsImage) {
-+        $elements[$delta]['#theme'] = 'image_formatter';
-+        $elements[$delta]['#image_style'] = NULL;
-+        $elements[$delta]['#item_attributes'] += $svgAttributes;
-+        unset($elements[$delta]['#responsive_image_style_id']);
-       }
-       else {
-         // Render as SVG tag.
-@@ -156,13 +87,20 @@ class SvgResponsiveImageFormatter extends ResponsiveImageFormatter {
-           $svgRaw = str_replace('<?xml version="1.0" encoding="UTF-8"?>', '', $svgRaw);
-           $svgRaw = trim($svgRaw);
- 
--          $elements[$delta] = [
--            '#markup' => Markup::create($svgRaw),
--            '#cache' => [
--              'tags' => $cacheTags,
--              'contexts' => $cacheContexts,
--            ],
--          ];
-+          if (isset($elements[$delta]['#url'])) {
-+            $elements[$delta] = [
-+              '#type' => 'link',
-+              '#title' => Markup::create($svgRaw),
-+              '#cache' => $elements[$delta]['#cache'],
-+              '#url' => $elements[$delta]['#url'],
-+            ];
-+          }
-+          else {
-+            $elements[$delta] = [
-+              '#markup' => Markup::create($svgRaw),
-+              '#cache' => $elements[$delta]['#cache'],
-+            ];
-+          }
-         }
-       }
-     }
-diff --git a/src/Plugin/Field/FieldFormatter/SvgImageFormatter.php b/src/Plugin/Field/FieldFormatter/SvgImageFormatter.php
-index c56bf989ffc1cde3fa396ed4889c9f5375ca2f54..501b3e6849de173c4196b40d3fd6fa0f6f0ab2b0 100755
---- a/src/Plugin/Field/FieldFormatter/SvgImageFormatter.php
-+++ b/src/Plugin/Field/FieldFormatter/SvgImageFormatter.php
-@@ -55,74 +55,23 @@ class SvgImageFormatter extends ImageFormatter {
-    * {@inheritdoc}
-    */
-   public function viewElements(FieldItemListInterface $items, $langcode) {
--    $elements = [];
--    /** @var \Drupal\file\Entity\File[] $files */
--    $files = $this->getEntitiesToView($items, $langcode);
--
--    // Early opt-out if the field is empty.
--    if (empty($files)) {
-+    $elements = parent::viewElements($items, $langcode);
-+    if (empty($elements)) {
-       return $elements;
-     }
--
--    $url = NULL;
--    $imageLinkSetting = $this->getSetting('image_link');
--    // Check if the formatter involves a link.
--    if ($imageLinkSetting === 'content') {
--      $entity = $items->getEntity();
--      if (!$entity->isNew()) {
--        $url = $entity->toUrl();
--      }
--    }
--    elseif ($imageLinkSetting === 'file') {
--      $linkFile = TRUE;
--    }
--
--    $imageStyleSetting = $this->getSetting('image_style');
--
--    // Collect cache tags to be added for each item in the field.
--    $cacheTags = [];
--    if (!empty($imageStyleSetting)) {
--      $imageStyle = $this->imageStyleStorage->load($imageStyleSetting);
--      $cacheTags = $imageStyle ? $imageStyle->getCacheTags() : [];
--    }
-+    $svgRenderAsImage = $this->getSetting('svg_render_as_image');
-+    /** @var \Drupal\file\Entity\File[] $files */
-+    $files = $this->getEntitiesToView($items, $langcode);
- 
-     $svgAttributes = $this->getSetting('svg_attributes');
-     foreach ($files as $delta => $file) {
--      $attributes = [];
-       $isSvg = svg_image_is_file_svg($file);
--
--      if ($isSvg) {
--        $attributes = $svgAttributes;
--      }
--
--      if (isset($linkFile)) {
--        $imageUri = $file->getFileUri();
--        $url = $this->fileUrlGenerator->generate($imageUri);
-+      if (!$isSvg) {
-+        continue;
-       }
--      $cacheTags = Cache::mergeTags($cacheTags, $file->getCacheTags());
--
--      // Extract field item attributes for the theme function, and unset them
--      // from the $item so that the field template does not re-render them.
--      $item = $file->_referringItem;
--
--      if (isset($item->_attributes)) {
--        $attributes += $item->_attributes;
--      }
--
--      unset($item->_attributes);
--      $isSvg = svg_image_is_file_svg($file);
--
--      if (!$isSvg || $this->getSetting('svg_render_as_image')) {
--        $elements[$delta] = [
--          '#theme' => 'image_formatter',
--          '#item' => $item,
--          '#item_attributes' => $attributes,
--          '#image_style' => $isSvg ? NULL : $imageStyleSetting,
--          '#url' => $url,
--          '#cache' => [
--            'tags' => $cacheTags,
--          ],
--        ];
-+      if ($svgRenderAsImage) {
-+        $elements[$delta]['#image_style'] = NULL;
-+        $elements[$delta]['#item_attributes'] += $svgAttributes;
-       }
-       else {
-         // Render as SVG tag.
-@@ -130,26 +79,24 @@ class SvgImageFormatter extends ImageFormatter {
-         if ($svgRaw) {
-           $svgRaw = preg_replace(['/<\?xml.*\?>/i', '/<!DOCTYPE((.|\n|\r)*?)">/i'], '', $svgRaw);
-           $svgRaw = trim($svgRaw);
--
--          if ($url) {
-+          if (isset($elements[$delta]['#url'])) {
-             $elements[$delta] = [
-               '#type' => 'link',
--              '#url' => $url,
-               '#title' => Markup::create($svgRaw),
--              '#cache' => [
--                'tags' => $cacheTags,
--              ],
-+              '#cache' => $elements[$delta]['#cache'],
-+              '#url' => $elements[$delta]['#url'],
-             ];
-           }
-           else {
-             $elements[$delta] = [
-               '#markup' => Markup::create($svgRaw),
--              '#cache' => [
--                'tags' => $cacheTags,
--              ],
-+              '#cache' => $elements[$delta]['#cache'],
-             ];
-           }
-         }
-+        else {
-+          unset($elements[$delta]);
-+        }
-       }
-     }
- 
\ No newline at end of file
-- 
GitLab


From ce6e7c400333e7e74c61e49078fd32e5e0717887 Mon Sep 17 00:00:00 2001
From: Zoltan Horvath <zoltan.horvath@ext.ec.europa.eu>
Date: Fri, 20 Dec 2024 10:59:11 +0100
Subject: [PATCH 079/137] ISAICP-9310: Prepare update to
 drupal/tmgmt_ec_etranslation 1.1.1 - remove patches of resolved issues

---
 composer.json                                 |    4 -
 .../tmgmt_ec_etranslation/3483072.patch       |  461 -------
 .../tmgmt_ec_etranslation/3484303.patch       | 1063 -----------------
 3 files changed, 1528 deletions(-)
 delete mode 100644 resources/patch/php/drupal/tmgmt_ec_etranslation/3483072.patch
 delete mode 100644 resources/patch/php/drupal/tmgmt_ec_etranslation/3484303.patch

diff --git a/composer.json b/composer.json
index 8260acf6c1..51277ed316 100644
--- a/composer.json
+++ b/composer.json
@@ -450,10 +450,6 @@
             "drupal/stage_file_proxy": {
                 "Fetching does not respect use_imagecache_root when using converted webp image styles @see https://www.drupal.org/i/3402972": "resources/patch/php/drupal/stage_file_proxy/stage_file_proxy-3402972-MR-28f616d8--without-method.diff"
             },
-            "drupal/tmgmt_ec_etranslation": {
-                "text-to-translate has a length limit, @see https://www.drupal.org/i/3483072": "resources/patch/php/drupal/tmgmt_ec_etranslation/3483072.patch",
-                "Wrong logic for base64 text detection": "resources/patch/php/drupal/tmgmt_ec_etranslation/3484303.patch"
-            },
             "drupal/video_embed_field": {
                 "Add title attribute to YouTube, Vimeo, and Playlist embeds @see https://www.drupal.org/project/video_embed_field/issues/3200253": "resources/patch/php/drupal/video_embed_field/3200253-26.patch",
                 "Extend support for embed URLs. Option to force privacy @see https://www.drupal.org/project/video_embed_field/issues/3060201 (originally on https://www.drupal.org/node/2899093)": "resources/patch/php/drupal/video_embed_field/3060201.patch",
diff --git a/resources/patch/php/drupal/tmgmt_ec_etranslation/3483072.patch b/resources/patch/php/drupal/tmgmt_ec_etranslation/3483072.patch
deleted file mode 100644
index 5e4821079c..0000000000
--- a/resources/patch/php/drupal/tmgmt_ec_etranslation/3483072.patch
+++ /dev/null
@@ -1,461 +0,0 @@
-From 32c270d526ad5ffe5dd1042b919ee2ad3c439c5a Mon Sep 17 00:00:00 2001
-From: Adrian Lorenc <adrian.lorenc@gmail.com>
-Date: Thu, 24 Oct 2024 09:24:52 +0200
-Subject: [PATCH 01/10] Characters length limit for text-to-translate.
-
----
- .../Translator/ETranslationTranslator.php     | 32 +++++++++++++++++++
- 1 file changed, 32 insertions(+)
-
-diff --git a/src/Plugin/tmgmt/Translator/ETranslationTranslator.php b/src/Plugin/tmgmt/Translator/ETranslationTranslator.php
-index 7807365..e5aa7e5 100644
---- a/src/Plugin/tmgmt/Translator/ETranslationTranslator.php
-+++ b/src/Plugin/tmgmt/Translator/ETranslationTranslator.php
-@@ -42,6 +42,13 @@ class ETranslationTranslator extends TranslatorPluginBase implements ContainerFa
-    */
-   protected const ENDPOINT = 'https://webgate.ec.europa.eu/';
- 
-+  /**
-+   * Characters length limit for text-to-translate.
-+   *
-+   * @var integer
-+   */
-+  protected const MAX_TEXT_TO_TRANSLATE_LENGTH = 5000;
-+
-   /**
-    * A cache bin for domain info.
-    *
-@@ -197,6 +204,12 @@ class ETranslationTranslator extends TranslatorPluginBase implements ContainerFa
-             'format' => 'html',
-           ];
-         }
-+        elseif (!$this->canTextToTranslateBeUsed($field['#text'])) {
-+          $data['documentToTranslateBase64'] = [
-+            'content' => base64_encode($field['#text']),
-+            'format' => 'txt',
-+          ];
-+        }
-         else {
-           $data['textToTranslate'] = $field['#text'];
-         }
-@@ -311,9 +324,28 @@ class ETranslationTranslator extends TranslatorPluginBase implements ContainerFa
- 
-   /**
-    * Checks if the given text is HTML.
-+   *
-+   * @param string $text
-+   *   Text to translate.
-+   *
-+   * @return bool
-+   *   TRUE if it is HTML.
-    */
-   protected function isHtml(string $text): bool {
-     return \strip_tags($text) !== $text;
-   }
- 
-+  /**
-+   * Checks if text-to-translate be used.
-+   *
-+   * @param string $text
-+   *   Text to translate.
-+   *
-+   * @return bool
-+   *   TRUE if text-to-translate can be used.
-+   */
-+  protected function canTextToTranslateBeUsed(string $text): bool {
-+    return mb_strlen($text) <= self::MAX_TEXT_TO_TRANSLATE_LENGTH;
-+  }
-+
- }
--- 
-GitLab
-
-
-From 844c02cce4178bbe88115975171e5274ef63b1da Mon Sep 17 00:00:00 2001
-From: Adrian Lorenc <adrian.lorenc@gmail.com>
-Date: Thu, 24 Oct 2024 10:08:52 +0200
-Subject: [PATCH 02/10] Use statements should be sorted alphabetically.
-
----
- tests/src/Functional/ETranslationServiceTest.php | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/tests/src/Functional/ETranslationServiceTest.php b/tests/src/Functional/ETranslationServiceTest.php
-index afee951..7e8d547 100644
---- a/tests/src/Functional/ETranslationServiceTest.php
-+++ b/tests/src/Functional/ETranslationServiceTest.php
-@@ -7,8 +7,8 @@ namespace Drupal\Tests\tmgmt_ec_etranslation\Functional;
- use Drupal\Core\Entity\EntityTypeManagerInterface;
- use Drupal\Core\Queue\QueueFactory;
- use Drupal\Core\Queue\QueueWorkerManagerInterface;
--use Drupal\Tests\tmgmt\Functional\TmgmtEntityTestTrait;
- use Drupal\Tests\tmgmt\Functional\TMGMTTestBase;
-+use Drupal\Tests\tmgmt\Functional\TmgmtEntityTestTrait;
- use Drupal\tmgmt\Entity\Translator;
- use Drupal\tmgmt\TranslatorInterface;
- use Drupal\tmgmt_ec_etranslation\Plugin\QueueWorker\TranslationQueueWorker;
--- 
-GitLab
-
-
-From 5d0eb0a29d55e3c20867593b0ef38dfa89aee2e8 Mon Sep 17 00:00:00 2001
-From: Adrian Lorenc <adrian.lorenc@gmail.com>
-Date: Thu, 24 Oct 2024 10:21:18 +0200
-Subject: [PATCH 03/10] Don't test D11 as it is not supported yet.
-
----
- .gitlab-ci.yml | 2 ++
- 1 file changed, 2 insertions(+)
-
-diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
-index 080b478..f32f8f6 100644
---- a/.gitlab-ci.yml
-+++ b/.gitlab-ci.yml
-@@ -35,3 +35,5 @@ include:
- 
- variables:
-   _CSPELL_WORDS: 'webgate'
-+  OPT_IN_TEST_CURRENT: '0'
-+  OPT_IN_TEST_PREVIOUS_MAJOR: '1'
--- 
-GitLab
-
-
-From fe707b8c4c419bbfd7153e2afcd3a835a4b54e24 Mon Sep 17 00:00:00 2001
-From: Adrian Lorenc <adrian.lorenc@gmail.com>
-Date: Thu, 24 Oct 2024 12:21:03 +0200
-Subject: [PATCH 04/10] Checks if the given text is base64 encoded.
-
----
- .../QueueWorker/TranslationQueueWorker.php    | 32 +++++++++----------
- 1 file changed, 15 insertions(+), 17 deletions(-)
-
-diff --git a/src/Plugin/QueueWorker/TranslationQueueWorker.php b/src/Plugin/QueueWorker/TranslationQueueWorker.php
-index 4e30d4a..adbd851 100644
---- a/src/Plugin/QueueWorker/TranslationQueueWorker.php
-+++ b/src/Plugin/QueueWorker/TranslationQueueWorker.php
-@@ -8,7 +8,6 @@ use Drupal\Core\Entity\EntityTypeManagerInterface;
- use Drupal\Core\Logger\LoggerChannelInterface;
- use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
- use Drupal\Core\Queue\QueueWorkerBase;
--use Drupal\tmgmt\Data;
- use Symfony\Component\DependencyInjection\ContainerInterface;
- 
- /**
-@@ -38,25 +37,16 @@ class TranslationQueueWorker extends QueueWorkerBase implements ContainerFactory
-    */
-   protected LoggerChannelInterface $logger;
- 
--  /**
--   * The tmgmt data service.
--   *
--   * @var \Drupal\tmgmt\Data
--   */
--  protected Data $tmgmtData;
--
-   public function __construct(
-     array $configuration,
-     $plugin_id,
-     $plugin_definition,
-     EntityTypeManagerInterface $entity_type_manager,
-     LoggerChannelInterface $logger,
--    Data $tmgmtData,
-   ) {
-     parent::__construct($configuration, $plugin_id, $plugin_definition);
-     $this->entityTypeManager = $entity_type_manager;
-     $this->logger = $logger;
--    $this->tmgmtData = $tmgmtData;
-   }
- 
-   /**
-@@ -74,7 +64,6 @@ class TranslationQueueWorker extends QueueWorkerBase implements ContainerFactory
-       $plugin_definition,
-       $container->get('entity_type.manager'),
-       $container->get('logger.channel.tmgmt_ec_etranslation'),
--      $container->get('tmgmt.data')
-     );
-   }
- 
-@@ -91,9 +80,7 @@ class TranslationQueueWorker extends QueueWorkerBase implements ContainerFactory
-       return;
-     }
- 
--    $translatableFields = $this->tmgmtData->filterTranslatable($jobItem->getData());
--
--    if ($this->isHtml($translatableFields[$key]['#text'])) {
-+    if ($this->isBase64Encoded($response)) {
-       $translation['#text'] = base64_decode($response);
-     }
-     else {
-@@ -111,10 +98,21 @@ class TranslationQueueWorker extends QueueWorkerBase implements ContainerFactory
-   }
- 
-   /**
--   * Checks if the given text is HTML.
-+   * Checks if the given text is base64 encoded.
-+   *
-+   * @param string $text
-+   *   Text to check.
-+   *
-+   * @return bool
-+   *   TRUE if string is base64 encoded.
-    */
--  protected function isHtml(string $text): bool {
--    return \strip_tags($text) !== $text;
-+  protected function isBase64Encoded(string $text): bool {
-+    $decoded = base64_decode($text, TRUE);
-+    if ($decoded === FALSE) {
-+      return FALSE;
-+    }
-+
-+    return base64_encode($decoded) === $text;
-   }
- 
- }
--- 
-GitLab
-
-
-From 0fcb9ff2ac335e2a13505ac5e4822e77fd95403a Mon Sep 17 00:00:00 2001
-From: Adrian Lorenc <adrian.lorenc@gmail.com>
-Date: Thu, 24 Oct 2024 12:26:18 +0200
-Subject: [PATCH 05/10] Update tests.
-
----
- .../Functional/ETranslationServiceTest.php    | 21 ++++++++++++++++++-
- tests/src/Unit/TranslationQueueWorkerTest.php | 20 +++++++-----------
- 2 files changed, 27 insertions(+), 14 deletions(-)
-
-diff --git a/tests/src/Functional/ETranslationServiceTest.php b/tests/src/Functional/ETranslationServiceTest.php
-index 7e8d547..ed2daff 100644
---- a/tests/src/Functional/ETranslationServiceTest.php
-+++ b/tests/src/Functional/ETranslationServiceTest.php
-@@ -85,12 +85,20 @@ class ETranslationServiceTest extends TMGMTTestBase {
- 
-   /**
-    * Tests basic API methods of the plugin.
-+   *
-+   * @dataProvider integrationDataProvider
-    */
--  public function testIntegration(): void {
-+  public function testIntegration(string $text): void {
-     $queue = $this->queueFactory->get(TranslationQueueWorker::ID);
-     $this->assertEquals(0, $queue->numberOfItems());
- 
-     $node = $this->createTranslatableNode('page');
-+    $node->set('body', [
-+      'value' => $text,
-+      'summary' => $this->randomMachineName(10),
-+      'format' => filter_default_format(),
-+    ])->save();
-+
-     $job = $this->createJob('en', 'de', 0, [
-       'label' => 'Continuous job',
-       'job_type' => 'continuous',
-@@ -124,4 +132,15 @@ class ETranslationServiceTest extends TMGMTTestBase {
-     $this->assertEquals(ETranslationMock::translate($body[0]['summary'], 'en', 'de'), $data['body']['0']['summary']['#translation']['#text']);
-   }
- 
-+  /**
-+   * Provider for ::testIntegration.
-+   */
-+  public function integrationDataProvider(): array {
-+    return [
-+      'Short text' => [$this->randomMachineName(10)],
-+      'Long text' => [$this->randomMachineName(5001)],
-+      'Html' => ['<strong>Lorem Ipsum</strong>' . $this->randomMachineName(10)],
-+    ];
-+  }
-+
- }
-diff --git a/tests/src/Unit/TranslationQueueWorkerTest.php b/tests/src/Unit/TranslationQueueWorkerTest.php
-index d1472cb..bef431e 100644
---- a/tests/src/Unit/TranslationQueueWorkerTest.php
-+++ b/tests/src/Unit/TranslationQueueWorkerTest.php
-@@ -57,7 +57,6 @@ class TranslationQueueWorkerTest extends TestCase {
- 
-     $this->entityTypeManager = $this->createMock(EntityTypeManagerInterface::class);
-     $this->logger = $this->createMock(LoggerChannelInterface::class);
--    $this->tmgmtData = $this->createMock(Data::class);
- 
-     $this->queueWorker = new TranslationQueueWorker(
-       [],
-@@ -65,7 +64,6 @@ class TranslationQueueWorkerTest extends TestCase {
-       [],
-       $this->entityTypeManager,
-       $this->logger,
--      $this->tmgmtData
-     );
-   }
- 
-@@ -96,13 +94,6 @@ class TranslationQueueWorkerTest extends TestCase {
-       ->with('tmgmt_job_item')
-       ->willReturn($entityStorage);
- 
--    $this->tmgmtData->expects($this->once())
--      ->method('filterTranslatable')
--      ->with($jobItem->getData())
--      ->willReturn([
--        'key' => ['#text' => '<p>HTML content</p>'],
--      ]);
--
-     $this->logger->expects($this->once())
-       ->method('notice')
-       ->with(
-@@ -126,20 +117,23 @@ class TranslationQueueWorkerTest extends TestCase {
-   }
- 
-   /**
--   * Tests the isHtml method.
-+   * Tests the isBase64 method.
-    *
--   * @covers ::isHtml
-+   * @covers ::isBase64
-    */
-   public function testIsHtml(): void {
-     $reflection = new \ReflectionClass($this->queueWorker);
--    $method = $reflection->getMethod('isHtml');
-+    $method = $reflection->getMethod('isBase64Encoded');
-     $method->setAccessible(TRUE);
- 
-     $result = $method->invokeArgs($this->queueWorker, ['<p>HTML content</p>']);
--    $this->assertTrue($result);
-+    $this->assertFALSE($result);
- 
-     $result = $method->invokeArgs($this->queueWorker, ['Plain text content']);
-     $this->assertFalse($result);
-+
-+    $result = $method->invokeArgs($this->queueWorker, ['UGxhaW4gdGV4dCBjb250ZW50']);
-+    $this->assertTrue($result);
-   }
- 
-   /**
--- 
-GitLab
-
-
-From 95407766f49c25d517fcc60cc824e9e137e1a94a Mon Sep 17 00:00:00 2001
-From: Adrian Lorenc <adrian.lorenc@gmail.com>
-Date: Thu, 24 Oct 2024 12:28:00 +0200
-Subject: [PATCH 06/10] Update name.
-
----
- tests/src/Functional/ETranslationServiceTest.php | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/tests/src/Functional/ETranslationServiceTest.php b/tests/src/Functional/ETranslationServiceTest.php
-index ed2daff..c424fa9 100644
---- a/tests/src/Functional/ETranslationServiceTest.php
-+++ b/tests/src/Functional/ETranslationServiceTest.php
-@@ -139,7 +139,7 @@ class ETranslationServiceTest extends TMGMTTestBase {
-     return [
-       'Short text' => [$this->randomMachineName(10)],
-       'Long text' => [$this->randomMachineName(5001)],
--      'Html' => ['<strong>Lorem Ipsum</strong>' . $this->randomMachineName(10)],
-+      'HTML' => ['<strong>Lorem Ipsum</strong>' . $this->randomMachineName(10)],
-     ];
-   }
- 
--- 
-GitLab
-
-
-From 523d2d43fd2f94f773a79e7ddee056eb2e420766 Mon Sep 17 00:00:00 2001
-From: Adrian Lorenc <adrian.lorenc@gmail.com>
-Date: Thu, 24 Oct 2024 12:30:10 +0200
-Subject: [PATCH 07/10] Rename test method.
-
----
- tests/src/Unit/TranslationQueueWorkerTest.php | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/tests/src/Unit/TranslationQueueWorkerTest.php b/tests/src/Unit/TranslationQueueWorkerTest.php
-index bef431e..bca519c 100644
---- a/tests/src/Unit/TranslationQueueWorkerTest.php
-+++ b/tests/src/Unit/TranslationQueueWorkerTest.php
-@@ -121,7 +121,7 @@ class TranslationQueueWorkerTest extends TestCase {
-    *
-    * @covers ::isBase64
-    */
--  public function testIsHtml(): void {
-+  public function testIsBase64(): void {
-     $reflection = new \ReflectionClass($this->queueWorker);
-     $method = $reflection->getMethod('isBase64Encoded');
-     $method->setAccessible(TRUE);
--- 
-GitLab
-
-
-From 2d3c1e58f673b9e85b644f278cf758a7d6f316bd Mon Sep 17 00:00:00 2001
-From: Adrian Lorenc <adrian.lorenc@gmail.com>
-Date: Thu, 24 Oct 2024 12:35:58 +0200
-Subject: [PATCH 08/10] Ignore encoded string.
-
----
- .gitlab-ci.yml | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
-index f32f8f6..338de89 100644
---- a/.gitlab-ci.yml
-+++ b/.gitlab-ci.yml
-@@ -34,6 +34,6 @@ include:
- #
- 
- variables:
--  _CSPELL_WORDS: 'webgate'
-+  _CSPELL_WORDS: 'webgate, UGxhaW4gdGV4dCBjb250ZW50'
-   OPT_IN_TEST_CURRENT: '0'
-   OPT_IN_TEST_PREVIOUS_MAJOR: '1'
--- 
-GitLab
-
-
-From cd42758a0b09a07ba0de895873a48507614a57a6 Mon Sep 17 00:00:00 2001
-From: Adrian Lorenc <adrian.lorenc@gmail.com>
-Date: Thu, 24 Oct 2024 12:38:53 +0200
-Subject: [PATCH 09/10] Fix typo.
-
----
- src/Plugin/tmgmt/Translator/ETranslationTranslator.php | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/src/Plugin/tmgmt/Translator/ETranslationTranslator.php b/src/Plugin/tmgmt/Translator/ETranslationTranslator.php
-index e5aa7e5..a7fb2c8 100644
---- a/src/Plugin/tmgmt/Translator/ETranslationTranslator.php
-+++ b/src/Plugin/tmgmt/Translator/ETranslationTranslator.php
-@@ -336,7 +336,7 @@ class ETranslationTranslator extends TranslatorPluginBase implements ContainerFa
-   }
- 
-   /**
--   * Checks if text-to-translate be used.
-+   * Checks if text-to-translate can be used.
-    *
-    * @param string $text
-    *   Text to translate.
--- 
-GitLab
-
-
-From 94b103ca472c48c1e18d4c1a4c79e9b01a3d5151 Mon Sep 17 00:00:00 2001
-From: Adrian Lorenc <adrian.lorenc@gmail.com>
-Date: Thu, 24 Oct 2024 12:44:06 +0200
-Subject: [PATCH 10/10] Remove OPT_IN_TEST_CURRENT
-
----
- .gitlab-ci.yml | 1 -
- 1 file changed, 1 deletion(-)
-
-diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
-index 338de89..091939f 100644
---- a/.gitlab-ci.yml
-+++ b/.gitlab-ci.yml
-@@ -35,5 +35,4 @@ include:
- 
- variables:
-   _CSPELL_WORDS: 'webgate, UGxhaW4gdGV4dCBjb250ZW50'
--  OPT_IN_TEST_CURRENT: '0'
-   OPT_IN_TEST_PREVIOUS_MAJOR: '1'
--- 
-GitLab
-
diff --git a/resources/patch/php/drupal/tmgmt_ec_etranslation/3484303.patch b/resources/patch/php/drupal/tmgmt_ec_etranslation/3484303.patch
deleted file mode 100644
index bec6bcea85..0000000000
--- a/resources/patch/php/drupal/tmgmt_ec_etranslation/3484303.patch
+++ /dev/null
@@ -1,1063 +0,0 @@
-From ea1004b2ef5f62f2cf90cf32852339e1a98aa6a7 Mon Sep 17 00:00:00 2001
-From: Adrian Lorenc <adrian.lorenc@gmail.com>
-Date: Mon, 18 Nov 2024 14:14:16 +0100
-Subject: [PATCH 1/5] Revert "Issue #3483072 by alorenc: text-to-translate has
- a length limit"
-
-This reverts commit e8bd97b8750a4fe3ff04051b487842ace011c4ad.
----
- .gitlab-ci.yml                                |  2 +-
- .../QueueWorker/TranslationQueueWorker.php    | 32 ++++++++++---------
- .../Translator/ETranslationTranslator.php     | 32 -------------------
- .../Functional/ETranslationServiceTest.php    | 21 +-----------
- tests/src/Unit/TranslationQueueWorkerTest.php | 22 ++++++++-----
- 5 files changed, 33 insertions(+), 76 deletions(-)
-
-diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
-index 091939f..6ce3edb 100644
---- a/.gitlab-ci.yml
-+++ b/.gitlab-ci.yml
-@@ -34,5 +34,5 @@ include:
- #
- 
- variables:
--  _CSPELL_WORDS: 'webgate, UGxhaW4gdGV4dCBjb250ZW50'
-+  _CSPELL_WORDS: 'webgate'
-   OPT_IN_TEST_PREVIOUS_MAJOR: '1'
-diff --git a/src/Plugin/QueueWorker/TranslationQueueWorker.php b/src/Plugin/QueueWorker/TranslationQueueWorker.php
-index adbd851..4e30d4a 100644
---- a/src/Plugin/QueueWorker/TranslationQueueWorker.php
-+++ b/src/Plugin/QueueWorker/TranslationQueueWorker.php
-@@ -8,6 +8,7 @@ use Drupal\Core\Entity\EntityTypeManagerInterface;
- use Drupal\Core\Logger\LoggerChannelInterface;
- use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
- use Drupal\Core\Queue\QueueWorkerBase;
-+use Drupal\tmgmt\Data;
- use Symfony\Component\DependencyInjection\ContainerInterface;
- 
- /**
-@@ -37,16 +38,25 @@ class TranslationQueueWorker extends QueueWorkerBase implements ContainerFactory
-    */
-   protected LoggerChannelInterface $logger;
- 
-+  /**
-+   * The tmgmt data service.
-+   *
-+   * @var \Drupal\tmgmt\Data
-+   */
-+  protected Data $tmgmtData;
-+
-   public function __construct(
-     array $configuration,
-     $plugin_id,
-     $plugin_definition,
-     EntityTypeManagerInterface $entity_type_manager,
-     LoggerChannelInterface $logger,
-+    Data $tmgmtData,
-   ) {
-     parent::__construct($configuration, $plugin_id, $plugin_definition);
-     $this->entityTypeManager = $entity_type_manager;
-     $this->logger = $logger;
-+    $this->tmgmtData = $tmgmtData;
-   }
- 
-   /**
-@@ -64,6 +74,7 @@ class TranslationQueueWorker extends QueueWorkerBase implements ContainerFactory
-       $plugin_definition,
-       $container->get('entity_type.manager'),
-       $container->get('logger.channel.tmgmt_ec_etranslation'),
-+      $container->get('tmgmt.data')
-     );
-   }
- 
-@@ -80,7 +91,9 @@ class TranslationQueueWorker extends QueueWorkerBase implements ContainerFactory
-       return;
-     }
- 
--    if ($this->isBase64Encoded($response)) {
-+    $translatableFields = $this->tmgmtData->filterTranslatable($jobItem->getData());
-+
-+    if ($this->isHtml($translatableFields[$key]['#text'])) {
-       $translation['#text'] = base64_decode($response);
-     }
-     else {
-@@ -98,21 +111,10 @@ class TranslationQueueWorker extends QueueWorkerBase implements ContainerFactory
-   }
- 
-   /**
--   * Checks if the given text is base64 encoded.
--   *
--   * @param string $text
--   *   Text to check.
--   *
--   * @return bool
--   *   TRUE if string is base64 encoded.
-+   * Checks if the given text is HTML.
-    */
--  protected function isBase64Encoded(string $text): bool {
--    $decoded = base64_decode($text, TRUE);
--    if ($decoded === FALSE) {
--      return FALSE;
--    }
--
--    return base64_encode($decoded) === $text;
-+  protected function isHtml(string $text): bool {
-+    return \strip_tags($text) !== $text;
-   }
- 
- }
-diff --git a/src/Plugin/tmgmt/Translator/ETranslationTranslator.php b/src/Plugin/tmgmt/Translator/ETranslationTranslator.php
-index a7fb2c8..7807365 100644
---- a/src/Plugin/tmgmt/Translator/ETranslationTranslator.php
-+++ b/src/Plugin/tmgmt/Translator/ETranslationTranslator.php
-@@ -42,13 +42,6 @@ class ETranslationTranslator extends TranslatorPluginBase implements ContainerFa
-    */
-   protected const ENDPOINT = 'https://webgate.ec.europa.eu/';
- 
--  /**
--   * Characters length limit for text-to-translate.
--   *
--   * @var integer
--   */
--  protected const MAX_TEXT_TO_TRANSLATE_LENGTH = 5000;
--
-   /**
-    * A cache bin for domain info.
-    *
-@@ -204,12 +197,6 @@ class ETranslationTranslator extends TranslatorPluginBase implements ContainerFa
-             'format' => 'html',
-           ];
-         }
--        elseif (!$this->canTextToTranslateBeUsed($field['#text'])) {
--          $data['documentToTranslateBase64'] = [
--            'content' => base64_encode($field['#text']),
--            'format' => 'txt',
--          ];
--        }
-         else {
-           $data['textToTranslate'] = $field['#text'];
-         }
-@@ -324,28 +311,9 @@ class ETranslationTranslator extends TranslatorPluginBase implements ContainerFa
- 
-   /**
-    * Checks if the given text is HTML.
--   *
--   * @param string $text
--   *   Text to translate.
--   *
--   * @return bool
--   *   TRUE if it is HTML.
-    */
-   protected function isHtml(string $text): bool {
-     return \strip_tags($text) !== $text;
-   }
- 
--  /**
--   * Checks if text-to-translate can be used.
--   *
--   * @param string $text
--   *   Text to translate.
--   *
--   * @return bool
--   *   TRUE if text-to-translate can be used.
--   */
--  protected function canTextToTranslateBeUsed(string $text): bool {
--    return mb_strlen($text) <= self::MAX_TEXT_TO_TRANSLATE_LENGTH;
--  }
--
- }
-diff --git a/tests/src/Functional/ETranslationServiceTest.php b/tests/src/Functional/ETranslationServiceTest.php
-index c424fa9..7e8d547 100644
---- a/tests/src/Functional/ETranslationServiceTest.php
-+++ b/tests/src/Functional/ETranslationServiceTest.php
-@@ -85,20 +85,12 @@ class ETranslationServiceTest extends TMGMTTestBase {
- 
-   /**
-    * Tests basic API methods of the plugin.
--   *
--   * @dataProvider integrationDataProvider
-    */
--  public function testIntegration(string $text): void {
-+  public function testIntegration(): void {
-     $queue = $this->queueFactory->get(TranslationQueueWorker::ID);
-     $this->assertEquals(0, $queue->numberOfItems());
- 
-     $node = $this->createTranslatableNode('page');
--    $node->set('body', [
--      'value' => $text,
--      'summary' => $this->randomMachineName(10),
--      'format' => filter_default_format(),
--    ])->save();
--
-     $job = $this->createJob('en', 'de', 0, [
-       'label' => 'Continuous job',
-       'job_type' => 'continuous',
-@@ -132,15 +124,4 @@ class ETranslationServiceTest extends TMGMTTestBase {
-     $this->assertEquals(ETranslationMock::translate($body[0]['summary'], 'en', 'de'), $data['body']['0']['summary']['#translation']['#text']);
-   }
- 
--  /**
--   * Provider for ::testIntegration.
--   */
--  public function integrationDataProvider(): array {
--    return [
--      'Short text' => [$this->randomMachineName(10)],
--      'Long text' => [$this->randomMachineName(5001)],
--      'HTML' => ['<strong>Lorem Ipsum</strong>' . $this->randomMachineName(10)],
--    ];
--  }
--
- }
-diff --git a/tests/src/Unit/TranslationQueueWorkerTest.php b/tests/src/Unit/TranslationQueueWorkerTest.php
-index bca519c..d1472cb 100644
---- a/tests/src/Unit/TranslationQueueWorkerTest.php
-+++ b/tests/src/Unit/TranslationQueueWorkerTest.php
-@@ -57,6 +57,7 @@ class TranslationQueueWorkerTest extends TestCase {
- 
-     $this->entityTypeManager = $this->createMock(EntityTypeManagerInterface::class);
-     $this->logger = $this->createMock(LoggerChannelInterface::class);
-+    $this->tmgmtData = $this->createMock(Data::class);
- 
-     $this->queueWorker = new TranslationQueueWorker(
-       [],
-@@ -64,6 +65,7 @@ class TranslationQueueWorkerTest extends TestCase {
-       [],
-       $this->entityTypeManager,
-       $this->logger,
-+      $this->tmgmtData
-     );
-   }
- 
-@@ -94,6 +96,13 @@ class TranslationQueueWorkerTest extends TestCase {
-       ->with('tmgmt_job_item')
-       ->willReturn($entityStorage);
- 
-+    $this->tmgmtData->expects($this->once())
-+      ->method('filterTranslatable')
-+      ->with($jobItem->getData())
-+      ->willReturn([
-+        'key' => ['#text' => '<p>HTML content</p>'],
-+      ]);
-+
-     $this->logger->expects($this->once())
-       ->method('notice')
-       ->with(
-@@ -117,23 +126,20 @@ class TranslationQueueWorkerTest extends TestCase {
-   }
- 
-   /**
--   * Tests the isBase64 method.
-+   * Tests the isHtml method.
-    *
--   * @covers ::isBase64
-+   * @covers ::isHtml
-    */
--  public function testIsBase64(): void {
-+  public function testIsHtml(): void {
-     $reflection = new \ReflectionClass($this->queueWorker);
--    $method = $reflection->getMethod('isBase64Encoded');
-+    $method = $reflection->getMethod('isHtml');
-     $method->setAccessible(TRUE);
- 
-     $result = $method->invokeArgs($this->queueWorker, ['<p>HTML content</p>']);
--    $this->assertFALSE($result);
-+    $this->assertTrue($result);
- 
-     $result = $method->invokeArgs($this->queueWorker, ['Plain text content']);
-     $this->assertFalse($result);
--
--    $result = $method->invokeArgs($this->queueWorker, ['UGxhaW4gdGV4dCBjb250ZW50']);
--    $this->assertTrue($result);
-   }
- 
-   /**
--- 
-GitLab
-
-
-From 0941ba54bdfda3b8368b6135a6451082836531a3 Mon Sep 17 00:00:00 2001
-From: Adrian Lorenc <adrian.lorenc@gmail.com>
-Date: Mon, 18 Nov 2024 14:15:48 +0100
-Subject: [PATCH 2/5] Reapply "Issue #3483072 by alorenc: text-to-translate has
- a length limit"
-
-This reverts commit ea1004b2ef5f62f2cf90cf32852339e1a98aa6a7.
----
- .gitlab-ci.yml                                |  2 +-
- .../QueueWorker/TranslationQueueWorker.php    | 32 +++++++++----------
- .../Translator/ETranslationTranslator.php     | 32 +++++++++++++++++++
- .../Functional/ETranslationServiceTest.php    | 21 +++++++++++-
- tests/src/Unit/TranslationQueueWorkerTest.php | 22 +++++--------
- 5 files changed, 76 insertions(+), 33 deletions(-)
-
-diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
-index 6ce3edb..091939f 100644
---- a/.gitlab-ci.yml
-+++ b/.gitlab-ci.yml
-@@ -34,5 +34,5 @@ include:
- #
- 
- variables:
--  _CSPELL_WORDS: 'webgate'
-+  _CSPELL_WORDS: 'webgate, UGxhaW4gdGV4dCBjb250ZW50'
-   OPT_IN_TEST_PREVIOUS_MAJOR: '1'
-diff --git a/src/Plugin/QueueWorker/TranslationQueueWorker.php b/src/Plugin/QueueWorker/TranslationQueueWorker.php
-index 4e30d4a..adbd851 100644
---- a/src/Plugin/QueueWorker/TranslationQueueWorker.php
-+++ b/src/Plugin/QueueWorker/TranslationQueueWorker.php
-@@ -8,7 +8,6 @@ use Drupal\Core\Entity\EntityTypeManagerInterface;
- use Drupal\Core\Logger\LoggerChannelInterface;
- use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
- use Drupal\Core\Queue\QueueWorkerBase;
--use Drupal\tmgmt\Data;
- use Symfony\Component\DependencyInjection\ContainerInterface;
- 
- /**
-@@ -38,25 +37,16 @@ class TranslationQueueWorker extends QueueWorkerBase implements ContainerFactory
-    */
-   protected LoggerChannelInterface $logger;
- 
--  /**
--   * The tmgmt data service.
--   *
--   * @var \Drupal\tmgmt\Data
--   */
--  protected Data $tmgmtData;
--
-   public function __construct(
-     array $configuration,
-     $plugin_id,
-     $plugin_definition,
-     EntityTypeManagerInterface $entity_type_manager,
-     LoggerChannelInterface $logger,
--    Data $tmgmtData,
-   ) {
-     parent::__construct($configuration, $plugin_id, $plugin_definition);
-     $this->entityTypeManager = $entity_type_manager;
-     $this->logger = $logger;
--    $this->tmgmtData = $tmgmtData;
-   }
- 
-   /**
-@@ -74,7 +64,6 @@ class TranslationQueueWorker extends QueueWorkerBase implements ContainerFactory
-       $plugin_definition,
-       $container->get('entity_type.manager'),
-       $container->get('logger.channel.tmgmt_ec_etranslation'),
--      $container->get('tmgmt.data')
-     );
-   }
- 
-@@ -91,9 +80,7 @@ class TranslationQueueWorker extends QueueWorkerBase implements ContainerFactory
-       return;
-     }
- 
--    $translatableFields = $this->tmgmtData->filterTranslatable($jobItem->getData());
--
--    if ($this->isHtml($translatableFields[$key]['#text'])) {
-+    if ($this->isBase64Encoded($response)) {
-       $translation['#text'] = base64_decode($response);
-     }
-     else {
-@@ -111,10 +98,21 @@ class TranslationQueueWorker extends QueueWorkerBase implements ContainerFactory
-   }
- 
-   /**
--   * Checks if the given text is HTML.
-+   * Checks if the given text is base64 encoded.
-+   *
-+   * @param string $text
-+   *   Text to check.
-+   *
-+   * @return bool
-+   *   TRUE if string is base64 encoded.
-    */
--  protected function isHtml(string $text): bool {
--    return \strip_tags($text) !== $text;
-+  protected function isBase64Encoded(string $text): bool {
-+    $decoded = base64_decode($text, TRUE);
-+    if ($decoded === FALSE) {
-+      return FALSE;
-+    }
-+
-+    return base64_encode($decoded) === $text;
-   }
- 
- }
-diff --git a/src/Plugin/tmgmt/Translator/ETranslationTranslator.php b/src/Plugin/tmgmt/Translator/ETranslationTranslator.php
-index 7807365..a7fb2c8 100644
---- a/src/Plugin/tmgmt/Translator/ETranslationTranslator.php
-+++ b/src/Plugin/tmgmt/Translator/ETranslationTranslator.php
-@@ -42,6 +42,13 @@ class ETranslationTranslator extends TranslatorPluginBase implements ContainerFa
-    */
-   protected const ENDPOINT = 'https://webgate.ec.europa.eu/';
- 
-+  /**
-+   * Characters length limit for text-to-translate.
-+   *
-+   * @var integer
-+   */
-+  protected const MAX_TEXT_TO_TRANSLATE_LENGTH = 5000;
-+
-   /**
-    * A cache bin for domain info.
-    *
-@@ -197,6 +204,12 @@ class ETranslationTranslator extends TranslatorPluginBase implements ContainerFa
-             'format' => 'html',
-           ];
-         }
-+        elseif (!$this->canTextToTranslateBeUsed($field['#text'])) {
-+          $data['documentToTranslateBase64'] = [
-+            'content' => base64_encode($field['#text']),
-+            'format' => 'txt',
-+          ];
-+        }
-         else {
-           $data['textToTranslate'] = $field['#text'];
-         }
-@@ -311,9 +324,28 @@ class ETranslationTranslator extends TranslatorPluginBase implements ContainerFa
- 
-   /**
-    * Checks if the given text is HTML.
-+   *
-+   * @param string $text
-+   *   Text to translate.
-+   *
-+   * @return bool
-+   *   TRUE if it is HTML.
-    */
-   protected function isHtml(string $text): bool {
-     return \strip_tags($text) !== $text;
-   }
- 
-+  /**
-+   * Checks if text-to-translate can be used.
-+   *
-+   * @param string $text
-+   *   Text to translate.
-+   *
-+   * @return bool
-+   *   TRUE if text-to-translate can be used.
-+   */
-+  protected function canTextToTranslateBeUsed(string $text): bool {
-+    return mb_strlen($text) <= self::MAX_TEXT_TO_TRANSLATE_LENGTH;
-+  }
-+
- }
-diff --git a/tests/src/Functional/ETranslationServiceTest.php b/tests/src/Functional/ETranslationServiceTest.php
-index 7e8d547..c424fa9 100644
---- a/tests/src/Functional/ETranslationServiceTest.php
-+++ b/tests/src/Functional/ETranslationServiceTest.php
-@@ -85,12 +85,20 @@ class ETranslationServiceTest extends TMGMTTestBase {
- 
-   /**
-    * Tests basic API methods of the plugin.
-+   *
-+   * @dataProvider integrationDataProvider
-    */
--  public function testIntegration(): void {
-+  public function testIntegration(string $text): void {
-     $queue = $this->queueFactory->get(TranslationQueueWorker::ID);
-     $this->assertEquals(0, $queue->numberOfItems());
- 
-     $node = $this->createTranslatableNode('page');
-+    $node->set('body', [
-+      'value' => $text,
-+      'summary' => $this->randomMachineName(10),
-+      'format' => filter_default_format(),
-+    ])->save();
-+
-     $job = $this->createJob('en', 'de', 0, [
-       'label' => 'Continuous job',
-       'job_type' => 'continuous',
-@@ -124,4 +132,15 @@ class ETranslationServiceTest extends TMGMTTestBase {
-     $this->assertEquals(ETranslationMock::translate($body[0]['summary'], 'en', 'de'), $data['body']['0']['summary']['#translation']['#text']);
-   }
- 
-+  /**
-+   * Provider for ::testIntegration.
-+   */
-+  public function integrationDataProvider(): array {
-+    return [
-+      'Short text' => [$this->randomMachineName(10)],
-+      'Long text' => [$this->randomMachineName(5001)],
-+      'HTML' => ['<strong>Lorem Ipsum</strong>' . $this->randomMachineName(10)],
-+    ];
-+  }
-+
- }
-diff --git a/tests/src/Unit/TranslationQueueWorkerTest.php b/tests/src/Unit/TranslationQueueWorkerTest.php
-index d1472cb..bca519c 100644
---- a/tests/src/Unit/TranslationQueueWorkerTest.php
-+++ b/tests/src/Unit/TranslationQueueWorkerTest.php
-@@ -57,7 +57,6 @@ class TranslationQueueWorkerTest extends TestCase {
- 
-     $this->entityTypeManager = $this->createMock(EntityTypeManagerInterface::class);
-     $this->logger = $this->createMock(LoggerChannelInterface::class);
--    $this->tmgmtData = $this->createMock(Data::class);
- 
-     $this->queueWorker = new TranslationQueueWorker(
-       [],
-@@ -65,7 +64,6 @@ class TranslationQueueWorkerTest extends TestCase {
-       [],
-       $this->entityTypeManager,
-       $this->logger,
--      $this->tmgmtData
-     );
-   }
- 
-@@ -96,13 +94,6 @@ class TranslationQueueWorkerTest extends TestCase {
-       ->with('tmgmt_job_item')
-       ->willReturn($entityStorage);
- 
--    $this->tmgmtData->expects($this->once())
--      ->method('filterTranslatable')
--      ->with($jobItem->getData())
--      ->willReturn([
--        'key' => ['#text' => '<p>HTML content</p>'],
--      ]);
--
-     $this->logger->expects($this->once())
-       ->method('notice')
-       ->with(
-@@ -126,20 +117,23 @@ class TranslationQueueWorkerTest extends TestCase {
-   }
- 
-   /**
--   * Tests the isHtml method.
-+   * Tests the isBase64 method.
-    *
--   * @covers ::isHtml
-+   * @covers ::isBase64
-    */
--  public function testIsHtml(): void {
-+  public function testIsBase64(): void {
-     $reflection = new \ReflectionClass($this->queueWorker);
--    $method = $reflection->getMethod('isHtml');
-+    $method = $reflection->getMethod('isBase64Encoded');
-     $method->setAccessible(TRUE);
- 
-     $result = $method->invokeArgs($this->queueWorker, ['<p>HTML content</p>']);
--    $this->assertTrue($result);
-+    $this->assertFALSE($result);
- 
-     $result = $method->invokeArgs($this->queueWorker, ['Plain text content']);
-     $this->assertFalse($result);
-+
-+    $result = $method->invokeArgs($this->queueWorker, ['UGxhaW4gdGV4dCBjb250ZW50']);
-+    $this->assertTrue($result);
-   }
- 
-   /**
--- 
-GitLab
-
-
-From 1682daf051f581d5e066d9217ffeaf5185aaa514 Mon Sep 17 00:00:00 2001
-From: Adrian Lorenc <adrian.lorenc@gmail.com>
-Date: Mon, 18 Nov 2024 16:05:39 +0100
-Subject: [PATCH 3/5] Use TextValidatorInterface.
-
----
- .../QueueWorker/TranslationQueueWorker.php    | 46 ++++++++------
- .../Translator/ETranslationTranslator.php     | 40 ++++--------
- src/TextValidator.php                         | 26 ++++++++
- src/TextValidatorInterface.php                | 39 ++++++++++++
- tests/src/Unit/TextValidatorTest.php          | 62 +++++++++++++++++++
- tests/src/Unit/TranslationQueueWorkerTest.php | 39 ++++++------
- tmgmt_ec_etranslation.services.yml            |  3 +
- 7 files changed, 188 insertions(+), 67 deletions(-)
- create mode 100644 src/TextValidator.php
- create mode 100644 src/TextValidatorInterface.php
- create mode 100644 tests/src/Unit/TextValidatorTest.php
-
-diff --git a/src/Plugin/QueueWorker/TranslationQueueWorker.php b/src/Plugin/QueueWorker/TranslationQueueWorker.php
-index adbd851..e24da15 100644
---- a/src/Plugin/QueueWorker/TranslationQueueWorker.php
-+++ b/src/Plugin/QueueWorker/TranslationQueueWorker.php
-@@ -8,6 +8,8 @@ use Drupal\Core\Entity\EntityTypeManagerInterface;
- use Drupal\Core\Logger\LoggerChannelInterface;
- use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
- use Drupal\Core\Queue\QueueWorkerBase;
-+use Drupal\tmgmt\Data;
-+use Drupal\tmgmt_ec_etranslation\TextValidatorInterface;
- use Symfony\Component\DependencyInjection\ContainerInterface;
- 
- /**
-@@ -37,16 +39,35 @@ class TranslationQueueWorker extends QueueWorkerBase implements ContainerFactory
-    */
-   protected LoggerChannelInterface $logger;
- 
-+  /**
-+   * The tmgmt data service.
-+   *
-+   * @var \Drupal\tmgmt\Data
-+   */
-+  protected Data $tmgmtData;
-+
-+  /**
-+   * Text validator service.
-+   *
-+   *
-+   * @var \Drupal\tmgmt_ec_etranslation\TextValidatorInterface
-+   */
-+  protected TextValidatorInterface $textValidator;
-+
-   public function __construct(
-     array $configuration,
-     $plugin_id,
-     $plugin_definition,
-     EntityTypeManagerInterface $entity_type_manager,
-     LoggerChannelInterface $logger,
-+    Data $tmgmtData,
-+    TextValidatorInterface $textValidator,
-   ) {
-     parent::__construct($configuration, $plugin_id, $plugin_definition);
-     $this->entityTypeManager = $entity_type_manager;
-     $this->logger = $logger;
-+    $this->tmgmtData = $tmgmtData;
-+    $this->textValidator = $textValidator;
-   }
- 
-   /**
-@@ -64,6 +85,8 @@ class TranslationQueueWorker extends QueueWorkerBase implements ContainerFactory
-       $plugin_definition,
-       $container->get('entity_type.manager'),
-       $container->get('logger.channel.tmgmt_ec_etranslation'),
-+      $container->get('tmgmt.data'),
-+      $container->get('tmgmt_ec_etranslation.text_validator'),
-     );
-   }
- 
-@@ -80,7 +103,10 @@ class TranslationQueueWorker extends QueueWorkerBase implements ContainerFactory
-       return;
-     }
- 
--    if ($this->isBase64Encoded($response)) {
-+    $translatableFields = $this->tmgmtData->filterTranslatable($jobItem->getData());
-+
-+    if ($this->textValidator->isHtml($translatableFields[$key]['#text']) ||
-+      !$this->textValidator->canTextToTranslateBeUsed($translatableFields[$key]['#text'])) {
-       $translation['#text'] = base64_decode($response);
-     }
-     else {
-@@ -97,22 +123,4 @@ class TranslationQueueWorker extends QueueWorkerBase implements ContainerFactory
-     $jobItem->save();
-   }
- 
--  /**
--   * Checks if the given text is base64 encoded.
--   *
--   * @param string $text
--   *   Text to check.
--   *
--   * @return bool
--   *   TRUE if string is base64 encoded.
--   */
--  protected function isBase64Encoded(string $text): bool {
--    $decoded = base64_decode($text, TRUE);
--    if ($decoded === FALSE) {
--      return FALSE;
--    }
--
--    return base64_encode($decoded) === $text;
--  }
--
- }
-diff --git a/src/Plugin/tmgmt/Translator/ETranslationTranslator.php b/src/Plugin/tmgmt/Translator/ETranslationTranslator.php
-index a7fb2c8..4fe1b3e 100644
---- a/src/Plugin/tmgmt/Translator/ETranslationTranslator.php
-+++ b/src/Plugin/tmgmt/Translator/ETranslationTranslator.php
-@@ -16,6 +16,7 @@ use Drupal\tmgmt\Translator\AvailableResult;
- use Drupal\tmgmt\TranslatorInterface;
- use Drupal\tmgmt\TranslatorPluginBase;
- use Drupal\tmgmt_ec_etranslation\HashGeneratorInterface;
-+use Drupal\tmgmt_ec_etranslation\TextValidatorInterface;
- use GuzzleHttp\Client;
- use GuzzleHttp\Exception\GuzzleException;
- use GuzzleHttp\RequestOptions;
-@@ -84,6 +85,14 @@ class ETranslationTranslator extends TranslatorPluginBase implements ContainerFa
-    */
-   protected HashGeneratorInterface $hashGenerator;
- 
-+  /**
-+   * Text validator service.
-+   *
-+   *
-+   * @var \Drupal\tmgmt_ec_etranslation\TextValidatorInterface
-+   */
-+  protected TextValidatorInterface $textValidator;
-+
-   /**
-    * {@inheritdoc}
-    */
-@@ -99,6 +108,7 @@ class ETranslationTranslator extends TranslatorPluginBase implements ContainerFa
-     $instance->client = $container->get('http_client');
-     $instance->tmgmtData = $container->get('tmgmt.data');
-     $instance->hashGenerator = $container->get('tmgmt_ec_etranslation.hash_generator');
-+    $instance->textValidator = $container->get('tmgmt_ec_etranslation.text_validator');
- 
-     return $instance;
-   }
-@@ -198,13 +208,13 @@ class ETranslationTranslator extends TranslatorPluginBase implements ContainerFa
-           $data['destinations']['emailDestinations'] = [$email];
-         }
- 
--        if ($this->isHtml($field['#text'])) {
-+        if ($this->textValidator->isHtml($field['#text'])) {
-           $data['documentToTranslateBase64'] = [
-             'content' => base64_encode($field['#text']),
-             'format' => 'html',
-           ];
-         }
--        elseif (!$this->canTextToTranslateBeUsed($field['#text'])) {
-+        elseif (!$this->textValidator->canTextToTranslateBeUsed($field['#text'])) {
-           $data['documentToTranslateBase64'] = [
-             'content' => base64_encode($field['#text']),
-             'format' => 'txt',
-@@ -322,30 +332,4 @@ class ETranslationTranslator extends TranslatorPluginBase implements ContainerFa
-     return $data;
-   }
- 
--  /**
--   * Checks if the given text is HTML.
--   *
--   * @param string $text
--   *   Text to translate.
--   *
--   * @return bool
--   *   TRUE if it is HTML.
--   */
--  protected function isHtml(string $text): bool {
--    return \strip_tags($text) !== $text;
--  }
--
--  /**
--   * Checks if text-to-translate can be used.
--   *
--   * @param string $text
--   *   Text to translate.
--   *
--   * @return bool
--   *   TRUE if text-to-translate can be used.
--   */
--  protected function canTextToTranslateBeUsed(string $text): bool {
--    return mb_strlen($text) <= self::MAX_TEXT_TO_TRANSLATE_LENGTH;
--  }
--
- }
-diff --git a/src/TextValidator.php b/src/TextValidator.php
-new file mode 100644
-index 0000000..1d20201
---- /dev/null
-+++ b/src/TextValidator.php
-@@ -0,0 +1,26 @@
-+<?php
-+
-+declare(strict_types=1);
-+
-+namespace Drupal\tmgmt_ec_etranslation;
-+
-+/**
-+ * Implements the TextValidatorInterface.
-+ */
-+class TextValidator implements TextValidatorInterface {
-+
-+  /**
-+   * {@inheritdoc}
-+   */
-+  public function isHtml(string $text): bool {
-+    return \strip_tags($text) !== $text;
-+  }
-+
-+  /**
-+   * {@inheritdoc}
-+   */
-+  public function canTextToTranslateBeUsed(string $text): bool {
-+    return mb_strlen($text) <= self::MAX_TEXT_TO_TRANSLATE_LENGTH;
-+  }
-+
-+}
-diff --git a/src/TextValidatorInterface.php b/src/TextValidatorInterface.php
-new file mode 100644
-index 0000000..c76e44d
---- /dev/null
-+++ b/src/TextValidatorInterface.php
-@@ -0,0 +1,39 @@
-+<?php
-+
-+declare(strict_types=1);
-+
-+namespace Drupal\tmgmt_ec_etranslation;
-+
-+/**
-+ * Provides an interface for text validation utilities.
-+ */
-+interface TextValidatorInterface {
-+
-+  /**
-+   * Maximum length for text-to-translate.
-+   */
-+  public const MAX_TEXT_TO_TRANSLATE_LENGTH = 1000;
-+
-+  /**
-+   * Checks if the given text is HTML.
-+   *
-+   * @param string $text
-+   *   Text to validate.
-+   *
-+   * @return bool
-+   *   TRUE if it is HTML.
-+   */
-+  public function isHtml(string $text): bool;
-+
-+  /**
-+   * Checks if text-to-translate can be used.
-+   *
-+   * @param string $text
-+   *   Text to validate.
-+   *
-+   * @return bool
-+   *   TRUE if text-to-translate can be used.
-+   */
-+  public function canTextToTranslateBeUsed(string $text): bool;
-+
-+}
-diff --git a/tests/src/Unit/TextValidatorTest.php b/tests/src/Unit/TextValidatorTest.php
-new file mode 100644
-index 0000000..4bc832d
---- /dev/null
-+++ b/tests/src/Unit/TextValidatorTest.php
-@@ -0,0 +1,62 @@
-+<?php
-+
-+declare(strict_types=1);
-+
-+namespace Drupal\Tests\tmgmt_ec_etranslation\Unit;
-+
-+use Drupal\tmgmt_ec_etranslation\TextValidator;
-+use Drupal\tmgmt_ec_etranslation\TextValidatorInterface;
-+use PHPUnit\Framework\TestCase;
-+
-+/**
-+ * Unit tests for the TextValidator class.
-+ *
-+ * @coversDefaultClass \Drupal\tmgmt_ec_etranslation\TextValidator
-+ */
-+class TextValidatorTest extends TestCase {
-+
-+  /**
-+   * The TextValidator instance.
-+   *
-+   * @var \Drupal\tmgmt_ec_etranslation\TextValidatorInterface
-+   */
-+  protected TextValidatorInterface $textValidator;
-+
-+  /**
-+   * {@inheritdoc}
-+   */
-+  protected function setUp(): void {
-+    parent::setUp();
-+    $this->textValidator = new TextValidator();
-+  }
-+
-+  /**
-+   * Tests the isHtml method.
-+   *
-+   * @covers ::isHtml
-+   */
-+  public function testIsHtml(): void {
-+    $this->assertTrue($this->textValidator->isHtml('<p>Example</p>'));
-+    $this->assertTrue($this->textValidator->isHtml('<div><b>Bold</b></div>'));
-+    $this->assertFalse($this->textValidator->isHtml('Plain text'));
-+    $this->assertFalse($this->textValidator->isHtml('12345'));
-+    $this->assertFalse($this->textValidator->isHtml(''));
-+  }
-+
-+  /**
-+   * Tests the canTextToTranslateBeUsed method.
-+   *
-+   * @covers ::canTextToTranslateBeUsed
-+   */
-+  public function testCanTextToTranslateBeUsed(): void {
-+    $shortText = str_repeat('a', 500);
-+    $exactLimitText = str_repeat('a', 1000);
-+    $tooLongText = str_repeat('a', 1001);
-+
-+    $this->assertTrue($this->textValidator->canTextToTranslateBeUsed($shortText));
-+    $this->assertTrue($this->textValidator->canTextToTranslateBeUsed($exactLimitText));
-+    $this->assertFalse($this->textValidator->canTextToTranslateBeUsed($tooLongText));
-+    $this->assertTrue($this->textValidator->canTextToTranslateBeUsed(''));
-+  }
-+
-+}
-diff --git a/tests/src/Unit/TranslationQueueWorkerTest.php b/tests/src/Unit/TranslationQueueWorkerTest.php
-index bca519c..81d2d8b 100644
---- a/tests/src/Unit/TranslationQueueWorkerTest.php
-+++ b/tests/src/Unit/TranslationQueueWorkerTest.php
-@@ -10,6 +10,7 @@ use Drupal\Core\Logger\LoggerChannelInterface;
- use Drupal\tmgmt\Data;
- use Drupal\tmgmt\JobItemInterface;
- use Drupal\tmgmt_ec_etranslation\Plugin\QueueWorker\TranslationQueueWorker;
-+use Drupal\tmgmt_ec_etranslation\TextValidatorInterface;
- use PHPUnit\Framework\TestCase;
- 
- /**
-@@ -42,6 +43,13 @@ class TranslationQueueWorkerTest extends TestCase {
-    */
-   protected Data $tmgmtData;
- 
-+  /**
-+   * The mock text validator service.
-+   *
-+   * @var \Drupal\tmgmt_ec_etranslation\TextValidatorInterface
-+   */
-+  protected TextValidatorInterface $textValidator;
-+
-   /**
-    * The TranslationQueueWorker instance.
-    *
-@@ -57,6 +65,8 @@ class TranslationQueueWorkerTest extends TestCase {
- 
-     $this->entityTypeManager = $this->createMock(EntityTypeManagerInterface::class);
-     $this->logger = $this->createMock(LoggerChannelInterface::class);
-+    $this->tmgmtData = $this->createMock(Data::class);
-+    $this->textValidator = $this->createMock(TextValidatorInterface::class);
- 
-     $this->queueWorker = new TranslationQueueWorker(
-       [],
-@@ -64,6 +74,8 @@ class TranslationQueueWorkerTest extends TestCase {
-       [],
-       $this->entityTypeManager,
-       $this->logger,
-+      $this->tmgmtData,
-+      $this->textValidator,
-     );
-   }
- 
-@@ -83,6 +95,13 @@ class TranslationQueueWorkerTest extends TestCase {
-         'key' => ['#text' => '<p>HTML content</p>'],
-       ]);
- 
-+    $this->tmgmtData->expects($this->once())
-+      ->method('filterTranslatable')
-+      ->with($jobItem->getData())
-+      ->willReturn([
-+        'key' => ['#text' => '<p>HTML content</p>'],
-+      ]);
-+
-     $entityStorage = $this->createMock(EntityStorageInterface::class);
-     $entityStorage->expects($this->once())
-       ->method('load')
-@@ -116,26 +135,6 @@ class TranslationQueueWorkerTest extends TestCase {
-     $this->queueWorker->processItem([1, 'key', base64_encode('HTML content')]);
-   }
- 
--  /**
--   * Tests the isBase64 method.
--   *
--   * @covers ::isBase64
--   */
--  public function testIsBase64(): void {
--    $reflection = new \ReflectionClass($this->queueWorker);
--    $method = $reflection->getMethod('isBase64Encoded');
--    $method->setAccessible(TRUE);
--
--    $result = $method->invokeArgs($this->queueWorker, ['<p>HTML content</p>']);
--    $this->assertFALSE($result);
--
--    $result = $method->invokeArgs($this->queueWorker, ['Plain text content']);
--    $this->assertFalse($result);
--
--    $result = $method->invokeArgs($this->queueWorker, ['UGxhaW4gdGV4dCBjb250ZW50']);
--    $this->assertTrue($result);
--  }
--
-   /**
-    * Tests the case when the job item does not exist in processItem.
-    */
-diff --git a/tmgmt_ec_etranslation.services.yml b/tmgmt_ec_etranslation.services.yml
-index 2c4fac7..eea27e2 100644
---- a/tmgmt_ec_etranslation.services.yml
-+++ b/tmgmt_ec_etranslation.services.yml
-@@ -3,6 +3,9 @@ services:
-     class: Drupal\tmgmt_ec_etranslation\HashGenerator
-     arguments: [ '@private_key' ]
- 
-+  tmgmt_ec_etranslation.text_validator:
-+    class: Drupal\tmgmt_ec_etranslation\TextValidator
-+
-   logger.channel.tmgmt_ec_etranslation:
-     parent: logger.channel_base
-     arguments: [ 'tmgmt_ec_etranslation' ]
--- 
-GitLab
-
-
-From dd727adce03640379dde2bdff9a07cb3f7c83b96 Mon Sep 17 00:00:00 2001
-From: Adrian Lorenc <adrian.lorenc@gmail.com>
-Date: Mon, 18 Nov 2024 16:08:07 +0100
-Subject: [PATCH 4/5] Remove MAX_TEXT_TO_TRANSLATE_LENGTH
-
----
- src/Plugin/tmgmt/Translator/ETranslationTranslator.php | 7 -------
- 1 file changed, 7 deletions(-)
-
-diff --git a/src/Plugin/tmgmt/Translator/ETranslationTranslator.php b/src/Plugin/tmgmt/Translator/ETranslationTranslator.php
-index 4fe1b3e..29dd878 100644
---- a/src/Plugin/tmgmt/Translator/ETranslationTranslator.php
-+++ b/src/Plugin/tmgmt/Translator/ETranslationTranslator.php
-@@ -43,13 +43,6 @@ class ETranslationTranslator extends TranslatorPluginBase implements ContainerFa
-    */
-   protected const ENDPOINT = 'https://webgate.ec.europa.eu/';
- 
--  /**
--   * Characters length limit for text-to-translate.
--   *
--   * @var integer
--   */
--  protected const MAX_TEXT_TO_TRANSLATE_LENGTH = 5000;
--
-   /**
-    * A cache bin for domain info.
-    *
--- 
-GitLab
-
-
-From 01f49468217c8af6e682b4e9899cb423e4f7cdac Mon Sep 17 00:00:00 2001
-From: Adrian Lorenc <adrian.lorenc@gmail.com>
-Date: Mon, 18 Nov 2024 16:12:06 +0100
-Subject: [PATCH 5/5] Fix phpcs issues
-
----
- src/Plugin/QueueWorker/TranslationQueueWorker.php      | 1 -
- src/Plugin/tmgmt/Translator/ETranslationTranslator.php | 1 -
- 2 files changed, 2 deletions(-)
-
-diff --git a/src/Plugin/QueueWorker/TranslationQueueWorker.php b/src/Plugin/QueueWorker/TranslationQueueWorker.php
-index e24da15..5fc8c8d 100644
---- a/src/Plugin/QueueWorker/TranslationQueueWorker.php
-+++ b/src/Plugin/QueueWorker/TranslationQueueWorker.php
-@@ -49,7 +49,6 @@ class TranslationQueueWorker extends QueueWorkerBase implements ContainerFactory
-   /**
-    * Text validator service.
-    *
--   *
-    * @var \Drupal\tmgmt_ec_etranslation\TextValidatorInterface
-    */
-   protected TextValidatorInterface $textValidator;
-diff --git a/src/Plugin/tmgmt/Translator/ETranslationTranslator.php b/src/Plugin/tmgmt/Translator/ETranslationTranslator.php
-index 29dd878..6049a0c 100644
---- a/src/Plugin/tmgmt/Translator/ETranslationTranslator.php
-+++ b/src/Plugin/tmgmt/Translator/ETranslationTranslator.php
-@@ -81,7 +81,6 @@ class ETranslationTranslator extends TranslatorPluginBase implements ContainerFa
-   /**
-    * Text validator service.
-    *
--   *
-    * @var \Drupal\tmgmt_ec_etranslation\TextValidatorInterface
-    */
-   protected TextValidatorInterface $textValidator;
--- 
-GitLab
-
-- 
GitLab


From 4ed483ff74dbc8c38abbe6d059632817dbe55032 Mon Sep 17 00:00:00 2001
From: Zoltan Horvath <zoltan.horvath@ext.ec.europa.eu>
Date: Fri, 20 Dec 2024 11:01:03 +0100
Subject: [PATCH 080/137] ISAICP-9310: Update composer dependencies

---
 composer.lock | 1416 +++++++++++++++++++++++++------------------------
 1 file changed, 719 insertions(+), 697 deletions(-)

diff --git a/composer.lock b/composer.lock
index 5be0aa29c9..69cba5ffeb 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": "3c4e5b4601fa5358c707296447e4ecd8",
+    "content-hash": "b4ad3a65c29792adbf6a1e4af91863ff",
     "packages": [
         {
             "name": "asm89/stack-cors",
@@ -350,20 +350,20 @@
             },
             "type": "library",
             "extra": {
-                "installer-paths": {
-                    "build/core": [
-                        "type:drupal-core"
-                    ]
-                },
                 "drupal-scaffold": {
                     "locations": {
                         "web-root": "build/"
                     },
                     "file-mapping": {
-                        "[project-root]/.gitattributes": false,
+                        "[project-root]/.gitignore": false,
                         "[project-root]/.editorconfig": false,
-                        "[project-root]/.gitignore": false
+                        "[project-root]/.gitattributes": false
                     }
+                },
+                "installer-paths": {
+                    "build/core": [
+                        "type:drupal-core"
+                    ]
                 }
             },
             "autoload": {
@@ -683,16 +683,16 @@
         },
         {
             "name": "consolidation/annotated-command",
-            "version": "4.10.0",
+            "version": "4.10.1",
             "source": {
                 "type": "git",
                 "url": "https://github.com/consolidation/annotated-command.git",
-                "reference": "1e830ba908c9ffb1ba7ca056203531b27188812c"
+                "reference": "362310b13ececa9f6f0a4a880811fa08fecc348b"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/consolidation/annotated-command/zipball/1e830ba908c9ffb1ba7ca056203531b27188812c",
-                "reference": "1e830ba908c9ffb1ba7ca056203531b27188812c",
+                "url": "https://api.github.com/repos/consolidation/annotated-command/zipball/362310b13ececa9f6f0a4a880811fa08fecc348b",
+                "reference": "362310b13ececa9f6f0a4a880811fa08fecc348b",
                 "shasum": ""
             },
             "require": {
@@ -733,9 +733,9 @@
             "description": "Initialize Symfony Console commands from annotated command class methods.",
             "support": {
                 "issues": "https://github.com/consolidation/annotated-command/issues",
-                "source": "https://github.com/consolidation/annotated-command/tree/4.10.0"
+                "source": "https://github.com/consolidation/annotated-command/tree/4.10.1"
             },
-            "time": "2024-04-05T21:05:39+00:00"
+            "time": "2024-12-13T19:55:40+00:00"
         },
         {
             "name": "consolidation/config",
@@ -1083,16 +1083,16 @@
         },
         {
             "name": "consolidation/site-alias",
-            "version": "4.1.0",
+            "version": "4.1.1",
             "source": {
                 "type": "git",
                 "url": "https://github.com/consolidation/site-alias.git",
-                "reference": "1056ceb93f6aafe6f7600d7bbe1b62b8488abccf"
+                "reference": "aff6189aae17da813d23249cb2fc0fff33f26d40"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/consolidation/site-alias/zipball/1056ceb93f6aafe6f7600d7bbe1b62b8488abccf",
-                "reference": "1056ceb93f6aafe6f7600d7bbe1b62b8488abccf",
+                "url": "https://api.github.com/repos/consolidation/site-alias/zipball/aff6189aae17da813d23249cb2fc0fff33f26d40",
+                "reference": "aff6189aae17da813d23249cb2fc0fff33f26d40",
                 "shasum": ""
             },
             "require": {
@@ -1136,22 +1136,22 @@
             "description": "Manage alias records for local and remote sites.",
             "support": {
                 "issues": "https://github.com/consolidation/site-alias/issues",
-                "source": "https://github.com/consolidation/site-alias/tree/4.1.0"
+                "source": "https://github.com/consolidation/site-alias/tree/4.1.1"
             },
-            "time": "2024-04-05T15:58:04+00:00"
+            "time": "2024-12-13T19:05:11+00:00"
         },
         {
             "name": "consolidation/site-process",
-            "version": "5.4.0",
+            "version": "5.4.2",
             "source": {
                 "type": "git",
                 "url": "https://github.com/consolidation/site-process.git",
-                "reference": "7ab3ffe4195a89b8dc334ea22e7881abe79ffd9a"
+                "reference": "e7fafc40ebfddc1a5ee99ee66e5d186fc1bed4da"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/consolidation/site-process/zipball/7ab3ffe4195a89b8dc334ea22e7881abe79ffd9a",
-                "reference": "7ab3ffe4195a89b8dc334ea22e7881abe79ffd9a",
+                "url": "https://api.github.com/repos/consolidation/site-process/zipball/e7fafc40ebfddc1a5ee99ee66e5d186fc1bed4da",
+                "reference": "e7fafc40ebfddc1a5ee99ee66e5d186fc1bed4da",
                 "shasum": ""
             },
             "require": {
@@ -1193,9 +1193,9 @@
             "description": "A thin wrapper around the Symfony Process Component that allows applications to use the Site Alias library to specify the target for a remote call.",
             "support": {
                 "issues": "https://github.com/consolidation/site-process/issues",
-                "source": "https://github.com/consolidation/site-process/tree/5.4.0"
+                "source": "https://github.com/consolidation/site-process/tree/5.4.2"
             },
-            "time": "2024-04-06T00:00:28+00:00"
+            "time": "2024-12-13T19:25:56+00:00"
         },
         {
             "name": "cweagans/composer-patches",
@@ -1457,29 +1457,27 @@
         },
         {
             "name": "doctrine/deprecations",
-            "version": "1.1.3",
+            "version": "1.1.4",
             "source": {
                 "type": "git",
                 "url": "https://github.com/doctrine/deprecations.git",
-                "reference": "dfbaa3c2d2e9a9df1118213f3b8b0c597bb99fab"
+                "reference": "31610dbb31faa98e6b5447b62340826f54fbc4e9"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/doctrine/deprecations/zipball/dfbaa3c2d2e9a9df1118213f3b8b0c597bb99fab",
-                "reference": "dfbaa3c2d2e9a9df1118213f3b8b0c597bb99fab",
+                "url": "https://api.github.com/repos/doctrine/deprecations/zipball/31610dbb31faa98e6b5447b62340826f54fbc4e9",
+                "reference": "31610dbb31faa98e6b5447b62340826f54fbc4e9",
                 "shasum": ""
             },
             "require": {
                 "php": "^7.1 || ^8.0"
             },
             "require-dev": {
-                "doctrine/coding-standard": "^9",
-                "phpstan/phpstan": "1.4.10 || 1.10.15",
-                "phpstan/phpstan-phpunit": "^1.0",
+                "doctrine/coding-standard": "^9 || ^12",
+                "phpstan/phpstan": "1.4.10 || 2.0.3",
+                "phpstan/phpstan-phpunit": "^1.0 || ^2",
                 "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5",
-                "psalm/plugin-phpunit": "0.18.4",
-                "psr/log": "^1 || ^2 || ^3",
-                "vimeo/psalm": "4.30.0 || 5.12.0"
+                "psr/log": "^1 || ^2 || ^3"
             },
             "suggest": {
                 "psr/log": "Allows logging deprecations via PSR-3 logger implementation"
@@ -1487,7 +1485,7 @@
             "type": "library",
             "autoload": {
                 "psr-4": {
-                    "Doctrine\\Deprecations\\": "lib/Doctrine/Deprecations"
+                    "Doctrine\\Deprecations\\": "src"
                 }
             },
             "notification-url": "https://packagist.org/downloads/",
@@ -1498,9 +1496,9 @@
             "homepage": "https://www.doctrine-project.org/",
             "support": {
                 "issues": "https://github.com/doctrine/deprecations/issues",
-                "source": "https://github.com/doctrine/deprecations/tree/1.1.3"
+                "source": "https://github.com/doctrine/deprecations/tree/1.1.4"
             },
-            "time": "2024-01-30T19:34:25+00:00"
+            "time": "2024-12-07T21:18:45+00:00"
         },
         {
             "name": "doctrine/lexer",
@@ -1582,16 +1580,16 @@
         },
         {
             "name": "dompdf/dompdf",
-            "version": "v3.0.0",
+            "version": "v3.0.1",
             "source": {
                 "type": "git",
                 "url": "https://github.com/dompdf/dompdf.git",
-                "reference": "fbc7c5ee5d94f7a910b78b43feb7931b7f971b59"
+                "reference": "2d622faf9aa1f8f7f24dd094e49b5cf6c0c5d4e6"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/dompdf/dompdf/zipball/fbc7c5ee5d94f7a910b78b43feb7931b7f971b59",
-                "reference": "fbc7c5ee5d94f7a910b78b43feb7931b7f971b59",
+                "url": "https://api.github.com/repos/dompdf/dompdf/zipball/2d622faf9aa1f8f7f24dd094e49b5cf6c0c5d4e6",
+                "reference": "2d622faf9aa1f8f7f24dd094e49b5cf6c0c5d4e6",
                 "shasum": ""
             },
             "require": {
@@ -1640,22 +1638,22 @@
             "homepage": "https://github.com/dompdf/dompdf",
             "support": {
                 "issues": "https://github.com/dompdf/dompdf/issues",
-                "source": "https://github.com/dompdf/dompdf/tree/v3.0.0"
+                "source": "https://github.com/dompdf/dompdf/tree/v3.0.1"
             },
-            "time": "2024-04-29T14:01:28+00:00"
+            "time": "2024-12-05T14:59:38+00:00"
         },
         {
             "name": "dompdf/php-font-lib",
-            "version": "1.0.0",
+            "version": "1.0.1",
             "source": {
                 "type": "git",
                 "url": "https://github.com/dompdf/php-font-lib.git",
-                "reference": "991d6a954f6bbd7e41022198f00586b230731441"
+                "reference": "6137b7d4232b7f16c882c75e4ca3991dbcf6fe2d"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/dompdf/php-font-lib/zipball/991d6a954f6bbd7e41022198f00586b230731441",
-                "reference": "991d6a954f6bbd7e41022198f00586b230731441",
+                "url": "https://api.github.com/repos/dompdf/php-font-lib/zipball/6137b7d4232b7f16c882c75e4ca3991dbcf6fe2d",
+                "reference": "6137b7d4232b7f16c882c75e4ca3991dbcf6fe2d",
                 "shasum": ""
             },
             "require": {
@@ -1685,9 +1683,9 @@
             "homepage": "https://github.com/dompdf/php-font-lib",
             "support": {
                 "issues": "https://github.com/dompdf/php-font-lib/issues",
-                "source": "https://github.com/dompdf/php-font-lib/tree/1.0.0"
+                "source": "https://github.com/dompdf/php-font-lib/tree/1.0.1"
             },
-            "time": "2024-04-29T13:40:38+00:00"
+            "time": "2024-12-02T14:37:59+00:00"
         },
         {
             "name": "dompdf/php-svg-lib",
@@ -1930,17 +1928,17 @@
         },
         {
             "name": "drupal/autologout",
-            "version": "2.0.0",
+            "version": "2.0.1",
             "source": {
                 "type": "git",
                 "url": "https://git.drupalcode.org/project/autologout.git",
-                "reference": "2.0.0"
+                "reference": "2.0.1"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://ftp.drupal.org/files/projects/autologout-2.0.0.zip",
-                "reference": "2.0.0",
-                "shasum": "e9a1d4846cc323eef2eb54a0276023b1f0ff8bd2"
+                "url": "https://ftp.drupal.org/files/projects/autologout-2.0.1.zip",
+                "reference": "2.0.1",
+                "shasum": "61407ffa8b857b1e5d22d03ededac94b5119bd60"
             },
             "require": {
                 "drupal/core": "^9.2 || ^10 || ^11",
@@ -1949,8 +1947,8 @@
             "type": "drupal-module",
             "extra": {
                 "drupal": {
-                    "version": "2.0.0",
-                    "datestamp": "1716413762",
+                    "version": "2.0.1",
+                    "datestamp": "1732235105",
                     "security-coverage": {
                         "status": "covered",
                         "message": "Covered by Drupal's security advisory policy"
@@ -2335,7 +2333,7 @@
                     "homepage": "https://www.drupal.org/user/32494"
                 },
                 {
-                    "name": "Olarin",
+                    "name": "olarin",
                     "homepage": "https://www.drupal.org/user/334773"
                 },
                 {
@@ -2525,16 +2523,16 @@
         },
         {
             "name": "drupal/core",
-            "version": "10.3.9",
+            "version": "10.3.10",
             "source": {
                 "type": "git",
                 "url": "https://github.com/drupal/core.git",
-                "reference": "42a6516491b4793158542a2326dc6ad1fe2aa5bd"
+                "reference": "3ebb71e9c4ef0c13f683353547551fca49f9a144"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/drupal/core/zipball/42a6516491b4793158542a2326dc6ad1fe2aa5bd",
-                "reference": "42a6516491b4793158542a2326dc6ad1fe2aa5bd",
+                "url": "https://api.github.com/repos/drupal/core/zipball/3ebb71e9c4ef0c13f683353547551fca49f9a144",
+                "reference": "3ebb71e9c4ef0c13f683353547551fca49f9a144",
                 "shasum": ""
             },
             "require": {
@@ -2618,29 +2616,29 @@
             "extra": {
                 "drupal-scaffold": {
                     "file-mapping": {
-                        "[project-root]/.editorconfig": "assets/scaffold/files/editorconfig",
-                        "[project-root]/.gitattributes": "assets/scaffold/files/gitattributes",
-                        "[web-root]/.csslintrc": "assets/scaffold/files/csslintrc",
-                        "[web-root]/.eslintignore": "assets/scaffold/files/eslintignore",
-                        "[web-root]/.eslintrc.json": "assets/scaffold/files/eslintrc.json",
-                        "[web-root]/.ht.router.php": "assets/scaffold/files/ht.router.php",
                         "[web-root]/.htaccess": "assets/scaffold/files/htaccess",
-                        "[web-root]/example.gitignore": "assets/scaffold/files/example.gitignore",
-                        "[web-root]/index.php": "assets/scaffold/files/index.php",
-                        "[web-root]/INSTALL.txt": "assets/scaffold/files/drupal.INSTALL.txt",
                         "[web-root]/README.md": "assets/scaffold/files/drupal.README.md",
+                        "[web-root]/index.php": "assets/scaffold/files/index.php",
+                        "[web-root]/.csslintrc": "assets/scaffold/files/csslintrc",
                         "[web-root]/robots.txt": "assets/scaffold/files/robots.txt",
                         "[web-root]/update.php": "assets/scaffold/files/update.php",
                         "[web-root]/web.config": "assets/scaffold/files/web.config",
+                        "[web-root]/INSTALL.txt": "assets/scaffold/files/drupal.INSTALL.txt",
+                        "[web-root]/.eslintignore": "assets/scaffold/files/eslintignore",
+                        "[web-root]/.eslintrc.json": "assets/scaffold/files/eslintrc.json",
+                        "[web-root]/.ht.router.php": "assets/scaffold/files/ht.router.php",
                         "[web-root]/sites/README.txt": "assets/scaffold/files/sites.README.txt",
+                        "[project-root]/.editorconfig": "assets/scaffold/files/editorconfig",
+                        "[web-root]/example.gitignore": "assets/scaffold/files/example.gitignore",
+                        "[web-root]/themes/README.txt": "assets/scaffold/files/themes.README.txt",
+                        "[project-root]/.gitattributes": "assets/scaffold/files/gitattributes",
+                        "[web-root]/modules/README.txt": "assets/scaffold/files/modules.README.txt",
+                        "[web-root]/profiles/README.txt": "assets/scaffold/files/profiles.README.txt",
+                        "[web-root]/sites/example.sites.php": "assets/scaffold/files/example.sites.php",
                         "[web-root]/sites/development.services.yml": "assets/scaffold/files/development.services.yml",
                         "[web-root]/sites/example.settings.local.php": "assets/scaffold/files/example.settings.local.php",
-                        "[web-root]/sites/example.sites.php": "assets/scaffold/files/example.sites.php",
                         "[web-root]/sites/default/default.services.yml": "assets/scaffold/files/default.services.yml",
-                        "[web-root]/sites/default/default.settings.php": "assets/scaffold/files/default.settings.php",
-                        "[web-root]/modules/README.txt": "assets/scaffold/files/modules.README.txt",
-                        "[web-root]/profiles/README.txt": "assets/scaffold/files/profiles.README.txt",
-                        "[web-root]/themes/README.txt": "assets/scaffold/files/themes.README.txt"
+                        "[web-root]/sites/default/default.settings.php": "assets/scaffold/files/default.settings.php"
                     }
                 }
             },
@@ -2683,13 +2681,13 @@
             ],
             "description": "Drupal is an open source content management platform powering millions of websites and applications.",
             "support": {
-                "source": "https://github.com/drupal/core/tree/10.3.9"
+                "source": "https://github.com/drupal/core/tree/10.3.10"
             },
-            "time": "2024-11-20T17:59:45+00:00"
+            "time": "2024-11-22T12:51:33+00:00"
         },
         {
             "name": "drupal/core-composer-scaffold",
-            "version": "10.3.9",
+            "version": "10.3.10",
             "source": {
                 "type": "git",
                 "url": "https://github.com/drupal/core-composer-scaffold.git",
@@ -2733,22 +2731,22 @@
                 "drupal"
             ],
             "support": {
-                "source": "https://github.com/drupal/core-composer-scaffold/tree/10.3.9"
+                "source": "https://github.com/drupal/core-composer-scaffold/tree/10.3.10"
             },
             "time": "2024-08-22T14:31:34+00:00"
         },
         {
             "name": "drupal/core-recommended",
-            "version": "10.3.9",
+            "version": "10.3.10",
             "source": {
                 "type": "git",
                 "url": "https://github.com/drupal/core-recommended.git",
-                "reference": "03da2860a10c12b86714e778178433b620bb890d"
+                "reference": "1d739e569c9324bcac1ecc7be600d414386a399b"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/drupal/core-recommended/zipball/03da2860a10c12b86714e778178433b620bb890d",
-                "reference": "03da2860a10c12b86714e778178433b620bb890d",
+                "url": "https://api.github.com/repos/drupal/core-recommended/zipball/1d739e569c9324bcac1ecc7be600d414386a399b",
+                "reference": "1d739e569c9324bcac1ecc7be600d414386a399b",
                 "shasum": ""
             },
             "require": {
@@ -2757,7 +2755,7 @@
                 "doctrine/annotations": "~1.14.3",
                 "doctrine/deprecations": "~1.1.3",
                 "doctrine/lexer": "~2.1.1",
-                "drupal/core": "10.3.9",
+                "drupal/core": "10.3.10",
                 "egulias/email-validator": "~4.0.2",
                 "guzzlehttp/guzzle": "~7.8.1",
                 "guzzlehttp/promises": "~2.0.2",
@@ -2818,9 +2816,9 @@
             ],
             "description": "Core and its dependencies with known-compatible minor versions. Require this project INSTEAD OF drupal/core.",
             "support": {
-                "source": "https://github.com/drupal/core-recommended/tree/10.3.9"
+                "source": "https://github.com/drupal/core-recommended/tree/10.3.10"
             },
-            "time": "2024-11-20T17:59:45+00:00"
+            "time": "2024-11-22T12:51:33+00:00"
         },
         {
             "name": "drupal/csv_serialization",
@@ -3407,26 +3405,26 @@
         },
         {
             "name": "drupal/editor_file",
-            "version": "2.0.0-rc1",
+            "version": "2.0.0-rc2",
             "source": {
                 "type": "git",
                 "url": "https://git.drupalcode.org/project/editor_file.git",
-                "reference": "2.0.0-rc1"
+                "reference": "2.0.0-rc2"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://ftp.drupal.org/files/projects/editor_file-2.0.0-rc1.zip",
-                "reference": "2.0.0-rc1",
-                "shasum": "bd0381d44cf582f9a3b2dab9267c2a97a809c6c3"
+                "url": "https://ftp.drupal.org/files/projects/editor_file-2.0.0-rc2.zip",
+                "reference": "2.0.0-rc2",
+                "shasum": "8389fed36294df09d38c528dd1e7ee829ce67145"
             },
             "require": {
-                "drupal/core": "^9.4 || ^10"
+                "drupal/core": "^10 || ^11"
             },
             "type": "drupal-module",
             "extra": {
                 "drupal": {
-                    "version": "2.0.0-rc1",
-                    "datestamp": "1705484426",
+                    "version": "2.0.0-rc2",
+                    "datestamp": "1732012868",
                     "security-coverage": {
                         "status": "not-covered",
                         "message": "RC releases are not covered by Drupal security advisories."
@@ -3439,15 +3437,14 @@
             ],
             "authors": [
                 {
-                    "name": "DuaelFr",
+                    "name": "duaelfr",
                     "homepage": "https://www.drupal.org/user/931394"
                 }
             ],
             "description": "Allow users to link uploaded files in the text Editor.",
             "homepage": "https://www.drupal.org/project/editor_file",
             "support": {
-                "source": "https://git.drupalcode.org/project/editor_file",
-                "issues": "https://www.drupal.org/project/issues/editor_file"
+                "source": "https://git.drupalcode.org/project/editor_file"
             }
         },
         {
@@ -3817,7 +3814,7 @@
             ],
             "authors": [
                 {
-                    "name": "Berdir",
+                    "name": "berdir",
                     "homepage": "https://www.drupal.org/user/214652"
                 },
                 {
@@ -3841,17 +3838,17 @@
         },
         {
             "name": "drupal/entityqueue",
-            "version": "1.8.0",
+            "version": "1.9.0",
             "source": {
                 "type": "git",
                 "url": "https://git.drupalcode.org/project/entityqueue.git",
-                "reference": "8.x-1.8"
+                "reference": "8.x-1.9"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://ftp.drupal.org/files/projects/entityqueue-8.x-1.8.zip",
-                "reference": "8.x-1.8",
-                "shasum": "394dc532a915345ac0c0393b62dd160e35f2cd92"
+                "url": "https://ftp.drupal.org/files/projects/entityqueue-8.x-1.9.zip",
+                "reference": "8.x-1.9",
+                "shasum": "96c62b4e8398e0bd82199c938da986b43e015666"
             },
             "require": {
                 "drupal/core": "^9 || ^10 || ^11"
@@ -3859,8 +3856,8 @@
             "type": "drupal-module",
             "extra": {
                 "drupal": {
-                    "version": "8.x-1.8",
-                    "datestamp": "1717148266",
+                    "version": "8.x-1.9",
+                    "datestamp": "1733392707",
                     "security-coverage": {
                         "status": "covered",
                         "message": "Covered by Drupal's security advisory policy"
@@ -4011,28 +4008,30 @@
         },
         {
             "name": "drupal/facets",
-            "version": "3.0.0-beta1",
+            "version": "3.0.0-beta4",
             "source": {
                 "type": "git",
                 "url": "https://git.drupalcode.org/project/facets.git",
-                "reference": "3.0.0-beta1"
+                "reference": "3.0.0-beta4"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://ftp.drupal.org/files/projects/facets-3.0.0-beta1.zip",
-                "reference": "3.0.0-beta1",
-                "shasum": "788ab7515e2e6aabd0e34c1ce54c29648c738b45"
+                "url": "https://ftp.drupal.org/files/projects/facets-3.0.0-beta4.zip",
+                "reference": "3.0.0-beta4",
+                "shasum": "949eef98b4b5d450a8a81bda2030583567dfb52d"
             },
             "require": {
-                "drupal/core": "^9.3 || ^10.0"
+                "drupal/core": "^10.1 || ^11"
             },
             "conflict": {
-                "drupal/search_api": "<1.14"
+                "drupal/core": "<10.1.0",
+                "drupal/search_api": "<1.30"
             },
             "require-dev": {
-                "drupal/jquery_ui_slider": "~2.0",
-                "drupal/jquery_ui_touch_punch": "~1.1",
-                "drupal/search_api": "^1.28||1.x-dev"
+                "drupal/better_exposed_filters": "*",
+                "drupal/jquery_ui_slider": "^2.1",
+                "drupal/jquery_ui_touch_punch": "^1.1",
+                "drupal/search_api": "1.x-dev"
             },
             "suggest": {
                 "drupal/better_exposed_filters": "Required for AJAX support for facets rendered as views exposed filters",
@@ -4042,8 +4041,8 @@
             "type": "drupal-module",
             "extra": {
                 "drupal": {
-                    "version": "3.0.0-beta1",
-                    "datestamp": "1671208547",
+                    "version": "3.0.0-beta4",
+                    "datestamp": "1731954099",
                     "security-coverage": {
                         "status": "not-covered",
                         "message": "Beta releases are not covered by Drupal security advisories."
@@ -4052,7 +4051,7 @@
             },
             "notification-url": "https://packages.drupal.org/8/downloads",
             "license": [
-                "GPL-2.0+"
+                "GPL-2.0-or-later"
             ],
             "authors": [
                 {
@@ -4079,7 +4078,7 @@
             "description": "The Facet module allows site builders to easily create and manage faceted search interfaces.",
             "homepage": "https://www.drupal.org/project/facets",
             "support": {
-                "source": "git://git.drupal.org/project/facets.git",
+                "source": "https://git.drupalcode.org/project/facets.git",
                 "issues": "https://www.drupal.org/project/issues/facets",
                 "irc": "irc://irc.freenode.org/drupal-search-api"
             }
@@ -4626,17 +4625,17 @@
         },
         {
             "name": "drupal/geocoder",
-            "version": "4.25.0",
+            "version": "4.26.0",
             "source": {
                 "type": "git",
                 "url": "https://git.drupalcode.org/project/geocoder.git",
-                "reference": "8.x-4.25"
+                "reference": "8.x-4.26"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://ftp.drupal.org/files/projects/geocoder-8.x-4.25.zip",
-                "reference": "8.x-4.25",
-                "shasum": "f62dcbdb3c27a266aed92f78c6b861ffaa391ff0"
+                "url": "https://ftp.drupal.org/files/projects/geocoder-8.x-4.26.zip",
+                "reference": "8.x-4.26",
+                "shasum": "6681f565880da40341aa90b7e2df18bb1978fc96"
             },
             "require": {
                 "davedevelopment/stiphle": "^0.9.2",
@@ -4680,8 +4679,8 @@
             "type": "drupal-module",
             "extra": {
                 "drupal": {
-                    "version": "8.x-4.25",
-                    "datestamp": "1722204762",
+                    "version": "8.x-4.26",
+                    "datestamp": "1733783003",
                     "security-coverage": {
                         "status": "covered",
                         "message": "Covered by Drupal's security advisory policy"
@@ -4722,17 +4721,17 @@
         },
         {
             "name": "drupal/geofield",
-            "version": "1.61.0",
+            "version": "1.62.0",
             "source": {
                 "type": "git",
                 "url": "https://git.drupalcode.org/project/geofield.git",
-                "reference": "8.x-1.61"
+                "reference": "8.x-1.62"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://ftp.drupal.org/files/projects/geofield-8.x-1.61.zip",
-                "reference": "8.x-1.61",
-                "shasum": "b204f101ee536597b9c293f66f75102d6ea2d268"
+                "url": "https://ftp.drupal.org/files/projects/geofield-8.x-1.62.zip",
+                "reference": "8.x-1.62",
+                "shasum": "0d5a59c934c96f38dcf2742f6d715316b695ec7e"
             },
             "require": {
                 "drupal/core": "^9 || ^10 || ^11",
@@ -4745,8 +4744,8 @@
             "type": "drupal-module",
             "extra": {
                 "drupal": {
-                    "version": "8.x-1.61",
-                    "datestamp": "1725441883",
+                    "version": "8.x-1.62",
+                    "datestamp": "1730931913",
                     "security-coverage": {
                         "status": "covered",
                         "message": "Covered by Drupal's security advisory policy"
@@ -5460,17 +5459,17 @@
         },
         {
             "name": "drupal/layout_paragraphs",
-            "version": "2.1.0",
+            "version": "2.1.1",
             "source": {
                 "type": "git",
                 "url": "https://git.drupalcode.org/project/layout_paragraphs.git",
-                "reference": "2.1.0"
+                "reference": "2.1.1"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://ftp.drupal.org/files/projects/layout_paragraphs-2.1.0.zip",
-                "reference": "2.1.0",
-                "shasum": "499d68d48f1a92d6620f9d3fd781122a95ed92bc"
+                "url": "https://ftp.drupal.org/files/projects/layout_paragraphs-2.1.1.zip",
+                "reference": "2.1.1",
+                "shasum": "6fc90954c67939933a6eb24000892822715e4f90"
             },
             "require": {
                 "drupal/core": "^10 || ^11",
@@ -5484,8 +5483,8 @@
             "type": "drupal-module",
             "extra": {
                 "drupal": {
-                    "version": "2.1.0",
-                    "datestamp": "1724879054",
+                    "version": "2.1.1",
+                    "datestamp": "1732724895",
                     "security-coverage": {
                         "status": "covered",
                         "message": "Covered by Drupal's security advisory policy"
@@ -5625,11 +5624,11 @@
                     "homepage": "https://www.drupal.org/user/1321830"
                 },
                 {
-                    "name": "Les Lim",
+                    "name": "les lim",
                     "homepage": "https://www.drupal.org/user/84263"
                 },
                 {
-                    "name": "Manuel Garcia",
+                    "name": "manuel garcia",
                     "homepage": "https://www.drupal.org/user/213194"
                 },
                 {
@@ -5649,7 +5648,7 @@
                     "homepage": "https://www.drupal.org/user/3326031"
                 },
                 {
-                    "name": "TR",
+                    "name": "tr",
                     "homepage": "https://www.drupal.org/user/202830"
                 }
             ],
@@ -5754,7 +5753,7 @@
                     "homepage": "https://www.drupal.org/user/1037976"
                 },
                 {
-                    "name": "Fabianx",
+                    "name": "fabianx",
                     "homepage": "https://www.drupal.org/user/693738"
                 },
                 {
@@ -5762,7 +5761,7 @@
                     "homepage": "https://www.drupal.org/user/45640"
                 },
                 {
-                    "name": "Jeremy",
+                    "name": "jeremy",
                     "homepage": "https://www.drupal.org/user/409"
                 },
                 {
@@ -5770,7 +5769,7 @@
                     "homepage": "https://www.drupal.org/user/2375"
                 },
                 {
-                    "name": "robertDouglass",
+                    "name": "robertdouglass",
                     "homepage": "https://www.drupal.org/user/5449"
                 }
             ],
@@ -6217,17 +6216,17 @@
         },
         {
             "name": "drupal/metatag",
-            "version": "2.0.2",
+            "version": "2.1.0",
             "source": {
                 "type": "git",
                 "url": "https://git.drupalcode.org/project/metatag.git",
-                "reference": "2.0.2"
+                "reference": "2.1.0"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://ftp.drupal.org/files/projects/metatag-2.0.2.zip",
-                "reference": "2.0.2",
-                "shasum": "748013c50a0ed5e10359413bb3481392a0bf0d3f"
+                "url": "https://ftp.drupal.org/files/projects/metatag-2.1.0.zip",
+                "reference": "2.1.0",
+                "shasum": "c28fe2fdac68a9370a6af6cbafff4425dd5148f3"
             },
             "require": {
                 "drupal/core": "^9.4 || ^10 || ^11",
@@ -6235,6 +6234,7 @@
                 "php": ">=8.0"
             },
             "require-dev": {
+                "drupal/forum": "*",
                 "drupal/hal": "^1 || ^2 || ^9",
                 "drupal/metatag_dc": "*",
                 "drupal/metatag_open_graph": "*",
@@ -6246,8 +6246,8 @@
             "type": "drupal-module",
             "extra": {
                 "drupal": {
-                    "version": "2.0.2",
-                    "datestamp": "1722869772",
+                    "version": "2.1.0",
+                    "datestamp": "1731004042",
                     "security-coverage": {
                         "status": "covered",
                         "message": "Covered by Drupal's security advisory policy"
@@ -6691,7 +6691,7 @@
             ],
             "authors": [
                 {
-                    "name": "Antonnavi",
+                    "name": "antonnavi",
                     "homepage": "https://www.drupal.org/user/875410"
                 }
             ],
@@ -6823,7 +6823,7 @@
             ],
             "authors": [
                 {
-                    "name": "Berdir",
+                    "name": "berdir",
                     "homepage": "https://www.drupal.org/user/214652"
                 },
                 {
@@ -6843,7 +6843,7 @@
                     "homepage": "https://www.drupal.org/user/227761"
                 },
                 {
-                    "name": "Primsi",
+                    "name": "primsi",
                     "homepage": "https://www.drupal.org/user/282629"
                 }
             ],
@@ -7081,7 +7081,11 @@
                     "homepage": "https://www.drupal.org/user/99012"
                 },
                 {
-                    "name": "Sheldon Rampton",
+                    "name": "mably",
+                    "homepage": "https://www.drupal.org/user/3375160"
+                },
+                {
+                    "name": "sheldon rampton",
                     "homepage": "https://www.drupal.org/user/13085"
                 },
                 {
@@ -7703,27 +7707,27 @@
         },
         {
             "name": "drupal/replicate_ui",
-            "version": "1.1.0",
+            "version": "1.2.0",
             "source": {
                 "type": "git",
                 "url": "https://git.drupalcode.org/project/replicate_ui.git",
-                "reference": "8.x-1.1"
+                "reference": "8.x-1.2"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://ftp.drupal.org/files/projects/replicate_ui-8.x-1.1.zip",
-                "reference": "8.x-1.1",
-                "shasum": "fade816b12a76df62621c363264e18ae17ee99e2"
+                "url": "https://ftp.drupal.org/files/projects/replicate_ui-8.x-1.2.zip",
+                "reference": "8.x-1.2",
+                "shasum": "b9eed2578e341a844370e5ab4542950bf150f0d5"
             },
             "require": {
-                "drupal/core": "^9 || ^10",
+                "drupal/core": "^10.1 || ^11",
                 "drupal/replicate": "^1.0"
             },
             "type": "drupal-module",
             "extra": {
                 "drupal": {
-                    "version": "8.x-1.1",
-                    "datestamp": "1679704077",
+                    "version": "8.x-1.2",
+                    "datestamp": "1732358026",
                     "security-coverage": {
                         "status": "covered",
                         "message": "Covered by Drupal's security advisory policy"
@@ -7736,7 +7740,7 @@
             ],
             "authors": [
                 {
-                    "name": "Berdir",
+                    "name": "berdir",
                     "homepage": "https://www.drupal.org/user/214652"
                 },
                 {
@@ -8053,20 +8057,20 @@
         },
         {
             "name": "drupal/search_api",
-            "version": "1.35.0",
+            "version": "1.37.0",
             "source": {
                 "type": "git",
                 "url": "https://git.drupalcode.org/project/search_api.git",
-                "reference": "8.x-1.35"
+                "reference": "8.x-1.37"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://ftp.drupal.org/files/projects/search_api-8.x-1.35.zip",
-                "reference": "8.x-1.35",
-                "shasum": "d119726e870f793c6470d2a4fa9286662c5eb45d"
+                "url": "https://ftp.drupal.org/files/projects/search_api-8.x-1.37.zip",
+                "reference": "8.x-1.37",
+                "shasum": "76d9b5850d7fce9df8fc6cf8c49450ab541f455d"
             },
             "require": {
-                "drupal/core": "^10.1 || ^11"
+                "drupal/core": "^10.2 || ^11"
             },
             "conflict": {
                 "drupal/search_api_solr": "2.* || 3.0 || 3.1"
@@ -8084,17 +8088,12 @@
             "type": "drupal-module",
             "extra": {
                 "drupal": {
-                    "version": "8.x-1.35",
-                    "datestamp": "1718551025",
+                    "version": "8.x-1.37",
+                    "datestamp": "1732727356",
                     "security-coverage": {
                         "status": "covered",
                         "message": "Covered by Drupal's security advisory policy"
                     }
-                },
-                "drush": {
-                    "services": {
-                        "drush.services.yml": "^9 || ^10 || ^11"
-                    }
                 }
             },
             "notification-url": "https://packages.drupal.org/8/downloads",
@@ -8179,24 +8178,24 @@
         },
         {
             "name": "drupal/search_api_solr",
-            "version": "4.3.5",
+            "version": "4.3.7",
             "source": {
                 "type": "git",
                 "url": "https://git.drupalcode.org/project/search_api_solr.git",
-                "reference": "4.3.5"
+                "reference": "4.3.7"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://ftp.drupal.org/files/projects/search_api_solr-4.3.5.zip",
-                "reference": "4.3.5",
-                "shasum": "c784ebc822c95f54bbfbf7b6cb1c369142f13311"
+                "url": "https://ftp.drupal.org/files/projects/search_api_solr-4.3.7.zip",
+                "reference": "4.3.7",
+                "shasum": "c2c6256c13b2ae6353ad52b5605378fa380d320c"
             },
             "require": {
                 "composer-runtime-api": ">=2.0",
                 "composer/semver": "^1.0|^3.0",
                 "consolidation/annotated-command": "^2.12|^4.1",
                 "drupal/core": "^10.2 || ^11.0",
-                "drupal/search_api": "~1.34",
+                "drupal/search_api": "^1.37|1.x-dev",
                 "ext-dom": "*",
                 "ext-json": "*",
                 "ext-simplexml": "*",
@@ -8228,8 +8227,8 @@
             "type": "drupal-module",
             "extra": {
                 "drupal": {
-                    "version": "4.3.5",
-                    "datestamp": "1722332547",
+                    "version": "4.3.7",
+                    "datestamp": "1732718666",
                     "security-coverage": {
                         "status": "covered",
                         "message": "Covered by Drupal's security advisory policy"
@@ -8388,36 +8387,37 @@
         },
         {
             "name": "drupal/simple_sitemap",
-            "version": "4.2.1",
+            "version": "4.2.2",
             "source": {
                 "type": "git",
                 "url": "https://git.drupalcode.org/project/simple_sitemap.git",
-                "reference": "4.2.1"
+                "reference": "4.2.2"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://ftp.drupal.org/files/projects/simple_sitemap-4.2.1.zip",
-                "reference": "4.2.1",
-                "shasum": "d96b481571ca2fecdb305e87d2557f9338116864"
+                "url": "https://ftp.drupal.org/files/projects/simple_sitemap-4.2.2.zip",
+                "reference": "4.2.2",
+                "shasum": "1f9c9197d37450fb347a4fa3f10191f5f4b5ef13"
             },
             "require": {
                 "drupal/core": "^10.2 || ^11",
                 "ext-xmlwriter": "*"
             },
+            "conflict": {
+                "drush/drush": "<12.5.1"
+            },
+            "require-dev": {
+                "drupal/paragraphs": "^1.18"
+            },
             "type": "drupal-module",
             "extra": {
                 "drupal": {
-                    "version": "4.2.1",
-                    "datestamp": "1723802052",
+                    "version": "4.2.2",
+                    "datestamp": "1732485885",
                     "security-coverage": {
                         "status": "covered",
                         "message": "Covered by Drupal's security advisory policy"
                     }
-                },
-                "drush": {
-                    "services": {
-                        "drush.services.yml": ">=9"
-                    }
                 }
             },
             "notification-url": "https://packages.drupal.org/8/downloads",
@@ -8487,6 +8487,10 @@
                     "homepage": "https://www.drupal.org/user/1988434",
                     "email": "chris@chrissnyder.org",
                     "role": "Maintainer"
+                },
+                {
+                    "name": "smustgrave",
+                    "homepage": "https://www.drupal.org/user/3252890"
                 }
             ],
             "description": "Provides ability to display an alert message at the top of all pages.",
@@ -8833,17 +8837,17 @@
         },
         {
             "name": "drupal/svg_image",
-            "version": "3.1.0",
+            "version": "3.2.0",
             "source": {
                 "type": "git",
                 "url": "https://git.drupalcode.org/project/svg_image.git",
-                "reference": "3.1.0"
+                "reference": "3.2.0"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://ftp.drupal.org/files/projects/svg_image-3.1.0.zip",
-                "reference": "3.1.0",
-                "shasum": "edb3038bf21c327706793cd1328a1734a7db48e6"
+                "url": "https://ftp.drupal.org/files/projects/svg_image-3.2.0.zip",
+                "reference": "3.2.0",
+                "shasum": "d55ef2bc3b751b8ce3f33485216c38cfbfb076b2"
             },
             "require": {
                 "drupal/core": "^10.3 || ^11",
@@ -8852,8 +8856,8 @@
             "type": "drupal-module",
             "extra": {
                 "drupal": {
-                    "version": "3.1.0",
-                    "datestamp": "1727351323",
+                    "version": "3.2.0",
+                    "datestamp": "1733298643",
                     "security-coverage": {
                         "status": "covered",
                         "message": "Covered by Drupal's security advisory policy"
@@ -8990,17 +8994,17 @@
         },
         {
             "name": "drupal/tmgmt",
-            "version": "1.16.0",
+            "version": "1.17.0",
             "source": {
                 "type": "git",
                 "url": "https://git.drupalcode.org/project/tmgmt.git",
-                "reference": "8.x-1.16"
+                "reference": "8.x-1.17"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://ftp.drupal.org/files/projects/tmgmt-8.x-1.16.zip",
-                "reference": "8.x-1.16",
-                "shasum": "70166f2b5fe42b1beadacfdf59041706385c7c88"
+                "url": "https://ftp.drupal.org/files/projects/tmgmt-8.x-1.17.zip",
+                "reference": "8.x-1.17",
+                "shasum": "83d9796a0e5219cf6fc752d8db8ecadc81550f34"
             },
             "require": {
                 "drupal/core": "^10.2 || ^11"
@@ -9019,8 +9023,8 @@
             "type": "drupal-module",
             "extra": {
                 "drupal": {
-                    "version": "8.x-1.16",
-                    "datestamp": "1727678120",
+                    "version": "8.x-1.17",
+                    "datestamp": "1731630348",
                     "security-coverage": {
                         "status": "covered",
                         "message": "Covered by Drupal's security advisory policy"
@@ -9057,7 +9061,7 @@
                     "homepage": "https://www.drupal.org/user/227761"
                 },
                 {
-                    "name": "Schnitzel",
+                    "name": "schnitzel",
                     "homepage": "https://www.drupal.org/user/643820"
                 },
                 {
@@ -9073,20 +9077,20 @@
         },
         {
             "name": "drupal/tmgmt_ec_etranslation",
-            "version": "1.1.0",
+            "version": "1.1.1",
             "source": {
                 "type": "git",
                 "url": "https://git.drupalcode.org/project/tmgmt_ec_etranslation.git",
-                "reference": "1.1.0"
+                "reference": "1.1.1"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://ftp.drupal.org/files/projects/tmgmt_ec_etranslation-1.1.0.zip",
-                "reference": "1.1.0",
-                "shasum": "017703c1d307a53983140a1b3b090cd934ff4da3"
+                "url": "https://ftp.drupal.org/files/projects/tmgmt_ec_etranslation-1.1.1.zip",
+                "reference": "1.1.1",
+                "shasum": "611bdaaac233da5b25c1aa1095a53778182c321a"
             },
             "require": {
-                "drupal/core": "^9.2 || ^10",
+                "drupal/core": "^9.2 || ^10 || ^11",
                 "drupal/tmgmt": "^1.5",
                 "php": ">=8.0"
             },
@@ -9096,8 +9100,8 @@
             "type": "drupal-module",
             "extra": {
                 "drupal": {
-                    "version": "1.1.0",
-                    "datestamp": "1725891728",
+                    "version": "1.1.1",
+                    "datestamp": "1732198577",
                     "security-coverage": {
                         "status": "covered",
                         "message": "Covered by Drupal's security advisory policy"
@@ -9632,22 +9636,25 @@
         },
         {
             "name": "drupal/views_data_export",
-            "version": "1.4.0",
+            "version": "1.5.0",
             "source": {
                 "type": "git",
                 "url": "https://git.drupalcode.org/project/views_data_export.git",
-                "reference": "8.x-1.4"
+                "reference": "8.x-1.5"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://ftp.drupal.org/files/projects/views_data_export-8.x-1.4.zip",
-                "reference": "8.x-1.4",
-                "shasum": "70dede9fdf50601232f068e67309d361341e88c5"
+                "url": "https://ftp.drupal.org/files/projects/views_data_export-8.x-1.5.zip",
+                "reference": "8.x-1.5",
+                "shasum": "2664bd52dd47b068dec60eecd3c6fc73f2d6c1b8"
             },
             "require": {
-                "drupal/core": "^9 || ^10",
+                "drupal/core": "^9 || ^10 || ^11",
                 "drupal/csv_serialization": "~1.4 || ~2.0 || ~3 || ~4"
             },
+            "conflict": {
+                "phpoffice/phpspreadsheet": "<1.23.0"
+            },
             "require-dev": {
                 "drupal/search_api": "~1.12",
                 "drupal/xls_serialization": "~1.0"
@@ -9655,8 +9662,8 @@
             "type": "drupal-module",
             "extra": {
                 "drupal": {
-                    "version": "8.x-1.4",
-                    "datestamp": "1698948991",
+                    "version": "8.x-1.5",
+                    "datestamp": "1732280381",
                     "security-coverage": {
                         "status": "covered",
                         "message": "Covered by Drupal's security advisory policy"
@@ -9665,7 +9672,7 @@
             },
             "notification-url": "https://packages.drupal.org/8/downloads",
             "license": [
-                "GPL-2.0+"
+                "GPL-2.0-or-later"
             ],
             "authors": [
                 {
@@ -9752,20 +9759,20 @@
         },
         {
             "name": "drupal/webform",
-            "version": "6.2.7",
+            "version": "6.2.9",
             "source": {
                 "type": "git",
                 "url": "https://git.drupalcode.org/project/webform.git",
-                "reference": "6.2.7"
+                "reference": "6.2.9"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://ftp.drupal.org/files/projects/webform-6.2.7.zip",
-                "reference": "6.2.7",
-                "shasum": "7e0520773f2521d70837371b08e09a13704b4274"
+                "url": "https://ftp.drupal.org/files/projects/webform-6.2.9.zip",
+                "reference": "6.2.9",
+                "shasum": "650752c3cc6d0144c6f378b8d25d45c083e23600"
             },
             "require": {
-                "drupal/core": "^10.1",
+                "drupal/core": "^10.2",
                 "php": ">=8.1"
             },
             "require-dev": {
@@ -9812,8 +9819,8 @@
             "type": "drupal-module",
             "extra": {
                 "drupal": {
-                    "version": "6.2.7",
-                    "datestamp": "1721425228",
+                    "version": "6.2.9",
+                    "datestamp": "1733851063",
                     "security-coverage": {
                         "status": "covered",
                         "message": "Covered by Drupal's security advisory policy"
@@ -9864,27 +9871,27 @@
         },
         {
             "name": "drupal/webform_views",
-            "version": "5.4.0",
+            "version": "5.5.0",
             "source": {
                 "type": "git",
                 "url": "https://git.drupalcode.org/project/webform_views.git",
-                "reference": "8.x-5.4"
+                "reference": "8.x-5.5"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://ftp.drupal.org/files/projects/webform_views-8.x-5.4.zip",
-                "reference": "8.x-5.4",
-                "shasum": "7fb229b3d0d400d84a7b25af6942872ca9ba8fed"
+                "url": "https://ftp.drupal.org/files/projects/webform_views-8.x-5.5.zip",
+                "reference": "8.x-5.5",
+                "shasum": "308360ef63ee7a362d34a14723d39a276c4a4de5"
             },
             "require": {
-                "drupal/core": "^9.3 || ^10.0",
-                "drupal/webform": "^6.0"
+                "drupal/core": "^10 || ^11",
+                "drupal/webform": "^6.2"
             },
             "type": "drupal-module",
             "extra": {
                 "drupal": {
-                    "version": "8.x-5.4",
-                    "datestamp": "1723680695",
+                    "version": "8.x-5.5",
+                    "datestamp": "1732397784",
                     "security-coverage": {
                         "status": "covered",
                         "message": "Covered by Drupal's security advisory policy"
@@ -9913,7 +9920,7 @@
                     "homepage": "https://www.drupal.org/user/371407"
                 },
                 {
-                    "name": "VladimirAus",
+                    "name": "vladimiraus",
                     "homepage": "https://www.drupal.org/user/673120"
                 },
                 {
@@ -9995,23 +10002,23 @@
                     "sut/libraries/{$name}": [
                         "type:drupal-library"
                     ],
+                    "sut/themes/unish/{$name}": [
+                        "drupal/empty_theme"
+                    ],
+                    "sut/drush/contrib/{$name}": [
+                        "type:drupal-drush"
+                    ],
                     "sut/modules/unish/{$name}": [
                         "drupal/devel"
                     ],
-                    "sut/themes/unish/{$name}": [
-                        "drupal/empty_theme"
+                    "sut/themes/contrib/{$name}": [
+                        "type:drupal-theme"
                     ],
                     "sut/modules/contrib/{$name}": [
                         "type:drupal-module"
                     ],
                     "sut/profiles/contrib/{$name}": [
                         "type:drupal-profile"
-                    ],
-                    "sut/themes/contrib/{$name}": [
-                        "type:drupal-theme"
-                    ],
-                    "sut/drush/contrib/{$name}": [
-                        "type:drupal-drush"
                     ]
                 }
             },
@@ -10383,16 +10390,16 @@
         },
         {
             "name": "grasmash/expander",
-            "version": "3.0.0",
+            "version": "3.0.1",
             "source": {
                 "type": "git",
                 "url": "https://github.com/grasmash/expander.git",
-                "reference": "bb1c1a2430957945cf08c5a62f5d72a6aa6a2c82"
+                "reference": "eea11b9afb0c32483b18b9009f4ca07b770e39f4"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/grasmash/expander/zipball/bb1c1a2430957945cf08c5a62f5d72a6aa6a2c82",
-                "reference": "bb1c1a2430957945cf08c5a62f5d72a6aa6a2c82",
+                "url": "https://api.github.com/repos/grasmash/expander/zipball/eea11b9afb0c32483b18b9009f4ca07b770e39f4",
+                "reference": "eea11b9afb0c32483b18b9009f4ca07b770e39f4",
                 "shasum": ""
             },
             "require": {
@@ -10429,9 +10436,9 @@
             "description": "Expands internal property references in PHP arrays file.",
             "support": {
                 "issues": "https://github.com/grasmash/expander/issues",
-                "source": "https://github.com/grasmash/expander/tree/3.0.0"
+                "source": "https://github.com/grasmash/expander/tree/3.0.1"
             },
-            "time": "2022-05-10T13:14:49+00:00"
+            "time": "2024-11-25T23:28:05+00:00"
         },
         {
             "name": "grasmash/yaml-cli",
@@ -10816,20 +10823,20 @@
         },
         {
             "name": "halaxa/json-machine",
-            "version": "1.1.4",
+            "version": "1.2.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/halaxa/json-machine.git",
-                "reference": "5147f38f74d7ab3e27733e3f3bdabbd2fd28e3fa"
+                "reference": "c889fdff2d5a51affae0033464ff24b0ae936b72"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/halaxa/json-machine/zipball/5147f38f74d7ab3e27733e3f3bdabbd2fd28e3fa",
-                "reference": "5147f38f74d7ab3e27733e3f3bdabbd2fd28e3fa",
+                "url": "https://api.github.com/repos/halaxa/json-machine/zipball/c889fdff2d5a51affae0033464ff24b0ae936b72",
+                "reference": "c889fdff2d5a51affae0033464ff24b0ae936b72",
                 "shasum": ""
             },
             "require": {
-                "php": "7.0 - 8.3"
+                "php": "7.2 - 8.4"
             },
             "require-dev": {
                 "ext-json": "*",
@@ -10843,6 +10850,9 @@
             },
             "type": "library",
             "autoload": {
+                "files": [
+                    "src/functions.php"
+                ],
                 "psr-4": {
                     "JsonMachine\\": "src/"
                 },
@@ -10863,7 +10873,7 @@
             "description": "Efficient, easy-to-use and fast JSON pull parser",
             "support": {
                 "issues": "https://github.com/halaxa/json-machine/issues",
-                "source": "https://github.com/halaxa/json-machine/tree/1.1.4"
+                "source": "https://github.com/halaxa/json-machine/tree/1.2.0"
             },
             "funding": [
                 {
@@ -10871,7 +10881,7 @@
                     "type": "other"
                 }
             ],
-            "time": "2023-11-28T21:12:40+00:00"
+            "time": "2024-11-24T12:48:58+00:00"
         },
         {
             "name": "html2text/html2text",
@@ -10996,16 +11006,16 @@
         },
         {
             "name": "knplabs/github-api",
-            "version": "v3.15.0",
+            "version": "v3.16.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/KnpLabs/php-github-api.git",
-                "reference": "d4b7a1c00e22c1ca32408ecdd4e33c674196b1bc"
+                "reference": "25d7bafd6b0dd088d4850aef7fcc74dc4fba8b28"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/KnpLabs/php-github-api/zipball/d4b7a1c00e22c1ca32408ecdd4e33c674196b1bc",
-                "reference": "d4b7a1c00e22c1ca32408ecdd4e33c674196b1bc",
+                "url": "https://api.github.com/repos/KnpLabs/php-github-api/zipball/25d7bafd6b0dd088d4850aef7fcc74dc4fba8b28",
+                "reference": "25d7bafd6b0dd088d4850aef7fcc74dc4fba8b28",
                 "shasum": ""
             },
             "require": {
@@ -11039,7 +11049,7 @@
             "extra": {
                 "branch-alias": {
                     "dev-2.x": "2.20.x-dev",
-                    "dev-master": "3.14-dev"
+                    "dev-master": "3.15-dev"
                 }
             },
             "autoload": {
@@ -11072,7 +11082,7 @@
             ],
             "support": {
                 "issues": "https://github.com/KnpLabs/php-github-api/issues",
-                "source": "https://github.com/KnpLabs/php-github-api/tree/v3.15.0"
+                "source": "https://github.com/KnpLabs/php-github-api/tree/v3.16.0"
             },
             "funding": [
                 {
@@ -11080,7 +11090,7 @@
                     "type": "github"
                 }
             ],
-            "time": "2024-09-23T19:00:43+00:00"
+            "time": "2024-11-07T19:35:30+00:00"
         },
         {
             "name": "laminas/laminas-stdlib",
@@ -11332,16 +11342,16 @@
         },
         {
             "name": "league/container",
-            "version": "4.2.3",
+            "version": "4.2.4",
             "source": {
                 "type": "git",
                 "url": "https://github.com/thephpleague/container.git",
-                "reference": "72f9bebe7bd623007782a40f5ec305661ab706d8"
+                "reference": "7ea728b013b9a156c409c6f0fc3624071b742dec"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/thephpleague/container/zipball/72f9bebe7bd623007782a40f5ec305661ab706d8",
-                "reference": "72f9bebe7bd623007782a40f5ec305661ab706d8",
+                "url": "https://api.github.com/repos/thephpleague/container/zipball/7ea728b013b9a156c409c6f0fc3624071b742dec",
+                "reference": "7ea728b013b9a156c409c6f0fc3624071b742dec",
                 "shasum": ""
             },
             "require": {
@@ -11366,11 +11376,11 @@
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "4.x-dev",
-                    "dev-4.x": "4.x-dev",
-                    "dev-3.x": "3.x-dev",
+                    "dev-1.x": "1.x-dev",
                     "dev-2.x": "2.x-dev",
-                    "dev-1.x": "1.x-dev"
+                    "dev-3.x": "3.x-dev",
+                    "dev-4.x": "4.x-dev",
+                    "dev-master": "4.x-dev"
                 }
             },
             "autoload": {
@@ -11402,7 +11412,7 @@
             ],
             "support": {
                 "issues": "https://github.com/thephpleague/container/issues",
-                "source": "https://github.com/thephpleague/container/tree/4.2.3"
+                "source": "https://github.com/thephpleague/container/tree/4.2.4"
             },
             "funding": [
                 {
@@ -11410,20 +11420,20 @@
                     "type": "github"
                 }
             ],
-            "time": "2024-10-23T12:06:58+00:00"
+            "time": "2024-11-10T12:42:13+00:00"
         },
         {
             "name": "league/csv",
-            "version": "9.18.0",
+            "version": "9.20.1",
             "source": {
                 "type": "git",
                 "url": "https://github.com/thephpleague/csv.git",
-                "reference": "b02d010e4055ae992247f6ffd1e7b103ef2a0790"
+                "reference": "491d1e79e973a7370c7571dc0fe4a7241f4936ee"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/thephpleague/csv/zipball/b02d010e4055ae992247f6ffd1e7b103ef2a0790",
-                "reference": "b02d010e4055ae992247f6ffd1e7b103ef2a0790",
+                "url": "https://api.github.com/repos/thephpleague/csv/zipball/491d1e79e973a7370c7571dc0fe4a7241f4936ee",
+                "reference": "491d1e79e973a7370c7571dc0fe4a7241f4936ee",
                 "shasum": ""
             },
             "require": {
@@ -11435,12 +11445,12 @@
                 "ext-xdebug": "*",
                 "friendsofphp/php-cs-fixer": "^3.64.0",
                 "phpbench/phpbench": "^1.3.1",
-                "phpstan/phpstan": "^1.12.6",
+                "phpstan/phpstan": "^1.12.11",
                 "phpstan/phpstan-deprecation-rules": "^1.2.1",
-                "phpstan/phpstan-phpunit": "^1.4.0",
+                "phpstan/phpstan-phpunit": "^1.4.1",
                 "phpstan/phpstan-strict-rules": "^1.6.1",
-                "phpunit/phpunit": "^10.5.16 || ^11.4.1",
-                "symfony/var-dumper": "^6.4.8 || ^7.1.5"
+                "phpunit/phpunit": "^10.5.16 || ^11.4.3",
+                "symfony/var-dumper": "^6.4.8 || ^7.1.8"
             },
             "suggest": {
                 "ext-dom": "Required to use the XMLConverter and the HTMLConverter classes",
@@ -11497,7 +11507,7 @@
                     "type": "github"
                 }
             ],
-            "time": "2024-10-18T08:14:48+00:00"
+            "time": "2024-12-18T10:11:15+00:00"
         },
         {
             "name": "m4tthumphrey/php-gitlab-api",
@@ -11929,16 +11939,16 @@
         },
         {
             "name": "monolog/monolog",
-            "version": "3.7.0",
+            "version": "3.8.1",
             "source": {
                 "type": "git",
                 "url": "https://github.com/Seldaek/monolog.git",
-                "reference": "f4393b648b78a5408747de94fca38beb5f7e9ef8"
+                "reference": "aef6ee73a77a66e404dd6540934a9ef1b3c855b4"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/Seldaek/monolog/zipball/f4393b648b78a5408747de94fca38beb5f7e9ef8",
-                "reference": "f4393b648b78a5408747de94fca38beb5f7e9ef8",
+                "url": "https://api.github.com/repos/Seldaek/monolog/zipball/aef6ee73a77a66e404dd6540934a9ef1b3c855b4",
+                "reference": "aef6ee73a77a66e404dd6540934a9ef1b3c855b4",
                 "shasum": ""
             },
             "require": {
@@ -11958,12 +11968,14 @@
                 "guzzlehttp/psr7": "^2.2",
                 "mongodb/mongodb": "^1.8",
                 "php-amqplib/php-amqplib": "~2.4 || ^3",
-                "phpstan/phpstan": "^1.9",
-                "phpstan/phpstan-deprecation-rules": "^1.0",
-                "phpstan/phpstan-strict-rules": "^1.4",
-                "phpunit/phpunit": "^10.5.17",
+                "php-console/php-console": "^3.1.8",
+                "phpstan/phpstan": "^2",
+                "phpstan/phpstan-deprecation-rules": "^2",
+                "phpstan/phpstan-strict-rules": "^2",
+                "phpunit/phpunit": "^10.5.17 || ^11.0.7",
                 "predis/predis": "^1.1 || ^2",
-                "ruflin/elastica": "^7",
+                "rollbar/rollbar": "^4.0",
+                "ruflin/elastica": "^7 || ^8",
                 "symfony/mailer": "^5.4 || ^6",
                 "symfony/mime": "^5.4 || ^6"
             },
@@ -12014,7 +12026,7 @@
             ],
             "support": {
                 "issues": "https://github.com/Seldaek/monolog/issues",
-                "source": "https://github.com/Seldaek/monolog/tree/3.7.0"
+                "source": "https://github.com/Seldaek/monolog/tree/3.8.1"
             },
             "funding": [
                 {
@@ -12026,7 +12038,7 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2024-06-28T09:40:51+00:00"
+            "time": "2024-12-05T17:15:07+00:00"
         },
         {
             "name": "neilime/php-css-lint",
@@ -12336,8 +12348,8 @@
             "extra": {
                 "class": "OpenEuropa\\ComposerArtifacts\\Plugin",
                 "enable-patching": true,
-                "composer-exit-on-patch-failure": true,
-                "plugin-modifies-downloads": true
+                "plugin-modifies-downloads": true,
+                "composer-exit-on-patch-failure": true
             },
             "autoload": {
                 "psr-4": {
@@ -12453,16 +12465,16 @@
         },
         {
             "name": "openeuropa/oe_bootstrap_theme",
-            "version": "1.16.0",
+            "version": "1.18.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/openeuropa/oe_bootstrap_theme.git",
-                "reference": "dd04afc6fa38bdb91adfff4a4247c1e18d880bf6"
+                "reference": "8df4c4347d7bd53e16bcb0798b1735b1dc52c7c3"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/openeuropa/oe_bootstrap_theme/zipball/dd04afc6fa38bdb91adfff4a4247c1e18d880bf6",
-                "reference": "dd04afc6fa38bdb91adfff4a4247c1e18d880bf6",
+                "url": "https://api.github.com/repos/openeuropa/oe_bootstrap_theme/zipball/8df4c4347d7bd53e16bcb0798b1735b1dc52c7c3",
+                "reference": "8df4c4347d7bd53e16bcb0798b1735b1dc52c7c3",
                 "shasum": ""
             },
             "require": {
@@ -12486,30 +12498,30 @@
             },
             "type": "drupal-theme",
             "extra": {
-                "composer-exit-on-patch-failure": true,
+                "_readme": [
+                    "Explicit requirement of nikic/php-parser ^4 as later versions are not compatible with grumphp @see https://github.com/phpro/grumphp/issues/1119"
+                ],
+                "drupal-scaffold": {
+                    "locations": {
+                        "web-root": "./build"
+                    }
+                },
                 "enable-patching": true,
                 "installer-paths": {
                     "build/core": [
                         "type:drupal-core"
                     ],
-                    "build/profiles/contrib/{$name}": [
-                        "type:drupal-profile"
+                    "build/themes/contrib/{$name}": [
+                        "type:drupal-theme"
                     ],
                     "build/modules/contrib/{$name}": [
                         "type:drupal-module"
                     ],
-                    "build/themes/contrib/{$name}": [
-                        "type:drupal-theme"
+                    "build/profiles/contrib/{$name}": [
+                        "type:drupal-profile"
                     ]
                 },
-                "drupal-scaffold": {
-                    "locations": {
-                        "web-root": "./build"
-                    }
-                },
-                "_readme": [
-                    "Explicit requirement of nikic/php-parser ^4 as later versions are not compatible with grumphp @see https://github.com/phpro/grumphp/issues/1119"
-                ]
+                "composer-exit-on-patch-failure": true
             },
             "autoload": {
                 "psr-4": {
@@ -12523,9 +12535,9 @@
             "description": "OpenEuropa Bootstrap base theme.",
             "support": {
                 "issues": "https://github.com/openeuropa/oe_bootstrap_theme/issues",
-                "source": "https://github.com/openeuropa/oe_bootstrap_theme/tree/1.16.0"
+                "source": "https://github.com/openeuropa/oe_bootstrap_theme/tree/1.18.0"
             },
-            "time": "2024-10-08T13:51:35+00:00"
+            "time": "2024-12-16T11:03:01+00:00"
         },
         {
             "name": "openeuropa/oe_dashboard_agent",
@@ -12613,16 +12625,16 @@
         },
         {
             "name": "openeuropa/oe_webtools",
-            "version": "1.33.0",
+            "version": "1.34.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/openeuropa/oe_webtools.git",
-                "reference": "ca78577cd85d1f8d6c48bf132f0817f18ea18dfd"
+                "reference": "1b1113874232428c9a2f94ddcdc99d4cebc4abce"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/openeuropa/oe_webtools/zipball/ca78577cd85d1f8d6c48bf132f0817f18ea18dfd",
-                "reference": "ca78577cd85d1f8d6c48bf132f0817f18ea18dfd",
+                "url": "https://api.github.com/repos/openeuropa/oe_webtools/zipball/1b1113874232428c9a2f94ddcdc99d4cebc4abce",
+                "reference": "1b1113874232428c9a2f94ddcdc99d4cebc4abce",
                 "shasum": ""
             },
             "require": {
@@ -12656,32 +12668,32 @@
             },
             "type": "drupal-module",
             "extra": {
-                "composer-exit-on-patch-failure": true,
+                "_readme": [
+                    "Explicit requirement of symfony/phpunit-bridge to replace drupal/core-dev testing classes and traits.",
+                    "Explicit requirement of mikey179/vfsstream to remove when drupal/core-dev is reinstated.",
+                    "Explicit requirement of nikic/php-parser as ^5.0 generates GrumPHP Parser issues."
+                ],
+                "drupal-scaffold": {
+                    "locations": {
+                        "web-root": "./build"
+                    }
+                },
                 "enable-patching": true,
                 "installer-paths": {
                     "build/core": [
                         "type:drupal-core"
                     ],
-                    "build/profiles/contrib/{$name}": [
-                        "type:drupal-profile"
+                    "build/themes/contrib/{$name}": [
+                        "type:drupal-theme"
                     ],
                     "build/modules/contrib/{$name}": [
                         "type:drupal-module"
                     ],
-                    "build/themes/contrib/{$name}": [
-                        "type:drupal-theme"
+                    "build/profiles/contrib/{$name}": [
+                        "type:drupal-profile"
                     ]
                 },
-                "drupal-scaffold": {
-                    "locations": {
-                        "web-root": "./build"
-                    }
-                },
-                "_readme": [
-                    "Explicit requirement of symfony/phpunit-bridge to replace drupal/core-dev testing classes and traits.",
-                    "Explicit requirement of mikey179/vfsstream to remove when drupal/core-dev is reinstated.",
-                    "Explicit requirement of nikic/php-parser as ^5.0 generates GrumPHP Parser issues."
-                ]
+                "composer-exit-on-patch-failure": true
             },
             "autoload": {
                 "psr-4": {
@@ -12695,9 +12707,9 @@
             "description": "OpenEuropa Webtools integration.",
             "support": {
                 "issues": "https://github.com/openeuropa/oe_webtools/issues",
-                "source": "https://github.com/openeuropa/oe_webtools/tree/1.33.0"
+                "source": "https://github.com/openeuropa/oe_webtools/tree/1.34.0"
             },
-            "time": "2024-10-28T15:31:34+00:00"
+            "time": "2024-12-16T13:43:12+00:00"
         },
         {
             "name": "pear/archive_tar",
@@ -12822,16 +12834,16 @@
         },
         {
             "name": "pear/pear-core-minimal",
-            "version": "v1.10.15",
+            "version": "v1.10.16",
             "source": {
                 "type": "git",
                 "url": "https://github.com/pear/pear-core-minimal.git",
-                "reference": "ce0adade8b97561656ace07cdaac4751c271ea8c"
+                "reference": "c0f51b45f50683bf5bbf558036854ebc9b54d033"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/pear/pear-core-minimal/zipball/ce0adade8b97561656ace07cdaac4751c271ea8c",
-                "reference": "ce0adade8b97561656ace07cdaac4751c271ea8c",
+                "url": "https://api.github.com/repos/pear/pear-core-minimal/zipball/c0f51b45f50683bf5bbf558036854ebc9b54d033",
+                "reference": "c0f51b45f50683bf5bbf558036854ebc9b54d033",
                 "shasum": ""
             },
             "require": {
@@ -12867,7 +12879,7 @@
                 "issues": "http://pear.php.net/bugs/search.php?cmd=display&package_name[]=PEAR",
                 "source": "https://github.com/pear/pear-core-minimal"
             },
-            "time": "2024-03-16T18:41:45+00:00"
+            "time": "2024-11-24T22:27:58+00:00"
         },
         {
             "name": "pear/pear_exception",
@@ -13237,21 +13249,21 @@
         },
         {
             "name": "php-http/guzzle7-adapter",
-            "version": "1.0.0",
+            "version": "1.1.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/php-http/guzzle7-adapter.git",
-                "reference": "fb075a71dbfa4847cf0c2938c4e5a9c478ef8b01"
+                "reference": "03a415fde709c2f25539790fecf4d9a31bc3d0eb"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/php-http/guzzle7-adapter/zipball/fb075a71dbfa4847cf0c2938c4e5a9c478ef8b01",
-                "reference": "fb075a71dbfa4847cf0c2938c4e5a9c478ef8b01",
+                "url": "https://api.github.com/repos/php-http/guzzle7-adapter/zipball/03a415fde709c2f25539790fecf4d9a31bc3d0eb",
+                "reference": "03a415fde709c2f25539790fecf4d9a31bc3d0eb",
                 "shasum": ""
             },
             "require": {
                 "guzzlehttp/guzzle": "^7.0",
-                "php": "^7.2 | ^8.0",
+                "php": "^7.3 | ^8.0",
                 "php-http/httplug": "^2.0",
                 "psr/http-client": "^1.0"
             },
@@ -13262,14 +13274,11 @@
             },
             "require-dev": {
                 "php-http/client-integration-tests": "^3.0",
+                "php-http/message-factory": "^1.1",
+                "phpspec/prophecy-phpunit": "^2.0",
                 "phpunit/phpunit": "^8.0|^9.3"
             },
             "type": "library",
-            "extra": {
-                "branch-alias": {
-                    "dev-master": "0.2.x-dev"
-                }
-            },
             "autoload": {
                 "psr-4": {
                     "Http\\Adapter\\Guzzle7\\": "src/"
@@ -13293,9 +13302,9 @@
             ],
             "support": {
                 "issues": "https://github.com/php-http/guzzle7-adapter/issues",
-                "source": "https://github.com/php-http/guzzle7-adapter/tree/1.0.0"
+                "source": "https://github.com/php-http/guzzle7-adapter/tree/1.1.0"
             },
-            "time": "2021-03-09T07:35:15+00:00"
+            "time": "2024-11-26T11:14:36+00:00"
         },
         {
             "name": "php-http/httplug",
@@ -13947,16 +13956,16 @@
         },
         {
             "name": "psy/psysh",
-            "version": "v0.12.4",
+            "version": "v0.12.7",
             "source": {
                 "type": "git",
                 "url": "https://github.com/bobthecow/psysh.git",
-                "reference": "2fd717afa05341b4f8152547f142cd2f130f6818"
+                "reference": "d73fa3c74918ef4522bb8a3bf9cab39161c4b57c"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/bobthecow/psysh/zipball/2fd717afa05341b4f8152547f142cd2f130f6818",
-                "reference": "2fd717afa05341b4f8152547f142cd2f130f6818",
+                "url": "https://api.github.com/repos/bobthecow/psysh/zipball/d73fa3c74918ef4522bb8a3bf9cab39161c4b57c",
+                "reference": "d73fa3c74918ef4522bb8a3bf9cab39161c4b57c",
                 "shasum": ""
             },
             "require": {
@@ -13983,12 +13992,12 @@
             ],
             "type": "library",
             "extra": {
-                "branch-alias": {
-                    "dev-main": "0.12.x-dev"
-                },
                 "bamarni-bin": {
                     "bin-links": false,
                     "forward-command": false
+                },
+                "branch-alias": {
+                    "dev-main": "0.12.x-dev"
                 }
             },
             "autoload": {
@@ -14020,9 +14029,9 @@
             ],
             "support": {
                 "issues": "https://github.com/bobthecow/psysh/issues",
-                "source": "https://github.com/bobthecow/psysh/tree/v0.12.4"
+                "source": "https://github.com/bobthecow/psysh/tree/v0.12.7"
             },
-            "time": "2024-06-10T01:18:23+00:00"
+            "time": "2024-12-10T01:58:33+00:00"
         },
         {
             "name": "ralouphie/getallheaders",
@@ -14211,16 +14220,16 @@
         },
         {
             "name": "solarium/solarium",
-            "version": "6.3.5",
+            "version": "6.3.6",
             "source": {
                 "type": "git",
                 "url": "https://github.com/solariumphp/solarium.git",
-                "reference": "ae4ea592dc92d2be4dfd0a329f1ffbe3cbd01cf3"
+                "reference": "9f86b092b1575002cb3634c9fa44f43259c30971"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/solariumphp/solarium/zipball/ae4ea592dc92d2be4dfd0a329f1ffbe3cbd01cf3",
-                "reference": "ae4ea592dc92d2be4dfd0a329f1ffbe3cbd01cf3",
+                "url": "https://api.github.com/repos/solariumphp/solarium/zipball/9f86b092b1575002cb3634c9fa44f43259c30971",
+                "reference": "9f86b092b1575002cb3634c9fa44f43259c30971",
                 "shasum": ""
             },
             "require": {
@@ -14246,7 +14255,7 @@
                 "phpunit/phpunit": "^9.6",
                 "rawr/phpunit-data-provider": "^3.3",
                 "roave/security-advisories": "dev-master",
-                "symfony/event-dispatcher": "^5.0 || ^6.0"
+                "symfony/event-dispatcher": "^5.0 || ^6.0 || ^7.0"
             },
             "type": "library",
             "autoload": {
@@ -14273,9 +14282,9 @@
             ],
             "support": {
                 "issues": "https://github.com/solariumphp/solarium/issues",
-                "source": "https://github.com/solariumphp/solarium/tree/6.3.5"
+                "source": "https://github.com/solariumphp/solarium/tree/6.3.6"
             },
-            "time": "2024-01-10T08:36:53+00:00"
+            "time": "2024-11-27T14:53:41+00:00"
         },
         {
             "name": "spatie/calendar-links",
@@ -14467,16 +14476,16 @@
         },
         {
             "name": "sweetrdf/rdf-interface",
-            "version": "2.0.0",
+            "version": "2.1.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/sweetrdf/rdfInterface.git",
-                "reference": "9a8c01779a214fa37f3420aa1d7228d51c170a19"
+                "reference": "eeee78832fe87c3ee6834df67b5b0cfb73eb503b"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/sweetrdf/rdfInterface/zipball/9a8c01779a214fa37f3420aa1d7228d51c170a19",
-                "reference": "9a8c01779a214fa37f3420aa1d7228d51c170a19",
+                "url": "https://api.github.com/repos/sweetrdf/rdfInterface/zipball/eeee78832fe87c3ee6834df67b5b0cfb73eb503b",
+                "reference": "eeee78832fe87c3ee6834df67b5b0cfb73eb503b",
                 "shasum": ""
             },
             "require": {
@@ -14508,22 +14517,22 @@
             "homepage": "https://github.com/sweetrdf/rdfInterface",
             "support": {
                 "issues": "https://github.com/sweetrdf/rdfInterface/issues",
-                "source": "https://github.com/sweetrdf/rdfInterface/tree/2.0.0"
+                "source": "https://github.com/sweetrdf/rdfInterface/tree/2.1.0"
             },
-            "time": "2024-02-09T12:03:33+00:00"
+            "time": "2024-11-22T19:09:12+00:00"
         },
         {
             "name": "symfony/cache",
-            "version": "v6.4.14",
+            "version": "v6.4.16",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/cache.git",
-                "reference": "36fb8aa88833708e9f29014b6f15fac051a8b613"
+                "reference": "70d60e9a3603108563010f8592dff15a6f15dfae"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/cache/zipball/36fb8aa88833708e9f29014b6f15fac051a8b613",
-                "reference": "36fb8aa88833708e9f29014b6f15fac051a8b613",
+                "url": "https://api.github.com/repos/symfony/cache/zipball/70d60e9a3603108563010f8592dff15a6f15dfae",
+                "reference": "70d60e9a3603108563010f8592dff15a6f15dfae",
                 "shasum": ""
             },
             "require": {
@@ -14590,7 +14599,7 @@
                 "psr6"
             ],
             "support": {
-                "source": "https://github.com/symfony/cache/tree/v6.4.14"
+                "source": "https://github.com/symfony/cache/tree/v6.4.16"
             },
             "funding": [
                 {
@@ -14606,20 +14615,20 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2024-11-05T15:34:40+00:00"
+            "time": "2024-11-20T10:10:54+00:00"
         },
         {
             "name": "symfony/cache-contracts",
-            "version": "v3.5.0",
+            "version": "v3.5.1",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/cache-contracts.git",
-                "reference": "df6a1a44c890faded49a5fca33c2d5c5fd3c2197"
+                "reference": "15a4f8e5cd3bce9aeafc882b1acab39ec8de2c1b"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/cache-contracts/zipball/df6a1a44c890faded49a5fca33c2d5c5fd3c2197",
-                "reference": "df6a1a44c890faded49a5fca33c2d5c5fd3c2197",
+                "url": "https://api.github.com/repos/symfony/cache-contracts/zipball/15a4f8e5cd3bce9aeafc882b1acab39ec8de2c1b",
+                "reference": "15a4f8e5cd3bce9aeafc882b1acab39ec8de2c1b",
                 "shasum": ""
             },
             "require": {
@@ -14666,7 +14675,7 @@
                 "standards"
             ],
             "support": {
-                "source": "https://github.com/symfony/cache-contracts/tree/v3.5.0"
+                "source": "https://github.com/symfony/cache-contracts/tree/v3.5.1"
             },
             "funding": [
                 {
@@ -14682,7 +14691,7 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2024-04-18T09:32:20+00:00"
+            "time": "2024-09-25T14:20:29+00:00"
         },
         {
             "name": "symfony/console",
@@ -14780,16 +14789,16 @@
         },
         {
             "name": "symfony/css-selector",
-            "version": "v7.1.6",
+            "version": "v7.2.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/css-selector.git",
-                "reference": "4aa4f6b3d6749c14d3aa815eef8226632e7bbc66"
+                "reference": "601a5ce9aaad7bf10797e3663faefce9e26c24e2"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/css-selector/zipball/4aa4f6b3d6749c14d3aa815eef8226632e7bbc66",
-                "reference": "4aa4f6b3d6749c14d3aa815eef8226632e7bbc66",
+                "url": "https://api.github.com/repos/symfony/css-selector/zipball/601a5ce9aaad7bf10797e3663faefce9e26c24e2",
+                "reference": "601a5ce9aaad7bf10797e3663faefce9e26c24e2",
                 "shasum": ""
             },
             "require": {
@@ -14825,7 +14834,7 @@
             "description": "Converts CSS selectors to XPath expressions",
             "homepage": "https://symfony.com",
             "support": {
-                "source": "https://github.com/symfony/css-selector/tree/v7.1.6"
+                "source": "https://github.com/symfony/css-selector/tree/v7.2.0"
             },
             "funding": [
                 {
@@ -14841,20 +14850,20 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2024-09-25T14:20:29+00:00"
+            "time": "2024-09-25T14:21:43+00:00"
         },
         {
             "name": "symfony/dependency-injection",
-            "version": "v6.4.15",
+            "version": "v6.4.16",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/dependency-injection.git",
-                "reference": "70ab1f65a4516ef741e519ea938e6aa465e6aa36"
+                "reference": "7a379d8871f6a36f01559c14e11141cc02eb8dc8"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/70ab1f65a4516ef741e519ea938e6aa465e6aa36",
-                "reference": "70ab1f65a4516ef741e519ea938e6aa465e6aa36",
+                "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/7a379d8871f6a36f01559c14e11141cc02eb8dc8",
+                "reference": "7a379d8871f6a36f01559c14e11141cc02eb8dc8",
                 "shasum": ""
             },
             "require": {
@@ -14906,7 +14915,7 @@
             "description": "Allows you to standardize and centralize the way objects are constructed in your application",
             "homepage": "https://symfony.com",
             "support": {
-                "source": "https://github.com/symfony/dependency-injection/tree/v6.4.15"
+                "source": "https://github.com/symfony/dependency-injection/tree/v6.4.16"
             },
             "funding": [
                 {
@@ -14922,20 +14931,20 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2024-11-09T06:56:25+00:00"
+            "time": "2024-11-25T14:52:46+00:00"
         },
         {
             "name": "symfony/deprecation-contracts",
-            "version": "v3.5.0",
+            "version": "v3.5.1",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/deprecation-contracts.git",
-                "reference": "0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1"
+                "reference": "74c71c939a79f7d5bf3c1ce9f5ea37ba0114c6f6"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1",
-                "reference": "0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1",
+                "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/74c71c939a79f7d5bf3c1ce9f5ea37ba0114c6f6",
+                "reference": "74c71c939a79f7d5bf3c1ce9f5ea37ba0114c6f6",
                 "shasum": ""
             },
             "require": {
@@ -14973,7 +14982,7 @@
             "description": "A generic function and convention to trigger deprecation notices",
             "homepage": "https://symfony.com",
             "support": {
-                "source": "https://github.com/symfony/deprecation-contracts/tree/v3.5.0"
+                "source": "https://github.com/symfony/deprecation-contracts/tree/v3.5.1"
             },
             "funding": [
                 {
@@ -14989,7 +14998,7 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2024-04-18T09:32:20+00:00"
+            "time": "2024-09-25T14:20:29+00:00"
         },
         {
             "name": "symfony/error-handler",
@@ -15148,16 +15157,16 @@
         },
         {
             "name": "symfony/event-dispatcher-contracts",
-            "version": "v3.5.0",
+            "version": "v3.5.1",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/event-dispatcher-contracts.git",
-                "reference": "8f93aec25d41b72493c6ddff14e916177c9efc50"
+                "reference": "7642f5e970b672283b7823222ae8ef8bbc160b9f"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/8f93aec25d41b72493c6ddff14e916177c9efc50",
-                "reference": "8f93aec25d41b72493c6ddff14e916177c9efc50",
+                "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/7642f5e970b672283b7823222ae8ef8bbc160b9f",
+                "reference": "7642f5e970b672283b7823222ae8ef8bbc160b9f",
                 "shasum": ""
             },
             "require": {
@@ -15204,7 +15213,7 @@
                 "standards"
             ],
             "support": {
-                "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.5.0"
+                "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.5.1"
             },
             "funding": [
                 {
@@ -15220,7 +15229,7 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2024-04-18T09:32:20+00:00"
+            "time": "2024-09-25T14:20:29+00:00"
         },
         {
             "name": "symfony/filesystem",
@@ -15354,23 +15363,23 @@
         },
         {
             "name": "symfony/http-client",
-            "version": "v6.4.15",
+            "version": "v6.4.16",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/http-client.git",
-                "reference": "cb4073c905cd12b8496d24ac428a9228c1750670"
+                "reference": "60a113666fa67e598abace38e5f46a0954d8833d"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/http-client/zipball/cb4073c905cd12b8496d24ac428a9228c1750670",
-                "reference": "cb4073c905cd12b8496d24ac428a9228c1750670",
+                "url": "https://api.github.com/repos/symfony/http-client/zipball/60a113666fa67e598abace38e5f46a0954d8833d",
+                "reference": "60a113666fa67e598abace38e5f46a0954d8833d",
                 "shasum": ""
             },
             "require": {
                 "php": ">=8.1",
                 "psr/log": "^1|^2|^3",
                 "symfony/deprecation-contracts": "^2.5|^3",
-                "symfony/http-client-contracts": "^3.4.1",
+                "symfony/http-client-contracts": "~3.4.3|^3.5.1",
                 "symfony/service-contracts": "^2.5|^3"
             },
             "conflict": {
@@ -15427,7 +15436,7 @@
                 "http"
             ],
             "support": {
-                "source": "https://github.com/symfony/http-client/tree/v6.4.15"
+                "source": "https://github.com/symfony/http-client/tree/v6.4.16"
             },
             "funding": [
                 {
@@ -15443,20 +15452,20 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2024-11-13T13:40:18+00:00"
+            "time": "2024-11-27T11:52:33+00:00"
         },
         {
             "name": "symfony/http-client-contracts",
-            "version": "v3.5.0",
+            "version": "v3.5.2",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/http-client-contracts.git",
-                "reference": "20414d96f391677bf80078aa55baece78b82647d"
+                "reference": "ee8d807ab20fcb51267fdace50fbe3494c31e645"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/http-client-contracts/zipball/20414d96f391677bf80078aa55baece78b82647d",
-                "reference": "20414d96f391677bf80078aa55baece78b82647d",
+                "url": "https://api.github.com/repos/symfony/http-client-contracts/zipball/ee8d807ab20fcb51267fdace50fbe3494c31e645",
+                "reference": "ee8d807ab20fcb51267fdace50fbe3494c31e645",
                 "shasum": ""
             },
             "require": {
@@ -15464,12 +15473,12 @@
             },
             "type": "library",
             "extra": {
+                "thanks": {
+                    "url": "https://github.com/symfony/contracts",
+                    "name": "symfony/contracts"
+                },
                 "branch-alias": {
                     "dev-main": "3.5-dev"
-                },
-                "thanks": {
-                    "name": "symfony/contracts",
-                    "url": "https://github.com/symfony/contracts"
                 }
             },
             "autoload": {
@@ -15505,7 +15514,7 @@
                 "standards"
             ],
             "support": {
-                "source": "https://github.com/symfony/http-client-contracts/tree/v3.5.0"
+                "source": "https://github.com/symfony/http-client-contracts/tree/v3.5.2"
             },
             "funding": [
                 {
@@ -15521,20 +15530,20 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2024-04-18T09:32:20+00:00"
+            "time": "2024-12-07T08:49:48+00:00"
         },
         {
             "name": "symfony/http-foundation",
-            "version": "v6.4.15",
+            "version": "v6.4.16",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/http-foundation.git",
-                "reference": "9b3165eb2f04aeaa1a5a2cfef73e63fe3b22dff6"
+                "reference": "431771b7a6f662f1575b3cfc8fd7617aa9864d57"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/http-foundation/zipball/9b3165eb2f04aeaa1a5a2cfef73e63fe3b22dff6",
-                "reference": "9b3165eb2f04aeaa1a5a2cfef73e63fe3b22dff6",
+                "url": "https://api.github.com/repos/symfony/http-foundation/zipball/431771b7a6f662f1575b3cfc8fd7617aa9864d57",
+                "reference": "431771b7a6f662f1575b3cfc8fd7617aa9864d57",
                 "shasum": ""
             },
             "require": {
@@ -15582,7 +15591,7 @@
             "description": "Defines an object-oriented layer for the HTTP specification",
             "homepage": "https://symfony.com",
             "support": {
-                "source": "https://github.com/symfony/http-foundation/tree/v6.4.15"
+                "source": "https://github.com/symfony/http-foundation/tree/v6.4.16"
             },
             "funding": [
                 {
@@ -15598,20 +15607,20 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2024-11-08T16:09:24+00:00"
+            "time": "2024-11-13T18:58:10+00:00"
         },
         {
             "name": "symfony/http-kernel",
-            "version": "v6.4.15",
+            "version": "v6.4.16",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/http-kernel.git",
-                "reference": "b002a5b3947653c5aee3adac2a024ea615fd3ff5"
+                "reference": "8838b5b21d807923b893ccbfc2cbeda0f1bc00f0"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/http-kernel/zipball/b002a5b3947653c5aee3adac2a024ea615fd3ff5",
-                "reference": "b002a5b3947653c5aee3adac2a024ea615fd3ff5",
+                "url": "https://api.github.com/repos/symfony/http-kernel/zipball/8838b5b21d807923b893ccbfc2cbeda0f1bc00f0",
+                "reference": "8838b5b21d807923b893ccbfc2cbeda0f1bc00f0",
                 "shasum": ""
             },
             "require": {
@@ -15696,7 +15705,7 @@
             "description": "Provides a structured process for converting a Request into a Response",
             "homepage": "https://symfony.com",
             "support": {
-                "source": "https://github.com/symfony/http-kernel/tree/v6.4.15"
+                "source": "https://github.com/symfony/http-kernel/tree/v6.4.16"
             },
             "funding": [
                 {
@@ -15712,7 +15721,7 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2024-11-13T13:57:37+00:00"
+            "time": "2024-11-27T12:49:36+00:00"
         },
         {
             "name": "symfony/mailer",
@@ -15881,16 +15890,16 @@
         },
         {
             "name": "symfony/options-resolver",
-            "version": "v7.1.6",
+            "version": "v7.2.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/options-resolver.git",
-                "reference": "85e95eeede2d41cd146146e98c9c81d9214cae85"
+                "reference": "7da8fbac9dcfef75ffc212235d76b2754ce0cf50"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/options-resolver/zipball/85e95eeede2d41cd146146e98c9c81d9214cae85",
-                "reference": "85e95eeede2d41cd146146e98c9c81d9214cae85",
+                "url": "https://api.github.com/repos/symfony/options-resolver/zipball/7da8fbac9dcfef75ffc212235d76b2754ce0cf50",
+                "reference": "7da8fbac9dcfef75ffc212235d76b2754ce0cf50",
                 "shasum": ""
             },
             "require": {
@@ -15928,7 +15937,7 @@
                 "options"
             ],
             "support": {
-                "source": "https://github.com/symfony/options-resolver/tree/v7.1.6"
+                "source": "https://github.com/symfony/options-resolver/tree/v7.2.0"
             },
             "funding": [
                 {
@@ -15944,7 +15953,7 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2024-09-25T14:20:29+00:00"
+            "time": "2024-11-20T11:17:29+00:00"
         },
         {
             "name": "symfony/polyfill-ctype",
@@ -15972,8 +15981,8 @@
             "type": "library",
             "extra": {
                 "thanks": {
-                    "name": "symfony/polyfill",
-                    "url": "https://github.com/symfony/polyfill"
+                    "url": "https://github.com/symfony/polyfill",
+                    "name": "symfony/polyfill"
                 }
             },
             "autoload": {
@@ -16051,8 +16060,8 @@
             "type": "library",
             "extra": {
                 "thanks": {
-                    "name": "symfony/polyfill",
-                    "url": "https://github.com/symfony/polyfill"
+                    "url": "https://github.com/symfony/polyfill",
+                    "name": "symfony/polyfill"
                 }
             },
             "autoload": {
@@ -16128,8 +16137,8 @@
             "type": "library",
             "extra": {
                 "thanks": {
-                    "name": "symfony/polyfill",
-                    "url": "https://github.com/symfony/polyfill"
+                    "url": "https://github.com/symfony/polyfill",
+                    "name": "symfony/polyfill"
                 }
             },
             "autoload": {
@@ -16208,8 +16217,8 @@
             "type": "library",
             "extra": {
                 "thanks": {
-                    "name": "symfony/polyfill",
-                    "url": "https://github.com/symfony/polyfill"
+                    "url": "https://github.com/symfony/polyfill",
+                    "name": "symfony/polyfill"
                 }
             },
             "autoload": {
@@ -16290,8 +16299,8 @@
             "type": "library",
             "extra": {
                 "thanks": {
-                    "name": "symfony/polyfill",
-                    "url": "https://github.com/symfony/polyfill"
+                    "url": "https://github.com/symfony/polyfill",
+                    "name": "symfony/polyfill"
                 }
             },
             "autoload": {
@@ -16374,8 +16383,8 @@
             "type": "library",
             "extra": {
                 "thanks": {
-                    "name": "symfony/polyfill",
-                    "url": "https://github.com/symfony/polyfill"
+                    "url": "https://github.com/symfony/polyfill",
+                    "name": "symfony/polyfill"
                 }
             },
             "autoload": {
@@ -16448,8 +16457,8 @@
             "type": "metapackage",
             "extra": {
                 "thanks": {
-                    "name": "symfony/polyfill",
-                    "url": "https://github.com/symfony/polyfill"
+                    "url": "https://github.com/symfony/polyfill",
+                    "name": "symfony/polyfill"
                 }
             },
             "notification-url": "https://packagist.org/downloads/",
@@ -16513,8 +16522,8 @@
             "type": "library",
             "extra": {
                 "thanks": {
-                    "name": "symfony/polyfill",
-                    "url": "https://github.com/symfony/polyfill"
+                    "url": "https://github.com/symfony/polyfill",
+                    "name": "symfony/polyfill"
                 }
             },
             "autoload": {
@@ -16593,8 +16602,8 @@
             "type": "library",
             "extra": {
                 "thanks": {
-                    "name": "symfony/polyfill",
-                    "url": "https://github.com/symfony/polyfill"
+                    "url": "https://github.com/symfony/polyfill",
+                    "name": "symfony/polyfill"
                 }
             },
             "autoload": {
@@ -16670,8 +16679,8 @@
             "type": "library",
             "extra": {
                 "thanks": {
-                    "name": "symfony/polyfill",
-                    "url": "https://github.com/symfony/polyfill"
+                    "url": "https://github.com/symfony/polyfill",
+                    "name": "symfony/polyfill"
                 }
             },
             "autoload": {
@@ -16872,16 +16881,16 @@
         },
         {
             "name": "symfony/routing",
-            "version": "v6.4.13",
+            "version": "v6.4.16",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/routing.git",
-                "reference": "640a74250d13f9c30d5ca045b6aaaabcc8215278"
+                "reference": "91e02e606b4b705c2f4fb42f7e7708b7923a3220"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/routing/zipball/640a74250d13f9c30d5ca045b6aaaabcc8215278",
-                "reference": "640a74250d13f9c30d5ca045b6aaaabcc8215278",
+                "url": "https://api.github.com/repos/symfony/routing/zipball/91e02e606b4b705c2f4fb42f7e7708b7923a3220",
+                "reference": "91e02e606b4b705c2f4fb42f7e7708b7923a3220",
                 "shasum": ""
             },
             "require": {
@@ -16935,7 +16944,7 @@
                 "url"
             ],
             "support": {
-                "source": "https://github.com/symfony/routing/tree/v6.4.13"
+                "source": "https://github.com/symfony/routing/tree/v6.4.16"
             },
             "funding": [
                 {
@@ -16951,7 +16960,7 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2024-10-01T08:30:56+00:00"
+            "time": "2024-11-13T15:31:34+00:00"
         },
         {
             "name": "symfony/serializer",
@@ -17053,16 +17062,16 @@
         },
         {
             "name": "symfony/service-contracts",
-            "version": "v3.5.0",
+            "version": "v3.5.1",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/service-contracts.git",
-                "reference": "bd1d9e59a81d8fa4acdcea3f617c581f7475a80f"
+                "reference": "e53260aabf78fb3d63f8d79d69ece59f80d5eda0"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/service-contracts/zipball/bd1d9e59a81d8fa4acdcea3f617c581f7475a80f",
-                "reference": "bd1d9e59a81d8fa4acdcea3f617c581f7475a80f",
+                "url": "https://api.github.com/repos/symfony/service-contracts/zipball/e53260aabf78fb3d63f8d79d69ece59f80d5eda0",
+                "reference": "e53260aabf78fb3d63f8d79d69ece59f80d5eda0",
                 "shasum": ""
             },
             "require": {
@@ -17116,7 +17125,7 @@
                 "standards"
             ],
             "support": {
-                "source": "https://github.com/symfony/service-contracts/tree/v3.5.0"
+                "source": "https://github.com/symfony/service-contracts/tree/v3.5.1"
             },
             "funding": [
                 {
@@ -17132,7 +17141,7 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2024-04-18T09:32:20+00:00"
+            "time": "2024-09-25T14:20:29+00:00"
         },
         {
             "name": "symfony/string",
@@ -17222,16 +17231,16 @@
         },
         {
             "name": "symfony/translation-contracts",
-            "version": "v3.5.0",
+            "version": "v3.5.1",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/translation-contracts.git",
-                "reference": "b9d2189887bb6b2e0367a9fc7136c5239ab9b05a"
+                "reference": "4667ff3bd513750603a09c8dedbea942487fb07c"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/b9d2189887bb6b2e0367a9fc7136c5239ab9b05a",
-                "reference": "b9d2189887bb6b2e0367a9fc7136c5239ab9b05a",
+                "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/4667ff3bd513750603a09c8dedbea942487fb07c",
+                "reference": "4667ff3bd513750603a09c8dedbea942487fb07c",
                 "shasum": ""
             },
             "require": {
@@ -17280,7 +17289,7 @@
                 "standards"
             ],
             "support": {
-                "source": "https://github.com/symfony/translation-contracts/tree/v3.5.0"
+                "source": "https://github.com/symfony/translation-contracts/tree/v3.5.1"
             },
             "funding": [
                 {
@@ -17296,20 +17305,20 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2024-04-18T09:32:20+00:00"
+            "time": "2024-09-25T14:20:29+00:00"
         },
         {
             "name": "symfony/validator",
-            "version": "v6.4.15",
+            "version": "v6.4.16",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/validator.git",
-                "reference": "7541055cdaf54ff95f0735bf703d313374e8b20b"
+                "reference": "9b0d1988b56511706bc91d96ead39acd77aaf34d"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/validator/zipball/7541055cdaf54ff95f0735bf703d313374e8b20b",
-                "reference": "7541055cdaf54ff95f0735bf703d313374e8b20b",
+                "url": "https://api.github.com/repos/symfony/validator/zipball/9b0d1988b56511706bc91d96ead39acd77aaf34d",
+                "reference": "9b0d1988b56511706bc91d96ead39acd77aaf34d",
                 "shasum": ""
             },
             "require": {
@@ -17377,7 +17386,7 @@
             "description": "Provides tools to validate values",
             "homepage": "https://symfony.com",
             "support": {
-                "source": "https://github.com/symfony/validator/tree/v6.4.15"
+                "source": "https://github.com/symfony/validator/tree/v6.4.16"
             },
             "funding": [
                 {
@@ -17393,7 +17402,7 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2024-11-08T15:28:48+00:00"
+            "time": "2024-11-27T09:48:51+00:00"
         },
         {
             "name": "symfony/var-dumper",
@@ -17911,36 +17920,40 @@
     "packages-dev": [
         {
             "name": "behat/behat",
-            "version": "v3.15.0",
+            "version": "v3.17.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/Behat/Behat.git",
-                "reference": "132e32fdad69340f503b103a5ccaf5dd72ce7d83"
+                "reference": "3eb5ebae08db4e44ca6a458ba0f449dda753c465"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/Behat/Behat/zipball/132e32fdad69340f503b103a5ccaf5dd72ce7d83",
-                "reference": "132e32fdad69340f503b103a5ccaf5dd72ce7d83",
+                "url": "https://api.github.com/repos/Behat/Behat/zipball/3eb5ebae08db4e44ca6a458ba0f449dda753c465",
+                "reference": "3eb5ebae08db4e44ca6a458ba0f449dda753c465",
                 "shasum": ""
             },
             "require": {
                 "behat/gherkin": "^4.10.0",
-                "behat/transliterator": "^1.2",
+                "behat/transliterator": "^1.5",
+                "composer-runtime-api": "^2.2",
+                "composer/xdebug-handler": "^3.0",
                 "ext-mbstring": "*",
-                "php": "^7.2 || ^8.0",
+                "php": "8.1.* || 8.2.* || 8.3.* || 8.4.* ",
                 "psr/container": "^1.0 || ^2.0",
-                "symfony/config": "^4.4 || ^5.0 || ^6.0 || ^7.0",
-                "symfony/console": "^4.4 || ^5.0 || ^6.0 || ^7.0",
-                "symfony/dependency-injection": "^4.4 || ^5.0 || ^6.0 || ^7.0",
-                "symfony/event-dispatcher": "^4.4 || ^5.0 || ^6.0 || ^7.0",
-                "symfony/translation": "^4.4 || ^5.0 || ^6.0 || ^7.0",
-                "symfony/yaml": "^4.4 || ^5.0 || ^6.0 || ^7.0"
+                "symfony/config": "^5.4 || ^6.4 || ^7.0",
+                "symfony/console": "^5.4 || ^6.4 || ^7.0",
+                "symfony/dependency-injection": "^5.4 || ^6.4 || ^7.0",
+                "symfony/event-dispatcher": "^5.4 || ^6.4 || ^7.0",
+                "symfony/translation": "^5.4 || ^6.4 || ^7.0",
+                "symfony/yaml": "^5.4 || ^6.4 || ^7.0"
             },
             "require-dev": {
                 "herrera-io/box": "~1.6.1",
-                "phpunit/phpunit": "^8.5 || ^9.0",
-                "symfony/process": "^4.4 || ^5.0 || ^6.0 || ^7.0",
-                "vimeo/psalm": "^4.8"
+                "phpunit/phpunit": "^9.6",
+                "sebastian/diff": "^4.0",
+                "symfony/polyfill-php84": "^1.31",
+                "symfony/process": "^5.4 || ^6.4 || ^7.0",
+                "vimeo/psalm": "^5.0"
             },
             "suggest": {
                 "ext-dom": "Needed to output test results in JUnit format."
@@ -17959,7 +17972,9 @@
                     "Behat\\Hook\\": "src/Behat/Hook/",
                     "Behat\\Step\\": "src/Behat/Step/",
                     "Behat\\Behat\\": "src/Behat/Behat/",
-                    "Behat\\Testwork\\": "src/Behat/Testwork/"
+                    "Behat\\Config\\": "src/Behat/Config/",
+                    "Behat\\Testwork\\": "src/Behat/Testwork/",
+                    "Behat\\Transformation\\": "src/Behat/Transformation/"
                 }
             },
             "notification-url": "https://packagist.org/downloads/",
@@ -17991,31 +18006,31 @@
             ],
             "support": {
                 "issues": "https://github.com/Behat/Behat/issues",
-                "source": "https://github.com/Behat/Behat/tree/v3.15.0"
+                "source": "https://github.com/Behat/Behat/tree/v3.17.0"
             },
-            "time": "2024-10-30T07:54:51+00:00"
+            "time": "2024-12-18T10:27:06+00:00"
         },
         {
             "name": "behat/gherkin",
-            "version": "v4.10.0",
+            "version": "v4.11.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/Behat/Gherkin.git",
-                "reference": "cbb83c4c435dd8d05a161f2a5ae322e61b2f4db6"
+                "reference": "32821a17b12620951e755b5d49328a6421a5b5b5"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/Behat/Gherkin/zipball/cbb83c4c435dd8d05a161f2a5ae322e61b2f4db6",
-                "reference": "cbb83c4c435dd8d05a161f2a5ae322e61b2f4db6",
+                "url": "https://api.github.com/repos/Behat/Gherkin/zipball/32821a17b12620951e755b5d49328a6421a5b5b5",
+                "reference": "32821a17b12620951e755b5d49328a6421a5b5b5",
                 "shasum": ""
             },
             "require": {
-                "php": "~7.2|~8.0"
+                "php": "8.1.* || 8.2.* || 8.3.* || 8.4.*"
             },
             "require-dev": {
                 "cucumber/cucumber": "dev-gherkin-24.1.0",
-                "phpunit/phpunit": "~8|~9",
-                "symfony/yaml": "~3|~4|~5|~6|~7"
+                "phpunit/phpunit": "^9.6",
+                "symfony/yaml": "^5.4 || ^6.4 || ^7.0"
             },
             "suggest": {
                 "symfony/yaml": "If you want to parse features, represented in YAML files"
@@ -18054,9 +18069,9 @@
             ],
             "support": {
                 "issues": "https://github.com/Behat/Gherkin/issues",
-                "source": "https://github.com/Behat/Gherkin/tree/v4.10.0"
+                "source": "https://github.com/Behat/Gherkin/tree/v4.11.0"
             },
-            "time": "2024-10-19T14:46:06+00:00"
+            "time": "2024-12-06T10:07:25+00:00"
         },
         {
             "name": "behat/mink",
@@ -18243,16 +18258,16 @@
         },
         {
             "name": "composer/ca-bundle",
-            "version": "1.5.3",
+            "version": "1.5.4",
             "source": {
                 "type": "git",
                 "url": "https://github.com/composer/ca-bundle.git",
-                "reference": "3b1fc3f0be055baa7c6258b1467849c3e8204eb2"
+                "reference": "bc0593537a463e55cadf45fd938d23b75095b7e1"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/composer/ca-bundle/zipball/3b1fc3f0be055baa7c6258b1467849c3e8204eb2",
-                "reference": "3b1fc3f0be055baa7c6258b1467849c3e8204eb2",
+                "url": "https://api.github.com/repos/composer/ca-bundle/zipball/bc0593537a463e55cadf45fd938d23b75095b7e1",
+                "reference": "bc0593537a463e55cadf45fd938d23b75095b7e1",
                 "shasum": ""
             },
             "require": {
@@ -18299,7 +18314,7 @@
             "support": {
                 "irc": "irc://irc.freenode.org/composer",
                 "issues": "https://github.com/composer/ca-bundle/issues",
-                "source": "https://github.com/composer/ca-bundle/tree/1.5.3"
+                "source": "https://github.com/composer/ca-bundle/tree/1.5.4"
             },
             "funding": [
                 {
@@ -18315,20 +18330,20 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2024-11-04T10:15:26+00:00"
+            "time": "2024-11-27T15:35:25+00:00"
         },
         {
             "name": "composer/class-map-generator",
-            "version": "1.4.0",
+            "version": "1.5.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/composer/class-map-generator.git",
-                "reference": "98bbf6780e56e0fd2404fe4b82eb665a0f93b783"
+                "reference": "4b0a223cf5be7c9ee7e0ef1bc7db42b4a97c9915"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/composer/class-map-generator/zipball/98bbf6780e56e0fd2404fe4b82eb665a0f93b783",
-                "reference": "98bbf6780e56e0fd2404fe4b82eb665a0f93b783",
+                "url": "https://api.github.com/repos/composer/class-map-generator/zipball/4b0a223cf5be7c9ee7e0ef1bc7db42b4a97c9915",
+                "reference": "4b0a223cf5be7c9ee7e0ef1bc7db42b4a97c9915",
                 "shasum": ""
             },
             "require": {
@@ -18337,10 +18352,10 @@
                 "symfony/finder": "^4.4 || ^5.3 || ^6 || ^7"
             },
             "require-dev": {
-                "phpstan/phpstan": "^1.6",
-                "phpstan/phpstan-deprecation-rules": "^1",
-                "phpstan/phpstan-phpunit": "^1",
-                "phpstan/phpstan-strict-rules": "^1.1",
+                "phpstan/phpstan": "^1.12 || ^2",
+                "phpstan/phpstan-deprecation-rules": "^1 || ^2",
+                "phpstan/phpstan-phpunit": "^1 || ^2",
+                "phpstan/phpstan-strict-rules": "^1.1 || ^2",
                 "phpunit/phpunit": "^8",
                 "symfony/filesystem": "^5.4 || ^6"
             },
@@ -18372,7 +18387,7 @@
             ],
             "support": {
                 "issues": "https://github.com/composer/class-map-generator/issues",
-                "source": "https://github.com/composer/class-map-generator/tree/1.4.0"
+                "source": "https://github.com/composer/class-map-generator/tree/1.5.0"
             },
             "funding": [
                 {
@@ -18388,20 +18403,20 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2024-10-03T18:14:00+00:00"
+            "time": "2024-11-25T16:11:06+00:00"
         },
         {
             "name": "composer/composer",
-            "version": "2.8.2",
+            "version": "2.8.4",
             "source": {
                 "type": "git",
                 "url": "https://github.com/composer/composer.git",
-                "reference": "6e543d03187c882ea1c6ba43add2467754427803"
+                "reference": "112e37d1dca22b3fdb81cf3524ab4994f47fdb8c"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/composer/composer/zipball/6e543d03187c882ea1c6ba43add2467754427803",
-                "reference": "6e543d03187c882ea1c6ba43add2467754427803",
+                "url": "https://api.github.com/repos/composer/composer/zipball/112e37d1dca22b3fdb81cf3524ab4994f47fdb8c",
+                "reference": "112e37d1dca22b3fdb81cf3524ab4994f47fdb8c",
                 "shasum": ""
             },
             "require": {
@@ -18415,7 +18430,7 @@
                 "justinrainbow/json-schema": "^5.3",
                 "php": "^7.2.5 || ^8.0",
                 "psr/log": "^1.0 || ^2.0 || ^3.0",
-                "react/promise": "^3.2",
+                "react/promise": "^2.11 || ^3.2",
                 "seld/jsonlint": "^1.4",
                 "seld/phar-utils": "^1.2",
                 "seld/signal-handler": "^2.0",
@@ -18445,13 +18460,13 @@
             ],
             "type": "library",
             "extra": {
-                "branch-alias": {
-                    "dev-main": "2.8-dev"
-                },
                 "phpstan": {
                     "includes": [
                         "phpstan/rules.neon"
                     ]
+                },
+                "branch-alias": {
+                    "dev-main": "2.8-dev"
                 }
             },
             "autoload": {
@@ -18486,7 +18501,7 @@
                 "irc": "ircs://irc.libera.chat:6697/composer",
                 "issues": "https://github.com/composer/composer/issues",
                 "security": "https://github.com/composer/composer/security/policy",
-                "source": "https://github.com/composer/composer/tree/2.8.2"
+                "source": "https://github.com/composer/composer/tree/2.8.4"
             },
             "funding": [
                 {
@@ -18502,7 +18517,7 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2024-10-29T15:12:11+00:00"
+            "time": "2024-12-11T10:57:47+00:00"
         },
         {
             "name": "composer/metadata-minifier",
@@ -18575,16 +18590,16 @@
         },
         {
             "name": "composer/pcre",
-            "version": "3.3.1",
+            "version": "3.3.2",
             "source": {
                 "type": "git",
                 "url": "https://github.com/composer/pcre.git",
-                "reference": "63aaeac21d7e775ff9bc9d45021e1745c97521c4"
+                "reference": "b2bed4734f0cc156ee1fe9c0da2550420d99a21e"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/composer/pcre/zipball/63aaeac21d7e775ff9bc9d45021e1745c97521c4",
-                "reference": "63aaeac21d7e775ff9bc9d45021e1745c97521c4",
+                "url": "https://api.github.com/repos/composer/pcre/zipball/b2bed4734f0cc156ee1fe9c0da2550420d99a21e",
+                "reference": "b2bed4734f0cc156ee1fe9c0da2550420d99a21e",
                 "shasum": ""
             },
             "require": {
@@ -18594,19 +18609,19 @@
                 "phpstan/phpstan": "<1.11.10"
             },
             "require-dev": {
-                "phpstan/phpstan": "^1.11.10",
-                "phpstan/phpstan-strict-rules": "^1.1",
+                "phpstan/phpstan": "^1.12 || ^2",
+                "phpstan/phpstan-strict-rules": "^1 || ^2",
                 "phpunit/phpunit": "^8 || ^9"
             },
             "type": "library",
             "extra": {
-                "branch-alias": {
-                    "dev-main": "3.x-dev"
-                },
                 "phpstan": {
                     "includes": [
                         "extension.neon"
                     ]
+                },
+                "branch-alias": {
+                    "dev-main": "3.x-dev"
                 }
             },
             "autoload": {
@@ -18634,7 +18649,7 @@
             ],
             "support": {
                 "issues": "https://github.com/composer/pcre/issues",
-                "source": "https://github.com/composer/pcre/tree/3.3.1"
+                "source": "https://github.com/composer/pcre/tree/3.3.2"
             },
             "funding": [
                 {
@@ -18650,7 +18665,7 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2024-08-27T18:44:43+00:00"
+            "time": "2024-11-12T16:29:46+00:00"
         },
         {
             "name": "composer/spdx-licenses",
@@ -19617,16 +19632,16 @@
         },
         {
             "name": "drupal/coder",
-            "version": "8.3.25",
+            "version": "8.3.26",
             "source": {
                 "type": "git",
                 "url": "https://github.com/pfrenssen/coder.git",
-                "reference": "c58e5a0c44c0010bbc8a91fc468f4667e177b976"
+                "reference": "fd98546ce3373aa7767240901eda47963ce64c82"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/pfrenssen/coder/zipball/c58e5a0c44c0010bbc8a91fc468f4667e177b976",
-                "reference": "c58e5a0c44c0010bbc8a91fc468f4667e177b976",
+                "url": "https://api.github.com/repos/pfrenssen/coder/zipball/fd98546ce3373aa7767240901eda47963ce64c82",
+                "reference": "fd98546ce3373aa7767240901eda47963ce64c82",
                 "shasum": ""
             },
             "require": {
@@ -19664,7 +19679,7 @@
                 "issues": "https://www.drupal.org/project/issues/coder",
                 "source": "https://www.drupal.org/project/coder"
             },
-            "time": "2024-09-22T19:02:16+00:00"
+            "time": "2024-11-28T23:14:29+00:00"
         },
         {
             "name": "drupal/composer_deploy",
@@ -20485,16 +20500,16 @@
         },
         {
             "name": "ec-europa/qa-automation",
-            "version": "9.3.0",
+            "version": "9.4.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/ec-europa/qa-automation.git",
-                "reference": "92c3b71b2c43e29fd46592661ef75e90ebb8389c"
+                "reference": "d7e5c27dce8f380e63acad93beea847bd85defd8"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/ec-europa/qa-automation/zipball/92c3b71b2c43e29fd46592661ef75e90ebb8389c",
-                "reference": "92c3b71b2c43e29fd46592661ef75e90ebb8389c",
+                "url": "https://api.github.com/repos/ec-europa/qa-automation/zipball/d7e5c27dce8f380e63acad93beea847bd85defd8",
+                "reference": "d7e5c27dce8f380e63acad93beea847bd85defd8",
                 "shasum": ""
             },
             "require": {
@@ -20532,20 +20547,20 @@
                 "issues": "https://github.com/ec-europa/qa-automation/issues",
                 "source": "https://github.com/ec-europa/qa-automation"
             },
-            "time": "2024-07-17T06:26:41+00:00"
+            "time": "2024-11-26T09:22:52+00:00"
         },
         {
             "name": "ec-europa/toolkit",
-            "version": "10.14.0",
+            "version": "10.16.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/ec-europa/toolkit.git",
-                "reference": "75b891996632fed332d5379b435dac6d20ab639e"
+                "reference": "f52d6867d09664715bde4d04b36072b808e6b00a"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/ec-europa/toolkit/zipball/75b891996632fed332d5379b435dac6d20ab639e",
-                "reference": "75b891996632fed332d5379b435dac6d20ab639e",
+                "url": "https://api.github.com/repos/ec-europa/toolkit/zipball/f52d6867d09664715bde4d04b36072b808e6b00a",
+                "reference": "f52d6867d09664715bde4d04b36072b808e6b00a",
                 "shasum": ""
             },
             "require": {
@@ -20554,8 +20569,10 @@
                 "consolidation/annotated-command": "^4.7.0",
                 "consolidation/robo": "^3.0 || ^4.0 || ^5.0",
                 "cweagans/composer-patches": "^1.7 || ^2.0",
+                "dantleech/gherkin-lint": "^0.2.3",
+                "drupal/coder": "^8.3.10",
                 "drush/drush": "^11.0.4 || ^12.0 || ^13.0",
-                "ec-europa/qa-automation": "^9.3",
+                "ec-europa/qa-automation": "^9.4.0",
                 "ec-europa/toolkit-composer-plugin": "^0.0.1",
                 "ext-curl": "*",
                 "ext-dom": "*",
@@ -20571,7 +20588,7 @@
                 "phpmd/phpmd": "^2.12",
                 "phpstan/phpstan": "^1.10",
                 "phpstan/phpstan-deprecation-rules": "^1.0",
-                "phpunit/phpunit": "^9.5 || ^10.0",
+                "phpunit/phpunit": "^9.5 || ^10.0 || ^11.0",
                 "squizlabs/php_codesniffer": "^3.7",
                 "vlucas/phpdotenv": "^5.6"
             },
@@ -20601,7 +20618,7 @@
                 "email": "DIGIT-NEXTEUROPA-QA@ec.europa.eu",
                 "source": "https://github.com/ec-europa/toolkit"
             },
-            "time": "2024-08-19T13:27:25+00:00"
+            "time": "2024-12-13T09:24:45+00:00"
         },
         {
             "name": "ec-europa/toolkit-composer-plugin",
@@ -21122,16 +21139,16 @@
         },
         {
             "name": "mglaman/phpstan-drupal",
-            "version": "1.3.1",
+            "version": "1.3.2",
             "source": {
                 "type": "git",
                 "url": "https://github.com/mglaman/phpstan-drupal.git",
-                "reference": "2bc25a59b53c8f3990f168efd71241d9c25ea0c3"
+                "reference": "bbb92dee546da3988da851122cb2925f72c149f3"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/mglaman/phpstan-drupal/zipball/2bc25a59b53c8f3990f168efd71241d9c25ea0c3",
-                "reference": "2bc25a59b53c8f3990f168efd71241d9c25ea0c3",
+                "url": "https://api.github.com/repos/mglaman/phpstan-drupal/zipball/bbb92dee546da3988da851122cb2925f72c149f3",
+                "reference": "bbb92dee546da3988da851122cb2925f72c149f3",
                 "shasum": ""
             },
             "require": {
@@ -21161,6 +21178,12 @@
             },
             "type": "phpstan-extension",
             "extra": {
+                "phpstan": {
+                    "includes": [
+                        "extension.neon",
+                        "rules.neon"
+                    ]
+                },
                 "branch-alias": {
                     "dev-main": "1.0-dev"
                 },
@@ -21171,20 +21194,14 @@
                     "tests/fixtures/drupal/libraries/{$name}": [
                         "type:drupal-library"
                     ],
+                    "tests/fixtures/drupal/themes/contrib/{$name}": [
+                        "type:drupal-theme"
+                    ],
                     "tests/fixtures/drupal/modules/contrib/{$name}": [
                         "type:drupal-module"
                     ],
                     "tests/fixtures/drupal/profiles/contrib/{$name}": [
                         "type:drupal-profile"
-                    ],
-                    "tests/fixtures/drupal/themes/contrib/{$name}": [
-                        "type:drupal-theme"
-                    ]
-                },
-                "phpstan": {
-                    "includes": [
-                        "extension.neon",
-                        "rules.neon"
                     ]
                 }
             },
@@ -21206,7 +21223,7 @@
             "description": "Drupal extension and rules for PHPStan",
             "support": {
                 "issues": "https://github.com/mglaman/phpstan-drupal/issues",
-                "source": "https://github.com/mglaman/phpstan-drupal/tree/1.3.1"
+                "source": "https://github.com/mglaman/phpstan-drupal/tree/1.3.2"
             },
             "funding": [
                 {
@@ -21222,7 +21239,7 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2024-09-27T08:54:16+00:00"
+            "time": "2024-11-19T15:26:05+00:00"
         },
         {
             "name": "mikey179/vfsstream",
@@ -21278,16 +21295,16 @@
         },
         {
             "name": "myclabs/deep-copy",
-            "version": "1.12.0",
+            "version": "1.12.1",
             "source": {
                 "type": "git",
                 "url": "https://github.com/myclabs/DeepCopy.git",
-                "reference": "3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c"
+                "reference": "123267b2c49fbf30d78a7b2d333f6be754b94845"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c",
-                "reference": "3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c",
+                "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/123267b2c49fbf30d78a7b2d333f6be754b94845",
+                "reference": "123267b2c49fbf30d78a7b2d333f6be754b94845",
                 "shasum": ""
             },
             "require": {
@@ -21326,7 +21343,7 @@
             ],
             "support": {
                 "issues": "https://github.com/myclabs/DeepCopy/issues",
-                "source": "https://github.com/myclabs/DeepCopy/tree/1.12.0"
+                "source": "https://github.com/myclabs/DeepCopy/tree/1.12.1"
             },
             "funding": [
                 {
@@ -21334,7 +21351,7 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2024-06-12T14:39:25+00:00"
+            "time": "2024-11-08T17:47:46+00:00"
         },
         {
             "name": "nicwortel/behat-unused-step-definitions-extension",
@@ -21951,16 +21968,16 @@
         },
         {
             "name": "phpdocumentor/reflection-docblock",
-            "version": "5.6.0",
+            "version": "5.6.1",
             "source": {
                 "type": "git",
                 "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git",
-                "reference": "f3558a4c23426d12bffeaab463f8a8d8b681193c"
+                "reference": "e5e784149a09bd69d9a5e3b01c5cbd2e2bd653d8"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/f3558a4c23426d12bffeaab463f8a8d8b681193c",
-                "reference": "f3558a4c23426d12bffeaab463f8a8d8b681193c",
+                "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/e5e784149a09bd69d9a5e3b01c5cbd2e2bd653d8",
+                "reference": "e5e784149a09bd69d9a5e3b01c5cbd2e2bd653d8",
                 "shasum": ""
             },
             "require": {
@@ -22009,9 +22026,9 @@
             "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.",
             "support": {
                 "issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues",
-                "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/5.6.0"
+                "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/5.6.1"
             },
-            "time": "2024-11-12T11:25:25+00:00"
+            "time": "2024-12-07T09:39:29+00:00"
         },
         {
             "name": "phpdocumentor/type-resolver",
@@ -22231,16 +22248,16 @@
         },
         {
             "name": "phpro/grumphp-shim",
-            "version": "v2.9.0",
+            "version": "v2.10.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/phpro/grumphp-shim.git",
-                "reference": "25a10df0001f4887e1028448c501b9de2cc29239"
+                "reference": "1a298a336a86e727f82b410892da272236806d23"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/phpro/grumphp-shim/zipball/25a10df0001f4887e1028448c501b9de2cc29239",
-                "reference": "25a10df0001f4887e1028448c501b9de2cc29239",
+                "url": "https://api.github.com/repos/phpro/grumphp-shim/zipball/1a298a336a86e727f82b410892da272236806d23",
+                "reference": "1a298a336a86e727f82b410892da272236806d23",
                 "shasum": ""
             },
             "require": {
@@ -22284,32 +22301,33 @@
             "description": "GrumPHP Phar distribution",
             "support": {
                 "issues": "https://github.com/phpro/grumphp-shim/issues",
-                "source": "https://github.com/phpro/grumphp-shim/tree/v2.9.0"
+                "source": "https://github.com/phpro/grumphp-shim/tree/v2.10.0"
             },
-            "time": "2024-10-25T10:14:23+00:00"
+            "time": "2024-12-13T12:23:51+00:00"
         },
         {
             "name": "phpspec/prophecy",
-            "version": "v1.19.0",
+            "version": "v1.20.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/phpspec/prophecy.git",
-                "reference": "67a759e7d8746d501c41536ba40cd9c0a07d6a87"
+                "reference": "a0165c648cab6a80311c74ffc708a07bb53ecc93"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/phpspec/prophecy/zipball/67a759e7d8746d501c41536ba40cd9c0a07d6a87",
-                "reference": "67a759e7d8746d501c41536ba40cd9c0a07d6a87",
+                "url": "https://api.github.com/repos/phpspec/prophecy/zipball/a0165c648cab6a80311c74ffc708a07bb53ecc93",
+                "reference": "a0165c648cab6a80311c74ffc708a07bb53ecc93",
                 "shasum": ""
             },
             "require": {
                 "doctrine/instantiator": "^1.2 || ^2.0",
-                "php": "^7.2 || 8.0.* || 8.1.* || 8.2.* || 8.3.*",
+                "php": "^7.2 || 8.0.* || 8.1.* || 8.2.* || 8.3.* || 8.4.*",
                 "phpdocumentor/reflection-docblock": "^5.2",
                 "sebastian/comparator": "^3.0 || ^4.0 || ^5.0 || ^6.0",
                 "sebastian/recursion-context": "^3.0 || ^4.0 || ^5.0 || ^6.0"
             },
             "require-dev": {
+                "friendsofphp/php-cs-fixer": "^3.40",
                 "phpspec/phpspec": "^6.0 || ^7.0",
                 "phpstan/phpstan": "^1.9",
                 "phpunit/phpunit": "^8.0 || ^9.0 || ^10.0"
@@ -22353,22 +22371,22 @@
             ],
             "support": {
                 "issues": "https://github.com/phpspec/prophecy/issues",
-                "source": "https://github.com/phpspec/prophecy/tree/v1.19.0"
+                "source": "https://github.com/phpspec/prophecy/tree/v1.20.0"
             },
-            "time": "2024-02-29T11:52:51+00:00"
+            "time": "2024-11-19T13:12:41+00:00"
         },
         {
             "name": "phpspec/prophecy-phpunit",
-            "version": "v2.2.0",
+            "version": "v2.3.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/phpspec/prophecy-phpunit.git",
-                "reference": "16e1247e139434bce0bac09848bc5c8d882940fc"
+                "reference": "8819516c1b489ecee4c60db5f5432fac1ea8ac6f"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/phpspec/prophecy-phpunit/zipball/16e1247e139434bce0bac09848bc5c8d882940fc",
-                "reference": "16e1247e139434bce0bac09848bc5c8d882940fc",
+                "url": "https://api.github.com/repos/phpspec/prophecy-phpunit/zipball/8819516c1b489ecee4c60db5f5432fac1ea8ac6f",
+                "reference": "8819516c1b489ecee4c60db5f5432fac1ea8ac6f",
                 "shasum": ""
             },
             "require": {
@@ -22376,6 +22394,9 @@
                 "phpspec/prophecy": "^1.18",
                 "phpunit/phpunit": "^9.1 || ^10.1 || ^11.0"
             },
+            "require-dev": {
+                "phpstan/phpstan": "^1.10"
+            },
             "type": "library",
             "extra": {
                 "branch-alias": {
@@ -22405,9 +22426,9 @@
             ],
             "support": {
                 "issues": "https://github.com/phpspec/prophecy-phpunit/issues",
-                "source": "https://github.com/phpspec/prophecy-phpunit/tree/v2.2.0"
+                "source": "https://github.com/phpspec/prophecy-phpunit/tree/v2.3.0"
             },
-            "time": "2024-03-01T08:33:58+00:00"
+            "time": "2024-11-19T13:24:17+00:00"
         },
         {
             "name": "phpstan/extension-installer",
@@ -22506,16 +22527,16 @@
         },
         {
             "name": "phpstan/phpstan",
-            "version": "1.12.7",
+            "version": "1.12.13",
             "source": {
                 "type": "git",
                 "url": "https://github.com/phpstan/phpstan.git",
-                "reference": "dc2b9976bd8b0f84ec9b0e50cc35378551de7af0"
+                "reference": "9b469068840cfa031e1deaf2fa1886d00e20680f"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/phpstan/phpstan/zipball/dc2b9976bd8b0f84ec9b0e50cc35378551de7af0",
-                "reference": "dc2b9976bd8b0f84ec9b0e50cc35378551de7af0",
+                "url": "https://api.github.com/repos/phpstan/phpstan/zipball/9b469068840cfa031e1deaf2fa1886d00e20680f",
+                "reference": "9b469068840cfa031e1deaf2fa1886d00e20680f",
                 "shasum": ""
             },
             "require": {
@@ -22560,7 +22581,7 @@
                     "type": "github"
                 }
             ],
-            "time": "2024-10-18T11:12:07+00:00"
+            "time": "2024-12-17T17:00:20+00:00"
         },
         {
             "name": "phpstan/phpstan-deprecation-rules",
@@ -22930,16 +22951,16 @@
         },
         {
             "name": "phpunit/phpunit",
-            "version": "9.6.21",
+            "version": "9.6.22",
             "source": {
                 "type": "git",
                 "url": "https://github.com/sebastianbergmann/phpunit.git",
-                "reference": "de6abf3b6f8dd955fac3caad3af7a9504e8c2ffa"
+                "reference": "f80235cb4d3caa59ae09be3adf1ded27521d1a9c"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/de6abf3b6f8dd955fac3caad3af7a9504e8c2ffa",
-                "reference": "de6abf3b6f8dd955fac3caad3af7a9504e8c2ffa",
+                "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/f80235cb4d3caa59ae09be3adf1ded27521d1a9c",
+                "reference": "f80235cb4d3caa59ae09be3adf1ded27521d1a9c",
                 "shasum": ""
             },
             "require": {
@@ -22950,7 +22971,7 @@
                 "ext-mbstring": "*",
                 "ext-xml": "*",
                 "ext-xmlwriter": "*",
-                "myclabs/deep-copy": "^1.12.0",
+                "myclabs/deep-copy": "^1.12.1",
                 "phar-io/manifest": "^2.0.4",
                 "phar-io/version": "^3.2.1",
                 "php": ">=7.3",
@@ -23013,7 +23034,7 @@
             "support": {
                 "issues": "https://github.com/sebastianbergmann/phpunit/issues",
                 "security": "https://github.com/sebastianbergmann/phpunit/security/policy",
-                "source": "https://github.com/sebastianbergmann/phpunit/tree/9.6.21"
+                "source": "https://github.com/sebastianbergmann/phpunit/tree/9.6.22"
             },
             "funding": [
                 {
@@ -23029,7 +23050,7 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2024-09-19T10:50:18+00:00"
+            "time": "2024-12-05T13:48:26+00:00"
         },
         {
             "name": "react/promise",
@@ -23106,16 +23127,16 @@
         },
         {
             "name": "rector/rector",
-            "version": "1.2.8",
+            "version": "1.2.10",
             "source": {
                 "type": "git",
                 "url": "https://github.com/rectorphp/rector.git",
-                "reference": "05755bf43617449c08ee8e50fb840c85ad3b1240"
+                "reference": "40f9cf38c05296bd32f444121336a521a293fa61"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/rectorphp/rector/zipball/05755bf43617449c08ee8e50fb840c85ad3b1240",
-                "reference": "05755bf43617449c08ee8e50fb840c85ad3b1240",
+                "url": "https://api.github.com/repos/rectorphp/rector/zipball/40f9cf38c05296bd32f444121336a521a293fa61",
+                "reference": "40f9cf38c05296bd32f444121336a521a293fa61",
                 "shasum": ""
             },
             "require": {
@@ -23153,7 +23174,7 @@
             ],
             "support": {
                 "issues": "https://github.com/rectorphp/rector/issues",
-                "source": "https://github.com/rectorphp/rector/tree/1.2.8"
+                "source": "https://github.com/rectorphp/rector/tree/1.2.10"
             },
             "funding": [
                 {
@@ -23161,7 +23182,7 @@
                     "type": "github"
                 }
             ],
-            "time": "2024-10-18T11:54:27+00:00"
+            "time": "2024-11-08T13:59:10+00:00"
         },
         {
             "name": "sebastian/cli-parser",
@@ -24235,16 +24256,16 @@
         },
         {
             "name": "sirbrillig/phpcs-variable-analysis",
-            "version": "v2.11.19",
+            "version": "v2.11.21",
             "source": {
                 "type": "git",
                 "url": "https://github.com/sirbrillig/phpcs-variable-analysis.git",
-                "reference": "bc8d7e30e2005bce5c59018b7cdb08e9fb45c0d1"
+                "reference": "eb2b351927098c24860daa7484e290d3eed693be"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/sirbrillig/phpcs-variable-analysis/zipball/bc8d7e30e2005bce5c59018b7cdb08e9fb45c0d1",
-                "reference": "bc8d7e30e2005bce5c59018b7cdb08e9fb45c0d1",
+                "url": "https://api.github.com/repos/sirbrillig/phpcs-variable-analysis/zipball/eb2b351927098c24860daa7484e290d3eed693be",
+                "reference": "eb2b351927098c24860daa7484e290d3eed693be",
                 "shasum": ""
             },
             "require": {
@@ -24255,9 +24276,9 @@
                 "dealerdirect/phpcodesniffer-composer-installer": "^0.7 || ^1.0",
                 "phpcsstandards/phpcsdevcs": "^1.1",
                 "phpstan/phpstan": "^1.7",
-                "phpunit/phpunit": "^4.8.36 || ^5.7.21 || ^6.5 || ^7.0 || ^8.0 || ^9.0",
+                "phpunit/phpunit": "^4.8.36 || ^5.7.21 || ^6.5 || ^7.0 || ^8.0 || ^9.0 || ^10.5.32 || ^11.3.3",
                 "sirbrillig/phpcs-import-detection": "^1.1",
-                "vimeo/psalm": "^0.2 || ^0.3 || ^1.1 || ^4.24 || ^5.0@beta"
+                "vimeo/psalm": "^0.2 || ^0.3 || ^1.1 || ^4.24 || ^5.0"
             },
             "type": "phpcodesniffer-standard",
             "autoload": {
@@ -24289,7 +24310,7 @@
                 "source": "https://github.com/sirbrillig/phpcs-variable-analysis",
                 "wiki": "https://github.com/sirbrillig/phpcs-variable-analysis/wiki"
             },
-            "time": "2024-06-26T20:08:34+00:00"
+            "time": "2024-12-02T16:37:49+00:00"
         },
         {
             "name": "slevomat/coding-standard",
@@ -24358,16 +24379,16 @@
         },
         {
             "name": "squizlabs/php_codesniffer",
-            "version": "3.10.3",
+            "version": "3.11.2",
             "source": {
                 "type": "git",
                 "url": "https://github.com/PHPCSStandards/PHP_CodeSniffer.git",
-                "reference": "62d32998e820bddc40f99f8251958aed187a5c9c"
+                "reference": "1368f4a58c3c52114b86b1abe8f4098869cb0079"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/PHPCSStandards/PHP_CodeSniffer/zipball/62d32998e820bddc40f99f8251958aed187a5c9c",
-                "reference": "62d32998e820bddc40f99f8251958aed187a5c9c",
+                "url": "https://api.github.com/repos/PHPCSStandards/PHP_CodeSniffer/zipball/1368f4a58c3c52114b86b1abe8f4098869cb0079",
+                "reference": "1368f4a58c3c52114b86b1abe8f4098869cb0079",
                 "shasum": ""
             },
             "require": {
@@ -24434,20 +24455,20 @@
                     "type": "open_collective"
                 }
             ],
-            "time": "2024-09-18T10:38:58+00:00"
+            "time": "2024-12-11T16:04:26+00:00"
         },
         {
             "name": "symfony/browser-kit",
-            "version": "v7.1.6",
+            "version": "v7.2.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/browser-kit.git",
-                "reference": "714becc9ba9b20115ffededc58f6b7172dc394cf"
+                "reference": "8d64d17e198082f8f198d023a6b634e7b5fdda94"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/browser-kit/zipball/714becc9ba9b20115ffededc58f6b7172dc394cf",
-                "reference": "714becc9ba9b20115ffededc58f6b7172dc394cf",
+                "url": "https://api.github.com/repos/symfony/browser-kit/zipball/8d64d17e198082f8f198d023a6b634e7b5fdda94",
+                "reference": "8d64d17e198082f8f198d023a6b634e7b5fdda94",
                 "shasum": ""
             },
             "require": {
@@ -24486,7 +24507,7 @@
             "description": "Simulates the behavior of a web browser, allowing you to make requests, click on links and submit forms programmatically",
             "homepage": "https://symfony.com",
             "support": {
-                "source": "https://github.com/symfony/browser-kit/tree/v7.1.6"
+                "source": "https://github.com/symfony/browser-kit/tree/v7.2.0"
             },
             "funding": [
                 {
@@ -24502,7 +24523,7 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2024-10-25T15:11:02+00:00"
+            "time": "2024-10-25T15:15:23+00:00"
         },
         {
             "name": "symfony/config",
@@ -24581,16 +24602,16 @@
         },
         {
             "name": "symfony/dom-crawler",
-            "version": "v7.1.6",
+            "version": "v7.2.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/dom-crawler.git",
-                "reference": "794ddd5481ba15d8a04132c95e211cd5656e09fb"
+                "reference": "b176e1f1f550ef44c94eb971bf92488de08f7c6b"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/794ddd5481ba15d8a04132c95e211cd5656e09fb",
-                "reference": "794ddd5481ba15d8a04132c95e211cd5656e09fb",
+                "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/b176e1f1f550ef44c94eb971bf92488de08f7c6b",
+                "reference": "b176e1f1f550ef44c94eb971bf92488de08f7c6b",
                 "shasum": ""
             },
             "require": {
@@ -24628,7 +24649,7 @@
             "description": "Eases DOM navigation for HTML and XML documents",
             "homepage": "https://symfony.com",
             "support": {
-                "source": "https://github.com/symfony/dom-crawler/tree/v7.1.6"
+                "source": "https://github.com/symfony/dom-crawler/tree/v7.2.0"
             },
             "funding": [
                 {
@@ -24644,20 +24665,20 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2024-10-25T15:11:02+00:00"
+            "time": "2024-11-13T16:15:23+00:00"
         },
         {
             "name": "symfony/phpunit-bridge",
-            "version": "v6.4.13",
+            "version": "v6.4.16",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/phpunit-bridge.git",
-                "reference": "e6377bea5b114f70de6332fe935e160da5014ce8"
+                "reference": "cebafe2f1ad2d1e745c1015b7c2519592341e4e6"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/e6377bea5b114f70de6332fe935e160da5014ce8",
-                "reference": "e6377bea5b114f70de6332fe935e160da5014ce8",
+                "url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/cebafe2f1ad2d1e745c1015b7c2519592341e4e6",
+                "reference": "cebafe2f1ad2d1e745c1015b7c2519592341e4e6",
                 "shasum": ""
             },
             "require": {
@@ -24677,8 +24698,8 @@
             "type": "symfony-bridge",
             "extra": {
                 "thanks": {
-                    "name": "phpunit/phpunit",
-                    "url": "https://github.com/sebastianbergmann/phpunit"
+                    "url": "https://github.com/sebastianbergmann/phpunit",
+                    "name": "phpunit/phpunit"
                 }
             },
             "autoload": {
@@ -24710,7 +24731,7 @@
             "description": "Provides utilities for PHPUnit, especially user deprecation notices management",
             "homepage": "https://symfony.com",
             "support": {
-                "source": "https://github.com/symfony/phpunit-bridge/tree/v6.4.13"
+                "source": "https://github.com/symfony/phpunit-bridge/tree/v6.4.16"
             },
             "funding": [
                 {
@@ -24726,7 +24747,7 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2024-09-25T14:18:03+00:00"
+            "time": "2024-11-13T15:06:22+00:00"
         },
         {
             "name": "symfony/polyfill-php73",
@@ -24748,8 +24769,8 @@
             "type": "library",
             "extra": {
                 "thanks": {
-                    "name": "symfony/polyfill",
-                    "url": "https://github.com/symfony/polyfill"
+                    "url": "https://github.com/symfony/polyfill",
+                    "name": "symfony/polyfill"
                 }
             },
             "autoload": {
@@ -24806,20 +24827,21 @@
         },
         {
             "name": "symfony/translation",
-            "version": "v7.1.6",
+            "version": "v7.2.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/translation.git",
-                "reference": "b9f72ab14efdb6b772f85041fa12f820dee8d55f"
+                "reference": "dc89e16b44048ceecc879054e5b7f38326ab6cc5"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/translation/zipball/b9f72ab14efdb6b772f85041fa12f820dee8d55f",
-                "reference": "b9f72ab14efdb6b772f85041fa12f820dee8d55f",
+                "url": "https://api.github.com/repos/symfony/translation/zipball/dc89e16b44048ceecc879054e5b7f38326ab6cc5",
+                "reference": "dc89e16b44048ceecc879054e5b7f38326ab6cc5",
                 "shasum": ""
             },
             "require": {
                 "php": ">=8.2",
+                "symfony/deprecation-contracts": "^2.5|^3",
                 "symfony/polyfill-mbstring": "~1.0",
                 "symfony/translation-contracts": "^2.5|^3.0"
             },
@@ -24880,7 +24902,7 @@
             "description": "Provides tools to internationalize your application",
             "homepage": "https://symfony.com",
             "support": {
-                "source": "https://github.com/symfony/translation/tree/v7.1.6"
+                "source": "https://github.com/symfony/translation/tree/v7.2.0"
             },
             "funding": [
                 {
@@ -24896,7 +24918,7 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2024-09-28T12:35:13+00:00"
+            "time": "2024-11-12T20:47:56+00:00"
         },
         {
             "name": "theseer/tokenizer",
@@ -25199,20 +25221,20 @@
             "default-branch": true,
             "type": "library",
             "extra": {
-                "installer-paths": {
-                    "web/core": [
-                        "type:drupal-core"
-                    ]
-                },
                 "drupal-scaffold": {
                     "locations": {
                         "web-root": "web/"
                     },
                     "file-mapping": {
+                        "[project-root]/.gitignore": false,
                         "[project-root]/.editorconfig": false,
-                        "[project-root]/.gitattributes": false,
-                        "[project-root]/.gitignore": false
+                        "[project-root]/.gitattributes": false
                     }
+                },
+                "installer-paths": {
+                    "web/core": [
+                        "type:drupal-core"
+                    ]
                 }
             },
             "autoload": {
-- 
GitLab


From 3e6d5a23ccf8d2f78963e573e9493b173bf41e36 Mon Sep 17 00:00:00 2001
From: Zoltan Horvath <zoltan.horvath@ext.ec.europa.eu>
Date: Fri, 20 Dec 2024 11:12:25 +0100
Subject: [PATCH 081/137] ISAICP-9310: Remove duplicated jquery-jsonview
 dependency from package.json

---
 package.json | 1 -
 1 file changed, 1 deletion(-)

diff --git a/package.json b/package.json
index 2d078b0b25..d59e40b007 100644
--- a/package.json
+++ b/package.json
@@ -35,7 +35,6 @@
     "stylelint-prettier": "^4.1.0"
   },
   "dependencies": {
-    "jquery-jsonview": "^1.2.3",
     "@glidejs/glide": "^3.6.0",
     "dompurify": "^3.0.9",
     "jquery-colorbox": "^1.6.4",
-- 
GitLab


From e3ce58170cfc830da3d7496350006dd78ab5c4ad Mon Sep 17 00:00:00 2001
From: Zoltan Horvath <zoltan.horvath@ext.ec.europa.eu>
Date: Fri, 20 Dec 2024 11:45:02 +0100
Subject: [PATCH 082/137] ISAICP-9310: Upgrade Node.js packages

---
 package-lock.json | 2668 ++++++++++++++++++++++++++++++++-------------
 1 file changed, 1898 insertions(+), 770 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 6a78c25fd6..77bbc9add9 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -54,6 +54,7 @@
       "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz",
       "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==",
       "dev": true,
+      "license": "Apache-2.0",
       "dependencies": {
         "@jridgewell/gen-mapping": "^0.3.5",
         "@jridgewell/trace-mapping": "^0.3.24"
@@ -67,6 +68,7 @@
       "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz",
       "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@babel/helper-validator-identifier": "^7.25.9",
         "js-tokens": "^4.0.0",
@@ -77,10 +79,11 @@
       }
     },
     "node_modules/@babel/compat-data": {
-      "version": "7.26.2",
-      "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.2.tgz",
-      "integrity": "sha512-Z0WgzSEa+aUcdiJuCIqgujCshpMWgUpgOxXotrYPSA53hA3qopNaqcJpyr0hVb1FeWdnqFA35/fUtXgBK8srQg==",
+      "version": "7.26.3",
+      "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.3.tgz",
+      "integrity": "sha512-nHIxvKPniQXpmQLb0vhY3VaFb3S0YrTAwpOWJZh1wn3oJPjJk9Asva204PsBdmAE8vpzfHudT8DB0scYvy9q0g==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=6.9.0"
       }
@@ -90,6 +93,7 @@
       "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.9.tgz",
       "integrity": "sha512-G2EgeufBcYw27U4hhoIwFcgc1XU7TlXJ3mv04oOv1WCuo900U/anZSPzEqNjwdjgffkk2Gs0AN0dW1CKVLcG7w==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@ampproject/remapping": "^2.2.0",
         "@babel/code-frame": "^7.22.5",
@@ -116,13 +120,14 @@
       }
     },
     "node_modules/@babel/generator": {
-      "version": "7.26.2",
-      "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.2.tgz",
-      "integrity": "sha512-zevQbhbau95nkoxSq3f/DC/SC+EEOUZd3DYqfSkMhY2/wfSeaHV1Ew4vk8e+x8lja31IbyuUa2uQ3JONqKbysw==",
+      "version": "7.26.3",
+      "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.3.tgz",
+      "integrity": "sha512-6FF/urZvD0sTeO7k6/B15pMLC4CHUv1426lzr3N01aHJTl046uCAh9LXW/fzeXXjPNCJ6iABW5XaWOsIZB93aQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "@babel/parser": "^7.26.2",
-        "@babel/types": "^7.26.0",
+        "@babel/parser": "^7.26.3",
+        "@babel/types": "^7.26.3",
         "@jridgewell/gen-mapping": "^0.3.5",
         "@jridgewell/trace-mapping": "^0.3.25",
         "jsesc": "^3.0.2"
@@ -136,6 +141,7 @@
       "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.9.tgz",
       "integrity": "sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@babel/types": "^7.25.9"
       },
@@ -143,24 +149,12 @@
         "node": ">=6.9.0"
       }
     },
-    "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": {
-      "version": "7.25.9",
-      "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.25.9.tgz",
-      "integrity": "sha512-C47lC7LIDCnz0h4vai/tpNOI95tCd5ZT3iBt/DBH5lXKHZsyNQv18yf1wIIg2ntiQNgmAvA+DgZ82iW8Qdym8g==",
-      "dev": true,
-      "dependencies": {
-        "@babel/traverse": "^7.25.9",
-        "@babel/types": "^7.25.9"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
     "node_modules/@babel/helper-compilation-targets": {
       "version": "7.25.9",
       "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.9.tgz",
       "integrity": "sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@babel/compat-data": "^7.25.9",
         "@babel/helper-validator-option": "^7.25.9",
@@ -177,6 +171,7 @@
       "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.9.tgz",
       "integrity": "sha512-UTZQMvt0d/rSz6KI+qdu7GQze5TIajwTS++GUozlw8VBJDEOAqSXwm1WvmYEZwqdqSGQshRocPDqrt4HBZB3fQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@babel/helper-annotate-as-pure": "^7.25.9",
         "@babel/helper-member-expression-to-functions": "^7.25.9",
@@ -194,13 +189,14 @@
       }
     },
     "node_modules/@babel/helper-create-regexp-features-plugin": {
-      "version": "7.25.9",
-      "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.25.9.tgz",
-      "integrity": "sha512-ORPNZ3h6ZRkOyAa/SaHU+XsLZr0UQzRwuDQ0cczIA17nAzZ+85G5cVkOJIj7QavLZGSe8QXUmNFxSZzjcZF9bw==",
+      "version": "7.26.3",
+      "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.26.3.tgz",
+      "integrity": "sha512-G7ZRb40uUgdKOQqPLjfD12ZmGA54PzqDFUv2BKImnC9QIfGhIHKvVML0oN8IUiDq4iRqpq74ABpvOaerfWdong==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@babel/helper-annotate-as-pure": "^7.25.9",
-        "regexpu-core": "^6.1.1",
+        "regexpu-core": "^6.2.0",
         "semver": "^6.3.1"
       },
       "engines": {
@@ -211,10 +207,11 @@
       }
     },
     "node_modules/@babel/helper-define-polyfill-provider": {
-      "version": "0.6.2",
-      "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.2.tgz",
-      "integrity": "sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ==",
+      "version": "0.6.3",
+      "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.3.tgz",
+      "integrity": "sha512-HK7Bi+Hj6H+VTHA3ZvBis7V/6hu9QuTrnMXNybfUf2iiuU/N97I8VjB+KbhFF8Rld/Lx5MzoCwPCpPjfK+n8Cg==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@babel/helper-compilation-targets": "^7.22.6",
         "@babel/helper-plugin-utils": "^7.22.5",
@@ -231,6 +228,7 @@
       "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.25.9.tgz",
       "integrity": "sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@babel/traverse": "^7.25.9",
         "@babel/types": "^7.25.9"
@@ -244,6 +242,7 @@
       "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz",
       "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@babel/traverse": "^7.25.9",
         "@babel/types": "^7.25.9"
@@ -257,6 +256,7 @@
       "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz",
       "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@babel/helper-module-imports": "^7.25.9",
         "@babel/helper-validator-identifier": "^7.25.9",
@@ -274,6 +274,7 @@
       "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.25.9.tgz",
       "integrity": "sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@babel/types": "^7.25.9"
       },
@@ -286,6 +287,7 @@
       "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.9.tgz",
       "integrity": "sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=6.9.0"
       }
@@ -295,6 +297,7 @@
       "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.9.tgz",
       "integrity": "sha512-IZtukuUeBbhgOcaW2s06OXTzVNJR0ybm4W5xC1opWFFJMZbwRj5LCk+ByYH7WdZPZTt8KnFwA8pvjN2yqcPlgw==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@babel/helper-annotate-as-pure": "^7.25.9",
         "@babel/helper-wrap-function": "^7.25.9",
@@ -312,6 +315,7 @@
       "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.25.9.tgz",
       "integrity": "sha512-IiDqTOTBQy0sWyeXyGSC5TBJpGFXBkRynjBeXsvbhQFKj2viwJC76Epz35YLU1fpe/Am6Vppb7W7zM4fPQzLsQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@babel/helper-member-expression-to-functions": "^7.25.9",
         "@babel/helper-optimise-call-expression": "^7.25.9",
@@ -324,24 +328,12 @@
         "@babel/core": "^7.0.0"
       }
     },
-    "node_modules/@babel/helper-simple-access": {
-      "version": "7.25.9",
-      "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.25.9.tgz",
-      "integrity": "sha512-c6WHXuiaRsJTyHYLJV75t9IqsmTbItYfdj99PnzYGQZkYKvan5/2jKJ7gu31J3/BJ/A18grImSPModuyG/Eo0Q==",
-      "dev": true,
-      "dependencies": {
-        "@babel/traverse": "^7.25.9",
-        "@babel/types": "^7.25.9"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
     "node_modules/@babel/helper-skip-transparent-expression-wrappers": {
       "version": "7.25.9",
       "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.25.9.tgz",
       "integrity": "sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@babel/traverse": "^7.25.9",
         "@babel/types": "^7.25.9"
@@ -355,6 +347,7 @@
       "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz",
       "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=6.9.0"
       }
@@ -364,6 +357,7 @@
       "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz",
       "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=6.9.0"
       }
@@ -373,6 +367,7 @@
       "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz",
       "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=6.9.0"
       }
@@ -382,6 +377,7 @@
       "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.25.9.tgz",
       "integrity": "sha512-ETzz9UTjQSTmw39GboatdymDq4XIQbR8ySgVrylRhPOFpsd+JrKHIuF0de7GCWmem+T4uC5z7EZguod7Wj4A4g==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@babel/template": "^7.25.9",
         "@babel/traverse": "^7.25.9",
@@ -396,6 +392,7 @@
       "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.0.tgz",
       "integrity": "sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@babel/template": "^7.25.9",
         "@babel/types": "^7.26.0"
@@ -405,12 +402,13 @@
       }
     },
     "node_modules/@babel/parser": {
-      "version": "7.26.2",
-      "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.2.tgz",
-      "integrity": "sha512-DWMCZH9WA4Maitz2q21SRKHo9QXZxkDsbNZoVD62gusNtNBBqDg9i7uOhASfTfIGNzW+O+r7+jAlM8dwphcJKQ==",
+      "version": "7.26.3",
+      "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.3.tgz",
+      "integrity": "sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "@babel/types": "^7.26.0"
+        "@babel/types": "^7.26.3"
       },
       "bin": {
         "parser": "bin/babel-parser.js"
@@ -424,6 +422,7 @@
       "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.25.9.tgz",
       "integrity": "sha512-2qUwwfAFpJLZqxd02YW9btUCZHl+RFvdDkNfZwaIJrvB8Tesjsk8pEQkTvGwZXLqXUx/2oyY3ySRhm6HOXuCug==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@babel/helper-plugin-utils": "^7.25.9"
       },
@@ -439,6 +438,7 @@
       "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.25.9.tgz",
       "integrity": "sha512-6xWgLZTJXwilVjlnV7ospI3xi+sl8lN8rXXbBD6vYn3UYDlGsag8wrZkKcSI8G6KgqKP7vNFaDgeDnfAABq61g==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@babel/helper-plugin-utils": "^7.25.9",
         "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9",
@@ -456,6 +456,7 @@
       "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz",
       "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=6.9.0"
       },
@@ -469,6 +470,7 @@
       "integrity": "sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==",
       "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-unicode-property-regex instead.",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@babel/helper-create-regexp-features-plugin": "^7.18.6",
         "@babel/helper-plugin-utils": "^7.18.6"
@@ -485,6 +487,7 @@
       "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz",
       "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@babel/helper-plugin-utils": "^7.8.0"
       },
@@ -497,6 +500,7 @@
       "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz",
       "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@babel/helper-plugin-utils": "^7.12.13"
       },
@@ -509,6 +513,7 @@
       "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz",
       "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@babel/helper-plugin-utils": "^7.14.5"
       },
@@ -524,6 +529,7 @@
       "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz",
       "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@babel/helper-plugin-utils": "^7.8.0"
       },
@@ -536,6 +542,7 @@
       "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz",
       "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@babel/helper-plugin-utils": "^7.8.3"
       },
@@ -548,6 +555,7 @@
       "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.26.0.tgz",
       "integrity": "sha512-QCWT5Hh830hK5EQa7XzuqIkQU9tT/whqbDz7kuaZMHFl1inRRg7JnuAEOQ0Ur0QUl0NufCk1msK2BeY79Aj/eg==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@babel/helper-plugin-utils": "^7.25.9"
       },
@@ -563,6 +571,7 @@
       "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.26.0.tgz",
       "integrity": "sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@babel/helper-plugin-utils": "^7.25.9"
       },
@@ -578,6 +587,7 @@
       "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz",
       "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@babel/helper-plugin-utils": "^7.10.4"
       },
@@ -590,6 +600,7 @@
       "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz",
       "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@babel/helper-plugin-utils": "^7.8.0"
       },
@@ -602,6 +613,7 @@
       "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz",
       "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@babel/helper-plugin-utils": "^7.10.4"
       },
@@ -614,6 +626,7 @@
       "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz",
       "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@babel/helper-plugin-utils": "^7.8.0"
       },
@@ -626,6 +639,7 @@
       "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz",
       "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@babel/helper-plugin-utils": "^7.10.4"
       },
@@ -638,6 +652,7 @@
       "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz",
       "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@babel/helper-plugin-utils": "^7.8.0"
       },
@@ -650,6 +665,7 @@
       "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz",
       "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@babel/helper-plugin-utils": "^7.8.0"
       },
@@ -662,6 +678,7 @@
       "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz",
       "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@babel/helper-plugin-utils": "^7.8.0"
       },
@@ -674,6 +691,7 @@
       "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz",
       "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@babel/helper-plugin-utils": "^7.14.5"
       },
@@ -689,6 +707,7 @@
       "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz",
       "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@babel/helper-plugin-utils": "^7.14.5"
       },
@@ -704,6 +723,7 @@
       "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz",
       "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@babel/helper-create-regexp-features-plugin": "^7.18.6",
         "@babel/helper-plugin-utils": "^7.18.6"
@@ -720,6 +740,7 @@
       "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.25.9.tgz",
       "integrity": "sha512-6jmooXYIwn9ca5/RylZADJ+EnSxVUS5sjeJ9UPk6RWRzXCmOJCy6dqItPJFpw2cuCangPK4OYr5uhGKcmrm5Qg==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@babel/helper-plugin-utils": "^7.25.9"
       },
@@ -735,6 +756,7 @@
       "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.9.tgz",
       "integrity": "sha512-RXV6QAzTBbhDMO9fWwOmwwTuYaiPbggWQ9INdZqAYeSHyG7FzQ+nOZaUUjNwKv9pV3aE4WFqFm1Hnbci5tBCAw==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@babel/helper-plugin-utils": "^7.25.9",
         "@babel/helper-remap-async-to-generator": "^7.25.9",
@@ -752,6 +774,7 @@
       "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.25.9.tgz",
       "integrity": "sha512-NT7Ejn7Z/LjUH0Gv5KsBCxh7BH3fbLTV0ptHvpeMvrt3cPThHfJfst9Wrb7S8EvJ7vRTFI7z+VAvFVEQn/m5zQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@babel/helper-module-imports": "^7.25.9",
         "@babel/helper-plugin-utils": "^7.25.9",
@@ -769,6 +792,7 @@
       "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.25.9.tgz",
       "integrity": "sha512-toHc9fzab0ZfenFpsyYinOX0J/5dgJVA2fm64xPewu7CoYHWEivIWKxkK2rMi4r3yQqLnVmheMXRdG+k239CgA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@babel/helper-plugin-utils": "^7.25.9"
       },
@@ -784,6 +808,7 @@
       "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.25.9.tgz",
       "integrity": "sha512-1F05O7AYjymAtqbsFETboN1NvBdcnzMerO+zlMyJBEz6WkMdejvGWw9p05iTSjC85RLlBseHHQpYaM4gzJkBGg==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@babel/helper-plugin-utils": "^7.25.9"
       },
@@ -799,6 +824,7 @@
       "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.25.9.tgz",
       "integrity": "sha512-bbMAII8GRSkcd0h0b4X+36GksxuheLFjP65ul9w6C3KgAamI3JqErNgSrosX6ZPj+Mpim5VvEbawXxJCyEUV3Q==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@babel/helper-create-class-features-plugin": "^7.25.9",
         "@babel/helper-plugin-utils": "^7.25.9"
@@ -815,6 +841,7 @@
       "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.26.0.tgz",
       "integrity": "sha512-6J2APTs7BDDm+UMqP1useWqhcRAXo0WIoVj26N7kPFB6S73Lgvyka4KTZYIxtgYXiN5HTyRObA72N2iu628iTQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@babel/helper-create-class-features-plugin": "^7.25.9",
         "@babel/helper-plugin-utils": "^7.25.9"
@@ -831,6 +858,7 @@
       "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.9.tgz",
       "integrity": "sha512-mD8APIXmseE7oZvZgGABDyM34GUmK45Um2TXiBUt7PnuAxrgoSVf123qUzPxEr/+/BHrRn5NMZCdE2m/1F8DGg==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@babel/helper-annotate-as-pure": "^7.25.9",
         "@babel/helper-compilation-targets": "^7.25.9",
@@ -851,6 +879,7 @@
       "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.25.9.tgz",
       "integrity": "sha512-HnBegGqXZR12xbcTHlJ9HGxw1OniltT26J5YpfruGqtUHlz/xKf/G2ak9e+t0rVqrjXa9WOhvYPz1ERfMj23AA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@babel/helper-plugin-utils": "^7.25.9",
         "@babel/template": "^7.25.9"
@@ -867,6 +896,7 @@
       "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.25.9.tgz",
       "integrity": "sha512-WkCGb/3ZxXepmMiX101nnGiU+1CAdut8oHyEOHxkKuS1qKpU2SMXE2uSvfz8PBuLd49V6LEsbtyPhWC7fnkgvQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@babel/helper-plugin-utils": "^7.25.9"
       },
@@ -882,6 +912,7 @@
       "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.25.9.tgz",
       "integrity": "sha512-t7ZQ7g5trIgSRYhI9pIJtRl64KHotutUJsh4Eze5l7olJv+mRSg4/MmbZ0tv1eeqRbdvo/+trvJD/Oc5DmW2cA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@babel/helper-create-regexp-features-plugin": "^7.25.9",
         "@babel/helper-plugin-utils": "^7.25.9"
@@ -898,6 +929,7 @@
       "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.25.9.tgz",
       "integrity": "sha512-LZxhJ6dvBb/f3x8xwWIuyiAHy56nrRG3PeYTpBkkzkYRRQ6tJLu68lEF5VIqMUZiAV7a8+Tb78nEoMCMcqjXBw==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@babel/helper-plugin-utils": "^7.25.9"
       },
@@ -913,6 +945,7 @@
       "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.25.9.tgz",
       "integrity": "sha512-GCggjexbmSLaFhqsojeugBpeaRIgWNTcgKVq/0qIteFEqY2A+b9QidYadrWlnbWQUrW5fn+mCvf3tr7OeBFTyg==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@babel/helper-plugin-utils": "^7.25.9"
       },
@@ -924,12 +957,12 @@
       }
     },
     "node_modules/@babel/plugin-transform-exponentiation-operator": {
-      "version": "7.25.9",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.25.9.tgz",
-      "integrity": "sha512-KRhdhlVk2nObA5AYa7QMgTMTVJdfHprfpAk4DjZVtllqRg9qarilstTKEhpVjyt+Npi8ThRyiV8176Am3CodPA==",
+      "version": "7.26.3",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.26.3.tgz",
+      "integrity": "sha512-7CAHcQ58z2chuXPWblnn1K6rLDnDWieghSOEmqQsrBenH0P9InCUtOJYD89pvngljmZlJcz3fcmgYsXFNGa1ZQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "@babel/helper-builder-binary-assignment-operator-visitor": "^7.25.9",
         "@babel/helper-plugin-utils": "^7.25.9"
       },
       "engines": {
@@ -944,6 +977,7 @@
       "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.25.9.tgz",
       "integrity": "sha512-2NsEz+CxzJIVOPx2o9UsW1rXLqtChtLoVnwYHHiB04wS5sgn7mrV45fWMBX0Kk+ub9uXytVYfNP2HjbVbCB3Ww==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@babel/helper-plugin-utils": "^7.25.9"
       },
@@ -959,6 +993,7 @@
       "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.25.9.tgz",
       "integrity": "sha512-LqHxduHoaGELJl2uhImHwRQudhCM50pT46rIBNvtT/Oql3nqiS3wOwP+5ten7NpYSXrrVLgtZU3DZmPtWZo16A==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@babel/helper-plugin-utils": "^7.25.9",
         "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9"
@@ -975,6 +1010,7 @@
       "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.9.tgz",
       "integrity": "sha512-8lP+Yxjv14Vc5MuWBpJsoUCd3hD6V9DgBon2FVYL4jJgbnVQ9fTgYmonchzZJOVNgzEgbxp4OwAf6xz6M/14XA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@babel/helper-compilation-targets": "^7.25.9",
         "@babel/helper-plugin-utils": "^7.25.9",
@@ -992,6 +1028,7 @@
       "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.25.9.tgz",
       "integrity": "sha512-xoTMk0WXceiiIvsaquQQUaLLXSW1KJ159KP87VilruQm0LNNGxWzahxSS6T6i4Zg3ezp4vA4zuwiNUR53qmQAw==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@babel/helper-plugin-utils": "^7.25.9"
       },
@@ -1007,6 +1044,7 @@
       "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.9.tgz",
       "integrity": "sha512-9N7+2lFziW8W9pBl2TzaNht3+pgMIRP74zizeCSrtnSKVdUl8mAjjOP2OOVQAfZ881P2cNjDj1uAMEdeD50nuQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@babel/helper-plugin-utils": "^7.25.9"
       },
@@ -1022,6 +1060,7 @@
       "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.25.9.tgz",
       "integrity": "sha512-wI4wRAzGko551Y8eVf6iOY9EouIDTtPb0ByZx+ktDGHwv6bHFimrgJM/2T021txPZ2s4c7bqvHbd+vXG6K948Q==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@babel/helper-plugin-utils": "^7.25.9"
       },
@@ -1037,6 +1076,7 @@
       "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.25.9.tgz",
       "integrity": "sha512-PYazBVfofCQkkMzh2P6IdIUaCEWni3iYEerAsRWuVd8+jlM1S9S9cz1dF9hIzyoZ8IA3+OwVYIp9v9e+GbgZhA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@babel/helper-plugin-utils": "^7.25.9"
       },
@@ -1052,6 +1092,7 @@
       "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.25.9.tgz",
       "integrity": "sha512-g5T11tnI36jVClQlMlt4qKDLlWnG5pP9CSM4GhdRciTNMRgkfpo5cR6b4rGIOYPgRRuFAvwjPQ/Yk+ql4dyhbw==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@babel/helper-module-transforms": "^7.25.9",
         "@babel/helper-plugin-utils": "^7.25.9"
@@ -1064,14 +1105,14 @@
       }
     },
     "node_modules/@babel/plugin-transform-modules-commonjs": {
-      "version": "7.25.9",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.25.9.tgz",
-      "integrity": "sha512-dwh2Ol1jWwL2MgkCzUSOvfmKElqQcuswAZypBSUsScMXvgdT8Ekq5YA6TtqpTVWH+4903NmboMuH1o9i8Rxlyg==",
+      "version": "7.26.3",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.26.3.tgz",
+      "integrity": "sha512-MgR55l4q9KddUDITEzEFYn5ZsGDXMSsU9E+kh7fjRXTIC3RHqfCo8RPRbyReYJh44HQ/yomFkqbOFohXvDCiIQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "@babel/helper-module-transforms": "^7.25.9",
-        "@babel/helper-plugin-utils": "^7.25.9",
-        "@babel/helper-simple-access": "^7.25.9"
+        "@babel/helper-module-transforms": "^7.26.0",
+        "@babel/helper-plugin-utils": "^7.25.9"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1085,6 +1126,7 @@
       "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.9.tgz",
       "integrity": "sha512-hyss7iIlH/zLHaehT+xwiymtPOpsiwIIRlCAOwBB04ta5Tt+lNItADdlXw3jAWZ96VJ2jlhl/c+PNIQPKNfvcA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@babel/helper-module-transforms": "^7.25.9",
         "@babel/helper-plugin-utils": "^7.25.9",
@@ -1103,6 +1145,7 @@
       "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.25.9.tgz",
       "integrity": "sha512-bS9MVObUgE7ww36HEfwe6g9WakQ0KF07mQF74uuXdkoziUPfKyu/nIm663kz//e5O1nPInPFx36z7WJmJ4yNEw==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@babel/helper-module-transforms": "^7.25.9",
         "@babel/helper-plugin-utils": "^7.25.9"
@@ -1119,6 +1162,7 @@
       "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.25.9.tgz",
       "integrity": "sha512-oqB6WHdKTGl3q/ItQhpLSnWWOpjUJLsOCLVyeFgeTktkBSCiurvPOsyt93gibI9CmuKvTUEtWmG5VhZD+5T/KA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@babel/helper-create-regexp-features-plugin": "^7.25.9",
         "@babel/helper-plugin-utils": "^7.25.9"
@@ -1135,6 +1179,7 @@
       "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.25.9.tgz",
       "integrity": "sha512-U/3p8X1yCSoKyUj2eOBIx3FOn6pElFOKvAAGf8HTtItuPyB+ZeOqfn+mvTtg9ZlOAjsPdK3ayQEjqHjU/yLeVQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@babel/helper-plugin-utils": "^7.25.9"
       },
@@ -1150,6 +1195,7 @@
       "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.25.9.tgz",
       "integrity": "sha512-ENfftpLZw5EItALAD4WsY/KUWvhUlZndm5GC7G3evUsVeSJB6p0pBeLQUnRnBCBx7zV0RKQjR9kCuwrsIrjWog==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@babel/helper-plugin-utils": "^7.25.9"
       },
@@ -1165,6 +1211,7 @@
       "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.25.9.tgz",
       "integrity": "sha512-TlprrJ1GBZ3r6s96Yq8gEQv82s8/5HnCVHtEJScUj90thHQbwe+E5MLhi2bbNHBEJuzrvltXSru+BUxHDoog7Q==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@babel/helper-plugin-utils": "^7.25.9"
       },
@@ -1180,6 +1227,7 @@
       "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.25.9.tgz",
       "integrity": "sha512-fSaXafEE9CVHPweLYw4J0emp1t8zYTXyzN3UuG+lylqkvYd7RMrsOQ8TYx5RF231be0vqtFC6jnx3UmpJmKBYg==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@babel/helper-compilation-targets": "^7.25.9",
         "@babel/helper-plugin-utils": "^7.25.9",
@@ -1197,6 +1245,7 @@
       "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.25.9.tgz",
       "integrity": "sha512-Kj/Gh+Rw2RNLbCK1VAWj2U48yxxqL2x0k10nPtSdRa0O2xnHXalD0s+o1A6a0W43gJ00ANo38jxkQreckOzv5A==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@babel/helper-plugin-utils": "^7.25.9",
         "@babel/helper-replace-supers": "^7.25.9"
@@ -1213,6 +1262,7 @@
       "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.25.9.tgz",
       "integrity": "sha512-qM/6m6hQZzDcZF3onzIhZeDHDO43bkNNlOX0i8n3lR6zLbu0GN2d8qfM/IERJZYauhAHSLHy39NF0Ctdvcid7g==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@babel/helper-plugin-utils": "^7.25.9"
       },
@@ -1228,6 +1278,7 @@
       "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.25.9.tgz",
       "integrity": "sha512-6AvV0FsLULbpnXeBjrY4dmWF8F7gf8QnvTEoO/wX/5xm/xE1Xo8oPuD3MPS+KS9f9XBEAWN7X1aWr4z9HdOr7A==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@babel/helper-plugin-utils": "^7.25.9",
         "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9"
@@ -1244,6 +1295,7 @@
       "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.25.9.tgz",
       "integrity": "sha512-wzz6MKwpnshBAiRmn4jR8LYz/g8Ksg0o80XmwZDlordjwEk9SxBzTWC7F5ef1jhbrbOW2DJ5J6ayRukrJmnr0g==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@babel/helper-plugin-utils": "^7.25.9"
       },
@@ -1259,6 +1311,7 @@
       "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.25.9.tgz",
       "integrity": "sha512-D/JUozNpQLAPUVusvqMxyvjzllRaF8/nSrP1s2YGQT/W4LHK4xxsMcHjhOGTS01mp9Hda8nswb+FblLdJornQw==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@babel/helper-create-class-features-plugin": "^7.25.9",
         "@babel/helper-plugin-utils": "^7.25.9"
@@ -1275,6 +1328,7 @@
       "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.25.9.tgz",
       "integrity": "sha512-Evf3kcMqzXA3xfYJmZ9Pg1OvKdtqsDMSWBDzZOPLvHiTt36E75jLDQo5w1gtRU95Q4E5PDttrTf25Fw8d/uWLw==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@babel/helper-annotate-as-pure": "^7.25.9",
         "@babel/helper-create-class-features-plugin": "^7.25.9",
@@ -1292,6 +1346,7 @@
       "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.25.9.tgz",
       "integrity": "sha512-IvIUeV5KrS/VPavfSM/Iu+RE6llrHrYIKY1yfCzyO/lMXHQ+p7uGhonmGVisv6tSBSVgWzMBohTcvkC9vQcQFA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@babel/helper-plugin-utils": "^7.25.9"
       },
@@ -1307,6 +1362,7 @@
       "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.25.9.tgz",
       "integrity": "sha512-vwDcDNsgMPDGP0nMqzahDWE5/MLcX8sv96+wfX7as7LoF/kr97Bo/7fI00lXY4wUXYfVmwIIyG80fGZ1uvt2qg==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@babel/helper-plugin-utils": "^7.25.9",
         "regenerator-transform": "^0.15.2"
@@ -1323,6 +1379,7 @@
       "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.25.9.tgz",
       "integrity": "sha512-7DL7DKYjn5Su++4RXu8puKZm2XBPHyjWLUidaPEkCUBbE7IPcsrkRHggAOOKydH1dASWdcUBxrkOGNxUv5P3Jg==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@babel/helper-plugin-utils": "^7.25.9"
       },
@@ -1338,6 +1395,7 @@
       "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.25.9.tgz",
       "integrity": "sha512-MUv6t0FhO5qHnS/W8XCbHmiRWOphNufpE1IVxhK5kuN3Td9FT1x4rx4K42s3RYdMXCXpfWkGSbCSd0Z64xA7Ng==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@babel/helper-plugin-utils": "^7.25.9"
       },
@@ -1353,6 +1411,7 @@
       "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.25.9.tgz",
       "integrity": "sha512-oNknIB0TbURU5pqJFVbOOFspVlrpVwo2H1+HUIsVDvp5VauGGDP1ZEvO8Nn5xyMEs3dakajOxlmkNW7kNgSm6A==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@babel/helper-plugin-utils": "^7.25.9",
         "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9"
@@ -1369,6 +1428,7 @@
       "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.25.9.tgz",
       "integrity": "sha512-WqBUSgeVwucYDP9U/xNRQam7xV8W5Zf+6Eo7T2SRVUFlhRiMNFdFz58u0KZmCVVqs2i7SHgpRnAhzRNmKfi2uA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@babel/helper-plugin-utils": "^7.25.9"
       },
@@ -1384,6 +1444,7 @@
       "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.25.9.tgz",
       "integrity": "sha512-o97AE4syN71M/lxrCtQByzphAdlYluKPDBzDVzMmfCobUjjhAryZV0AIpRPrxN0eAkxXO6ZLEScmt+PNhj2OTw==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@babel/helper-plugin-utils": "^7.25.9"
       },
@@ -1399,6 +1460,7 @@
       "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.25.9.tgz",
       "integrity": "sha512-v61XqUMiueJROUv66BVIOi0Fv/CUuZuZMl5NkRoCVxLAnMexZ0A3kMe7vvZ0nulxMuMp0Mk6S5hNh48yki08ZA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@babel/helper-plugin-utils": "^7.25.9"
       },
@@ -1414,6 +1476,7 @@
       "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.25.9.tgz",
       "integrity": "sha512-s5EDrE6bW97LtxOcGj1Khcx5AaXwiMmi4toFWRDP9/y0Woo6pXC+iyPu/KuhKtfSrNFd7jJB+/fkOtZy6aIC6Q==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@babel/helper-plugin-utils": "^7.25.9"
       },
@@ -1429,6 +1492,7 @@
       "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.25.9.tgz",
       "integrity": "sha512-Jt2d8Ga+QwRluxRQ307Vlxa6dMrYEMZCgGxoPR8V52rxPyldHu3hdlHspxaqYmE7oID5+kB+UKUB/eWS+DkkWg==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@babel/helper-create-regexp-features-plugin": "^7.25.9",
         "@babel/helper-plugin-utils": "^7.25.9"
@@ -1445,6 +1509,7 @@
       "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.25.9.tgz",
       "integrity": "sha512-yoxstj7Rg9dlNn9UQxzk4fcNivwv4nUYz7fYXBaKxvw/lnmPuOm/ikoELygbYq68Bls3D/D+NBPHiLwZdZZ4HA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@babel/helper-create-regexp-features-plugin": "^7.25.9",
         "@babel/helper-plugin-utils": "^7.25.9"
@@ -1461,6 +1526,7 @@
       "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.25.9.tgz",
       "integrity": "sha512-8BYqO3GeVNHtx69fdPshN3fnzUNLrWdHhk/icSwigksJGczKSizZ+Z6SBCxTs723Fr5VSNorTIK7a+R2tISvwQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@babel/helper-create-regexp-features-plugin": "^7.25.9",
         "@babel/helper-plugin-utils": "^7.25.9"
@@ -1477,6 +1543,7 @@
       "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.22.9.tgz",
       "integrity": "sha512-wNi5H/Emkhll/bqPjsjQorSykrlfY5OWakd6AulLvMEytpKasMVUpVy8RL4qBIBs5Ac6/5i0/Rv0b/Fg6Eag/g==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@babel/compat-data": "^7.22.9",
         "@babel/helper-compilation-targets": "^7.22.9",
@@ -1571,6 +1638,7 @@
       "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6.tgz",
       "integrity": "sha512-ID2yj6K/4lKfhuU3+EX4UvNbIt7eACFbHmNUjzA+ep+B5971CknnA/9DEWKbRokfbbtblxxxXFJJrH47UEAMVg==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@babel/helper-plugin-utils": "^7.0.0",
         "@babel/plugin-proposal-unicode-property-regex": "^7.4.4",
@@ -1587,6 +1655,7 @@
       "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.6.tgz",
       "integrity": "sha512-wDb5pWm4WDdF6LFUde3Jl8WzPA+3ZbxYqkC6xAXuD3irdEHN1k0NfTRrJD8ZD378SJ61miMLCqIOXYhd8x+AJQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "regenerator-runtime": "^0.13.11"
       },
@@ -1599,6 +1668,7 @@
       "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.9.tgz",
       "integrity": "sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@babel/code-frame": "^7.25.9",
         "@babel/parser": "^7.25.9",
@@ -1609,16 +1679,17 @@
       }
     },
     "node_modules/@babel/traverse": {
-      "version": "7.25.9",
-      "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.9.tgz",
-      "integrity": "sha512-ZCuvfwOwlz/bawvAuvcj8rrithP2/N55Tzz342AkTvq4qaWbGfmCk/tKhNaV2cthijKrPAA8SRJV5WWe7IBMJw==",
+      "version": "7.26.4",
+      "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.4.tgz",
+      "integrity": "sha512-fH+b7Y4p3yqvApJALCPJcwb0/XaOSgtK4pzV6WVjPR5GLFQBRI7pfoX2V2iM48NXvX07NUxxm1Vw98YjqTcU5w==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "@babel/code-frame": "^7.25.9",
-        "@babel/generator": "^7.25.9",
-        "@babel/parser": "^7.25.9",
+        "@babel/code-frame": "^7.26.2",
+        "@babel/generator": "^7.26.3",
+        "@babel/parser": "^7.26.3",
         "@babel/template": "^7.25.9",
-        "@babel/types": "^7.25.9",
+        "@babel/types": "^7.26.3",
         "debug": "^4.3.1",
         "globals": "^11.1.0"
       },
@@ -1627,10 +1698,11 @@
       }
     },
     "node_modules/@babel/types": {
-      "version": "7.26.0",
-      "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.0.tgz",
-      "integrity": "sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==",
+      "version": "7.26.3",
+      "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.3.tgz",
+      "integrity": "sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@babel/helper-string-parser": "^7.25.9",
         "@babel/helper-validator-identifier": "^7.25.9"
@@ -1644,6 +1716,7 @@
       "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz",
       "integrity": "sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=0.1.90"
       }
@@ -1663,6 +1736,7 @@
           "url": "https://opencollective.com/csstools"
         }
       ],
+      "license": "MIT",
       "engines": {
         "node": "^14 || ^16 || >=18"
       },
@@ -1685,6 +1759,7 @@
           "url": "https://opencollective.com/csstools"
         }
       ],
+      "license": "MIT",
       "engines": {
         "node": "^14 || ^16 || >=18"
       }
@@ -1704,6 +1779,7 @@
           "url": "https://opencollective.com/csstools"
         }
       ],
+      "license": "MIT",
       "engines": {
         "node": "^14 || ^16 || >=18"
       },
@@ -1727,6 +1803,7 @@
           "url": "https://opencollective.com/csstools"
         }
       ],
+      "license": "MIT-0",
       "engines": {
         "node": "^14 || ^16 || >=18"
       },
@@ -1739,6 +1816,7 @@
       "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.3.tgz",
       "integrity": "sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "colorspace": "1.1.x",
         "enabled": "2.0.x",
@@ -1750,6 +1828,7 @@
       "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.41.0.tgz",
       "integrity": "sha512-aKUhyn1QI5Ksbqcr3fFJj16p99QdjUxXAEuFst1Z47DRyoiMwivIH9MV/ARcJOCXVjPfjITciej8ZD2O/6qUmw==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "comment-parser": "1.4.1",
         "esquery": "^1.5.0",
@@ -1764,6 +1843,7 @@
       "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz",
       "integrity": "sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "eslint-visitor-keys": "^3.4.3"
       },
@@ -1782,6 +1862,7 @@
       "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
       "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==",
       "dev": true,
+      "license": "Apache-2.0",
       "engines": {
         "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
       },
@@ -1794,6 +1875,7 @@
       "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz",
       "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": "^12.0.0 || ^14.0.0 || >=16.0.0"
       }
@@ -1803,6 +1885,7 @@
       "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz",
       "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "ajv": "^6.12.4",
         "debug": "^4.3.2",
@@ -1826,6 +1909,7 @@
       "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz",
       "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "type-fest": "^0.20.2"
       },
@@ -1841,6 +1925,7 @@
       "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
       "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
       "dev": true,
+      "license": "(MIT OR CC0-1.0)",
       "engines": {
         "node": ">=10"
       },
@@ -1853,14 +1938,16 @@
       "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz",
       "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
       }
     },
     "node_modules/@glidejs/glide": {
-      "version": "3.6.2",
-      "resolved": "https://registry.npmjs.org/@glidejs/glide/-/glide-3.6.2.tgz",
-      "integrity": "sha512-oXw7In0IZV69PC0PChQakY+yh+UnqIb5+zfVuEIzub6Kkfl1foo7TAhr2PZXPzihOG9YS57t8wvdzBFEZ0aPVA=="
+      "version": "3.7.1",
+      "resolved": "https://registry.npmjs.org/@glidejs/glide/-/glide-3.7.1.tgz",
+      "integrity": "sha512-8he0pZpLSqTesSFYiuWdhBmtdlYSPWxfPUCKtkkiX6ZmT8UdMdmoFPtJaOwLBXv4p2JiGxqbuPdiRGGo2e/htQ==",
+      "license": "MIT"
     },
     "node_modules/@humanwhocodes/config-array": {
       "version": "0.13.0",
@@ -1868,6 +1955,7 @@
       "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==",
       "deprecated": "Use @eslint/config-array instead",
       "dev": true,
+      "license": "Apache-2.0",
       "dependencies": {
         "@humanwhocodes/object-schema": "^2.0.3",
         "debug": "^4.3.1",
@@ -1882,6 +1970,7 @@
       "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
       "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==",
       "dev": true,
+      "license": "Apache-2.0",
       "engines": {
         "node": ">=12.22"
       },
@@ -1895,13 +1984,15 @@
       "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz",
       "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==",
       "deprecated": "Use @eslint/object-schema instead",
-      "dev": true
+      "dev": true,
+      "license": "BSD-3-Clause"
     },
     "node_modules/@isaacs/cliui": {
       "version": "8.0.2",
       "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz",
       "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==",
       "dev": true,
+      "license": "ISC",
       "dependencies": {
         "string-width": "^5.1.2",
         "string-width-cjs": "npm:string-width@^4.2.0",
@@ -1919,6 +2010,7 @@
       "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz",
       "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=12"
       },
@@ -1931,6 +2023,7 @@
       "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
       "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "ansi-regex": "^6.0.1"
       },
@@ -1946,15 +2039,17 @@
       "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz",
       "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=8"
       }
     },
     "node_modules/@jridgewell/gen-mapping": {
-      "version": "0.3.5",
-      "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz",
-      "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==",
+      "version": "0.3.8",
+      "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz",
+      "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@jridgewell/set-array": "^1.2.1",
         "@jridgewell/sourcemap-codec": "^1.4.10",
@@ -1969,6 +2064,7 @@
       "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
       "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=6.0.0"
       }
@@ -1978,6 +2074,7 @@
       "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz",
       "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=6.0.0"
       }
@@ -1987,6 +2084,7 @@
       "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz",
       "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@jridgewell/gen-mapping": "^0.3.5",
         "@jridgewell/trace-mapping": "^0.3.25"
@@ -1996,13 +2094,15 @@
       "version": "1.5.0",
       "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz",
       "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/@jridgewell/trace-mapping": {
       "version": "0.3.25",
       "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz",
       "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@jridgewell/resolve-uri": "^3.1.0",
         "@jridgewell/sourcemap-codec": "^1.4.14"
@@ -2013,6 +2113,7 @@
       "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
       "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@nodelib/fs.stat": "2.0.5",
         "run-parallel": "^1.1.9"
@@ -2026,6 +2127,7 @@
       "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
       "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">= 8"
       }
@@ -2035,6 +2137,7 @@
       "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
       "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@nodelib/fs.scandir": "2.1.5",
         "fastq": "^1.6.0"
@@ -2048,6 +2151,7 @@
       "resolved": "https://registry.npmjs.org/@openeuropa/bcl-bootstrap/-/bcl-bootstrap-1.2.0.tgz",
       "integrity": "sha512-WC8UOC53pgMhbNBJ2UH+edr3CWr7+G+dNLpO+oFdBxVxXOJljRIhA6H1KeoXvsLvIQZeFv2v4Bqx3fsEYeIOTw==",
       "dev": true,
+      "license": "EUPL-1.2",
       "bin": {
         "plugins-builder": "bin/build-plugins.js"
       }
@@ -2057,6 +2161,7 @@
       "resolved": "https://registry.npmjs.org/@openeuropa/bcl-builder/-/bcl-builder-1.2.0.tgz",
       "integrity": "sha512-7Q1+PvdeCfmThD5F0y/IWCxNeEhjxIic4yh+Qg/QtwQI7xBq7cjawc4lw/I7Kf20UYgFY7rmfPAYFZQdp7KZyg==",
       "dev": true,
+      "license": "EUPL-1.2",
       "dependencies": {
         "@babel/core": "7.22.9",
         "@babel/preset-env": "7.22.9",
@@ -2108,6 +2213,7 @@
           "url": "https://github.com/sponsors/ai"
         }
       ],
+      "license": "MIT",
       "dependencies": {
         "nanoid": "^3.3.6",
         "picocolors": "^1.0.0",
@@ -2122,6 +2228,7 @@
       "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.27.0.tgz",
       "integrity": "sha512-aOltLCrYZ0FhJDm7fCqwTjIUEVjWjcydKBV/Zeid6Mn8BWgDCUBBWT5beM5ieForYNo/1ZHuGJdka26kvQ3Gzg==",
       "dev": true,
+      "license": "MIT",
       "bin": {
         "rollup": "dist/bin/rollup"
       },
@@ -2137,19 +2244,22 @@
       "version": "1.2.0",
       "resolved": "https://registry.npmjs.org/@openeuropa/bcl-theme-default/-/bcl-theme-default-1.2.0.tgz",
       "integrity": "sha512-LOP5uGg7x769vB+hu0maUdWXM4UgZz2Qz9+cX8eudbKIU4nmW+lXHD5FCFe93uQJIvWHoehxhn/t8eAXjCVYIA==",
-      "dev": true
+      "dev": true,
+      "license": "EUPL-1.2"
     },
     "node_modules/@openeuropa/bcl-theme-joinup": {
       "version": "1.2.0",
       "resolved": "https://registry.npmjs.org/@openeuropa/bcl-theme-joinup/-/bcl-theme-joinup-1.2.0.tgz",
       "integrity": "sha512-M9pJyGIO4aBMgWQ82lbaLtAltFsppc2gxNwrfLV0tGapXhygQ2Er0oLDbIsnCEuThJclaI4WLT4XFNBigaQi5w==",
-      "dev": true
+      "dev": true,
+      "license": "EUPL-1.2"
     },
     "node_modules/@pkgjs/parseargs": {
       "version": "0.11.0",
       "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz",
       "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==",
       "dev": true,
+      "license": "MIT",
       "optional": true,
       "engines": {
         "node": ">=14"
@@ -2160,6 +2270,7 @@
       "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.1.tgz",
       "integrity": "sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": "^12.20.0 || ^14.18.0 || >=16.0.0"
       },
@@ -2172,6 +2283,7 @@
       "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz",
       "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==",
       "dev": true,
+      "license": "MIT",
       "funding": {
         "type": "opencollective",
         "url": "https://opencollective.com/popperjs"
@@ -2182,6 +2294,7 @@
       "resolved": "https://registry.npmjs.org/@resvg/resvg-js/-/resvg-js-2.6.2.tgz",
       "integrity": "sha512-xBaJish5OeGmniDj9cW5PRa/PtmuVU3ziqrbr5xJj901ZDN4TosrVaNZpEiLZAxdfnhAe7uQ7QFWfjPe9d9K2Q==",
       "dev": true,
+      "license": "MPL-2.0",
       "engines": {
         "node": ">= 10"
       },
@@ -2208,6 +2321,7 @@
         "arm"
       ],
       "dev": true,
+      "license": "MPL-2.0",
       "optional": true,
       "os": [
         "android"
@@ -2224,6 +2338,7 @@
         "arm64"
       ],
       "dev": true,
+      "license": "MPL-2.0",
       "optional": true,
       "os": [
         "android"
@@ -2240,6 +2355,7 @@
         "arm64"
       ],
       "dev": true,
+      "license": "MPL-2.0",
       "optional": true,
       "os": [
         "darwin"
@@ -2256,6 +2372,7 @@
         "x64"
       ],
       "dev": true,
+      "license": "MPL-2.0",
       "optional": true,
       "os": [
         "darwin"
@@ -2272,6 +2389,7 @@
         "arm"
       ],
       "dev": true,
+      "license": "MPL-2.0",
       "optional": true,
       "os": [
         "linux"
@@ -2288,6 +2406,7 @@
         "arm64"
       ],
       "dev": true,
+      "license": "MPL-2.0",
       "optional": true,
       "os": [
         "linux"
@@ -2304,6 +2423,7 @@
         "arm64"
       ],
       "dev": true,
+      "license": "MPL-2.0",
       "optional": true,
       "os": [
         "linux"
@@ -2320,6 +2440,7 @@
         "x64"
       ],
       "dev": true,
+      "license": "MPL-2.0",
       "optional": true,
       "os": [
         "linux"
@@ -2336,6 +2457,7 @@
         "x64"
       ],
       "dev": true,
+      "license": "MPL-2.0",
       "optional": true,
       "os": [
         "linux"
@@ -2352,6 +2474,7 @@
         "arm64"
       ],
       "dev": true,
+      "license": "MPL-2.0",
       "optional": true,
       "os": [
         "win32"
@@ -2368,6 +2491,7 @@
         "ia32"
       ],
       "dev": true,
+      "license": "MPL-2.0",
       "optional": true,
       "os": [
         "win32"
@@ -2384,6 +2508,7 @@
         "x64"
       ],
       "dev": true,
+      "license": "MPL-2.0",
       "optional": true,
       "os": [
         "win32"
@@ -2397,6 +2522,7 @@
       "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-6.0.3.tgz",
       "integrity": "sha512-fKImZKppa1A/gX73eg4JGo+8kQr/q1HBQaCGKECZ0v4YBBv3lFqi14+7xyApECzvkLTHCifx+7ntcrvtBIRcpg==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@babel/helper-module-imports": "^7.18.6",
         "@rollup/pluginutils": "^5.0.1"
@@ -2423,6 +2549,7 @@
       "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-25.0.3.tgz",
       "integrity": "sha512-uBdtWr/H3BVcgm97MUdq2oJmqBR23ny1hOrWe2PKo9FTbjsGqg32jfasJUKYAI5ouqacjRnj65mBB/S79F+GQA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@rollup/pluginutils": "^5.0.1",
         "commondir": "^1.0.1",
@@ -2448,6 +2575,7 @@
       "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
       "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "balanced-match": "^1.0.0"
       }
@@ -2458,6 +2586,7 @@
       "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==",
       "deprecated": "Glob versions prior to v9 are no longer supported",
       "dev": true,
+      "license": "ISC",
       "dependencies": {
         "fs.realpath": "^1.0.0",
         "inflight": "^1.0.4",
@@ -2477,6 +2606,7 @@
       "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz",
       "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==",
       "dev": true,
+      "license": "ISC",
       "dependencies": {
         "brace-expansion": "^2.0.1"
       },
@@ -2489,6 +2619,7 @@
       "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.1.0.tgz",
       "integrity": "sha512-xeZHCgsiZ9pzYVgAo9580eCGqwh/XCEUM9q6iQfGNocjgkufHAqC3exA+45URvhiYV8sBF9RlBai650eNs7AsA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@rollup/pluginutils": "^5.0.1",
         "@types/resolve": "1.20.2",
@@ -2514,6 +2645,7 @@
       "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-5.0.2.tgz",
       "integrity": "sha512-M9YXNekv/C/iHHK+cvORzfRYfPbq0RDD8r0G+bMiTXjNGKulPnCT9O3Ss46WfhI6ZOCgApOP7xAdmCQJ+U2LAA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@rollup/pluginutils": "^5.0.1",
         "magic-string": "^0.27.0"
@@ -2531,10 +2663,11 @@
       }
     },
     "node_modules/@rollup/pluginutils": {
-      "version": "5.1.3",
-      "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.3.tgz",
-      "integrity": "sha512-Pnsb6f32CD2W3uCaLZIzDmeFyQ2b8UWMFI7xtwUezpcGBDVDW6y9XgAWIlARiGAo6eNF5FK5aQTr0LFyNyqq5A==",
+      "version": "5.1.4",
+      "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.4.tgz",
+      "integrity": "sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@types/estree": "^1.0.0",
         "estree-walker": "^2.0.2",
@@ -2556,19 +2689,22 @@
       "version": "1.1.0",
       "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz",
       "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/@socket.io/component-emitter": {
       "version": "3.1.2",
       "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz",
       "integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/@trysound/sax": {
       "version": "0.2.0",
       "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz",
       "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==",
       "dev": true,
+      "license": "ISC",
       "engines": {
         "node": ">=10.13.0"
       }
@@ -2577,13 +2713,15 @@
       "version": "0.4.1",
       "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz",
       "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/@types/cors": {
       "version": "2.8.17",
       "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.17.tgz",
       "integrity": "sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@types/node": "*"
       }
@@ -2592,58 +2730,74 @@
       "version": "1.0.6",
       "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz",
       "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/@types/json5": {
       "version": "0.0.29",
       "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz",
       "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/@types/minimist": {
       "version": "1.2.5",
       "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.5.tgz",
       "integrity": "sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/@types/node": {
-      "version": "22.8.7",
-      "resolved": "https://registry.npmjs.org/@types/node/-/node-22.8.7.tgz",
-      "integrity": "sha512-LidcG+2UeYIWcMuMUpBKOnryBWG/rnmOHQR5apjn8myTQcx3rinFRn7DcIFhMnS0PPFSC6OafdIKEad0lj6U0Q==",
+      "version": "22.10.2",
+      "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.2.tgz",
+      "integrity": "sha512-Xxr6BBRCAOQixvonOye19wnzyDiUtTeqldOOmj3CkeblonbccA12PFwlufvRdrpjXxqnmUaeiU5EOA+7s5diUQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "undici-types": "~6.19.8"
+        "undici-types": "~6.20.0"
       }
     },
     "node_modules/@types/normalize-package-data": {
       "version": "2.4.4",
       "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz",
       "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/@types/resolve": {
       "version": "1.20.2",
       "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.2.tgz",
       "integrity": "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/@types/triple-beam": {
       "version": "1.3.5",
       "resolved": "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.5.tgz",
       "integrity": "sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/@types/trusted-types": {
+      "version": "2.0.7",
+      "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz",
+      "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==",
+      "license": "MIT",
+      "optional": true
     },
     "node_modules/@ungap/structured-clone": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz",
-      "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==",
-      "dev": true
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.1.tgz",
+      "integrity": "sha512-fEzPV3hSkSMltkw152tJKNARhOupqbH96MZWyRjNaYZOMIzbrTeQDG+MTc6Mr2pgzFQzFxAfmhGDNP5QK++2ZA==",
+      "dev": true,
+      "license": "ISC"
     },
     "node_modules/@xmldom/xmldom": {
       "version": "0.8.10",
       "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.10.tgz",
       "integrity": "sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=10.0.0"
       }
@@ -2652,25 +2806,15 @@
       "version": "1.1.0",
       "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz",
       "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==",
-      "dev": true
-    },
-    "node_modules/abort-controller": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz",
-      "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==",
       "dev": true,
-      "dependencies": {
-        "event-target-shim": "^5.0.0"
-      },
-      "engines": {
-        "node": ">=6.5"
-      }
+      "license": "BSD-2-Clause"
     },
     "node_modules/accepts": {
       "version": "1.3.8",
       "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",
       "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "mime-types": "~2.1.34",
         "negotiator": "0.6.3"
@@ -2684,6 +2828,7 @@
       "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz",
       "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==",
       "dev": true,
+      "license": "MIT",
       "bin": {
         "acorn": "bin/acorn"
       },
@@ -2696,6 +2841,7 @@
       "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
       "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
       "dev": true,
+      "license": "MIT",
       "peerDependencies": {
         "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
       }
@@ -2705,6 +2851,7 @@
       "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz",
       "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "clean-stack": "^2.0.0",
         "indent-string": "^4.0.0"
@@ -2718,6 +2865,7 @@
       "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
       "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "fast-deep-equal": "^3.1.1",
         "fast-json-stable-stringify": "^2.0.0",
@@ -2734,6 +2882,7 @@
       "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
       "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=8"
       }
@@ -2743,6 +2892,7 @@
       "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
       "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "color-convert": "^2.0.1"
       },
@@ -2758,6 +2908,7 @@
       "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
       "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
       "dev": true,
+      "license": "ISC",
       "dependencies": {
         "normalize-path": "^3.0.0",
         "picomatch": "^2.0.4"
@@ -2771,6 +2922,7 @@
       "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
       "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=8.6"
       },
@@ -2783,6 +2935,7 @@
       "resolved": "https://registry.npmjs.org/are-docs-informative/-/are-docs-informative-0.0.2.tgz",
       "integrity": "sha512-ixiS0nLNNG5jNQzgZJNoUpBKdo9yTYZMGJ+QgT2jmjR7G7+QHRCc4v6LQ3NgE7EBJq+o0ams3waJwkrlBom8Ig==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=14"
       }
@@ -2791,25 +2944,28 @@
       "version": "2.0.1",
       "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
       "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
-      "dev": true
+      "dev": true,
+      "license": "Python-2.0"
     },
     "node_modules/aria-query": {
       "version": "5.3.2",
       "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz",
       "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==",
       "dev": true,
+      "license": "Apache-2.0",
       "engines": {
         "node": ">= 0.4"
       }
     },
     "node_modules/array-buffer-byte-length": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz",
-      "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==",
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz",
+      "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "call-bind": "^1.0.5",
-        "is-array-buffer": "^3.0.4"
+        "call-bound": "^1.0.3",
+        "is-array-buffer": "^3.0.5"
       },
       "engines": {
         "node": ">= 0.4"
@@ -2823,6 +2979,7 @@
       "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz",
       "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "call-bind": "^1.0.7",
         "define-properties": "^1.2.1",
@@ -2843,6 +3000,7 @@
       "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
       "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=8"
       }
@@ -2852,6 +3010,7 @@
       "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz",
       "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "call-bind": "^1.0.7",
         "define-properties": "^1.2.1",
@@ -2872,6 +3031,7 @@
       "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz",
       "integrity": "sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "call-bind": "^1.0.7",
         "define-properties": "^1.2.1",
@@ -2888,15 +3048,16 @@
       }
     },
     "node_modules/array.prototype.flat": {
-      "version": "1.3.2",
-      "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz",
-      "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==",
+      "version": "1.3.3",
+      "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz",
+      "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "call-bind": "^1.0.2",
-        "define-properties": "^1.2.0",
-        "es-abstract": "^1.22.1",
-        "es-shim-unscopables": "^1.0.0"
+        "call-bind": "^1.0.8",
+        "define-properties": "^1.2.1",
+        "es-abstract": "^1.23.5",
+        "es-shim-unscopables": "^1.0.2"
       },
       "engines": {
         "node": ">= 0.4"
@@ -2906,15 +3067,16 @@
       }
     },
     "node_modules/array.prototype.flatmap": {
-      "version": "1.3.2",
-      "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz",
-      "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==",
+      "version": "1.3.3",
+      "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz",
+      "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "call-bind": "^1.0.2",
-        "define-properties": "^1.2.0",
-        "es-abstract": "^1.22.1",
-        "es-shim-unscopables": "^1.0.0"
+        "call-bind": "^1.0.8",
+        "define-properties": "^1.2.1",
+        "es-abstract": "^1.23.5",
+        "es-shim-unscopables": "^1.0.2"
       },
       "engines": {
         "node": ">= 0.4"
@@ -2928,6 +3090,7 @@
       "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz",
       "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "call-bind": "^1.0.7",
         "define-properties": "^1.2.1",
@@ -2940,19 +3103,19 @@
       }
     },
     "node_modules/arraybuffer.prototype.slice": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz",
-      "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==",
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz",
+      "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "array-buffer-byte-length": "^1.0.1",
-        "call-bind": "^1.0.5",
+        "call-bind": "^1.0.8",
         "define-properties": "^1.2.1",
-        "es-abstract": "^1.22.3",
-        "es-errors": "^1.2.1",
-        "get-intrinsic": "^1.2.3",
-        "is-array-buffer": "^3.0.4",
-        "is-shared-array-buffer": "^1.0.2"
+        "es-abstract": "^1.23.5",
+        "es-errors": "^1.3.0",
+        "get-intrinsic": "^1.2.6",
+        "is-array-buffer": "^3.0.4"
       },
       "engines": {
         "node": ">= 0.4"
@@ -2966,6 +3129,7 @@
       "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz",
       "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=0.10.0"
       }
@@ -2974,13 +3138,15 @@
       "version": "0.0.8",
       "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz",
       "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/astral-regex": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz",
       "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=8"
       }
@@ -2990,6 +3156,7 @@
       "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz",
       "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "lodash": "^4.17.14"
       }
@@ -2999,6 +3166,7 @@
       "resolved": "https://registry.npmjs.org/async-each-series/-/async-each-series-0.1.1.tgz",
       "integrity": "sha512-p4jj6Fws4Iy2m0iCmI2am2ZNZCgbdgE+P8F/8csmn2vx7ixXrO2zGcuNsD46X5uZSVecmkEy/M06X2vG8KD6dQ==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=0.8.0"
       }
@@ -3008,6 +3176,7 @@
       "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz",
       "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==",
       "dev": true,
+      "license": "ISC",
       "engines": {
         "node": ">= 4.0.0"
       }
@@ -3027,6 +3196,7 @@
           "url": "https://tidelift.com/funding/github/npm/autoprefixer"
         }
       ],
+      "license": "MIT",
       "dependencies": {
         "browserslist": "^4.21.5",
         "caniuse-lite": "^1.0.30001464",
@@ -3050,6 +3220,7 @@
       "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz",
       "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "possible-typed-array-names": "^1.0.0"
       },
@@ -3065,6 +3236,7 @@
       "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.10.2.tgz",
       "integrity": "sha512-RE3mdQ7P3FRSe7eqCWoeQ/Z9QXrtniSjp1wUjt5nRC3WIpz5rSCve6o3fsZ2aCpJtrZjSZgjwXAoTO5k4tEI0w==",
       "dev": true,
+      "license": "MPL-2.0",
       "engines": {
         "node": ">=4"
       }
@@ -3074,6 +3246,7 @@
       "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz",
       "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "follow-redirects": "^1.14.0"
       }
@@ -3083,6 +3256,7 @@
       "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz",
       "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==",
       "dev": true,
+      "license": "Apache-2.0",
       "engines": {
         "node": ">= 0.4"
       }
@@ -3093,6 +3267,7 @@
       "integrity": "sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg==",
       "deprecated": "babel-eslint is now @babel/eslint-parser. This package will no longer receive updates.",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@babel/code-frame": "^7.0.0",
         "@babel/parser": "^7.7.0",
@@ -3109,13 +3284,14 @@
       }
     },
     "node_modules/babel-plugin-polyfill-corejs2": {
-      "version": "0.4.11",
-      "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.11.tgz",
-      "integrity": "sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q==",
+      "version": "0.4.12",
+      "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.12.tgz",
+      "integrity": "sha512-CPWT6BwvhrTO2d8QVorhTCQw9Y43zOu7G9HigcfxvepOU6b8o3tcWad6oVgZIsZCTt42FFv97aA7ZJsbM4+8og==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@babel/compat-data": "^7.22.6",
-        "@babel/helper-define-polyfill-provider": "^0.6.2",
+        "@babel/helper-define-polyfill-provider": "^0.6.3",
         "semver": "^6.3.1"
       },
       "peerDependencies": {
@@ -3127,6 +3303,7 @@
       "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.7.tgz",
       "integrity": "sha512-KyDvZYxAzkC0Aj2dAPyDzi2Ym15e5JKZSK+maI7NAwSqofvuFglbSsxE7wUOvTg9oFVnHMzVzBKcqEb4PJgtOA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@babel/helper-define-polyfill-provider": "^0.4.4",
         "core-js-compat": "^3.33.1"
@@ -3140,6 +3317,7 @@
       "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.4.tgz",
       "integrity": "sha512-QcJMILQCu2jm5TFPGA3lCpJJTeEP+mqeXooG/NZbg/h5FTFi6V0+99ahlRsW8/kRLyb24LZVCCiclDedhLKcBA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@babel/helper-compilation-targets": "^7.22.6",
         "@babel/helper-plugin-utils": "^7.22.5",
@@ -3156,6 +3334,7 @@
       "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.5.tgz",
       "integrity": "sha512-OJGYZlhLqBh2DDHeqAxWB1XIvr49CxiJ2gIt61/PU55CQK4Z58OzMqjDe1zwQdQk+rBYsRc+1rJmdajM3gimHg==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@babel/helper-define-polyfill-provider": "^0.5.0"
       },
@@ -3168,6 +3347,7 @@
       "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.5.0.tgz",
       "integrity": "sha512-NovQquuQLAQ5HuyjCz7WQP9MjRj7dx++yspwiyUiGl9ZyadHRSql1HZh5ogRd8W8w6YM6EQ/NTB8rgjLt5W65Q==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@babel/helper-compilation-targets": "^7.22.6",
         "@babel/helper-plugin-utils": "^7.22.5",
@@ -3183,33 +3363,15 @@
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
       "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
-      "dev": true
-    },
-    "node_modules/base64-js": {
-      "version": "1.5.1",
-      "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
-      "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
       "dev": true,
-      "funding": [
-        {
-          "type": "github",
-          "url": "https://github.com/sponsors/feross"
-        },
-        {
-          "type": "patreon",
-          "url": "https://www.patreon.com/feross"
-        },
-        {
-          "type": "consulting",
-          "url": "https://feross.org/support"
-        }
-      ]
+      "license": "MIT"
     },
     "node_modules/base64id": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz",
       "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": "^4.5.0 || >= 5.9"
       }
@@ -3218,13 +3380,15 @@
       "version": "0.6.1",
       "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz",
       "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/binary-extensions": {
       "version": "2.3.0",
       "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz",
       "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=8"
       },
@@ -3236,13 +3400,15 @@
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
       "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==",
-      "dev": true
+      "dev": true,
+      "license": "ISC"
     },
     "node_modules/brace-expansion": {
       "version": "1.1.11",
       "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
       "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "balanced-match": "^1.0.0",
         "concat-map": "0.0.1"
@@ -3253,6 +3419,7 @@
       "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
       "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "fill-range": "^7.1.1"
       },
@@ -3265,6 +3432,7 @@
       "resolved": "https://registry.npmjs.org/browser-sync/-/browser-sync-2.29.3.tgz",
       "integrity": "sha512-NiM38O6XU84+MN+gzspVmXV2fTOoe+jBqIBx3IBdhZrdeURr6ZgznJr/p+hQ+KzkKEiGH/GcC4SQFSL0jV49bg==",
       "dev": true,
+      "license": "Apache-2.0",
       "dependencies": {
         "browser-sync-client": "^2.29.3",
         "browser-sync-ui": "^2.29.3",
@@ -3308,6 +3476,7 @@
       "resolved": "https://registry.npmjs.org/browser-sync-client/-/browser-sync-client-2.29.3.tgz",
       "integrity": "sha512-4tK5JKCl7v/3aLbmCBMzpufiYLsB1+UI+7tUXCCp5qF0AllHy/jAqYu6k7hUF3hYtlClKpxExWaR+rH+ny07wQ==",
       "dev": true,
+      "license": "ISC",
       "dependencies": {
         "etag": "1.8.1",
         "fresh": "0.5.2",
@@ -3322,6 +3491,7 @@
       "resolved": "https://registry.npmjs.org/browser-sync-ui/-/browser-sync-ui-2.29.3.tgz",
       "integrity": "sha512-kBYOIQjU/D/3kYtUIJtj82e797Egk1FB2broqItkr3i4eF1qiHbFCG6srksu9gWhfmuM/TNG76jMfzAdxEPakg==",
       "dev": true,
+      "license": "Apache-2.0",
       "dependencies": {
         "async-each-series": "0.1.1",
         "chalk": "4.1.2",
@@ -3333,9 +3503,9 @@
       }
     },
     "node_modules/browserslist": {
-      "version": "4.24.2",
-      "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.2.tgz",
-      "integrity": "sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==",
+      "version": "4.24.3",
+      "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.3.tgz",
+      "integrity": "sha512-1CPmv8iobE2fyRMV97dAcMVegvvWKxmq94hkLiAkUGwKVTyDLw33K+ZxiFrREKmmps4rIw6grcCFCnTMSZ/YiA==",
       "dev": true,
       "funding": [
         {
@@ -3351,10 +3521,11 @@
           "url": "https://github.com/sponsors/ai"
         }
       ],
+      "license": "MIT",
       "dependencies": {
-        "caniuse-lite": "^1.0.30001669",
-        "electron-to-chromium": "^1.5.41",
-        "node-releases": "^2.0.18",
+        "caniuse-lite": "^1.0.30001688",
+        "electron-to-chromium": "^1.5.73",
+        "node-releases": "^2.0.19",
         "update-browserslist-db": "^1.1.1"
       },
       "bin": {
@@ -3368,43 +3539,22 @@
       "version": "1.3.4",
       "resolved": "https://registry.npmjs.org/bs-recipes/-/bs-recipes-1.3.4.tgz",
       "integrity": "sha512-BXvDkqhDNxXEjeGM8LFkSbR+jzmP/CYpCiVKYn+soB1dDldeU15EBNDkwVXndKuX35wnNUaPd0qSoQEAkmQtMw==",
-      "dev": true
-    },
-    "node_modules/buffer": {
-      "version": "6.0.3",
-      "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz",
-      "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==",
       "dev": true,
-      "funding": [
-        {
-          "type": "github",
-          "url": "https://github.com/sponsors/feross"
-        },
-        {
-          "type": "patreon",
-          "url": "https://www.patreon.com/feross"
-        },
-        {
-          "type": "consulting",
-          "url": "https://feross.org/support"
-        }
-      ],
-      "dependencies": {
-        "base64-js": "^1.3.1",
-        "ieee754": "^1.2.1"
-      }
+      "license": "ISC"
     },
     "node_modules/buffer-from": {
       "version": "1.1.2",
       "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
       "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/builtin-modules": {
       "version": "3.3.0",
       "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz",
       "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=6"
       },
@@ -3417,21 +3567,53 @@
       "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
       "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">= 0.8"
       }
     },
     "node_modules/call-bind": {
-      "version": "1.0.7",
-      "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz",
-      "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==",
+      "version": "1.0.8",
+      "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz",
+      "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
+        "call-bind-apply-helpers": "^1.0.0",
         "es-define-property": "^1.0.0",
-        "es-errors": "^1.3.0",
-        "function-bind": "^1.1.2",
         "get-intrinsic": "^1.2.4",
-        "set-function-length": "^1.2.1"
+        "set-function-length": "^1.2.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/call-bind-apply-helpers": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.1.tgz",
+      "integrity": "sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "es-errors": "^1.3.0",
+        "function-bind": "^1.1.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/call-bound": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.3.tgz",
+      "integrity": "sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "call-bind-apply-helpers": "^1.0.1",
+        "get-intrinsic": "^1.2.6"
       },
       "engines": {
         "node": ">= 0.4"
@@ -3445,6 +3627,7 @@
       "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
       "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=6"
       }
@@ -3454,6 +3637,7 @@
       "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz",
       "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=10"
       },
@@ -3466,6 +3650,7 @@
       "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-7.0.2.tgz",
       "integrity": "sha512-Rjs1H+A9R+Ig+4E/9oyB66UC5Mj9Xq3N//vcLf2WzgdTi/3gUu3Z9KoqmlrEG4VuuLK8wJHofxzdQXz/knhiYg==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "camelcase": "^6.3.0",
         "map-obj": "^4.1.0",
@@ -3484,6 +3669,7 @@
       "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz",
       "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "browserslist": "^4.0.0",
         "caniuse-lite": "^1.0.0",
@@ -3492,9 +3678,9 @@
       }
     },
     "node_modules/caniuse-lite": {
-      "version": "1.0.30001677",
-      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001677.tgz",
-      "integrity": "sha512-fmfjsOlJUpMWu+mAAtZZZHz7UEwsUxIIvu1TJfO1HqFQvB/B+ii0xr9B5HpbZY/mC4XZ8SvjHJqtAY6pDPQEog==",
+      "version": "1.0.30001690",
+      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001690.tgz",
+      "integrity": "sha512-5ExiE3qQN6oF8Clf8ifIDcMRCRE/dMGcETG/XGMD8/XiXm6HXQgQTh1yZYLXXpSOsEUlJm1Xr7kGULZTuGtP/w==",
       "dev": true,
       "funding": [
         {
@@ -3509,13 +3695,15 @@
           "type": "github",
           "url": "https://github.com/sponsors/ai"
         }
-      ]
+      ],
+      "license": "CC-BY-4.0"
     },
     "node_modules/chalk": {
       "version": "4.1.2",
       "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
       "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "ansi-styles": "^4.1.0",
         "supports-color": "^7.1.0"
@@ -3532,6 +3720,7 @@
       "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",
       "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "anymatch": "~3.1.2",
         "braces": "~3.0.2",
@@ -3555,13 +3744,15 @@
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz",
       "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/clean-stack": {
       "version": "2.2.0",
       "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz",
       "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=6"
       }
@@ -3571,6 +3762,7 @@
       "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz",
       "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==",
       "dev": true,
+      "license": "ISC",
       "dependencies": {
         "string-width": "^4.2.0",
         "strip-ansi": "^6.0.1",
@@ -3584,13 +3776,15 @@
       "version": "8.0.0",
       "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
       "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/cliui/node_modules/string-width": {
       "version": "4.2.3",
       "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
       "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "emoji-regex": "^8.0.0",
         "is-fullwidth-code-point": "^3.0.0",
@@ -3605,6 +3799,7 @@
       "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
       "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "ansi-styles": "^4.0.0",
         "string-width": "^4.1.0",
@@ -3622,6 +3817,7 @@
       "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz",
       "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=0.8"
       }
@@ -3631,6 +3827,7 @@
       "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz",
       "integrity": "sha512-KLLTJWrvwIP+OPfMn0x2PheDEP20RPUcGXj/ERegTgdmPEZylALQldygiqrPPu8P45uNuPs7ckmReLY6v/iA5g==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">= 0.10"
       }
@@ -3639,13 +3836,15 @@
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz",
       "integrity": "sha512-au6ydSpg6nsrigcZ4m8Bc9hxjeW+GJ8xh5G3BJCMt4WXe1H10UNaVOamqQTmrx1kjVuxAHIQSNU6hY4Nsn9/ag==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/cloneable-readable": {
       "version": "1.1.3",
       "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.3.tgz",
       "integrity": "sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "inherits": "^2.0.1",
         "process-nextick-args": "^2.0.0",
@@ -3656,13 +3855,15 @@
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
       "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/cloneable-readable/node_modules/readable-stream": {
       "version": "2.3.8",
       "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz",
       "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "core-util-is": "~1.0.0",
         "inherits": "~2.0.3",
@@ -3677,13 +3878,15 @@
       "version": "5.1.2",
       "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
       "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/cloneable-readable/node_modules/string_decoder": {
       "version": "1.1.1",
       "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
       "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "safe-buffer": "~5.1.0"
       }
@@ -3693,6 +3896,7 @@
       "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz",
       "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "color-convert": "^1.9.3",
         "color-string": "^1.6.0"
@@ -3703,6 +3907,7 @@
       "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
       "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "color-name": "~1.1.4"
       },
@@ -3714,13 +3919,15 @@
       "version": "1.1.4",
       "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
       "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/color-string": {
       "version": "1.9.1",
       "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz",
       "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "color-name": "^1.0.0",
         "simple-swizzle": "^0.2.2"
@@ -3731,6 +3938,7 @@
       "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
       "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "color-name": "1.1.3"
       }
@@ -3739,19 +3947,22 @@
       "version": "1.1.3",
       "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
       "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/colord": {
       "version": "2.9.3",
       "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz",
       "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/colorspace": {
       "version": "1.1.4",
       "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.4.tgz",
       "integrity": "sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "color": "^3.1.3",
         "text-hex": "1.0.x"
@@ -3762,6 +3973,7 @@
       "resolved": "https://registry.npmjs.org/commander/-/commander-11.0.0.tgz",
       "integrity": "sha512-9HMlXtt/BNoYr8ooyjjNRdIilOTkVJXB+GhxMTtOKwk0R4j4lS4NpjuqmRxroBfnfTSHQIHQB7wryHhXarNjmQ==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=16"
       }
@@ -3771,6 +3983,7 @@
       "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.4.1.tgz",
       "integrity": "sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">= 12.0.0"
       }
@@ -3779,25 +3992,29 @@
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz",
       "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/concat-map": {
       "version": "0.0.1",
       "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
       "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/confusing-browser-globals": {
       "version": "1.0.11",
       "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz",
       "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/connect": {
       "version": "3.6.6",
       "resolved": "https://registry.npmjs.org/connect/-/connect-3.6.6.tgz",
       "integrity": "sha512-OO7axMmPpu/2XuX1+2Yrg0ddju31B6xLZMWkJ5rYBu4YRmRVlOjvlY6kw2FJKiAzyxGwnrDUAG4s1Pf0sbBMCQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "debug": "2.6.9",
         "finalhandler": "1.1.0",
@@ -3813,6 +4030,7 @@
       "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz",
       "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=0.8"
       }
@@ -3822,6 +4040,7 @@
       "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
       "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "ms": "2.0.0"
       }
@@ -3830,19 +4049,22 @@
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
       "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/convert-source-map": {
       "version": "1.9.0",
       "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz",
       "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/cookie": {
       "version": "0.7.2",
       "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz",
       "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">= 0.6"
       }
@@ -3852,6 +4074,7 @@
       "resolved": "https://registry.npmjs.org/copyfiles/-/copyfiles-2.4.1.tgz",
       "integrity": "sha512-fereAvAvxDrQDOXybk3Qu3dPbOoKoysFMWtkY3mv5BsL8//OSZVL5DCLYqgRfY5cWirgRzlC+WSrxp6Bo3eNZg==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "glob": "^7.0.5",
         "minimatch": "^3.0.3",
@@ -3871,6 +4094,7 @@
       "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
       "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
       "dev": true,
+      "license": "ISC",
       "dependencies": {
         "string-width": "^4.2.0",
         "strip-ansi": "^6.0.0",
@@ -3881,7 +4105,8 @@
       "version": "8.0.0",
       "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
       "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/copyfiles/node_modules/glob": {
       "version": "7.2.3",
@@ -3889,6 +4114,7 @@
       "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
       "deprecated": "Glob versions prior to v9 are no longer supported",
       "dev": true,
+      "license": "ISC",
       "dependencies": {
         "fs.realpath": "^1.0.0",
         "inflight": "^1.0.4",
@@ -3909,6 +4135,7 @@
       "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
       "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "emoji-regex": "^8.0.0",
         "is-fullwidth-code-point": "^3.0.0",
@@ -3923,6 +4150,7 @@
       "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
       "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "ansi-styles": "^4.0.0",
         "string-width": "^4.1.0",
@@ -3940,6 +4168,7 @@
       "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
       "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "cliui": "^7.0.2",
         "escalade": "^3.1.1",
@@ -3958,6 +4187,7 @@
       "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.39.0.tgz",
       "integrity": "sha512-VgEUx3VwlExr5no0tXlBt+silBvhTryPwCXRI2Id1PN8WTKu7MreethvddqOubrYxkFdv/RnYrqlv1sFNAUelw==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "browserslist": "^4.24.2"
       },
@@ -3970,13 +4200,15 @@
       "version": "1.0.3",
       "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
       "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/cors": {
       "version": "2.8.5",
       "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz",
       "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "object-assign": "^4",
         "vary": "^1"
@@ -3990,6 +4222,7 @@
       "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz",
       "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "import-fresh": "^3.3.0",
         "js-yaml": "^4.1.0",
@@ -4016,6 +4249,7 @@
       "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz",
       "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@babel/code-frame": "^7.0.0",
         "error-ex": "^1.3.1",
@@ -4034,6 +4268,7 @@
       "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz",
       "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "cross-spawn": "^7.0.1"
       },
@@ -4048,10 +4283,11 @@
       }
     },
     "node_modules/cross-spawn": {
-      "version": "7.0.3",
-      "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
-      "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+      "version": "7.0.6",
+      "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
+      "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "path-key": "^3.1.0",
         "shebang-command": "^2.0.0",
@@ -4066,6 +4302,7 @@
       "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-7.2.0.tgz",
       "integrity": "sha512-h70rUM+3PNFuaBDTLe8wF/cdWu+dOZmb7pJt8Z2sedYbAcQVQV/tEchueg3GWxwqS0cxtbxmaHEdkNACqcvsow==",
       "dev": true,
+      "license": "ISC",
       "engines": {
         "node": "^14 || ^16 || >=18"
       },
@@ -4078,6 +4315,7 @@
       "resolved": "https://registry.npmjs.org/css-functions-list/-/css-functions-list-3.2.3.tgz",
       "integrity": "sha512-IQOkD3hbR5KrN93MtcYuad6YPuTSUhntLHDuLEbFWE+ff2/XSZNdZG+LcbbIW5AXKg/WFIfYItIzVoHngHXZzA==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=12 || >=16"
       }
@@ -4087,6 +4325,7 @@
       "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz",
       "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==",
       "dev": true,
+      "license": "BSD-2-Clause",
       "dependencies": {
         "boolbase": "^1.0.0",
         "css-what": "^6.1.0",
@@ -4102,13 +4341,15 @@
       "version": "1.4.1",
       "resolved": "https://registry.npmjs.org/css-selector-parser/-/css-selector-parser-1.4.1.tgz",
       "integrity": "sha512-HYPSb7y/Z7BNDCOrakL4raGO2zltZkbeXyAd6Tg9obzix6QhzxCotdBl6VT0Dv4vZfJGVz3WL/xaEI9Ly3ul0g==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/css-tree": {
       "version": "2.3.1",
       "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz",
       "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "mdn-data": "2.0.30",
         "source-map-js": "^1.0.1"
@@ -4122,6 +4363,7 @@
       "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz",
       "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==",
       "dev": true,
+      "license": "BSD-2-Clause",
       "engines": {
         "node": ">= 6"
       },
@@ -4134,6 +4376,7 @@
       "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
       "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==",
       "dev": true,
+      "license": "MIT",
       "bin": {
         "cssesc": "bin/cssesc"
       },
@@ -4146,6 +4389,7 @@
       "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-6.0.1.tgz",
       "integrity": "sha512-fVO1JdJ0LSdIGJq68eIxOqFpIJrZqXUsBt8fkrBcztCQqAjQD51OhZp7tc0ImcbwXD4k7ny84QTV90nZhmqbkg==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "cssnano-preset-default": "^6.0.1",
         "lilconfig": "^2.1.0"
@@ -4166,6 +4410,7 @@
       "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-6.1.2.tgz",
       "integrity": "sha512-1C0C+eNaeN8OcHQa193aRgYexyJtU8XwbdieEjClw+J9d94E41LwT6ivKH0WT+fYwYWB0Zp3I3IZ7tI/BbUbrg==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "browserslist": "^4.23.0",
         "css-declaration-sorter": "^7.2.0",
@@ -4210,6 +4455,7 @@
       "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-4.0.2.tgz",
       "integrity": "sha512-ZR1jHg+wZ8o4c3zqf1SIUSTIvm/9mU343FMR6Obe/unskbvpGhZOo1J6d/r8D1pzkRQYuwbcH3hToOuoA2G7oQ==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": "^14 || ^16 || >=18.0"
       },
@@ -4222,6 +4468,7 @@
       "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz",
       "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "css-tree": "^1.1.2"
       },
@@ -4234,6 +4481,7 @@
       "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz",
       "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "mdn-data": "2.0.14",
         "source-map": "^0.6.1"
@@ -4246,29 +4494,33 @@
       "version": "2.0.14",
       "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz",
       "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==",
-      "dev": true
+      "dev": true,
+      "license": "CC0-1.0"
     },
     "node_modules/cssom": {
       "version": "0.5.0",
       "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz",
       "integrity": "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/damerau-levenshtein": {
       "version": "1.0.8",
       "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz",
       "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==",
-      "dev": true
+      "dev": true,
+      "license": "BSD-2-Clause"
     },
     "node_modules/data-view-buffer": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz",
-      "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==",
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz",
+      "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "call-bind": "^1.0.6",
+        "call-bound": "^1.0.3",
         "es-errors": "^1.3.0",
-        "is-data-view": "^1.0.1"
+        "is-data-view": "^1.0.2"
       },
       "engines": {
         "node": ">= 0.4"
@@ -4278,29 +4530,31 @@
       }
     },
     "node_modules/data-view-byte-length": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz",
-      "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==",
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz",
+      "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "call-bind": "^1.0.7",
+        "call-bound": "^1.0.3",
         "es-errors": "^1.3.0",
-        "is-data-view": "^1.0.1"
+        "is-data-view": "^1.0.2"
       },
       "engines": {
         "node": ">= 0.4"
       },
       "funding": {
-        "url": "https://github.com/sponsors/ljharb"
+        "url": "https://github.com/sponsors/inspect-js"
       }
     },
     "node_modules/data-view-byte-offset": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz",
-      "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==",
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz",
+      "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "call-bind": "^1.0.6",
+        "call-bound": "^1.0.2",
         "es-errors": "^1.3.0",
         "is-data-view": "^1.0.1"
       },
@@ -4312,10 +4566,11 @@
       }
     },
     "node_modules/debug": {
-      "version": "4.3.7",
-      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz",
-      "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==",
+      "version": "4.4.0",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz",
+      "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "ms": "^2.1.3"
       },
@@ -4333,6 +4588,7 @@
       "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-5.0.1.tgz",
       "integrity": "sha512-VfxadyCECXgQlkoEAjeghAr5gY3Hf+IKjKb+X8tGVDtveCjN+USwprd2q3QXBR9T1+x2DG0XZF5/w+7HAtSaXA==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=10"
       },
@@ -4345,6 +4601,7 @@
       "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz",
       "integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "decamelize": "^1.1.0",
         "map-obj": "^1.0.0"
@@ -4361,6 +4618,7 @@
       "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
       "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=0.10.0"
       }
@@ -4370,6 +4628,7 @@
       "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz",
       "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=0.10.0"
       }
@@ -4378,13 +4637,15 @@
       "version": "0.1.4",
       "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
       "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/deepmerge": {
       "version": "4.3.1",
       "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz",
       "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=0.10.0"
       }
@@ -4394,6 +4655,7 @@
       "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz",
       "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "es-define-property": "^1.0.0",
         "es-errors": "^1.3.0",
@@ -4411,6 +4673,7 @@
       "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz",
       "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "define-data-property": "^1.0.1",
         "has-property-descriptors": "^1.0.0",
@@ -4428,6 +4691,7 @@
       "resolved": "https://registry.npmjs.org/del/-/del-6.1.1.tgz",
       "integrity": "sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "globby": "^11.0.1",
         "graceful-fs": "^4.2.4",
@@ -4450,6 +4714,7 @@
       "resolved": "https://registry.npmjs.org/del-cli/-/del-cli-4.0.1.tgz",
       "integrity": "sha512-KtR/6cBfZkGDAP2NA7z+bP4p1OMob3wjN9mq13+SWvExx6jT9gFWfLgXEeX8J2B47OKeNCq9yTONmtryQ+m+6g==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "del": "^6.0.0",
         "meow": "^10.1.0"
@@ -4470,6 +4735,7 @@
       "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
       "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">= 0.8"
       }
@@ -4478,7 +4744,8 @@
       "version": "1.0.4",
       "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz",
       "integrity": "sha512-3NdhDuEXnfun/z7x9GOElY49LoqVHoGScmOKwmxhsS8N5Y+Z8KyPPDnaSzqWgYt/ji4mqwfTS34Htrk0zPIXVg==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/dev-ip": {
       "version": "1.0.1",
@@ -4497,6 +4764,7 @@
       "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
       "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "path-type": "^4.0.0"
       },
@@ -4509,6 +4777,7 @@
       "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
       "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
       "dev": true,
+      "license": "Apache-2.0",
       "dependencies": {
         "esutils": "^2.0.2"
       },
@@ -4521,6 +4790,7 @@
       "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz",
       "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "domelementtype": "^2.3.0",
         "domhandler": "^5.0.2",
@@ -4540,13 +4810,15 @@
           "type": "github",
           "url": "https://github.com/sponsors/fb55"
         }
-      ]
+      ],
+      "license": "BSD-2-Clause"
     },
     "node_modules/domhandler": {
       "version": "5.0.3",
       "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz",
       "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==",
       "dev": true,
+      "license": "BSD-2-Clause",
       "dependencies": {
         "domelementtype": "^2.3.0"
       },
@@ -4558,15 +4830,20 @@
       }
     },
     "node_modules/dompurify": {
-      "version": "3.1.7",
-      "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.1.7.tgz",
-      "integrity": "sha512-VaTstWtsneJY8xzy7DekmYWEOZcmzIe3Qb3zPd4STve1OBTa+e+WmS1ITQec1fZYXI3HCsOZZiSMpG6oxoWMWQ=="
+      "version": "3.2.3",
+      "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.2.3.tgz",
+      "integrity": "sha512-U1U5Hzc2MO0oW3DF+G9qYN0aT7atAou4AgI0XjWz061nyBPbdxkfdhfy5uMgGn6+oLFCfn44ZGbdDqCzVmlOWA==",
+      "license": "(MPL-2.0 OR Apache-2.0)",
+      "optionalDependencies": {
+        "@types/trusted-types": "^2.0.7"
+      }
     },
     "node_modules/domutils": {
       "version": "3.1.0",
       "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz",
       "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==",
       "dev": true,
+      "license": "BSD-2-Clause",
       "dependencies": {
         "dom-serializer": "^2.0.0",
         "domelementtype": "^2.3.0",
@@ -4576,11 +4853,27 @@
         "url": "https://github.com/fb55/domutils?sponsor=1"
       }
     },
+    "node_modules/dunder-proto": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
+      "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "call-bind-apply-helpers": "^1.0.1",
+        "es-errors": "^1.3.0",
+        "gopd": "^1.2.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
     "node_modules/eastasianwidth": {
       "version": "0.2.0",
       "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
       "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/easy-extender": {
       "version": "2.3.4",
@@ -4610,31 +4903,36 @@
       "version": "1.1.1",
       "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
       "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/electron-to-chromium": {
-      "version": "1.5.50",
-      "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.50.tgz",
-      "integrity": "sha512-eMVObiUQ2LdgeO1F/ySTXsvqvxb6ZH2zPGaMYsWzRDdOddUa77tdmI0ltg+L16UpbWdhPmuF3wIQYyQq65WfZw==",
-      "dev": true
+      "version": "1.5.75",
+      "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.75.tgz",
+      "integrity": "sha512-Lf3++DumRE/QmweGjU+ZcKqQ+3bKkU/qjaKYhIJKEOhgIO9Xs6IiAQFkfFoj+RhgDk4LUeNsLo6plExHqSyu6Q==",
+      "dev": true,
+      "license": "ISC"
     },
     "node_modules/emoji-regex": {
       "version": "9.2.2",
       "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
       "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/enabled": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz",
       "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/encodeurl": {
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
       "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">= 0.8"
       }
@@ -4644,6 +4942,7 @@
       "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.6.2.tgz",
       "integrity": "sha512-gmNvsYi9C8iErnZdVcJnvCpSKbWTt1E8+JZo8b+daLninywUWi5NQ5STSHZ9rFjFO7imNcvb8Pc5pe/wMR5xEw==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@types/cookie": "^0.4.1",
         "@types/cors": "^2.8.12",
@@ -4665,6 +4964,7 @@
       "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.6.2.tgz",
       "integrity": "sha512-TAr+NKeoVTjEVW8P3iHguO1LO6RlUz9O5Y8o7EY0fU+gY1NYqas7NN3slpFtbXEsLMHk0h90fJMfKjRkQ0qUIw==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@socket.io/component-emitter": "~3.1.0",
         "debug": "~4.3.1",
@@ -4673,20 +4973,58 @@
         "xmlhttprequest-ssl": "~2.1.1"
       }
     },
-    "node_modules/engine.io-parser": {
-      "version": "5.2.3",
-      "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.3.tgz",
-      "integrity": "sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==",
+    "node_modules/engine.io-client/node_modules/debug": {
+      "version": "4.3.7",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz",
+      "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==",
       "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "ms": "^2.1.3"
+      },
       "engines": {
-        "node": ">=10.0.0"
-      }
-    },
+        "node": ">=6.0"
+      },
+      "peerDependenciesMeta": {
+        "supports-color": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/engine.io-parser": {
+      "version": "5.2.3",
+      "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.3.tgz",
+      "integrity": "sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=10.0.0"
+      }
+    },
+    "node_modules/engine.io/node_modules/debug": {
+      "version": "4.3.7",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz",
+      "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "ms": "^2.1.3"
+      },
+      "engines": {
+        "node": ">=6.0"
+      },
+      "peerDependenciesMeta": {
+        "supports-color": {
+          "optional": true
+        }
+      }
+    },
     "node_modules/entities": {
       "version": "4.5.0",
       "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz",
       "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",
       "dev": true,
+      "license": "BSD-2-Clause",
       "engines": {
         "node": ">=0.12"
       },
@@ -4699,62 +5037,66 @@
       "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
       "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "is-arrayish": "^0.2.1"
       }
     },
     "node_modules/es-abstract": {
-      "version": "1.23.3",
-      "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz",
-      "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==",
+      "version": "1.23.6",
+      "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.6.tgz",
+      "integrity": "sha512-Ifco6n3yj2tMZDWNLyloZrytt9lqqlwvS83P3HtaETR0NUOYnIULGGHpktqYGObGy+8wc1okO25p8TjemhImvA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "array-buffer-byte-length": "^1.0.1",
-        "arraybuffer.prototype.slice": "^1.0.3",
+        "arraybuffer.prototype.slice": "^1.0.4",
         "available-typed-arrays": "^1.0.7",
-        "call-bind": "^1.0.7",
+        "call-bind": "^1.0.8",
+        "call-bound": "^1.0.3",
         "data-view-buffer": "^1.0.1",
         "data-view-byte-length": "^1.0.1",
         "data-view-byte-offset": "^1.0.0",
-        "es-define-property": "^1.0.0",
+        "es-define-property": "^1.0.1",
         "es-errors": "^1.3.0",
         "es-object-atoms": "^1.0.0",
         "es-set-tostringtag": "^2.0.3",
-        "es-to-primitive": "^1.2.1",
-        "function.prototype.name": "^1.1.6",
-        "get-intrinsic": "^1.2.4",
+        "es-to-primitive": "^1.3.0",
+        "function.prototype.name": "^1.1.7",
+        "get-intrinsic": "^1.2.6",
         "get-symbol-description": "^1.0.2",
-        "globalthis": "^1.0.3",
-        "gopd": "^1.0.1",
+        "globalthis": "^1.0.4",
+        "gopd": "^1.2.0",
         "has-property-descriptors": "^1.0.2",
-        "has-proto": "^1.0.3",
-        "has-symbols": "^1.0.3",
+        "has-proto": "^1.2.0",
+        "has-symbols": "^1.1.0",
         "hasown": "^2.0.2",
-        "internal-slot": "^1.0.7",
+        "internal-slot": "^1.1.0",
         "is-array-buffer": "^3.0.4",
         "is-callable": "^1.2.7",
-        "is-data-view": "^1.0.1",
+        "is-data-view": "^1.0.2",
         "is-negative-zero": "^2.0.3",
-        "is-regex": "^1.1.4",
+        "is-regex": "^1.2.1",
         "is-shared-array-buffer": "^1.0.3",
-        "is-string": "^1.0.7",
+        "is-string": "^1.1.1",
         "is-typed-array": "^1.1.13",
-        "is-weakref": "^1.0.2",
-        "object-inspect": "^1.13.1",
+        "is-weakref": "^1.1.0",
+        "math-intrinsics": "^1.0.0",
+        "object-inspect": "^1.13.3",
         "object-keys": "^1.1.1",
         "object.assign": "^4.1.5",
-        "regexp.prototype.flags": "^1.5.2",
-        "safe-array-concat": "^1.1.2",
-        "safe-regex-test": "^1.0.3",
-        "string.prototype.trim": "^1.2.9",
-        "string.prototype.trimend": "^1.0.8",
+        "regexp.prototype.flags": "^1.5.3",
+        "safe-array-concat": "^1.1.3",
+        "safe-regex-test": "^1.1.0",
+        "string.prototype.trim": "^1.2.10",
+        "string.prototype.trimend": "^1.0.9",
         "string.prototype.trimstart": "^1.0.8",
         "typed-array-buffer": "^1.0.2",
         "typed-array-byte-length": "^1.0.1",
-        "typed-array-byte-offset": "^1.0.2",
-        "typed-array-length": "^1.0.6",
+        "typed-array-byte-offset": "^1.0.3",
+        "typed-array-length": "^1.0.7",
         "unbox-primitive": "^1.0.2",
-        "which-typed-array": "^1.1.15"
+        "which-typed-array": "^1.1.16"
       },
       "engines": {
         "node": ">= 0.4"
@@ -4764,13 +5106,11 @@
       }
     },
     "node_modules/es-define-property": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz",
-      "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==",
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
+      "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
       "dev": true,
-      "dependencies": {
-        "get-intrinsic": "^1.2.4"
-      },
+      "license": "MIT",
       "engines": {
         "node": ">= 0.4"
       }
@@ -4780,15 +5120,17 @@
       "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
       "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">= 0.4"
       }
     },
     "node_modules/es-iterator-helpers": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.1.0.tgz",
-      "integrity": "sha512-/SurEfycdyssORP/E+bj4sEu1CWw4EmLDsHynHwSXQ7utgbrMRWW195pTrCjFgFCddf/UkYm3oqKPRq5i8bJbw==",
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.2.0.tgz",
+      "integrity": "sha512-tpxqxncxnpw3c93u8n3VOzACmRFoVmWJqbWXvX/JfKbkhBw1oslgPrUfeSt2psuqyEJFD6N/9lg5i7bsKpoq+Q==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "call-bind": "^1.0.7",
         "define-properties": "^1.2.1",
@@ -4798,6 +5140,7 @@
         "function-bind": "^1.1.2",
         "get-intrinsic": "^1.2.4",
         "globalthis": "^1.0.4",
+        "gopd": "^1.0.1",
         "has-property-descriptors": "^1.0.2",
         "has-proto": "^1.0.3",
         "has-symbols": "^1.0.3",
@@ -4814,6 +5157,7 @@
       "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz",
       "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "es-errors": "^1.3.0"
       },
@@ -4826,6 +5170,7 @@
       "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz",
       "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "get-intrinsic": "^1.2.4",
         "has-tostringtag": "^1.0.2",
@@ -4840,19 +5185,21 @@
       "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz",
       "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "hasown": "^2.0.0"
       }
     },
     "node_modules/es-to-primitive": {
-      "version": "1.2.1",
-      "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
-      "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz",
+      "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "is-callable": "^1.1.4",
-        "is-date-object": "^1.0.1",
-        "is-symbol": "^1.0.2"
+        "is-callable": "^1.2.7",
+        "is-date-object": "^1.0.5",
+        "is-symbol": "^1.0.4"
       },
       "engines": {
         "node": ">= 0.4"
@@ -4866,6 +5213,7 @@
       "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
       "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=6"
       }
@@ -4874,13 +5222,15 @@
       "version": "1.0.3",
       "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
       "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/escape-string-regexp": {
       "version": "4.0.0",
       "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
       "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=10"
       },
@@ -4894,6 +5244,7 @@
       "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==",
       "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@eslint-community/eslint-utils": "^4.2.0",
         "@eslint-community/regexpp": "^4.6.1",
@@ -4945,10 +5296,11 @@
       }
     },
     "node_modules/eslint-compat-utils": {
-      "version": "0.5.1",
-      "resolved": "https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.5.1.tgz",
-      "integrity": "sha512-3z3vFexKIEnjHE3zCMRo6fn/e44U7T1khUjg+Hp0ZQMCigh28rALD0nPFBcGZuiLC5rLZa2ubQHDRln09JfU2Q==",
+      "version": "0.6.4",
+      "resolved": "https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.6.4.tgz",
+      "integrity": "sha512-/u+GQt8NMfXO8w17QendT4gvO5acfxQsAKirAt0LVxDnr2N8YLCVbregaNc/Yhp7NM128DwCaRvr8PLDfeNkQw==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "semver": "^7.5.4"
       },
@@ -4964,6 +5316,7 @@
       "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz",
       "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==",
       "dev": true,
+      "license": "ISC",
       "bin": {
         "semver": "bin/semver.js"
       },
@@ -4976,6 +5329,7 @@
       "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-15.0.0.tgz",
       "integrity": "sha512-xaX3z4ZZIcFLvh2oUNvcX5oEofXda7giYmuplVxoOg5A7EXJMrUyqRgR+mhDhPK8LZ4PttFOBvCYDbX3sUoUig==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "confusing-browser-globals": "^1.0.10",
         "object.assign": "^4.1.2",
@@ -4995,6 +5349,7 @@
       "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz",
       "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==",
       "dev": true,
+      "license": "MIT",
       "bin": {
         "eslint-config-prettier": "bin/cli.js"
       },
@@ -5007,6 +5362,7 @@
       "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz",
       "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "debug": "^3.2.7",
         "is-core-module": "^2.13.0",
@@ -5018,6 +5374,7 @@
       "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
       "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "ms": "^2.1.1"
       }
@@ -5027,6 +5384,7 @@
       "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.0.tgz",
       "integrity": "sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "debug": "^3.2.7"
       },
@@ -5044,6 +5402,7 @@
       "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
       "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "ms": "^2.1.1"
       }
@@ -5053,6 +5412,7 @@
       "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.31.0.tgz",
       "integrity": "sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@rtsao/scc": "^1.1.0",
         "array-includes": "^3.1.8",
@@ -5086,6 +5446,7 @@
       "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
       "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "ms": "^2.1.1"
       }
@@ -5095,6 +5456,7 @@
       "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
       "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
       "dev": true,
+      "license": "Apache-2.0",
       "dependencies": {
         "esutils": "^2.0.2"
       },
@@ -5107,6 +5469,7 @@
       "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-46.10.1.tgz",
       "integrity": "sha512-x8wxIpv00Y50NyweDUpa+58ffgSAI5sqe+zcZh33xphD0AVh+1kqr1ombaTRb7Fhpove1zfUuujlX9DWWBP5ag==",
       "dev": true,
+      "license": "BSD-3-Clause",
       "dependencies": {
         "@es-joy/jsdoccomment": "~0.41.0",
         "are-docs-informative": "^0.0.2",
@@ -5130,6 +5493,7 @@
       "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz",
       "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==",
       "dev": true,
+      "license": "ISC",
       "bin": {
         "semver": "bin/semver.js"
       },
@@ -5142,6 +5506,7 @@
       "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.10.2.tgz",
       "integrity": "sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "aria-query": "^5.3.2",
         "array-includes": "^3.1.8",
@@ -5171,6 +5536,7 @@
       "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.2.1.tgz",
       "integrity": "sha512-gH3iR3g4JfF+yYPaJYkN7jEl9QbweL/YfkoRlNnuIEHEz1vHVlCmWOS+eGGiRuzHQXdJFCOTxRgvju9b8VUmrw==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "prettier-linter-helpers": "^1.0.0",
         "synckit": "^0.9.1"
@@ -5201,6 +5567,7 @@
       "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.2.tgz",
       "integrity": "sha512-EsTAnj9fLVr/GZleBLFbj/sSuXeWmp1eXIN60ceYnZveqEaUCyW4X+Vh4WTdUhCkW4xutXYqTXCUSyqD4rB75w==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "array-includes": "^3.1.8",
         "array.prototype.findlast": "^1.2.5",
@@ -5233,6 +5600,7 @@
       "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
       "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
       "dev": true,
+      "license": "Apache-2.0",
       "dependencies": {
         "esutils": "^2.0.2"
       },
@@ -5245,6 +5613,7 @@
       "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz",
       "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "is-core-module": "^2.13.0",
         "path-parse": "^1.0.7",
@@ -5258,13 +5627,14 @@
       }
     },
     "node_modules/eslint-plugin-yml": {
-      "version": "1.15.0",
-      "resolved": "https://registry.npmjs.org/eslint-plugin-yml/-/eslint-plugin-yml-1.15.0.tgz",
-      "integrity": "sha512-leC8APYVOsKyWUlvRwVhewytK5wS70BfMqIaUplFstRfzCoVp0YoEroV4cUEvQrBj93tQ3M9LcjO/ewr6D4kjA==",
+      "version": "1.16.0",
+      "resolved": "https://registry.npmjs.org/eslint-plugin-yml/-/eslint-plugin-yml-1.16.0.tgz",
+      "integrity": "sha512-t4MNCetPjTn18/fUDlQ/wKkcYjnuLYKChBrZ0qUaNqRigVqChHWzTP8SrfFi5s4keX3vdlkWRSu8zHJMdKwxWQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "debug": "^4.3.2",
-        "eslint-compat-utils": "^0.5.0",
+        "eslint-compat-utils": "^0.6.0",
         "lodash": "^4.17.21",
         "natural-compare": "^1.4.0",
         "yaml-eslint-parser": "^1.2.1"
@@ -5284,6 +5654,7 @@
       "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz",
       "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==",
       "dev": true,
+      "license": "BSD-2-Clause",
       "dependencies": {
         "esrecurse": "^4.3.0",
         "estraverse": "^5.2.0"
@@ -5300,6 +5671,7 @@
       "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz",
       "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==",
       "dev": true,
+      "license": "Apache-2.0",
       "engines": {
         "node": ">=4"
       }
@@ -5309,6 +5681,7 @@
       "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
       "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==",
       "dev": true,
+      "license": "Apache-2.0",
       "engines": {
         "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
       },
@@ -5321,6 +5694,7 @@
       "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
       "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
       "dev": true,
+      "license": "ISC",
       "dependencies": {
         "is-glob": "^4.0.3"
       },
@@ -5333,6 +5707,7 @@
       "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz",
       "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "type-fest": "^0.20.2"
       },
@@ -5348,6 +5723,7 @@
       "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
       "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
       "dev": true,
+      "license": "(MIT OR CC0-1.0)",
       "engines": {
         "node": ">=10"
       },
@@ -5360,6 +5736,7 @@
       "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz",
       "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==",
       "dev": true,
+      "license": "BSD-2-Clause",
       "dependencies": {
         "acorn": "^8.9.0",
         "acorn-jsx": "^5.3.2",
@@ -5377,6 +5754,7 @@
       "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
       "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==",
       "dev": true,
+      "license": "Apache-2.0",
       "engines": {
         "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
       },
@@ -5389,6 +5767,7 @@
       "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
       "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
       "dev": true,
+      "license": "BSD-2-Clause",
       "bin": {
         "esparse": "bin/esparse.js",
         "esvalidate": "bin/esvalidate.js"
@@ -5402,6 +5781,7 @@
       "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz",
       "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==",
       "dev": true,
+      "license": "BSD-3-Clause",
       "dependencies": {
         "estraverse": "^5.1.0"
       },
@@ -5414,6 +5794,7 @@
       "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
       "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
       "dev": true,
+      "license": "BSD-2-Clause",
       "dependencies": {
         "estraverse": "^5.2.0"
       },
@@ -5426,6 +5807,7 @@
       "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
       "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
       "dev": true,
+      "license": "BSD-2-Clause",
       "engines": {
         "node": ">=4.0"
       }
@@ -5434,13 +5816,15 @@
       "version": "2.0.2",
       "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",
       "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/esutils": {
       "version": "2.0.3",
       "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
       "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
       "dev": true,
+      "license": "BSD-2-Clause",
       "engines": {
         "node": ">=0.10.0"
       }
@@ -5450,51 +5834,38 @@
       "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
       "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">= 0.6"
       }
     },
-    "node_modules/event-target-shim": {
-      "version": "5.0.1",
-      "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz",
-      "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==",
-      "dev": true,
-      "engines": {
-        "node": ">=6"
-      }
-    },
     "node_modules/eventemitter3": {
       "version": "4.0.7",
       "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz",
       "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==",
-      "dev": true
-    },
-    "node_modules/events": {
-      "version": "3.3.0",
-      "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz",
-      "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==",
       "dev": true,
-      "engines": {
-        "node": ">=0.8.x"
-      }
+      "license": "MIT"
     },
     "node_modules/fast-deep-equal": {
       "version": "3.1.3",
       "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
       "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/fast-diff": {
       "version": "1.3.0",
       "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz",
       "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==",
-      "dev": true
+      "dev": true,
+      "license": "Apache-2.0"
     },
     "node_modules/fast-glob": {
       "version": "3.3.2",
       "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz",
       "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@nodelib/fs.stat": "^2.0.2",
         "@nodelib/fs.walk": "^1.2.3",
@@ -5510,25 +5881,29 @@
       "version": "2.1.0",
       "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
       "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/fast-levenshtein": {
       "version": "2.0.6",
       "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
       "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/fast-uri": {
       "version": "3.0.3",
       "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.3.tgz",
       "integrity": "sha512-aLrHthzCjH5He4Z2H9YZ+v6Ujb9ocRuW6ZzkJQOrTxleEijANq4v1TsaPaVG1PZcuurEzrLcWRyYBYXD5cEiaw==",
-      "dev": true
+      "dev": true,
+      "license": "BSD-3-Clause"
     },
     "node_modules/fastest-levenshtein": {
       "version": "1.0.16",
       "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz",
       "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">= 4.9.1"
       }
@@ -5538,6 +5913,7 @@
       "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz",
       "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==",
       "dev": true,
+      "license": "ISC",
       "dependencies": {
         "reusify": "^1.0.4"
       }
@@ -5546,13 +5922,15 @@
       "version": "4.2.3",
       "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz",
       "integrity": "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/file-entry-cache": {
       "version": "6.0.1",
       "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
       "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "flat-cache": "^3.0.4"
       },
@@ -5565,6 +5943,7 @@
       "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
       "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "to-regex-range": "^5.0.1"
       },
@@ -5577,6 +5956,7 @@
       "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.0.tgz",
       "integrity": "sha512-ejnvM9ZXYzp6PUPUyQBMBf0Co5VX2gr5H2VQe2Ui2jWXNlxv+PYZo8wpAymJNJdLsG1R4p+M4aynF8KuoUEwRw==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "debug": "2.6.9",
         "encodeurl": "~1.0.1",
@@ -5595,6 +5975,7 @@
       "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
       "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "ms": "2.0.0"
       }
@@ -5603,13 +5984,15 @@
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
       "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/find-up": {
       "version": "5.0.0",
       "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
       "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "locate-path": "^6.0.0",
         "path-exists": "^4.0.0"
@@ -5626,6 +6009,7 @@
       "resolved": "https://registry.npmjs.org/find-yarn-workspace-root/-/find-yarn-workspace-root-2.0.0.tgz",
       "integrity": "sha512-1IMnbjt4KzsQfnhnzNd8wUEgXZ44IzZaZmnLYx7D5FZlaHt2gW20Cri8Q+E/t5tIj4+epTBub+2Zxu/vNILzqQ==",
       "dev": true,
+      "license": "Apache-2.0",
       "dependencies": {
         "micromatch": "^4.0.2"
       }
@@ -5635,6 +6019,7 @@
       "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz",
       "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "flatted": "^3.2.9",
         "keyv": "^4.5.3",
@@ -5645,16 +6030,18 @@
       }
     },
     "node_modules/flatted": {
-      "version": "3.3.1",
-      "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz",
-      "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==",
-      "dev": true
+      "version": "3.3.2",
+      "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.2.tgz",
+      "integrity": "sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==",
+      "dev": true,
+      "license": "ISC"
     },
     "node_modules/fn.name": {
       "version": "1.1.0",
       "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz",
       "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/follow-redirects": {
       "version": "1.15.9",
@@ -5667,6 +6054,7 @@
           "url": "https://github.com/sponsors/RubenVerborgh"
         }
       ],
+      "license": "MIT",
       "engines": {
         "node": ">=4.0"
       },
@@ -5681,6 +6069,7 @@
       "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz",
       "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "is-callable": "^1.1.3"
       }
@@ -5690,6 +6079,7 @@
       "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz",
       "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==",
       "dev": true,
+      "license": "ISC",
       "dependencies": {
         "cross-spawn": "^7.0.0",
         "signal-exit": "^4.0.1"
@@ -5706,6 +6096,7 @@
       "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz",
       "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": "*"
       },
@@ -5719,6 +6110,7 @@
       "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
       "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">= 0.6"
       }
@@ -5728,6 +6120,7 @@
       "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-3.0.1.tgz",
       "integrity": "sha512-V3Z3WZWVUYd8hoCL5xfXJCaHWYzmtwW5XWYSlLgERi8PWd8bx1kUHUk8L1BT57e49oKnDDD180mjfrHc1yA9rg==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "graceful-fs": "^4.1.2",
         "jsonfile": "^3.0.0",
@@ -5738,7 +6131,8 @@
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
       "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==",
-      "dev": true
+      "dev": true,
+      "license": "ISC"
     },
     "node_modules/fsevents": {
       "version": "2.3.3",
@@ -5746,6 +6140,7 @@
       "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
       "dev": true,
       "hasInstallScript": true,
+      "license": "MIT",
       "optional": true,
       "os": [
         "darwin"
@@ -5759,20 +6154,24 @@
       "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
       "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
       "dev": true,
+      "license": "MIT",
       "funding": {
         "url": "https://github.com/sponsors/ljharb"
       }
     },
     "node_modules/function.prototype.name": {
-      "version": "1.1.6",
-      "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz",
-      "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==",
+      "version": "1.1.8",
+      "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz",
+      "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "call-bind": "^1.0.2",
-        "define-properties": "^1.2.0",
-        "es-abstract": "^1.22.1",
-        "functions-have-names": "^1.2.3"
+        "call-bind": "^1.0.8",
+        "call-bound": "^1.0.3",
+        "define-properties": "^1.2.1",
+        "functions-have-names": "^1.2.3",
+        "hasown": "^2.0.2",
+        "is-callable": "^1.2.7"
       },
       "engines": {
         "node": ">= 0.4"
@@ -5786,6 +6185,7 @@
       "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz",
       "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==",
       "dev": true,
+      "license": "MIT",
       "funding": {
         "url": "https://github.com/sponsors/ljharb"
       }
@@ -5795,6 +6195,7 @@
       "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
       "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=6.9.0"
       }
@@ -5804,21 +6205,28 @@
       "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
       "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
       "dev": true,
+      "license": "ISC",
       "engines": {
         "node": "6.* || 8.* || >= 10.*"
       }
     },
     "node_modules/get-intrinsic": {
-      "version": "1.2.4",
-      "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz",
-      "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==",
+      "version": "1.2.6",
+      "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.6.tgz",
+      "integrity": "sha512-qxsEs+9A+u85HhllWJJFicJfPDhRmjzoYdl64aMWW9yRIJmSyxdn8IEkuIM530/7T+lv0TIHd8L6Q/ra0tEoeA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
+        "call-bind-apply-helpers": "^1.0.1",
+        "dunder-proto": "^1.0.0",
+        "es-define-property": "^1.0.1",
         "es-errors": "^1.3.0",
+        "es-object-atoms": "^1.0.0",
         "function-bind": "^1.1.2",
-        "has-proto": "^1.0.1",
-        "has-symbols": "^1.0.3",
-        "hasown": "^2.0.0"
+        "gopd": "^1.2.0",
+        "has-symbols": "^1.1.0",
+        "hasown": "^2.0.2",
+        "math-intrinsics": "^1.0.0"
       },
       "engines": {
         "node": ">= 0.4"
@@ -5828,14 +6236,15 @@
       }
     },
     "node_modules/get-symbol-description": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz",
-      "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==",
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz",
+      "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "call-bind": "^1.0.5",
+        "call-bound": "^1.0.3",
         "es-errors": "^1.3.0",
-        "get-intrinsic": "^1.2.4"
+        "get-intrinsic": "^1.2.6"
       },
       "engines": {
         "node": ">= 0.4"
@@ -5849,6 +6258,7 @@
       "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.5.tgz",
       "integrity": "sha512-bYUpUD7XDEHI4Q2O5a7PXGvyw4deKR70kHiDxzQbe925wbZknhOzUt2xBgTkYL6RBcVeXYuD9iNYeqoWbBZQnA==",
       "dev": true,
+      "license": "ISC",
       "dependencies": {
         "foreground-child": "^3.1.0",
         "jackspeak": "^2.0.3",
@@ -5871,6 +6281,7 @@
       "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
       "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
       "dev": true,
+      "license": "ISC",
       "dependencies": {
         "is-glob": "^4.0.1"
       },
@@ -5883,6 +6294,7 @@
       "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
       "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "balanced-match": "^1.0.0"
       }
@@ -5892,6 +6304,7 @@
       "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
       "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
       "dev": true,
+      "license": "ISC",
       "dependencies": {
         "brace-expansion": "^2.0.1"
       },
@@ -5907,6 +6320,7 @@
       "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz",
       "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "global-prefix": "^3.0.0"
       },
@@ -5919,6 +6333,7 @@
       "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz",
       "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "ini": "^1.3.5",
         "kind-of": "^6.0.2",
@@ -5933,6 +6348,7 @@
       "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
       "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
       "dev": true,
+      "license": "ISC",
       "dependencies": {
         "isexe": "^2.0.0"
       },
@@ -5945,6 +6361,7 @@
       "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
       "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=4"
       }
@@ -5954,6 +6371,7 @@
       "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz",
       "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "define-properties": "^1.2.1",
         "gopd": "^1.0.1"
@@ -5970,6 +6388,7 @@
       "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz",
       "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "array-union": "^2.1.0",
         "dir-glob": "^3.0.1",
@@ -5989,15 +6408,17 @@
       "version": "0.1.4",
       "resolved": "https://registry.npmjs.org/globjoin/-/globjoin-0.1.4.tgz",
       "integrity": "sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/gopd": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz",
-      "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==",
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
+      "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
       "dev": true,
-      "dependencies": {
-        "get-intrinsic": "^1.1.3"
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.4"
       },
       "funding": {
         "url": "https://github.com/sponsors/ljharb"
@@ -6007,28 +6428,35 @@
       "version": "4.2.11",
       "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
       "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
-      "dev": true
+      "dev": true,
+      "license": "ISC"
     },
     "node_modules/graphemer": {
       "version": "1.4.0",
       "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz",
       "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/hard-rejection": {
       "version": "2.1.0",
       "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz",
       "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=6"
       }
     },
     "node_modules/has-bigints": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz",
-      "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==",
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz",
+      "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==",
       "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.4"
+      },
       "funding": {
         "url": "https://github.com/sponsors/ljharb"
       }
@@ -6038,6 +6466,7 @@
       "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
       "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=8"
       }
@@ -6047,6 +6476,7 @@
       "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz",
       "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "es-define-property": "^1.0.0"
       },
@@ -6055,10 +6485,14 @@
       }
     },
     "node_modules/has-proto": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz",
-      "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==",
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz",
+      "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==",
       "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "dunder-proto": "^1.0.0"
+      },
       "engines": {
         "node": ">= 0.4"
       },
@@ -6067,10 +6501,11 @@
       }
     },
     "node_modules/has-symbols": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
-      "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==",
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
+      "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">= 0.4"
       },
@@ -6083,6 +6518,7 @@
       "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz",
       "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "has-symbols": "^1.0.3"
       },
@@ -6098,6 +6534,7 @@
       "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
       "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "function-bind": "^1.1.2"
       },
@@ -6110,6 +6547,7 @@
       "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz",
       "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==",
       "dev": true,
+      "license": "ISC",
       "dependencies": {
         "lru-cache": "^6.0.0"
       },
@@ -6122,6 +6560,7 @@
       "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
       "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
       "dev": true,
+      "license": "ISC",
       "dependencies": {
         "yallist": "^4.0.0"
       },
@@ -6133,13 +6572,15 @@
       "version": "4.0.0",
       "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
       "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
-      "dev": true
+      "dev": true,
+      "license": "ISC"
     },
     "node_modules/html-tags": {
       "version": "3.3.1",
       "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.3.1.tgz",
       "integrity": "sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=8"
       },
@@ -6152,6 +6593,7 @@
       "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
       "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "depd": "2.0.0",
         "inherits": "2.0.4",
@@ -6168,6 +6610,7 @@
       "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
       "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">= 0.8"
       }
@@ -6177,6 +6620,7 @@
       "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz",
       "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "eventemitter3": "^4.0.0",
         "follow-redirects": "^1.0.0",
@@ -6191,6 +6635,7 @@
       "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
       "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "safer-buffer": ">= 2.1.2 < 3"
       },
@@ -6198,31 +6643,12 @@
         "node": ">=0.10.0"
       }
     },
-    "node_modules/ieee754": {
-      "version": "1.2.1",
-      "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
-      "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
-      "dev": true,
-      "funding": [
-        {
-          "type": "github",
-          "url": "https://github.com/sponsors/feross"
-        },
-        {
-          "type": "patreon",
-          "url": "https://www.patreon.com/feross"
-        },
-        {
-          "type": "consulting",
-          "url": "https://feross.org/support"
-        }
-      ]
-    },
     "node_modules/ignore": {
       "version": "5.3.2",
       "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz",
       "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">= 4"
       }
@@ -6231,13 +6657,15 @@
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz",
       "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==",
-      "dev": true
+      "dev": true,
+      "license": "ISC"
     },
     "node_modules/immutable": {
       "version": "3.8.2",
       "resolved": "https://registry.npmjs.org/immutable/-/immutable-3.8.2.tgz",
       "integrity": "sha512-15gZoQ38eYjEjxkorfbcgBKBL6R7T459OuK+CpcWt7O3KF4uPCx2tD0uFETlUDIyo+1789crbMhTvQBSR5yBMg==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=0.10.0"
       }
@@ -6247,6 +6675,7 @@
       "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
       "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "parent-module": "^1.0.0",
         "resolve-from": "^4.0.0"
@@ -6263,6 +6692,7 @@
       "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz",
       "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=8"
       }
@@ -6272,6 +6702,7 @@
       "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
       "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=0.8.19"
       }
@@ -6281,6 +6712,7 @@
       "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
       "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=8"
       }
@@ -6291,6 +6723,7 @@
       "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
       "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.",
       "dev": true,
+      "license": "ISC",
       "dependencies": {
         "once": "^1.3.0",
         "wrappy": "1"
@@ -6300,36 +6733,41 @@
       "version": "2.0.4",
       "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
       "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
-      "dev": true
+      "dev": true,
+      "license": "ISC"
     },
     "node_modules/ini": {
       "version": "1.3.8",
       "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
       "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
-      "dev": true
+      "dev": true,
+      "license": "ISC"
     },
     "node_modules/internal-slot": {
-      "version": "1.0.7",
-      "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz",
-      "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==",
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz",
+      "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "es-errors": "^1.3.0",
-        "hasown": "^2.0.0",
-        "side-channel": "^1.0.4"
+        "hasown": "^2.0.2",
+        "side-channel": "^1.1.0"
       },
       "engines": {
         "node": ">= 0.4"
       }
     },
     "node_modules/is-array-buffer": {
-      "version": "3.0.4",
-      "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz",
-      "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==",
+      "version": "3.0.5",
+      "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz",
+      "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "call-bind": "^1.0.2",
-        "get-intrinsic": "^1.2.1"
+        "call-bind": "^1.0.8",
+        "call-bound": "^1.0.3",
+        "get-intrinsic": "^1.2.6"
       },
       "engines": {
         "node": ">= 0.4"
@@ -6342,13 +6780,15 @@
       "version": "0.2.1",
       "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
       "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/is-async-function": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz",
       "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "has-tostringtag": "^1.0.0"
       },
@@ -6360,12 +6800,16 @@
       }
     },
     "node_modules/is-bigint": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz",
-      "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==",
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz",
+      "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "has-bigints": "^1.0.1"
+        "has-bigints": "^1.0.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
       },
       "funding": {
         "url": "https://github.com/sponsors/ljharb"
@@ -6376,6 +6820,7 @@
       "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
       "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "binary-extensions": "^2.0.0"
       },
@@ -6384,13 +6829,14 @@
       }
     },
     "node_modules/is-boolean-object": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz",
-      "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==",
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.1.tgz",
+      "integrity": "sha512-l9qO6eFlUETHtuihLcYOaLKByJ1f+N4kthcU9YjHy3N+B3hWv0y/2Nd0mu/7lTFnRQHTrSdXF50HQ3bl5fEnng==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "call-bind": "^1.0.2",
-        "has-tostringtag": "^1.0.0"
+        "call-bound": "^1.0.2",
+        "has-tostringtag": "^1.0.2"
       },
       "engines": {
         "node": ">= 0.4"
@@ -6404,6 +6850,7 @@
       "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.1.tgz",
       "integrity": "sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "builtin-modules": "^3.3.0"
       },
@@ -6419,6 +6866,7 @@
       "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz",
       "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">= 0.4"
       },
@@ -6431,6 +6879,7 @@
       "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz",
       "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "ci-info": "^2.0.0"
       },
@@ -6439,10 +6888,11 @@
       }
     },
     "node_modules/is-core-module": {
-      "version": "2.15.1",
-      "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz",
-      "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==",
+      "version": "2.16.0",
+      "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.0.tgz",
+      "integrity": "sha512-urTSINYfAYgcbLb0yDQ6egFm6h3Mo1DcF9EkyXSRjjzdHbsulg01qhwWuXdOoUBuTkbQ80KDboXa0vFJ+BDH+g==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "hasown": "^2.0.2"
       },
@@ -6454,11 +6904,14 @@
       }
     },
     "node_modules/is-data-view": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz",
-      "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==",
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz",
+      "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
+        "call-bound": "^1.0.2",
+        "get-intrinsic": "^1.2.6",
         "is-typed-array": "^1.1.13"
       },
       "engines": {
@@ -6469,12 +6922,14 @@
       }
     },
     "node_modules/is-date-object": {
-      "version": "1.0.5",
-      "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz",
-      "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==",
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz",
+      "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "has-tostringtag": "^1.0.0"
+        "call-bound": "^1.0.2",
+        "has-tostringtag": "^1.0.2"
       },
       "engines": {
         "node": ">= 0.4"
@@ -6488,6 +6943,7 @@
       "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz",
       "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==",
       "dev": true,
+      "license": "MIT",
       "bin": {
         "is-docker": "cli.js"
       },
@@ -6503,17 +6959,22 @@
       "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
       "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=0.10.0"
       }
     },
     "node_modules/is-finalizationregistry": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz",
-      "integrity": "sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==",
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz",
+      "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "call-bind": "^1.0.2"
+        "call-bound": "^1.0.3"
+      },
+      "engines": {
+        "node": ">= 0.4"
       },
       "funding": {
         "url": "https://github.com/sponsors/ljharb"
@@ -6524,6 +6985,7 @@
       "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
       "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=8"
       }
@@ -6533,6 +6995,7 @@
       "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz",
       "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "has-tostringtag": "^1.0.0"
       },
@@ -6548,6 +7011,7 @@
       "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
       "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "is-extglob": "^2.1.1"
       },
@@ -6560,6 +7024,7 @@
       "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz",
       "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">= 0.4"
       },
@@ -6571,13 +7036,15 @@
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz",
       "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/is-negative-zero": {
       "version": "2.0.3",
       "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz",
       "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">= 0.4"
       },
@@ -6590,6 +7057,7 @@
       "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
       "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=0.12.0"
       }
@@ -6599,17 +7067,20 @@
       "resolved": "https://registry.npmjs.org/is-number-like/-/is-number-like-1.0.8.tgz",
       "integrity": "sha512-6rZi3ezCyFcn5L71ywzz2bS5b2Igl1En3eTlZlvKjpz1n3IZLAYMbKYAIQgFmEu0GENg92ziU/faEOA/aixjbA==",
       "dev": true,
+      "license": "ISC",
       "dependencies": {
         "lodash.isfinite": "^3.3.2"
       }
     },
     "node_modules/is-number-object": {
-      "version": "1.0.7",
-      "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz",
-      "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==",
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz",
+      "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "has-tostringtag": "^1.0.0"
+        "call-bound": "^1.0.3",
+        "has-tostringtag": "^1.0.2"
       },
       "engines": {
         "node": ">= 0.4"
@@ -6623,6 +7094,7 @@
       "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz",
       "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=6"
       }
@@ -6632,6 +7104,7 @@
       "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz",
       "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=8"
       }
@@ -6641,6 +7114,7 @@
       "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz",
       "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=0.10.0"
       }
@@ -6650,6 +7124,7 @@
       "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz",
       "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=0.10.0"
       }
@@ -6659,18 +7134,22 @@
       "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz",
       "integrity": "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@types/estree": "*"
       }
     },
     "node_modules/is-regex": {
-      "version": "1.1.4",
-      "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz",
-      "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==",
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz",
+      "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "call-bind": "^1.0.2",
-        "has-tostringtag": "^1.0.0"
+        "call-bound": "^1.0.2",
+        "gopd": "^1.2.0",
+        "has-tostringtag": "^1.0.2",
+        "hasown": "^2.0.2"
       },
       "engines": {
         "node": ">= 0.4"
@@ -6684,6 +7163,7 @@
       "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz",
       "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">= 0.4"
       },
@@ -6692,12 +7172,13 @@
       }
     },
     "node_modules/is-shared-array-buffer": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz",
-      "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==",
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz",
+      "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "call-bind": "^1.0.7"
+        "call-bound": "^1.0.3"
       },
       "engines": {
         "node": ">= 0.4"
@@ -6711,6 +7192,7 @@
       "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
       "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=8"
       },
@@ -6719,12 +7201,14 @@
       }
     },
     "node_modules/is-string": {
-      "version": "1.0.7",
-      "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz",
-      "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==",
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz",
+      "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "has-tostringtag": "^1.0.0"
+        "call-bound": "^1.0.3",
+        "has-tostringtag": "^1.0.2"
       },
       "engines": {
         "node": ">= 0.4"
@@ -6734,12 +7218,15 @@
       }
     },
     "node_modules/is-symbol": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz",
-      "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==",
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz",
+      "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "has-symbols": "^1.0.2"
+        "call-bound": "^1.0.2",
+        "has-symbols": "^1.1.0",
+        "safe-regex-test": "^1.1.0"
       },
       "engines": {
         "node": ">= 0.4"
@@ -6749,12 +7236,13 @@
       }
     },
     "node_modules/is-typed-array": {
-      "version": "1.1.13",
-      "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz",
-      "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==",
+      "version": "1.1.15",
+      "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz",
+      "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "which-typed-array": "^1.1.14"
+        "which-typed-array": "^1.1.16"
       },
       "engines": {
         "node": ">= 0.4"
@@ -6768,6 +7256,7 @@
       "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz",
       "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">= 0.4"
       },
@@ -6776,25 +7265,30 @@
       }
     },
     "node_modules/is-weakref": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz",
-      "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==",
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.0.tgz",
+      "integrity": "sha512-SXM8Nwyys6nT5WP6pltOwKytLV7FqQ4UiibxVmW+EIosHcmCqkkjViTb5SNssDlkCiEYRP1/pdWUKVvZBmsR2Q==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "call-bind": "^1.0.2"
+        "call-bound": "^1.0.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
       },
       "funding": {
         "url": "https://github.com/sponsors/ljharb"
       }
     },
     "node_modules/is-weakset": {
-      "version": "2.0.3",
-      "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.3.tgz",
-      "integrity": "sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==",
+      "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz",
+      "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "call-bind": "^1.0.7",
-        "get-intrinsic": "^1.2.4"
+        "call-bound": "^1.0.3",
+        "get-intrinsic": "^1.2.6"
       },
       "engines": {
         "node": ">= 0.4"
@@ -6808,6 +7302,7 @@
       "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz",
       "integrity": "sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=4"
       }
@@ -6816,19 +7311,22 @@
       "version": "0.0.1",
       "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
       "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/isexe": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
       "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
-      "dev": true
+      "dev": true,
+      "license": "ISC"
     },
     "node_modules/istanbul-lib-coverage": {
       "version": "3.2.2",
       "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz",
       "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==",
       "dev": true,
+      "license": "BSD-3-Clause",
       "engines": {
         "node": ">=8"
       }
@@ -6838,6 +7336,7 @@
       "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz",
       "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==",
       "dev": true,
+      "license": "BSD-3-Clause",
       "dependencies": {
         "@babel/core": "^7.12.3",
         "@babel/parser": "^7.14.7",
@@ -6850,16 +7349,18 @@
       }
     },
     "node_modules/iterator.prototype": {
-      "version": "1.1.3",
-      "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.3.tgz",
-      "integrity": "sha512-FW5iMbeQ6rBGm/oKgzq2aW4KvAGpxPzYES8N4g4xNXUKpL1mclMvOe+76AcLDTvD+Ze+sOpVhgdAQEKF4L9iGQ==",
+      "version": "1.1.4",
+      "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.4.tgz",
+      "integrity": "sha512-x4WH0BWmrMmg4oHHl+duwubhrvczGlyuGAZu3nvrf0UXOfPu8IhZObFEr7DE/iv01YgVZrsOiRcqw2srkKEDIA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "define-properties": "^1.2.1",
-        "get-intrinsic": "^1.2.1",
-        "has-symbols": "^1.0.3",
-        "reflect.getprototypeof": "^1.0.4",
-        "set-function-name": "^2.0.1"
+        "define-data-property": "^1.1.4",
+        "es-object-atoms": "^1.0.0",
+        "get-intrinsic": "^1.2.6",
+        "has-symbols": "^1.1.0",
+        "reflect.getprototypeof": "^1.0.8",
+        "set-function-name": "^2.0.2"
       },
       "engines": {
         "node": ">= 0.4"
@@ -6870,6 +7371,7 @@
       "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz",
       "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==",
       "dev": true,
+      "license": "BlueOak-1.0.0",
       "dependencies": {
         "@isaacs/cliui": "^8.0.2"
       },
@@ -6888,6 +7390,7 @@
       "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz",
       "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@types/node": "*",
         "merge-stream": "^2.0.0",
@@ -6900,12 +7403,14 @@
     "node_modules/jquery": {
       "version": "3.7.1",
       "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.7.1.tgz",
-      "integrity": "sha512-m4avr8yL8kmFN8psrbFFFmB/If14iN5o9nw/NgnnM+kybDJpRsAynV2BsfpTYrTRysYUdADVD7CkUUizgkpLfg=="
+      "integrity": "sha512-m4avr8yL8kmFN8psrbFFFmB/If14iN5o9nw/NgnnM+kybDJpRsAynV2BsfpTYrTRysYUdADVD7CkUUizgkpLfg==",
+      "license": "MIT"
     },
     "node_modules/jquery-colorbox": {
       "version": "1.6.4",
       "resolved": "https://registry.npmjs.org/jquery-colorbox/-/jquery-colorbox-1.6.4.tgz",
       "integrity": "sha512-nC5xs9dSmIZ5n62a9HreGJTUmZJwfZ2DQXDVnHKs3Z2VNg91o8FFGeu7OWcCxYj7QIkrCGoMypaCftrR8YEJsA==",
+      "license": "MIT",
       "dependencies": {
         "jquery": ">=1.3.2"
       }
@@ -6913,19 +7418,22 @@
     "node_modules/jquery-jsonview": {
       "version": "1.2.3",
       "resolved": "https://registry.npmjs.org/jquery-jsonview/-/jquery-jsonview-1.2.3.tgz",
-      "integrity": "sha512-f7nbWtNbhb/xIa9lTTw4rGkrlLVxqkfoi6bO+Dy5IK+9UGwM/vbEJZdfQgRnwj38nUXMbdMQUSWqaIhBCe71dQ=="
+      "integrity": "sha512-f7nbWtNbhb/xIa9lTTw4rGkrlLVxqkfoi6bO+Dy5IK+9UGwM/vbEJZdfQgRnwj38nUXMbdMQUSWqaIhBCe71dQ==",
+      "license": "MIT"
     },
     "node_modules/js-tokens": {
       "version": "4.0.0",
       "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
       "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/js-yaml": {
       "version": "4.1.0",
       "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
       "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "argparse": "^2.0.1"
       },
@@ -6938,15 +7446,17 @@
       "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-4.0.0.tgz",
       "integrity": "sha512-YtOli5Cmzy3q4dP26GraSOeAhqecewG04hoO8DY56CH4KJ9Fvv5qKWUCCo3HZob7esJQHCv6/+bnTy72xZZaVQ==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=12.0.0"
       }
     },
     "node_modules/jsesc": {
-      "version": "3.0.2",
-      "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz",
-      "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==",
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz",
+      "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==",
       "dev": true,
+      "license": "MIT",
       "bin": {
         "jsesc": "bin/jsesc"
       },
@@ -6958,37 +7468,43 @@
       "version": "3.0.1",
       "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
       "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/json-parse-better-errors": {
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz",
       "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/json-parse-even-better-errors": {
       "version": "2.3.1",
       "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
       "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/json-schema-traverse": {
       "version": "0.4.1",
       "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
       "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/json-stable-stringify-without-jsonify": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
       "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/json5": {
       "version": "2.2.3",
       "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
       "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
       "dev": true,
+      "license": "MIT",
       "bin": {
         "json5": "lib/cli.js"
       },
@@ -7001,6 +7517,7 @@
       "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-3.0.1.tgz",
       "integrity": "sha512-oBko6ZHlubVB5mRFkur5vgYR1UyqX+S6Y/oCfLhqNdcc2fYFlDpIoNc7AfKS1KOGcnNAkvsr0grLck9ANM815w==",
       "dev": true,
+      "license": "MIT",
       "optionalDependencies": {
         "graceful-fs": "^4.1.6"
       }
@@ -7010,6 +7527,7 @@
       "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz",
       "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "array-includes": "^3.1.6",
         "array.prototype.flat": "^1.3.1",
@@ -7025,6 +7543,7 @@
       "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz",
       "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "json-buffer": "3.0.1"
       }
@@ -7034,6 +7553,7 @@
       "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
       "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=0.10.0"
       }
@@ -7043,6 +7563,7 @@
       "resolved": "https://registry.npmjs.org/klaw-sync/-/klaw-sync-6.0.0.tgz",
       "integrity": "sha512-nIeuVSzdCCs6TDPTqI8w1Yre34sSq7AkZ4B3sfOBbI2CgVSB4Du4aLQijFU2+lhAFCwt9+42Hel6lQNIv6AntQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "graceful-fs": "^4.1.11"
       }
@@ -7051,25 +7572,29 @@
       "version": "0.29.0",
       "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.29.0.tgz",
       "integrity": "sha512-Ne7wqW7/9Cz54PDt4I3tcV+hAyat8ypyOGzYRJQfdxnnjeWsTxt1cy8pjvvKeI5kfXuyvULyeeAvwvvtAX3ayQ==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/kuler": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz",
       "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/language-subtag-registry": {
       "version": "0.3.23",
       "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz",
       "integrity": "sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==",
-      "dev": true
+      "dev": true,
+      "license": "CC0-1.0"
     },
     "node_modules/language-tags": {
       "version": "1.0.9",
       "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz",
       "integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "language-subtag-registry": "^0.3.20"
       },
@@ -7082,6 +7607,7 @@
       "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
       "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "prelude-ls": "^1.2.1",
         "type-check": "~0.4.0"
@@ -7095,6 +7621,7 @@
       "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz",
       "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=10"
       }
@@ -7109,13 +7636,15 @@
       "version": "1.2.4",
       "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
       "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/load-json-file": {
       "version": "4.0.0",
       "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz",
       "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "graceful-fs": "^4.1.2",
         "parse-json": "^4.0.0",
@@ -7131,6 +7660,7 @@
       "resolved": "https://registry.npmjs.org/localtunnel/-/localtunnel-2.0.2.tgz",
       "integrity": "sha512-n418Cn5ynvJd7m/N1d9WVJISLJF/ellZnfsLnx8WBWGzxv/ntNcFkJ1o6se5quUhCplfLGBNL5tYHiq5WF3Nug==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "axios": "0.21.4",
         "debug": "4.3.2",
@@ -7149,6 +7679,7 @@
       "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
       "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
       "dev": true,
+      "license": "ISC",
       "dependencies": {
         "string-width": "^4.2.0",
         "strip-ansi": "^6.0.0",
@@ -7160,6 +7691,7 @@
       "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz",
       "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "ms": "2.1.2"
       },
@@ -7176,19 +7708,22 @@
       "version": "8.0.0",
       "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
       "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/localtunnel/node_modules/ms": {
       "version": "2.1.2",
       "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
       "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/localtunnel/node_modules/string-width": {
       "version": "4.2.3",
       "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
       "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "emoji-regex": "^8.0.0",
         "is-fullwidth-code-point": "^3.0.0",
@@ -7203,6 +7738,7 @@
       "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
       "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "ansi-styles": "^4.0.0",
         "string-width": "^4.1.0",
@@ -7220,6 +7756,7 @@
       "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.1.1.tgz",
       "integrity": "sha512-c2k48R0PwKIqKhPMWjeiF6y2xY/gPMUlro0sgxqXpbOIohWiLNXWslsootttv7E1e73QPAMQSg5FeySbVcpsPQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "cliui": "^7.0.2",
         "escalade": "^3.1.1",
@@ -7238,6 +7775,7 @@
       "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
       "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "p-locate": "^5.0.0"
       },
@@ -7252,67 +7790,78 @@
       "version": "4.17.21",
       "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
       "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/lodash.debounce": {
       "version": "4.0.8",
       "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
       "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/lodash.escape": {
       "version": "4.0.1",
       "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-4.0.1.tgz",
       "integrity": "sha512-nXEOnb/jK9g0DYMr1/Xvq6l5xMD7GDG55+GSYIYmS0G4tBk/hURD4JR9WCavs04t33WmJx9kCyp9vJ+mr4BOUw==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/lodash.isfinite": {
       "version": "3.3.2",
       "resolved": "https://registry.npmjs.org/lodash.isfinite/-/lodash.isfinite-3.3.2.tgz",
       "integrity": "sha512-7FGG40uhC8Mm633uKW1r58aElFlBlxCrg9JfSi3P6aYiWmfiWF0PgMd86ZUsxE5GwWPdHoS2+48bwTh2VPkIQA==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/lodash.memoize": {
       "version": "4.1.2",
       "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz",
       "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/lodash.merge": {
       "version": "4.6.2",
       "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
       "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/lodash.trim": {
       "version": "4.5.1",
       "resolved": "https://registry.npmjs.org/lodash.trim/-/lodash.trim-4.5.1.tgz",
       "integrity": "sha512-nJAlRl/K+eiOehWKDzoBVrSMhK0K3A3YQsUNXHQa5yIrKBAhsZgSu3KoAFoFT+mEgiyBHddZ0pRk1ITpIp90Wg==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/lodash.trimstart": {
       "version": "4.5.1",
       "resolved": "https://registry.npmjs.org/lodash.trimstart/-/lodash.trimstart-4.5.1.tgz",
       "integrity": "sha512-b/+D6La8tU76L/61/aN0jULWHkT0EeJCmVstPBn/K9MtD2qBW83AsBNrr63dKuWYwVMO7ucv13QNO/Ek/2RKaQ==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/lodash.truncate": {
       "version": "4.4.2",
       "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz",
       "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/lodash.uniq": {
       "version": "4.5.0",
       "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz",
       "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/logform": {
-      "version": "2.6.1",
-      "resolved": "https://registry.npmjs.org/logform/-/logform-2.6.1.tgz",
-      "integrity": "sha512-CdaO738xRapbKIMVn2m4F6KTj4j7ooJ8POVnebSgKo3KBz5axNXRAL7ZdRjIV6NOr2Uf4vjtRkxrFETOioCqSA==",
+      "version": "2.7.0",
+      "resolved": "https://registry.npmjs.org/logform/-/logform-2.7.0.tgz",
+      "integrity": "sha512-TFYA4jnP7PVbmlBIfhlSe+WKxs9dklXMTEGcBCIvLhE/Tn3H6Gk1norupVW7m5Cnd4bLcr08AytbyV/xj7f/kQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@colors/colors": "1.6.0",
         "@types/triple-beam": "^1.3.2",
@@ -7330,6 +7879,7 @@
       "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
       "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "js-tokens": "^3.0.0 || ^4.0.0"
       },
@@ -7342,6 +7892,7 @@
       "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
       "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
       "dev": true,
+      "license": "ISC",
       "dependencies": {
         "yallist": "^3.0.2"
       }
@@ -7351,6 +7902,7 @@
       "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.27.0.tgz",
       "integrity": "sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@jridgewell/sourcemap-codec": "^1.4.13"
       },
@@ -7363,6 +7915,7 @@
       "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz",
       "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=8"
       },
@@ -7370,11 +7923,22 @@
         "url": "https://github.com/sponsors/sindresorhus"
       }
     },
+    "node_modules/math-intrinsics": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
+      "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
     "node_modules/mathml-tag-names": {
       "version": "2.1.3",
       "resolved": "https://registry.npmjs.org/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz",
       "integrity": "sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==",
       "dev": true,
+      "license": "MIT",
       "funding": {
         "type": "github",
         "url": "https://github.com/sponsors/wooorm"
@@ -7384,7 +7948,8 @@
       "version": "2.0.30",
       "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz",
       "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==",
-      "dev": true
+      "dev": true,
+      "license": "CC0-1.0"
     },
     "node_modules/memorystream": {
       "version": "0.3.1",
@@ -7400,6 +7965,7 @@
       "resolved": "https://registry.npmjs.org/meow/-/meow-10.1.5.tgz",
       "integrity": "sha512-/d+PQ4GKmGvM9Bee/DPa8z3mXs/pkvJE2KEThngVNOqtmljC6K7NMPxtc2JeZYTmpWb9k/TmxjeL18ez3h7vCw==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@types/minimist": "^1.2.2",
         "camelcase-keys": "^7.0.0",
@@ -7425,13 +7991,15 @@
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
       "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/merge2": {
       "version": "1.4.1",
       "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
       "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">= 8"
       }
@@ -7441,6 +8009,7 @@
       "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
       "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "braces": "^3.0.3",
         "picomatch": "^2.3.1"
@@ -7454,6 +8023,7 @@
       "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
       "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=8.6"
       },
@@ -7466,6 +8036,7 @@
       "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz",
       "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==",
       "dev": true,
+      "license": "MIT",
       "bin": {
         "mime": "cli.js"
       }
@@ -7475,6 +8046,7 @@
       "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
       "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">= 0.6"
       }
@@ -7484,6 +8056,7 @@
       "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
       "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "mime-db": "1.52.0"
       },
@@ -7496,6 +8069,7 @@
       "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz",
       "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=4"
       }
@@ -7505,6 +8079,7 @@
       "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
       "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
       "dev": true,
+      "license": "ISC",
       "dependencies": {
         "brace-expansion": "^1.1.7"
       },
@@ -7517,6 +8092,7 @@
       "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
       "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
       "dev": true,
+      "license": "MIT",
       "funding": {
         "url": "https://github.com/sponsors/ljharb"
       }
@@ -7526,6 +8102,7 @@
       "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz",
       "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "arrify": "^1.0.1",
         "is-plain-obj": "^1.1.0",
@@ -7540,6 +8117,7 @@
       "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz",
       "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==",
       "dev": true,
+      "license": "ISC",
       "engines": {
         "node": ">=16 || 14 >=14.17"
       }
@@ -7548,13 +8126,15 @@
       "version": "1.2.0",
       "resolved": "https://registry.npmjs.org/mitt/-/mitt-1.2.0.tgz",
       "integrity": "sha512-r6lj77KlwqLhIUku9UWYes7KJtsczvolZkzp8hbaDPPaE24OmWl5s539Mytlj22siEQKosZ26qCBgda2PKwoJw==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/mkdirp": {
       "version": "1.0.4",
       "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
       "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
       "dev": true,
+      "license": "MIT",
       "bin": {
         "mkdirp": "bin/cmd.js"
       },
@@ -7565,27 +8145,30 @@
     "node_modules/mmenu-light": {
       "version": "3.2.2",
       "resolved": "https://registry.npmjs.org/mmenu-light/-/mmenu-light-3.2.2.tgz",
-      "integrity": "sha512-Ue+3+ZIF500IWNPgojHRbIhl8ikMxuPnFBpb+I8bL5fg5ODFOctOEAhA7aZmfjvWvtC+8v0ik3y6aTvgX/QXTQ=="
+      "integrity": "sha512-Ue+3+ZIF500IWNPgojHRbIhl8ikMxuPnFBpb+I8bL5fg5ODFOctOEAhA7aZmfjvWvtC+8v0ik3y6aTvgX/QXTQ==",
+      "license": "CC-BY-4.0"
     },
     "node_modules/ms": {
       "version": "2.1.3",
       "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
       "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/mustache": {
       "version": "4.2.0",
       "resolved": "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz",
       "integrity": "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==",
       "dev": true,
+      "license": "MIT",
       "bin": {
         "mustache": "bin/mustache"
       }
     },
     "node_modules/nanoid": {
-      "version": "3.3.7",
-      "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz",
-      "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==",
+      "version": "3.3.8",
+      "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz",
+      "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==",
       "dev": true,
       "funding": [
         {
@@ -7593,6 +8176,7 @@
           "url": "https://github.com/sponsors/ai"
         }
       ],
+      "license": "MIT",
       "bin": {
         "nanoid": "bin/nanoid.cjs"
       },
@@ -7604,13 +8188,15 @@
       "version": "1.4.0",
       "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
       "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/negotiator": {
       "version": "0.6.3",
       "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
       "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">= 0.6"
       }
@@ -7619,19 +8205,22 @@
       "version": "1.0.5",
       "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz",
       "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/node-releases": {
-      "version": "2.0.18",
-      "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz",
-      "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==",
-      "dev": true
+      "version": "2.0.19",
+      "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz",
+      "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==",
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/nodemon": {
       "version": "2.0.22",
       "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.22.tgz",
       "integrity": "sha512-B8YqaKMmyuCO7BowF1Z1/mkPqLk6cs/l63Ojtd6otKjMx47Dq1utxfRxcavH1I7VSaL8n5BUaoutadnsX3AAVQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "chokidar": "^3.5.2",
         "debug": "^3.2.7",
@@ -7660,6 +8249,7 @@
       "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
       "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "ms": "^2.1.1"
       }
@@ -7669,6 +8259,7 @@
       "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
       "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=4"
       }
@@ -7678,6 +8269,7 @@
       "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
       "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
       "dev": true,
+      "license": "ISC",
       "bin": {
         "semver": "bin/semver"
       }
@@ -7687,6 +8279,7 @@
       "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
       "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "has-flag": "^3.0.0"
       },
@@ -7699,6 +8292,7 @@
       "resolved": "https://registry.npmjs.org/noms/-/noms-0.0.0.tgz",
       "integrity": "sha512-lNDU9VJaOPxUmXcLb+HQFeUgQQPtMI24Gt6hgfuMHRJgMRHMF/qZ4HJD3GDru4sSw9IQl2jPjAYnQrdIeLbwow==",
       "dev": true,
+      "license": "ISC",
       "dependencies": {
         "inherits": "^2.0.1",
         "readable-stream": "~1.0.31"
@@ -7709,6 +8303,7 @@
       "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz",
       "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==",
       "dev": true,
+      "license": "BSD-2-Clause",
       "dependencies": {
         "hosted-git-info": "^4.0.1",
         "is-core-module": "^2.5.0",
@@ -7724,6 +8319,7 @@
       "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz",
       "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==",
       "dev": true,
+      "license": "ISC",
       "bin": {
         "semver": "bin/semver.js"
       },
@@ -7736,6 +8332,7 @@
       "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
       "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=0.10.0"
       }
@@ -7745,6 +8342,7 @@
       "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz",
       "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=0.10.0"
       }
@@ -7754,6 +8352,7 @@
       "resolved": "https://registry.npmjs.org/npm-run-all/-/npm-run-all-4.1.5.tgz",
       "integrity": "sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "ansi-styles": "^3.2.1",
         "chalk": "^2.4.1",
@@ -7779,6 +8378,7 @@
       "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
       "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "color-convert": "^1.9.0"
       },
@@ -7791,6 +8391,7 @@
       "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
       "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "ansi-styles": "^3.2.1",
         "escape-string-regexp": "^1.0.5",
@@ -7805,6 +8406,7 @@
       "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
       "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "color-name": "1.1.3"
       }
@@ -7813,13 +8415,15 @@
       "version": "1.1.3",
       "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
       "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/npm-run-all/node_modules/cross-spawn": {
-      "version": "6.0.5",
-      "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
-      "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
+      "version": "6.0.6",
+      "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.6.tgz",
+      "integrity": "sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "nice-try": "^1.0.4",
         "path-key": "^2.0.1",
@@ -7836,6 +8440,7 @@
       "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
       "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=0.8.0"
       }
@@ -7845,6 +8450,7 @@
       "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
       "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=4"
       }
@@ -7854,6 +8460,7 @@
       "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
       "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=4"
       }
@@ -7863,6 +8470,7 @@
       "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
       "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
       "dev": true,
+      "license": "ISC",
       "bin": {
         "semver": "bin/semver"
       }
@@ -7872,6 +8480,7 @@
       "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
       "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "shebang-regex": "^1.0.0"
       },
@@ -7884,6 +8493,7 @@
       "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
       "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=0.10.0"
       }
@@ -7893,6 +8503,7 @@
       "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
       "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "has-flag": "^3.0.0"
       },
@@ -7905,6 +8516,7 @@
       "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
       "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
       "dev": true,
+      "license": "ISC",
       "dependencies": {
         "isexe": "^2.0.0"
       },
@@ -7917,6 +8529,7 @@
       "resolved": "https://registry.npmjs.org/npm-watch/-/npm-watch-0.11.0.tgz",
       "integrity": "sha512-wAOd0moNX2kSA2FNvt8+7ORwYaJpQ1ZoWjUYdb1bBCxq4nkWuU0IiJa9VpVxrj5Ks+FGXQd62OC/Bjk0aSr+dg==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "nodemon": "^2.0.7",
         "through2": "^4.0.2"
@@ -7930,6 +8543,7 @@
       "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
       "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "inherits": "^2.0.3",
         "string_decoder": "^1.1.1",
@@ -7944,6 +8558,7 @@
       "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
       "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "safe-buffer": "~5.2.0"
       }
@@ -7953,6 +8568,7 @@
       "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz",
       "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "readable-stream": "3"
       }
@@ -7962,6 +8578,7 @@
       "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz",
       "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==",
       "dev": true,
+      "license": "BSD-2-Clause",
       "dependencies": {
         "boolbase": "^1.0.0"
       },
@@ -7974,15 +8591,17 @@
       "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
       "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=0.10.0"
       }
     },
     "node_modules/object-inspect": {
-      "version": "1.13.2",
-      "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz",
-      "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==",
+      "version": "1.13.3",
+      "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.3.tgz",
+      "integrity": "sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">= 0.4"
       },
@@ -7995,19 +8614,23 @@
       "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
       "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">= 0.4"
       }
     },
     "node_modules/object.assign": {
-      "version": "4.1.5",
-      "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz",
-      "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==",
+      "version": "4.1.7",
+      "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz",
+      "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "call-bind": "^1.0.5",
+        "call-bind": "^1.0.8",
+        "call-bound": "^1.0.3",
         "define-properties": "^1.2.1",
-        "has-symbols": "^1.0.3",
+        "es-object-atoms": "^1.0.0",
+        "has-symbols": "^1.1.0",
         "object-keys": "^1.1.1"
       },
       "engines": {
@@ -8022,6 +8645,7 @@
       "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.8.tgz",
       "integrity": "sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "call-bind": "^1.0.7",
         "define-properties": "^1.2.1",
@@ -8036,6 +8660,7 @@
       "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz",
       "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "call-bind": "^1.0.7",
         "define-properties": "^1.2.1",
@@ -8054,6 +8679,7 @@
       "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz",
       "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "call-bind": "^1.0.7",
         "define-properties": "^1.2.1",
@@ -8064,12 +8690,14 @@
       }
     },
     "node_modules/object.values": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz",
-      "integrity": "sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==",
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz",
+      "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "call-bind": "^1.0.7",
+        "call-bind": "^1.0.8",
+        "call-bound": "^1.0.3",
         "define-properties": "^1.2.1",
         "es-object-atoms": "^1.0.0"
       },
@@ -8085,6 +8713,7 @@
       "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
       "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "ee-first": "1.1.1"
       },
@@ -8097,6 +8726,7 @@
       "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
       "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
       "dev": true,
+      "license": "ISC",
       "dependencies": {
         "wrappy": "1"
       }
@@ -8106,6 +8736,7 @@
       "resolved": "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz",
       "integrity": "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "fn.name": "1.x.x"
       }
@@ -8115,6 +8746,7 @@
       "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz",
       "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "is-docker": "^2.0.0",
         "is-wsl": "^2.1.1"
@@ -8131,6 +8763,7 @@
       "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz",
       "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "is-docker": "^2.0.0"
       },
@@ -8142,13 +8775,15 @@
       "version": "1.1.1",
       "resolved": "https://registry.npmjs.org/openurl/-/openurl-1.1.1.tgz",
       "integrity": "sha512-d/gTkTb1i1GKz5k3XE3XFV/PxQ1k45zDqGP2OA7YhgsaLoqm6qRvARAZOFer1fcXritWlGBRCu/UgeS4HAnXAA==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/opn": {
       "version": "5.3.0",
       "resolved": "https://registry.npmjs.org/opn/-/opn-5.3.0.tgz",
       "integrity": "sha512-bYJHo/LOmoTd+pfiYhfZDnf9zekVJrY+cnS2a5F2x+w5ppvTqObojTP7WiFG+kVZs9Inw+qQ/lw7TroWwhdd2g==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "is-wsl": "^1.1.0"
       },
@@ -8161,6 +8796,7 @@
       "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz",
       "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "deep-is": "^0.1.3",
         "fast-levenshtein": "^2.0.6",
@@ -8178,6 +8814,7 @@
       "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
       "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=0.10.0"
       }
@@ -8187,6 +8824,7 @@
       "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
       "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "yocto-queue": "^0.1.0"
       },
@@ -8202,6 +8840,7 @@
       "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
       "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "p-limit": "^3.0.2"
       },
@@ -8217,6 +8856,7 @@
       "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz",
       "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "aggregate-error": "^3.0.0"
       },
@@ -8232,6 +8872,7 @@
       "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
       "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "callsites": "^3.0.0"
       },
@@ -8244,6 +8885,7 @@
       "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz",
       "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "error-ex": "^1.3.1",
         "json-parse-better-errors": "^1.0.1"
@@ -8257,6 +8899,7 @@
       "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
       "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">= 0.8"
       }
@@ -8266,6 +8909,7 @@
       "resolved": "https://registry.npmjs.org/patch-package/-/patch-package-6.5.1.tgz",
       "integrity": "sha512-I/4Zsalfhc6bphmJTlrLoOcAF87jcxko4q0qsv4bGcurbr8IskEOtdnt9iCmsQVGL1B+iUhSQqweyTLJfCF9rA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@yarnpkg/lockfile": "^1.1.0",
         "chalk": "^4.1.2",
@@ -8291,10 +8935,11 @@
       }
     },
     "node_modules/patch-package/node_modules/cross-spawn": {
-      "version": "6.0.5",
-      "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
-      "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
+      "version": "6.0.6",
+      "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.6.tgz",
+      "integrity": "sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "nice-try": "^1.0.4",
         "path-key": "^2.0.1",
@@ -8311,6 +8956,7 @@
       "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz",
       "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "at-least-node": "^1.0.0",
         "graceful-fs": "^4.2.0",
@@ -8327,6 +8973,7 @@
       "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
       "deprecated": "Glob versions prior to v9 are no longer supported",
       "dev": true,
+      "license": "ISC",
       "dependencies": {
         "fs.realpath": "^1.0.0",
         "inflight": "^1.0.4",
@@ -8347,6 +8994,7 @@
       "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
       "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "universalify": "^2.0.0"
       },
@@ -8359,6 +9007,7 @@
       "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
       "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=4"
       }
@@ -8369,6 +9018,7 @@
       "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
       "deprecated": "Rimraf versions prior to v4 are no longer supported",
       "dev": true,
+      "license": "ISC",
       "dependencies": {
         "glob": "^7.1.3"
       },
@@ -8381,6 +9031,7 @@
       "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
       "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
       "dev": true,
+      "license": "ISC",
       "bin": {
         "semver": "bin/semver"
       }
@@ -8390,6 +9041,7 @@
       "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
       "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "shebang-regex": "^1.0.0"
       },
@@ -8402,6 +9054,7 @@
       "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
       "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=0.10.0"
       }
@@ -8411,6 +9064,7 @@
       "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz",
       "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=6"
       }
@@ -8420,6 +9074,7 @@
       "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz",
       "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">= 10.0.0"
       }
@@ -8429,6 +9084,7 @@
       "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
       "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
       "dev": true,
+      "license": "ISC",
       "dependencies": {
         "isexe": "^2.0.0"
       },
@@ -8441,6 +9097,7 @@
       "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
       "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=8"
       }
@@ -8450,6 +9107,7 @@
       "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
       "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=0.10.0"
       }
@@ -8459,6 +9117,7 @@
       "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
       "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=8"
       }
@@ -8467,13 +9126,15 @@
       "version": "1.0.7",
       "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
       "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/path-scurry": {
       "version": "1.11.1",
       "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz",
       "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==",
       "dev": true,
+      "license": "BlueOak-1.0.0",
       "dependencies": {
         "lru-cache": "^10.2.0",
         "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0"
@@ -8489,13 +9150,15 @@
       "version": "10.4.3",
       "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz",
       "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==",
-      "dev": true
+      "dev": true,
+      "license": "ISC"
     },
     "node_modules/path-type": {
       "version": "4.0.0",
       "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
       "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=8"
       }
@@ -8504,13 +9167,15 @@
       "version": "1.1.1",
       "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
       "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
-      "dev": true
+      "dev": true,
+      "license": "ISC"
     },
     "node_modules/picomatch": {
       "version": "4.0.2",
       "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz",
       "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=12"
       },
@@ -8523,6 +9188,7 @@
       "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.3.1.tgz",
       "integrity": "sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==",
       "dev": true,
+      "license": "MIT",
       "bin": {
         "pidtree": "bin/pidtree.js"
       },
@@ -8535,6 +9201,7 @@
       "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
       "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=4"
       }
@@ -8544,6 +9211,7 @@
       "resolved": "https://registry.npmjs.org/portscanner/-/portscanner-2.2.0.tgz",
       "integrity": "sha512-IFroCz/59Lqa2uBvzK3bKDbDDIEaAY8XJ1jFxcLWTqosrsc32//P4VuSB2vZXoHiHqOmx8B5L5hnKOxL/7FlPw==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "async": "^2.6.0",
         "is-number-like": "^1.0.3"
@@ -8558,14 +9226,15 @@
       "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz",
       "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">= 0.4"
       }
     },
     "node_modules/postcss": {
-      "version": "8.4.47",
-      "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.47.tgz",
-      "integrity": "sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==",
+      "version": "8.4.49",
+      "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz",
+      "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==",
       "dev": true,
       "funding": [
         {
@@ -8581,9 +9250,10 @@
           "url": "https://github.com/sponsors/ai"
         }
       ],
+      "license": "MIT",
       "dependencies": {
         "nanoid": "^3.3.7",
-        "picocolors": "^1.1.0",
+        "picocolors": "^1.1.1",
         "source-map-js": "^1.2.1"
       },
       "engines": {
@@ -8595,6 +9265,7 @@
       "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-9.0.1.tgz",
       "integrity": "sha512-TipgjGyzP5QzEhsOZUaIkeO5mKeMFpebWzRogWG/ysonUlnHcq5aJe0jOjpfzUU8PeSaBQnrE8ehR0QA5vs8PQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "postcss-selector-parser": "^6.0.11",
         "postcss-value-parser": "^4.2.0"
@@ -8611,6 +9282,7 @@
       "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-6.1.0.tgz",
       "integrity": "sha512-x9yX7DOxeMAR+BgGVnNSAxmAj98NX/YxEMNFP+SDCEeNLb2r3i6Hh1ksMsnW8Ub5SLCpbescQqn9YEbE9554Sw==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "browserslist": "^4.23.0",
         "caniuse-api": "^3.0.0",
@@ -8629,6 +9301,7 @@
       "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-6.1.0.tgz",
       "integrity": "sha512-zx8IwP/ts9WvUM6NkVSkiU902QZL1bwPhaVaLynPtCsOTqp+ZKbNi+s6XJg3rfqpKGA/oc7Oxk5t8pOQJcwl/w==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "browserslist": "^4.23.0",
         "postcss-value-parser": "^4.2.0"
@@ -8645,6 +9318,7 @@
       "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-6.0.2.tgz",
       "integrity": "sha512-65w/uIqhSBBfQmYnG92FO1mWZjJ4GL5b8atm5Yw2UgrwD7HiNiSSNwJor1eCFGzUgYnN/iIknhNRVqjrrpuglw==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": "^14 || ^16 || >=18.0"
       },
@@ -8657,6 +9331,7 @@
       "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-6.0.3.tgz",
       "integrity": "sha512-+JA0DCvc5XvFAxwx6f/e68gQu/7Z9ud584VLmcgto28eB8FqSFZwtrLwB5Kcp70eIoWP/HXqz4wpo8rD8gpsTw==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": "^14 || ^16 || >=18.0"
       },
@@ -8669,6 +9344,7 @@
       "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-6.0.3.tgz",
       "integrity": "sha512-znyno9cHKQsK6PtxL5D19Fj9uwSzC2mB74cpT66fhgOadEUPyXFkbgwm5tvc3bt3NAy8ltE5MrghxovZRVnOjQ==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": "^14 || ^16 || >=18.0"
       },
@@ -8681,6 +9357,7 @@
       "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-6.0.2.tgz",
       "integrity": "sha512-j87xzI4LUggC5zND7KdjsI25APtyMuynXZSujByMaav2roV6OZX+8AaCUcZSWqckZpjAjRyFDdpqybgjFO0HJQ==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": "^14 || ^16 || >=18.0"
       },
@@ -8692,13 +9369,15 @@
       "version": "0.2.3",
       "resolved": "https://registry.npmjs.org/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz",
       "integrity": "sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/postcss-merge-longhand": {
       "version": "6.0.5",
       "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-6.0.5.tgz",
       "integrity": "sha512-5LOiordeTfi64QhICp07nzzuTDjNSO8g5Ksdibt44d+uvIIAE1oZdRn8y/W5ZtYgRH/lnLDlvi9F8btZcVzu3w==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "postcss-value-parser": "^4.2.0",
         "stylehacks": "^6.1.1"
@@ -8715,6 +9394,7 @@
       "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-6.1.1.tgz",
       "integrity": "sha512-KOdWF0gju31AQPZiD+2Ar9Qjowz1LTChSjFFbS+e2sFgc4uHOp3ZvVX4sNeTlk0w2O31ecFGgrFzhO0RSWbWwQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "browserslist": "^4.23.0",
         "caniuse-api": "^3.0.0",
@@ -8733,6 +9413,7 @@
       "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-6.1.0.tgz",
       "integrity": "sha512-gklfI/n+9rTh8nYaSJXlCo3nOKqMNkxuGpTn/Qm0gstL3ywTr9/WRKznE+oy6fvfolH6dF+QM4nCo8yPLdvGJg==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "postcss-value-parser": "^4.2.0"
       },
@@ -8748,6 +9429,7 @@
       "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-6.0.3.tgz",
       "integrity": "sha512-4KXAHrYlzF0Rr7uc4VrfwDJ2ajrtNEpNEuLxFgwkhFZ56/7gaE4Nr49nLsQDZyUe+ds+kEhf+YAUolJiYXF8+Q==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "colord": "^2.9.3",
         "cssnano-utils": "^4.0.2",
@@ -8765,6 +9447,7 @@
       "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-6.1.0.tgz",
       "integrity": "sha512-bmSKnDtyyE8ujHQK0RQJDIKhQ20Jq1LYiez54WiaOoBtcSuflfK3Nm596LvbtlFcpipMjgClQGyGr7GAs+H1uA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "browserslist": "^4.23.0",
         "cssnano-utils": "^4.0.2",
@@ -8782,6 +9465,7 @@
       "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-6.0.4.tgz",
       "integrity": "sha512-L8dZSwNLgK7pjTto9PzWRoMbnLq5vsZSTu8+j1P/2GB8qdtGQfn+K1uSvFgYvgh83cbyxT5m43ZZhUMTJDSClQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "postcss-selector-parser": "^6.0.16"
       },
@@ -8797,6 +9481,7 @@
       "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-6.0.2.tgz",
       "integrity": "sha512-a8N9czmdnrjPHa3DeFlwqst5eaL5W8jYu3EBbTTkI5FHkfMhFZh1EGbku6jhHhIzTA6tquI2P42NtZ59M/H/kQ==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": "^14 || ^16 || >=18.0"
       },
@@ -8809,6 +9494,7 @@
       "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-6.0.2.tgz",
       "integrity": "sha512-8H04Mxsb82ON/aAkPeq8kcBbAtI5Q2a64X/mnRRfPXBq7XeogoQvReqxEfc0B4WPq1KimjezNC8flUtC3Qz6jg==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "postcss-value-parser": "^4.2.0"
       },
@@ -8824,6 +9510,7 @@
       "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-6.0.2.tgz",
       "integrity": "sha512-/JFzI441OAB9O7VnLA+RtSNZvQ0NCFZDOtp6QPFo1iIyawyXg0YI3CYM9HBy1WvwCRHnPep/BvI1+dGPKoXx/Q==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "postcss-value-parser": "^4.2.0"
       },
@@ -8839,6 +9526,7 @@
       "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-6.0.2.tgz",
       "integrity": "sha512-YdCgsfHkJ2jEXwR4RR3Tm/iOxSfdRt7jplS6XRh9Js9PyCR/aka/FCb6TuHT2U8gQubbm/mPmF6L7FY9d79VwQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "postcss-value-parser": "^4.2.0"
       },
@@ -8854,6 +9542,7 @@
       "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-6.0.2.tgz",
       "integrity": "sha512-vQZIivlxlfqqMp4L9PZsFE4YUkWniziKjQWUtsxUiVsSSPelQydwS8Wwcuw0+83ZjPWNTl02oxlIvXsmmG+CiQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "postcss-value-parser": "^4.2.0"
       },
@@ -8869,6 +9558,7 @@
       "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-6.0.2.tgz",
       "integrity": "sha512-a+YrtMox4TBtId/AEwbA03VcJgtyW4dGBizPl7e88cTFULYsprgHWTbfyjSLyHeBcK/Q9JhXkt2ZXiwaVHoMzA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "postcss-value-parser": "^4.2.0"
       },
@@ -8884,6 +9574,7 @@
       "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-6.1.0.tgz",
       "integrity": "sha512-QVC5TQHsVj33otj8/JD869Ndr5Xcc/+fwRh4HAsFsAeygQQXm+0PySrKbr/8tkDKzW+EVT3QkqZMfFrGiossDg==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "browserslist": "^4.23.0",
         "postcss-value-parser": "^4.2.0"
@@ -8900,6 +9591,7 @@
       "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-6.0.2.tgz",
       "integrity": "sha512-kVNcWhCeKAzZ8B4pv/DnrU1wNh458zBNp8dh4y5hhxih5RZQ12QWMuQrDgPRw3LRl8mN9vOVfHl7uhvHYMoXsQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "postcss-value-parser": "^4.2.0"
       },
@@ -8915,6 +9607,7 @@
       "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-6.0.2.tgz",
       "integrity": "sha512-sXZ2Nj1icbJOKmdjXVT9pnyHQKiSAyuNQHSgRCUgThn2388Y9cGVDR+E9J9iAYbSbLHI+UUwLVl1Wzco/zgv0Q==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "postcss-value-parser": "^4.2.0"
       },
@@ -8930,6 +9623,7 @@
       "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-6.0.2.tgz",
       "integrity": "sha512-VRZSOB+JU32RsEAQrO94QPkClGPKJEL/Z9PCBImXMhIeK5KAYo6slP/hBYlLgrCjFxyqvn5VC81tycFEDBLG1Q==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "cssnano-utils": "^4.0.2",
         "postcss-value-parser": "^4.2.0"
@@ -8946,6 +9640,7 @@
       "resolved": "https://registry.npmjs.org/postcss-prefix-selector/-/postcss-prefix-selector-1.16.1.tgz",
       "integrity": "sha512-Umxu+FvKMwlY6TyDzGFoSUnzW+NOfMBLyC1tAkIjgX+Z/qGspJeRjVC903D7mx7TuBpJlwti2ibXtWuA7fKMeQ==",
       "dev": true,
+      "license": "MIT",
       "peerDependencies": {
         "postcss": ">4 <9"
       }
@@ -8955,6 +9650,7 @@
       "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-6.1.0.tgz",
       "integrity": "sha512-RarLgBK/CrL1qZags04oKbVbrrVK2wcxhvta3GCxrZO4zveibqbRPmm2VI8sSgCXwoUHEliRSbOfpR0b/VIoiw==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "browserslist": "^4.23.0",
         "caniuse-api": "^3.0.0"
@@ -8971,6 +9667,7 @@
       "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-6.0.2.tgz",
       "integrity": "sha512-sB+Ya++3Xj1WaT9+5LOOdirAxP7dJZms3GRcYheSPi1PiTMigsxHAdkrbItHxwYHr4kt1zL7mmcHstgMYT+aiA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "postcss-value-parser": "^4.2.0"
       },
@@ -8985,13 +9682,15 @@
       "version": "0.1.6",
       "resolved": "https://registry.npmjs.org/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.6.tgz",
       "integrity": "sha512-0sglIs9Wmkzbr8lQwEyIzlDOOC9bGmfVKcJTaxv3vMmd3uo4o4DerC3En0bnmgceeql9BfC8hRkp7cg0fjdVqw==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/postcss-safe-parser": {
       "version": "6.0.0",
       "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-6.0.0.tgz",
       "integrity": "sha512-FARHN8pwH+WiS2OPCxJI8FuRJpTVnn6ZNFiqAM2aeW2LwTHWWmWgIyKC6cUo0L8aeKiF/14MNvnpls6R2PBeMQ==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=12.0"
       },
@@ -9022,6 +9721,7 @@
           "url": "https://github.com/sponsors/ai"
         }
       ],
+      "license": "MIT",
       "engines": {
         "node": ">=12.0"
       },
@@ -9034,6 +9734,7 @@
       "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz",
       "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "cssesc": "^3.0.0",
         "util-deprecate": "^1.0.2"
@@ -9047,6 +9748,7 @@
       "resolved": "https://registry.npmjs.org/postcss-sorting/-/postcss-sorting-8.0.2.tgz",
       "integrity": "sha512-M9dkSrmU00t/jK7rF6BZSZauA5MAaBW4i5EnJXspMwt4iqTh/L9j6fgMnbElEOfyRyfLfVbIHj/R52zHzAPe1Q==",
       "dev": true,
+      "license": "MIT",
       "peerDependencies": {
         "postcss": "^8.4.20"
       }
@@ -9056,6 +9758,7 @@
       "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-6.0.3.tgz",
       "integrity": "sha512-dlrahRmxP22bX6iKEjOM+c8/1p+81asjKT+V5lrgOH944ryx/OHpclnIbGsKVd3uWOXFLYJwCVf0eEkJGvO96g==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "postcss-value-parser": "^4.2.0",
         "svgo": "^3.2.0"
@@ -9072,6 +9775,7 @@
       "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz",
       "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">= 10"
       }
@@ -9081,6 +9785,7 @@
       "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz",
       "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "css-tree": "~2.2.0"
       },
@@ -9094,6 +9799,7 @@
       "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz",
       "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "mdn-data": "2.0.28",
         "source-map-js": "^1.0.1"
@@ -9107,13 +9813,15 @@
       "version": "2.0.28",
       "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz",
       "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==",
-      "dev": true
+      "dev": true,
+      "license": "CC0-1.0"
     },
     "node_modules/postcss-svgo/node_modules/svgo": {
       "version": "3.3.2",
       "resolved": "https://registry.npmjs.org/svgo/-/svgo-3.3.2.tgz",
       "integrity": "sha512-OoohrmuUlBs8B8o6MB2Aevn+pRIH9zDALSR+6hhqVfa6fRwG/Qw9VUMSMW9VNg2CFc/MTIfabtdOVl9ODIJjpw==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@trysound/sax": "0.2.0",
         "commander": "^7.2.0",
@@ -9139,6 +9847,7 @@
       "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-6.0.4.tgz",
       "integrity": "sha512-K38OCaIrO8+PzpArzkLKB42dSARtC2tmG6PvD4b1o1Q2E9Os8jzfWFfSy/rixsHwohtsDdFtAWGjFVFUdwYaMg==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "postcss-selector-parser": "^6.0.16"
       },
@@ -9153,22 +9862,25 @@
       "version": "4.2.0",
       "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz",
       "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/prelude-ls": {
       "version": "1.2.1",
       "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
       "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">= 0.8.0"
       }
     },
     "node_modules/prettier": {
-      "version": "3.3.3",
-      "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz",
-      "integrity": "sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==",
+      "version": "3.4.2",
+      "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.4.2.tgz",
+      "integrity": "sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ==",
       "dev": true,
+      "license": "MIT",
       "bin": {
         "prettier": "bin/prettier.cjs"
       },
@@ -9184,6 +9896,7 @@
       "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz",
       "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "fast-diff": "^1.1.2"
       },
@@ -9200,28 +9913,22 @@
     "node_modules/priority-plus": {
       "version": "1.5.1",
       "resolved": "https://registry.npmjs.org/priority-plus/-/priority-plus-1.5.1.tgz",
-      "integrity": "sha512-mIXWwkxz3X2kUfxTtkqKR80U9AihOBZeka6D/+jS7fEWa2H8A3bRcU3wCdmrNdjw9pXyOps7z1CYPVGAlqvghQ=="
-    },
-    "node_modules/process": {
-      "version": "0.11.10",
-      "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
-      "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==",
-      "dev": true,
-      "engines": {
-        "node": ">= 0.6.0"
-      }
+      "integrity": "sha512-mIXWwkxz3X2kUfxTtkqKR80U9AihOBZeka6D/+jS7fEWa2H8A3bRcU3wCdmrNdjw9pXyOps7z1CYPVGAlqvghQ==",
+      "license": "ISC"
     },
     "node_modules/process-nextick-args": {
       "version": "2.0.1",
       "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
       "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/prop-types": {
       "version": "15.8.1",
       "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz",
       "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "loose-envify": "^1.4.0",
         "object-assign": "^4.1.1",
@@ -9232,13 +9939,15 @@
       "version": "1.1.8",
       "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz",
       "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/punycode": {
       "version": "2.3.1",
       "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
       "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=6"
       }
@@ -9261,13 +9970,15 @@
           "type": "consulting",
           "url": "https://feross.org/support"
         }
-      ]
+      ],
+      "license": "MIT"
     },
     "node_modules/quick-lru": {
       "version": "5.1.1",
       "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz",
       "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=10"
       },
@@ -9280,6 +9991,7 @@
       "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
       "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "safe-buffer": "^5.1.0"
       }
@@ -9289,6 +10001,7 @@
       "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
       "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">= 0.6"
       }
@@ -9298,6 +10011,7 @@
       "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz",
       "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "bytes": "3.1.2",
         "http-errors": "2.0.0",
@@ -9313,6 +10027,7 @@
       "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz",
       "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "loose-envify": "^1.1.0",
         "object-assign": "^4.1.1"
@@ -9325,13 +10040,15 @@
       "version": "16.13.1",
       "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
       "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/read-pkg": {
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz",
       "integrity": "sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "load-json-file": "^4.0.0",
         "normalize-package-data": "^2.3.2",
@@ -9346,6 +10063,7 @@
       "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-8.0.0.tgz",
       "integrity": "sha512-snVCqPczksT0HS2EC+SxUndvSzn6LRCwpfSvLrIfR5BKDQQZMaI6jPRC9dYvYFDRAuFEAnkwww8kBBNE/3VvzQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "find-up": "^5.0.0",
         "read-pkg": "^6.0.0",
@@ -9363,6 +10081,7 @@
       "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz",
       "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@babel/code-frame": "^7.0.0",
         "error-ex": "^1.3.1",
@@ -9381,6 +10100,7 @@
       "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-6.0.0.tgz",
       "integrity": "sha512-X1Fu3dPuk/8ZLsMhEj5f4wFAF0DWoK7qhGJvgaijocXxBmSToKfbFtqbxMO7bVjNA1dmE5huAzjXj/ey86iw9Q==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@types/normalize-package-data": "^2.4.0",
         "normalize-package-data": "^3.0.2",
@@ -9398,13 +10118,15 @@
       "version": "2.8.9",
       "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz",
       "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==",
-      "dev": true
+      "dev": true,
+      "license": "ISC"
     },
     "node_modules/read-pkg/node_modules/normalize-package-data": {
       "version": "2.5.0",
       "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
       "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==",
       "dev": true,
+      "license": "BSD-2-Clause",
       "dependencies": {
         "hosted-git-info": "^2.1.4",
         "resolve": "^1.10.0",
@@ -9417,6 +10139,7 @@
       "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz",
       "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "pify": "^3.0.0"
       },
@@ -9429,6 +10152,7 @@
       "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
       "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
       "dev": true,
+      "license": "ISC",
       "bin": {
         "semver": "bin/semver"
       }
@@ -9438,6 +10162,7 @@
       "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
       "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "core-util-is": "~1.0.0",
         "inherits": "~2.0.1",
@@ -9450,6 +10175,7 @@
       "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
       "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "picomatch": "^2.2.1"
       },
@@ -9462,6 +10188,7 @@
       "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
       "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=8.6"
       },
@@ -9474,6 +10201,7 @@
       "resolved": "https://registry.npmjs.org/redent/-/redent-4.0.0.tgz",
       "integrity": "sha512-tYkDkVVtYkSVhuQ4zBgfvciymHaeuel+zFKXShfDnFP5SyVEP7qo70Rf1jTOTCx3vGNAbnEi/xFkcfQVMIBWag==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "indent-string": "^5.0.0",
         "strip-indent": "^4.0.0"
@@ -9490,6 +10218,7 @@
       "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz",
       "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=12"
       },
@@ -9498,18 +10227,20 @@
       }
     },
     "node_modules/reflect.getprototypeof": {
-      "version": "1.0.6",
-      "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.6.tgz",
-      "integrity": "sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==",
+      "version": "1.0.9",
+      "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.9.tgz",
+      "integrity": "sha512-r0Ay04Snci87djAsI4U+WNRcSw5S4pOH7qFjd/veA5gC7TbqESR3tcj28ia95L/fYUDw11JKP7uqUKUAfVvV5Q==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "call-bind": "^1.0.7",
+        "call-bind": "^1.0.8",
         "define-properties": "^1.2.1",
-        "es-abstract": "^1.23.1",
+        "dunder-proto": "^1.0.1",
+        "es-abstract": "^1.23.6",
         "es-errors": "^1.3.0",
-        "get-intrinsic": "^1.2.4",
-        "globalthis": "^1.0.3",
-        "which-builtin-type": "^1.1.3"
+        "get-intrinsic": "^1.2.6",
+        "gopd": "^1.2.0",
+        "which-builtin-type": "^1.2.1"
       },
       "engines": {
         "node": ">= 0.4"
@@ -9522,13 +10253,15 @@
       "version": "1.4.2",
       "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz",
       "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/regenerate-unicode-properties": {
       "version": "10.2.0",
       "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.0.tgz",
       "integrity": "sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "regenerate": "^1.4.2"
       },
@@ -9540,13 +10273,15 @@
       "version": "0.13.11",
       "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz",
       "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/regenerator-transform": {
       "version": "0.15.2",
       "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz",
       "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@babel/runtime": "^7.8.4"
       }
@@ -9556,6 +10291,7 @@
       "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.3.tgz",
       "integrity": "sha512-vqlC04+RQoFalODCbCumG2xIOvapzVMHwsyIGM/SIE8fRhFFsXeH8/QQ+s0T0kDAhKc4k30s73/0ydkHQz6HlQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "call-bind": "^1.0.7",
         "define-properties": "^1.2.1",
@@ -9570,15 +10306,16 @@
       }
     },
     "node_modules/regexpu-core": {
-      "version": "6.1.1",
-      "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.1.1.tgz",
-      "integrity": "sha512-k67Nb9jvwJcJmVpw0jPttR1/zVfnKf8Km0IPatrU/zJ5XeG3+Slx0xLXs9HByJSzXzrlz5EDvN6yLNMDc2qdnw==",
+      "version": "6.2.0",
+      "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.2.0.tgz",
+      "integrity": "sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "regenerate": "^1.4.2",
         "regenerate-unicode-properties": "^10.2.0",
         "regjsgen": "^0.8.0",
-        "regjsparser": "^0.11.0",
+        "regjsparser": "^0.12.0",
         "unicode-match-property-ecmascript": "^2.0.0",
         "unicode-match-property-value-ecmascript": "^2.1.0"
       },
@@ -9590,13 +10327,15 @@
       "version": "0.8.0",
       "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz",
       "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/regjsparser": {
-      "version": "0.11.2",
-      "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.11.2.tgz",
-      "integrity": "sha512-3OGZZ4HoLJkkAZx/48mTXJNlmqTGOzc0o9OWQPuWpkOlXXPbyN6OafCcoXUnBqE2D3f/T5L+pWc1kdEmnfnRsA==",
+      "version": "0.12.0",
+      "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.12.0.tgz",
+      "integrity": "sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ==",
       "dev": true,
+      "license": "BSD-2-Clause",
       "dependencies": {
         "jsesc": "~3.0.2"
       },
@@ -9604,17 +10343,32 @@
         "regjsparser": "bin/parser"
       }
     },
+    "node_modules/regjsparser/node_modules/jsesc": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz",
+      "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==",
+      "dev": true,
+      "license": "MIT",
+      "bin": {
+        "jsesc": "bin/jsesc"
+      },
+      "engines": {
+        "node": ">=6"
+      }
+    },
     "node_modules/remove-trailing-separator": {
       "version": "1.1.0",
       "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz",
       "integrity": "sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==",
-      "dev": true
+      "dev": true,
+      "license": "ISC"
     },
     "node_modules/replace-ext": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.1.tgz",
       "integrity": "sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">= 0.10"
       }
@@ -9624,6 +10378,7 @@
       "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
       "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=0.10.0"
       }
@@ -9633,6 +10388,7 @@
       "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
       "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=0.10.0"
       }
@@ -9641,21 +10397,26 @@
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
       "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/resolve": {
-      "version": "1.22.8",
-      "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz",
-      "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==",
+      "version": "1.22.10",
+      "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz",
+      "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "is-core-module": "^2.13.0",
+        "is-core-module": "^2.16.0",
         "path-parse": "^1.0.7",
         "supports-preserve-symlinks-flag": "^1.0.0"
       },
       "bin": {
         "resolve": "bin/resolve"
       },
+      "engines": {
+        "node": ">= 0.4"
+      },
       "funding": {
         "url": "https://github.com/sponsors/ljharb"
       }
@@ -9665,6 +10426,7 @@
       "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
       "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=4"
       }
@@ -9687,6 +10449,7 @@
       "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
       "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "ms": "2.0.0"
       }
@@ -9695,13 +10458,15 @@
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
       "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/reusify": {
       "version": "1.0.4",
       "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
       "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "iojs": ">=1.0.0",
         "node": ">=0.10.0"
@@ -9713,6 +10478,7 @@
       "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
       "deprecated": "Rimraf versions prior to v4 are no longer supported",
       "dev": true,
+      "license": "ISC",
       "dependencies": {
         "glob": "^7.1.3"
       },
@@ -9729,6 +10495,7 @@
       "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
       "deprecated": "Glob versions prior to v9 are no longer supported",
       "dev": true,
+      "license": "ISC",
       "dependencies": {
         "fs.realpath": "^1.0.0",
         "inflight": "^1.0.4",
@@ -9749,6 +10516,7 @@
       "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.2.tgz",
       "integrity": "sha512-fS6iqSPZDs3dr/y7Od6y5nha8dW1YnbgtsyotCVvoFGKbERG++CVRFv1meyGDE1SNItQA8BrnCw7ScdAhRJ3XQ==",
       "dev": true,
+      "license": "MIT",
       "peer": true,
       "bin": {
         "rollup": "dist/bin/rollup"
@@ -9765,6 +10533,7 @@
       "resolved": "https://registry.npmjs.org/rollup-plugin-istanbul/-/rollup-plugin-istanbul-4.0.0.tgz",
       "integrity": "sha512-AOauxxl4eAHWdvTnY/uwSrwMkbDymTWUhaD6aym8a4YJaO9hxK2U8bcuhZA0iravuOTUulqPWUbYP7mTV7i4oQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@rollup/pluginutils": "^5.0.2",
         "istanbul-lib-instrument": "^5.2.1"
@@ -9784,6 +10553,7 @@
       "integrity": "sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==",
       "deprecated": "This package has been deprecated and is no longer maintained. Please use @rollup/plugin-terser",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@babel/code-frame": "^7.10.4",
         "jest-worker": "^26.2.1",
@@ -9813,6 +10583,7 @@
           "url": "https://feross.org/support"
         }
       ],
+      "license": "MIT",
       "dependencies": {
         "queue-microtask": "^1.2.2"
       }
@@ -9821,17 +10592,20 @@
       "version": "4.1.0",
       "resolved": "https://registry.npmjs.org/rx/-/rx-4.1.0.tgz",
       "integrity": "sha512-CiaiuN6gapkdl+cZUr67W6I8jquN4lkak3vtIsIWCl4XIPP8ffsoyN6/+PuGXnQy8Cu8W2y9Xxh31Rq4M6wUug==",
-      "dev": true
+      "dev": true,
+      "license": "Apache-2.0"
     },
     "node_modules/safe-array-concat": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz",
-      "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==",
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz",
+      "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "call-bind": "^1.0.7",
-        "get-intrinsic": "^1.2.4",
-        "has-symbols": "^1.0.3",
+        "call-bind": "^1.0.8",
+        "call-bound": "^1.0.2",
+        "get-intrinsic": "^1.2.6",
+        "has-symbols": "^1.1.0",
         "isarray": "^2.0.5"
       },
       "engines": {
@@ -9845,7 +10619,8 @@
       "version": "2.0.5",
       "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz",
       "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/safe-buffer": {
       "version": "5.2.1",
@@ -9865,17 +10640,19 @@
           "type": "consulting",
           "url": "https://feross.org/support"
         }
-      ]
+      ],
+      "license": "MIT"
     },
     "node_modules/safe-regex-test": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz",
-      "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==",
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz",
+      "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "call-bind": "^1.0.6",
+        "call-bound": "^1.0.2",
         "es-errors": "^1.3.0",
-        "is-regex": "^1.1.4"
+        "is-regex": "^1.2.1"
       },
       "engines": {
         "node": ">= 0.4"
@@ -9889,6 +10666,7 @@
       "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz",
       "integrity": "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=10"
       }
@@ -9897,13 +10675,15 @@
       "version": "2.1.2",
       "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
       "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/sass": {
       "version": "1.64.2",
       "resolved": "https://registry.npmjs.org/sass/-/sass-1.64.2.tgz",
       "integrity": "sha512-TnDlfc+CRnUAgLO9D8cQLFu/GIjJIzJCGkE7o4ekIGQOH7T3GetiRR/PsTWJUHhkzcSPrARkPI+gNWn5alCzDg==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "chokidar": ">=3.0.0 <4.0.0",
         "immutable": "^4.0.0",
@@ -9920,13 +10700,15 @@
       "version": "4.3.7",
       "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.7.tgz",
       "integrity": "sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/semver": {
       "version": "6.3.1",
       "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
       "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
       "dev": true,
+      "license": "ISC",
       "bin": {
         "semver": "bin/semver.js"
       }
@@ -9936,6 +10718,7 @@
       "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz",
       "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "debug": "2.6.9",
         "depd": "~1.1.2",
@@ -9960,6 +10743,7 @@
       "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
       "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "ms": "2.0.0"
       }
@@ -9969,6 +10753,7 @@
       "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
       "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">= 0.6"
       }
@@ -9978,6 +10763,7 @@
       "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz",
       "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "depd": "~1.1.2",
         "inherits": "2.0.3",
@@ -9992,25 +10778,29 @@
       "version": "2.0.3",
       "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
       "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==",
-      "dev": true
+      "dev": true,
+      "license": "ISC"
     },
     "node_modules/send/node_modules/ms": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
       "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/send/node_modules/setprototypeof": {
       "version": "1.1.0",
       "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz",
       "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==",
-      "dev": true
+      "dev": true,
+      "license": "ISC"
     },
     "node_modules/send/node_modules/statuses": {
       "version": "1.4.0",
       "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz",
       "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">= 0.6"
       }
@@ -10020,6 +10810,7 @@
       "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz",
       "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==",
       "dev": true,
+      "license": "BSD-3-Clause",
       "dependencies": {
         "randombytes": "^2.1.0"
       }
@@ -10029,6 +10820,7 @@
       "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz",
       "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "accepts": "~1.3.4",
         "batch": "0.6.1",
@@ -10047,6 +10839,7 @@
       "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
       "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "ms": "2.0.0"
       }
@@ -10056,6 +10849,7 @@
       "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
       "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">= 0.6"
       }
@@ -10065,6 +10859,7 @@
       "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz",
       "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "depd": "~1.1.2",
         "inherits": "2.0.3",
@@ -10079,25 +10874,29 @@
       "version": "2.0.3",
       "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
       "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==",
-      "dev": true
+      "dev": true,
+      "license": "ISC"
     },
     "node_modules/serve-index/node_modules/ms": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
       "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/serve-index/node_modules/setprototypeof": {
       "version": "1.1.0",
       "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz",
       "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==",
-      "dev": true
+      "dev": true,
+      "license": "ISC"
     },
     "node_modules/serve-index/node_modules/statuses": {
       "version": "1.5.0",
       "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
       "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">= 0.6"
       }
@@ -10107,6 +10906,7 @@
       "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz",
       "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "encodeurl": "~1.0.2",
         "escape-html": "~1.0.3",
@@ -10121,13 +10921,15 @@
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/server-destroy/-/server-destroy-1.0.1.tgz",
       "integrity": "sha512-rb+9B5YBIEzYcD6x2VKidaa+cqYBJQKnU4oe4E3ANwRRN56yk/ua1YCJT1n21NTS8w6CcOclAKNP3PhdCXKYtQ==",
-      "dev": true
+      "dev": true,
+      "license": "ISC"
     },
     "node_modules/set-function-length": {
       "version": "1.2.2",
       "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz",
       "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "define-data-property": "^1.1.4",
         "es-errors": "^1.3.0",
@@ -10145,6 +10947,7 @@
       "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz",
       "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "define-data-property": "^1.1.4",
         "es-errors": "^1.3.0",
@@ -10159,13 +10962,15 @@
       "version": "1.2.0",
       "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
       "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==",
-      "dev": true
+      "dev": true,
+      "license": "ISC"
     },
     "node_modules/shebang-command": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
       "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "shebang-regex": "^3.0.0"
       },
@@ -10178,29 +10983,92 @@
       "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
       "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=8"
       }
     },
     "node_modules/shell-quote": {
-      "version": "1.8.1",
-      "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz",
-      "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==",
+      "version": "1.8.2",
+      "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.2.tgz",
+      "integrity": "sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA==",
       "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.4"
+      },
       "funding": {
         "url": "https://github.com/sponsors/ljharb"
       }
     },
     "node_modules/side-channel": {
-      "version": "1.0.6",
-      "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz",
-      "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==",
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz",
+      "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "call-bind": "^1.0.7",
         "es-errors": "^1.3.0",
-        "get-intrinsic": "^1.2.4",
-        "object-inspect": "^1.13.1"
+        "object-inspect": "^1.13.3",
+        "side-channel-list": "^1.0.0",
+        "side-channel-map": "^1.0.1",
+        "side-channel-weakmap": "^1.0.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/side-channel-list": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz",
+      "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "es-errors": "^1.3.0",
+        "object-inspect": "^1.13.3"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/side-channel-map": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz",
+      "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "call-bound": "^1.0.2",
+        "es-errors": "^1.3.0",
+        "get-intrinsic": "^1.2.5",
+        "object-inspect": "^1.13.3"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/side-channel-weakmap": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz",
+      "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "call-bound": "^1.0.2",
+        "es-errors": "^1.3.0",
+        "get-intrinsic": "^1.2.5",
+        "object-inspect": "^1.13.3",
+        "side-channel-map": "^1.0.1"
       },
       "engines": {
         "node": ">= 0.4"
@@ -10214,6 +11082,7 @@
       "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
       "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
       "dev": true,
+      "license": "ISC",
       "engines": {
         "node": ">=14"
       },
@@ -10226,6 +11095,7 @@
       "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz",
       "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "is-arrayish": "^0.3.1"
       }
@@ -10234,13 +11104,15 @@
       "version": "0.3.2",
       "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz",
       "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/simple-update-notifier": {
       "version": "1.1.0",
       "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-1.1.0.tgz",
       "integrity": "sha512-VpsrsJSUcJEseSbMHkrsrAVSdvVS5I96Qo1QAQ4FxQ9wXFcB+pjj7FB7/us9+GcgfW4ziHtYMc1J0PLczb55mg==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "semver": "~7.0.0"
       },
@@ -10253,6 +11125,7 @@
       "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz",
       "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==",
       "dev": true,
+      "license": "ISC",
       "bin": {
         "semver": "bin/semver.js"
       }
@@ -10262,6 +11135,7 @@
       "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
       "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=8"
       }
@@ -10271,6 +11145,7 @@
       "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz",
       "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "ansi-styles": "^4.0.0",
         "astral-regex": "^2.0.0",
@@ -10287,6 +11162,7 @@
       "version": "1.8.0",
       "resolved": "https://registry.npmjs.org/slick-carousel/-/slick-carousel-1.8.0.tgz",
       "integrity": "sha512-MSMpaUJoeM7svF+pWDOZpme4PyxZ4SBCWpyBdFvw97RSeRYrjs+EsMT0fQpRxH2Qu7axEuS8d1uA7/G7IGm0CQ==",
+      "license": "MIT",
       "peerDependencies": {
         "jquery": ">=1.8.0"
       }
@@ -10296,6 +11172,7 @@
       "resolved": "https://registry.npmjs.org/slim-select/-/slim-select-1.27.1.tgz",
       "integrity": "sha512-LvJ02cKKk6/jSHIcQv7dZwkQSXHLCVQR3v3lo8RJUssUUcmKPkpBmTpQ8au8KSMkxwca9+yeg+dO0iHAaVr5Aw==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=8"
       }
@@ -10305,6 +11182,7 @@
       "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.8.1.tgz",
       "integrity": "sha512-oZ7iUCxph8WYRHHcjBEc9unw3adt5CmSNlppj/5Q4k2RIrhl8Z5yY2Xr4j9zj0+wzVZ0bxmYoGSzKJnRl6A4yg==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "accepts": "~1.3.4",
         "base64id": "~2.0.0",
@@ -10323,16 +11201,36 @@
       "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.5.tgz",
       "integrity": "sha512-eLDQas5dzPgOWCk9GuuJC2lBqItuhKI4uxGgo9aIV7MYbk2h9Q6uULEh8WBzThoI7l+qU9Ast9fVUmkqPP9wYg==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "debug": "~4.3.4",
         "ws": "~8.17.1"
       }
     },
+    "node_modules/socket.io-adapter/node_modules/debug": {
+      "version": "4.3.7",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz",
+      "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "ms": "^2.1.3"
+      },
+      "engines": {
+        "node": ">=6.0"
+      },
+      "peerDependenciesMeta": {
+        "supports-color": {
+          "optional": true
+        }
+      }
+    },
     "node_modules/socket.io-client": {
       "version": "4.8.1",
       "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.8.1.tgz",
       "integrity": "sha512-hJVXfu3E28NmzGk8o1sHhN3om52tRvwYeidbj7xKy2eIIse5IoKX3USlS6Tqt3BHAtflLIkCQBkzVrEEfWUyYQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@socket.io/component-emitter": "~3.1.0",
         "debug": "~4.3.2",
@@ -10343,11 +11241,30 @@
         "node": ">=10.0.0"
       }
     },
+    "node_modules/socket.io-client/node_modules/debug": {
+      "version": "4.3.7",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz",
+      "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "ms": "^2.1.3"
+      },
+      "engines": {
+        "node": ">=6.0"
+      },
+      "peerDependenciesMeta": {
+        "supports-color": {
+          "optional": true
+        }
+      }
+    },
     "node_modules/socket.io-parser": {
       "version": "4.2.4",
       "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz",
       "integrity": "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@socket.io/component-emitter": "~3.1.0",
         "debug": "~4.3.1"
@@ -10356,11 +11273,48 @@
         "node": ">=10.0.0"
       }
     },
+    "node_modules/socket.io-parser/node_modules/debug": {
+      "version": "4.3.7",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz",
+      "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "ms": "^2.1.3"
+      },
+      "engines": {
+        "node": ">=6.0"
+      },
+      "peerDependenciesMeta": {
+        "supports-color": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/socket.io/node_modules/debug": {
+      "version": "4.3.7",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz",
+      "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "ms": "^2.1.3"
+      },
+      "engines": {
+        "node": ">=6.0"
+      },
+      "peerDependenciesMeta": {
+        "supports-color": {
+          "optional": true
+        }
+      }
+    },
     "node_modules/source-map": {
       "version": "0.6.1",
       "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
       "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
       "dev": true,
+      "license": "BSD-3-Clause",
       "engines": {
         "node": ">=0.10.0"
       }
@@ -10370,6 +11324,7 @@
       "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
       "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
       "dev": true,
+      "license": "BSD-3-Clause",
       "engines": {
         "node": ">=0.10.0"
       }
@@ -10379,6 +11334,7 @@
       "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",
       "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "buffer-from": "^1.0.0",
         "source-map": "^0.6.0"
@@ -10389,6 +11345,7 @@
       "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz",
       "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==",
       "dev": true,
+      "license": "Apache-2.0",
       "dependencies": {
         "spdx-expression-parse": "^3.0.0",
         "spdx-license-ids": "^3.0.0"
@@ -10399,6 +11356,7 @@
       "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz",
       "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "spdx-exceptions": "^2.1.0",
         "spdx-license-ids": "^3.0.0"
@@ -10408,13 +11366,15 @@
       "version": "2.5.0",
       "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz",
       "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==",
-      "dev": true
+      "dev": true,
+      "license": "CC-BY-3.0"
     },
     "node_modules/spdx-expression-parse": {
       "version": "4.0.0",
       "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-4.0.0.tgz",
       "integrity": "sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "spdx-exceptions": "^2.1.0",
         "spdx-license-ids": "^3.0.0"
@@ -10424,26 +11384,30 @@
       "version": "3.0.20",
       "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.20.tgz",
       "integrity": "sha512-jg25NiDV/1fLtSgEgyvVyDunvaNHbuwF9lfNV17gSmPFAlYzdfNBlLtLzXTevwkPj7DhGbmN9VnmJIgLnhvaBw==",
-      "dev": true
+      "dev": true,
+      "license": "CC0-1.0"
     },
     "node_modules/sprintf-js": {
       "version": "1.0.3",
       "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
       "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==",
-      "dev": true
+      "dev": true,
+      "license": "BSD-3-Clause"
     },
     "node_modules/stable": {
       "version": "0.1.8",
       "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz",
       "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==",
       "deprecated": "Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/stack-trace": {
       "version": "0.0.10",
       "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz",
       "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": "*"
       }
@@ -10453,6 +11417,7 @@
       "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz",
       "integrity": "sha512-wuTCPGlJONk/a1kqZ4fQM2+908lC7fa7nPYpTC1EhnvqLX/IICbeP1OZGDtA374trpSq68YubKUMo8oRhN46yg==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">= 0.6"
       }
@@ -10462,6 +11427,7 @@
       "resolved": "https://registry.npmjs.org/stream-throttle/-/stream-throttle-0.1.3.tgz",
       "integrity": "sha512-889+B9vN9dq7/vLbGyuHeZ6/ctf5sNuGWsDy89uNxkFTAgzy0eK7+w5fL3KLNRTkLle7EgZGvHUphZW0Q26MnQ==",
       "dev": true,
+      "license": "BSD-3-Clause",
       "dependencies": {
         "commander": "^2.2.0",
         "limiter": "^1.0.5"
@@ -10477,19 +11443,22 @@
       "version": "2.20.3",
       "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
       "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/string_decoder": {
       "version": "0.10.31",
       "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
       "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/string-width": {
       "version": "5.1.2",
       "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
       "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "eastasianwidth": "^0.2.0",
         "emoji-regex": "^9.2.2",
@@ -10508,6 +11477,7 @@
       "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
       "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "emoji-regex": "^8.0.0",
         "is-fullwidth-code-point": "^3.0.0",
@@ -10521,13 +11491,15 @@
       "version": "8.0.0",
       "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
       "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/string-width/node_modules/ansi-regex": {
       "version": "6.1.0",
       "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz",
       "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=12"
       },
@@ -10540,6 +11512,7 @@
       "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
       "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "ansi-regex": "^6.0.1"
       },
@@ -10555,6 +11528,7 @@
       "resolved": "https://registry.npmjs.org/string.prototype.includes/-/string.prototype.includes-2.0.1.tgz",
       "integrity": "sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "call-bind": "^1.0.7",
         "define-properties": "^1.2.1",
@@ -10565,23 +11539,25 @@
       }
     },
     "node_modules/string.prototype.matchall": {
-      "version": "4.0.11",
-      "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.11.tgz",
-      "integrity": "sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==",
+      "version": "4.0.12",
+      "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz",
+      "integrity": "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "call-bind": "^1.0.7",
+        "call-bind": "^1.0.8",
+        "call-bound": "^1.0.3",
         "define-properties": "^1.2.1",
-        "es-abstract": "^1.23.2",
+        "es-abstract": "^1.23.6",
         "es-errors": "^1.3.0",
         "es-object-atoms": "^1.0.0",
-        "get-intrinsic": "^1.2.4",
-        "gopd": "^1.0.1",
-        "has-symbols": "^1.0.3",
-        "internal-slot": "^1.0.7",
-        "regexp.prototype.flags": "^1.5.2",
+        "get-intrinsic": "^1.2.6",
+        "gopd": "^1.2.0",
+        "has-symbols": "^1.1.0",
+        "internal-slot": "^1.1.0",
+        "regexp.prototype.flags": "^1.5.3",
         "set-function-name": "^2.0.2",
-        "side-channel": "^1.0.6"
+        "side-channel": "^1.1.0"
       },
       "engines": {
         "node": ">= 0.4"
@@ -10595,6 +11571,7 @@
       "resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.1.6.tgz",
       "integrity": "sha512-XZpspuSB7vJWhvJc9DLSlrXl1mcA2BdoY5jjnS135ydXqLoqhs96JjDtCkjJEQHvfqZIp9hBuBMgI589peyx9Q==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "call-bind": "^1.0.7",
         "define-properties": "^1.2.1",
@@ -10613,21 +11590,26 @@
       "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz",
       "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "define-properties": "^1.1.3",
         "es-abstract": "^1.17.5"
       }
     },
     "node_modules/string.prototype.trim": {
-      "version": "1.2.9",
-      "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz",
-      "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==",
+      "version": "1.2.10",
+      "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz",
+      "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "call-bind": "^1.0.7",
+        "call-bind": "^1.0.8",
+        "call-bound": "^1.0.2",
+        "define-data-property": "^1.1.4",
         "define-properties": "^1.2.1",
-        "es-abstract": "^1.23.0",
-        "es-object-atoms": "^1.0.0"
+        "es-abstract": "^1.23.5",
+        "es-object-atoms": "^1.0.0",
+        "has-property-descriptors": "^1.0.2"
       },
       "engines": {
         "node": ">= 0.4"
@@ -10637,15 +11619,20 @@
       }
     },
     "node_modules/string.prototype.trimend": {
-      "version": "1.0.8",
-      "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz",
-      "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==",
+      "version": "1.0.9",
+      "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz",
+      "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "call-bind": "^1.0.7",
+        "call-bind": "^1.0.8",
+        "call-bound": "^1.0.2",
         "define-properties": "^1.2.1",
         "es-object-atoms": "^1.0.0"
       },
+      "engines": {
+        "node": ">= 0.4"
+      },
       "funding": {
         "url": "https://github.com/sponsors/ljharb"
       }
@@ -10655,6 +11642,7 @@
       "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz",
       "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "call-bind": "^1.0.7",
         "define-properties": "^1.2.1",
@@ -10672,6 +11660,7 @@
       "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
       "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "ansi-regex": "^5.0.1"
       },
@@ -10685,6 +11674,7 @@
       "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
       "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "ansi-regex": "^5.0.1"
       },
@@ -10697,6 +11687,7 @@
       "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
       "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=4"
       }
@@ -10706,6 +11697,7 @@
       "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-4.0.0.tgz",
       "integrity": "sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "min-indent": "^1.0.1"
       },
@@ -10721,6 +11713,7 @@
       "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
       "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=8"
       },
@@ -10732,13 +11725,15 @@
       "version": "0.1.0",
       "resolved": "https://registry.npmjs.org/style-search/-/style-search-0.1.0.tgz",
       "integrity": "sha512-Dj1Okke1C3uKKwQcetra4jSuk0DqbzbYtXipzFlFMZtowbF1x7BKJwB9AayVMyFARvU8EDrZdcax4At/452cAg==",
-      "dev": true
+      "dev": true,
+      "license": "ISC"
     },
     "node_modules/stylehacks": {
       "version": "6.1.1",
       "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-6.1.1.tgz",
       "integrity": "sha512-gSTTEQ670cJNoaeIp9KX6lZmm8LJ3jPB5yJmX8Zq/wQxOsAFXV3qjWzHas3YYk1qesuVIyYWWUpZ0vSE/dTSGg==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "browserslist": "^4.23.0",
         "postcss-selector-parser": "^6.0.16"
@@ -10755,6 +11750,7 @@
       "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-15.11.0.tgz",
       "integrity": "sha512-78O4c6IswZ9TzpcIiQJIN49K3qNoXTM8zEJzhaTE/xRTCZswaovSEVIa/uwbOltZrk16X4jAxjaOhzz/hTm1Kw==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@csstools/css-parser-algorithms": "^2.3.1",
         "@csstools/css-tokenizer": "^2.2.0",
@@ -10813,6 +11809,7 @@
       "resolved": "https://registry.npmjs.org/stylelint-checkstyle-formatter/-/stylelint-checkstyle-formatter-0.1.2.tgz",
       "integrity": "sha512-bePbF16ei9dCza2SlExRCGYMLVWsw0uQ2WJ5bakuL7lyprlENWz5/3qCZpneRMsFJkq+qtYuvomMoY/VI3AbPw==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "lodash": "^4.17.10"
       }
@@ -10822,6 +11819,7 @@
       "resolved": "https://registry.npmjs.org/stylelint-config-recommended/-/stylelint-config-recommended-13.0.0.tgz",
       "integrity": "sha512-EH+yRj6h3GAe/fRiyaoO2F9l9Tgg50AOFhaszyfov9v6ayXJ1IkSHwTxd7lB48FmOeSGDPLjatjO11fJpmarkQ==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": "^14.13.1 || >=16.0.0"
       },
@@ -10834,6 +11832,7 @@
       "resolved": "https://registry.npmjs.org/stylelint-config-recommended-scss/-/stylelint-config-recommended-scss-13.1.0.tgz",
       "integrity": "sha512-8L5nDfd+YH6AOoBGKmhH8pLWF1dpfY816JtGMePcBqqSsLU+Ysawx44fQSlMOJ2xTfI9yTGpup5JU77c17w1Ww==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "postcss-scss": "^4.0.9",
         "stylelint-config-recommended": "^13.0.0",
@@ -10854,6 +11853,7 @@
       "resolved": "https://registry.npmjs.org/stylelint-config-standard/-/stylelint-config-standard-34.0.0.tgz",
       "integrity": "sha512-u0VSZnVyW9VSryBG2LSO+OQTjN7zF9XJaAJRX/4EwkmU0R2jYwmBSN10acqZisDitS0CLiEiGjX7+Hrq8TAhfQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "stylelint-config-recommended": "^13.0.0"
       },
@@ -10869,6 +11869,7 @@
       "resolved": "https://registry.npmjs.org/stylelint-config-standard-scss/-/stylelint-config-standard-scss-11.1.0.tgz",
       "integrity": "sha512-5gnBgeNTgRVdchMwiFQPuBOtj9QefYtfXiddrOMJA2pI22zxt6ddI2s+e5Oh7/6QYl7QLJujGnaUR5YyGq72ow==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "stylelint-config-recommended-scss": "^13.1.0",
         "stylelint-config-standard": "^34.0.0"
@@ -10888,6 +11889,7 @@
       "resolved": "https://registry.npmjs.org/stylelint-formatter-gitlab/-/stylelint-formatter-gitlab-1.0.2.tgz",
       "integrity": "sha512-Iu5NjHSp/WdhUeICuUKNi6QvpEut5KPwnrx4XU5q1GZEcAvpyqbjBq7yMAEX6850BUza45ARpsfX4yfOcnFWLQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "fs-extra": "^8.1.0",
         "is-glob": "^4.0.1",
@@ -10902,6 +11904,7 @@
       "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
       "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "sprintf-js": "~1.0.2"
       }
@@ -10911,6 +11914,7 @@
       "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz",
       "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "graceful-fs": "^4.2.0",
         "jsonfile": "^4.0.0",
@@ -10925,6 +11929,7 @@
       "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
       "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "argparse": "^1.0.7",
         "esprima": "^4.0.0"
@@ -10938,6 +11943,7 @@
       "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
       "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==",
       "dev": true,
+      "license": "MIT",
       "optionalDependencies": {
         "graceful-fs": "^4.1.6"
       }
@@ -10947,6 +11953,7 @@
       "resolved": "https://registry.npmjs.org/stylelint-order/-/stylelint-order-6.0.4.tgz",
       "integrity": "sha512-0UuKo4+s1hgQ/uAxlYU4h0o0HS4NiQDud0NAUNI0aa8FJdmYHA5ZZTFHiV5FpmE3071e9pZx5j0QpVJW5zOCUA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "postcss": "^8.4.32",
         "postcss-sorting": "^8.0.2"
@@ -10960,6 +11967,7 @@
       "resolved": "https://registry.npmjs.org/stylelint-prettier/-/stylelint-prettier-4.1.0.tgz",
       "integrity": "sha512-dd653q/d1IfvsSQshz1uAMe+XDm6hfM/7XiFH0htYY8Lse/s5ERTg7SURQehZPwVvm/rs7AsFhda9EQ2E9TS0g==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "prettier-linter-helpers": "^1.0.0"
       },
@@ -10976,6 +11984,7 @@
       "resolved": "https://registry.npmjs.org/stylelint-scss/-/stylelint-scss-5.3.2.tgz",
       "integrity": "sha512-4LzLaayFhFyneJwLo0IUa8knuIvj+zF0vBFueQs4e3tEaAMIQX8q5th8ziKkgOavr6y/y9yoBe+RXN/edwLzsQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "known-css-properties": "^0.29.0",
         "postcss-media-query-parser": "^0.2.3",
@@ -10991,19 +12000,22 @@
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-2.0.0.tgz",
       "integrity": "sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/stylelint/node_modules/emoji-regex": {
       "version": "8.0.0",
       "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
       "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/stylelint/node_modules/file-entry-cache": {
       "version": "7.0.2",
       "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-7.0.2.tgz",
       "integrity": "sha512-TfW7/1iI4Cy7Y8L6iqNdZQVvdXn0f8B4QcIXmkIbtTIe/Okm/nSlHb4IwGzRVOd3WfSieCgvf5cMzEfySAIl0g==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "flat-cache": "^3.2.0"
       },
@@ -11016,6 +12028,7 @@
       "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
       "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=8"
       }
@@ -11025,6 +12038,7 @@
       "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
       "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "emoji-regex": "^8.0.0",
         "is-fullwidth-code-point": "^3.0.0",
@@ -11039,6 +12053,7 @@
       "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
       "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "has-flag": "^4.0.0"
       },
@@ -11051,6 +12066,7 @@
       "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-3.1.0.tgz",
       "integrity": "sha512-2rn0BZ+/f7puLOHZm1HOJfwBggfaHXUpPUSSG/SWM4TWp5KCfmNYwnC3hruy2rZlMnmWZ+QAGpZfchu3f3695A==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "has-flag": "^4.0.0",
         "supports-color": "^7.0.0"
@@ -11067,6 +12083,7 @@
       "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
       "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">= 0.4"
       },
@@ -11079,6 +12096,7 @@
       "resolved": "https://registry.npmjs.org/svg-sprite/-/svg-sprite-2.0.2.tgz",
       "integrity": "sha512-vLFP/t4YCu62mvOzUt6g9bqpKrPjYsLuzegw5WsIsv3DkulAI/fRC+k7Atk//rIkUDbvKo572nJ6o4YT+FbKig==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@resvg/resvg-js": "^2.1.0",
         "@xmldom/xmldom": "^0.8.3",
@@ -11111,13 +12129,15 @@
       "version": "3.2.6",
       "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz",
       "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/svg-sprite/node_modules/commander": {
       "version": "7.2.0",
       "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz",
       "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">= 10"
       }
@@ -11127,6 +12147,7 @@
       "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz",
       "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==",
       "dev": true,
+      "license": "BSD-2-Clause",
       "dependencies": {
         "boolbase": "^1.0.0",
         "css-what": "^6.0.1",
@@ -11143,6 +12164,7 @@
       "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz",
       "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "mdn-data": "2.0.14",
         "source-map": "^0.6.1"
@@ -11156,6 +12178,7 @@
       "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz",
       "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "domelementtype": "^2.0.1",
         "domhandler": "^4.2.0",
@@ -11170,6 +12193,7 @@
       "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz",
       "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==",
       "dev": true,
+      "license": "BSD-2-Clause",
       "dependencies": {
         "domelementtype": "^2.2.0"
       },
@@ -11185,6 +12209,7 @@
       "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz",
       "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==",
       "dev": true,
+      "license": "BSD-2-Clause",
       "dependencies": {
         "dom-serializer": "^1.0.1",
         "domelementtype": "^2.2.0",
@@ -11199,6 +12224,7 @@
       "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz",
       "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==",
       "dev": true,
+      "license": "BSD-2-Clause",
       "funding": {
         "url": "https://github.com/fb55/entities?sponsor=1"
       }
@@ -11209,6 +12235,7 @@
       "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
       "deprecated": "Glob versions prior to v9 are no longer supported",
       "dev": true,
+      "license": "ISC",
       "dependencies": {
         "fs.realpath": "^1.0.0",
         "inflight": "^1.0.4",
@@ -11228,13 +12255,15 @@
       "version": "2.0.14",
       "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz",
       "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==",
-      "dev": true
+      "dev": true,
+      "license": "CC0-1.0"
     },
     "node_modules/svg-sprite/node_modules/svgo": {
       "version": "2.8.0",
       "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz",
       "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@trysound/sax": "0.2.0",
         "commander": "^7.2.0",
@@ -11262,6 +12291,7 @@
       "resolved": "https://registry.npmjs.org/svgo/-/svgo-3.0.2.tgz",
       "integrity": "sha512-Z706C1U2pb1+JGP48fbazf3KxHrWOsLme6Rv7imFBn5EnuanDW1GPaA/P1/dvObE670JDePC3mnj0k0B7P0jjQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@trysound/sax": "0.2.0",
         "commander": "^7.2.0",
@@ -11286,6 +12316,7 @@
       "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz",
       "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">= 10"
       }
@@ -11295,6 +12326,7 @@
       "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz",
       "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "mdn-data": "2.0.28",
         "source-map-js": "^1.0.1"
@@ -11309,6 +12341,7 @@
       "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz",
       "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "css-tree": "~2.2.0"
       },
@@ -11321,13 +12354,15 @@
       "version": "2.0.28",
       "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz",
       "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==",
-      "dev": true
+      "dev": true,
+      "license": "CC0-1.0"
     },
     "node_modules/synckit": {
       "version": "0.9.2",
       "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.9.2.tgz",
       "integrity": "sha512-vrozgXDQwYO72vHjUb/HnFbQx1exDjoKzqx23aXEg2a9VIg2TSFZ8FmeZpTjUCFMYw7mpX4BE2SFu8wI7asYsw==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@pkgr/core": "^0.1.0",
         "tslib": "^2.6.2"
@@ -11340,10 +12375,11 @@
       }
     },
     "node_modules/table": {
-      "version": "6.8.2",
-      "resolved": "https://registry.npmjs.org/table/-/table-6.8.2.tgz",
-      "integrity": "sha512-w2sfv80nrAh2VCbqR5AK27wswXhqcck2AhfnNW76beQXskGZ1V12GwS//yYVa3d3fcvAip2OUnbDAjW2k3v9fA==",
+      "version": "6.9.0",
+      "resolved": "https://registry.npmjs.org/table/-/table-6.9.0.tgz",
+      "integrity": "sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A==",
       "dev": true,
+      "license": "BSD-3-Clause",
       "dependencies": {
         "ajv": "^8.0.1",
         "lodash.truncate": "^4.4.2",
@@ -11360,6 +12396,7 @@
       "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz",
       "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "fast-deep-equal": "^3.1.3",
         "fast-uri": "^3.0.1",
@@ -11375,19 +12412,22 @@
       "version": "8.0.0",
       "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
       "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/table/node_modules/json-schema-traverse": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
       "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/table/node_modules/string-width": {
       "version": "4.2.3",
       "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
       "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "emoji-regex": "^8.0.0",
         "is-fullwidth-code-point": "^3.0.0",
@@ -11398,10 +12438,11 @@
       }
     },
     "node_modules/terser": {
-      "version": "5.36.0",
-      "resolved": "https://registry.npmjs.org/terser/-/terser-5.36.0.tgz",
-      "integrity": "sha512-IYV9eNMuFAV4THUspIRXkLakHnV6XO7FEdtKjf/mDyrnqUg9LnlOn6/RwRvM9SZjR4GUq8Nk8zj67FzVARr74w==",
+      "version": "5.37.0",
+      "resolved": "https://registry.npmjs.org/terser/-/terser-5.37.0.tgz",
+      "integrity": "sha512-B8wRRkmre4ERucLM/uXx4MOV5cbnOlVAqUst+1+iLKPI0dOgFO28f84ptoQt9HEI537PMzfYa/d+GEPKTRXmYA==",
       "dev": true,
+      "license": "BSD-2-Clause",
       "dependencies": {
         "@jridgewell/source-map": "^0.3.3",
         "acorn": "^8.8.2",
@@ -11419,25 +12460,29 @@
       "version": "2.20.3",
       "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
       "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/text-hex": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz",
       "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/text-table": {
       "version": "0.2.0",
       "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
       "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/through2": {
       "version": "2.0.5",
       "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz",
       "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "readable-stream": "~2.3.6",
         "xtend": "~4.0.1"
@@ -11447,13 +12492,15 @@
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
       "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/through2/node_modules/readable-stream": {
       "version": "2.3.8",
       "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz",
       "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "core-util-is": "~1.0.0",
         "inherits": "~2.0.3",
@@ -11468,13 +12515,15 @@
       "version": "5.1.2",
       "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
       "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/through2/node_modules/string_decoder": {
       "version": "1.1.1",
       "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
       "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "safe-buffer": "~5.1.0"
       }
@@ -11484,6 +12533,7 @@
       "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz",
       "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "os-tmpdir": "~1.0.2"
       },
@@ -11496,6 +12546,7 @@
       "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
       "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "is-number": "^7.0.0"
       },
@@ -11508,6 +12559,7 @@
       "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
       "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=0.6"
       }
@@ -11517,6 +12569,7 @@
       "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.1.tgz",
       "integrity": "sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA==",
       "dev": true,
+      "license": "ISC",
       "bin": {
         "nodetouch": "bin/nodetouch.js"
       }
@@ -11526,6 +12579,7 @@
       "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-4.1.1.tgz",
       "integrity": "sha512-jRKj0n0jXWo6kh62nA5TEh3+4igKDXLvzBJcPpiizP7oOolUrYIxmVBG9TOtHYFHoddUk6YvAkGeGoSVTXfQXQ==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=12"
       },
@@ -11538,6 +12592,7 @@
       "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.4.1.tgz",
       "integrity": "sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">= 14.0.0"
       }
@@ -11547,6 +12602,7 @@
       "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz",
       "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@types/json5": "^0.0.29",
         "json5": "^1.0.2",
@@ -11559,6 +12615,7 @@
       "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz",
       "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "minimist": "^1.2.0"
       },
@@ -11570,13 +12627,15 @@
       "version": "2.8.1",
       "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
       "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
-      "dev": true
+      "dev": true,
+      "license": "0BSD"
     },
     "node_modules/type-check": {
       "version": "0.4.0",
       "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
       "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "prelude-ls": "^1.2.1"
       },
@@ -11589,6 +12648,7 @@
       "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz",
       "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==",
       "dev": true,
+      "license": "(MIT OR CC0-1.0)",
       "engines": {
         "node": ">=10"
       },
@@ -11597,30 +12657,32 @@
       }
     },
     "node_modules/typed-array-buffer": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz",
-      "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==",
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz",
+      "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "call-bind": "^1.0.7",
+        "call-bound": "^1.0.3",
         "es-errors": "^1.3.0",
-        "is-typed-array": "^1.1.13"
+        "is-typed-array": "^1.1.14"
       },
       "engines": {
         "node": ">= 0.4"
       }
     },
     "node_modules/typed-array-byte-length": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz",
-      "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==",
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz",
+      "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "call-bind": "^1.0.7",
+        "call-bind": "^1.0.8",
         "for-each": "^0.3.3",
-        "gopd": "^1.0.1",
-        "has-proto": "^1.0.3",
-        "is-typed-array": "^1.1.13"
+        "gopd": "^1.2.0",
+        "has-proto": "^1.2.0",
+        "is-typed-array": "^1.1.14"
       },
       "engines": {
         "node": ">= 0.4"
@@ -11630,17 +12692,19 @@
       }
     },
     "node_modules/typed-array-byte-offset": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz",
-      "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==",
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz",
+      "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "available-typed-arrays": "^1.0.7",
-        "call-bind": "^1.0.7",
+        "call-bind": "^1.0.8",
         "for-each": "^0.3.3",
-        "gopd": "^1.0.1",
-        "has-proto": "^1.0.3",
-        "is-typed-array": "^1.1.13"
+        "gopd": "^1.2.0",
+        "has-proto": "^1.2.0",
+        "is-typed-array": "^1.1.15",
+        "reflect.getprototypeof": "^1.0.9"
       },
       "engines": {
         "node": ">= 0.4"
@@ -11650,17 +12714,18 @@
       }
     },
     "node_modules/typed-array-length": {
-      "version": "1.0.6",
-      "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz",
-      "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==",
+      "version": "1.0.7",
+      "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz",
+      "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "call-bind": "^1.0.7",
         "for-each": "^0.3.3",
         "gopd": "^1.0.1",
-        "has-proto": "^1.0.3",
         "is-typed-array": "^1.1.13",
-        "possible-typed-array-names": "^1.0.0"
+        "possible-typed-array-names": "^1.0.0",
+        "reflect.getprototypeof": "^1.0.6"
       },
       "engines": {
         "node": ">= 0.4"
@@ -11688,6 +12753,7 @@
           "url": "https://github.com/sponsors/faisalman"
         }
       ],
+      "license": "MIT",
       "bin": {
         "ua-parser-js": "script/cli.js"
       },
@@ -11696,15 +12762,19 @@
       }
     },
     "node_modules/unbox-primitive": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz",
-      "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==",
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz",
+      "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "call-bind": "^1.0.2",
+        "call-bound": "^1.0.3",
         "has-bigints": "^1.0.2",
-        "has-symbols": "^1.0.3",
-        "which-boxed-primitive": "^1.0.2"
+        "has-symbols": "^1.1.0",
+        "which-boxed-primitive": "^1.1.1"
+      },
+      "engines": {
+        "node": ">= 0.4"
       },
       "funding": {
         "url": "https://github.com/sponsors/ljharb"
@@ -11714,19 +12784,22 @@
       "version": "2.0.5",
       "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz",
       "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/undici-types": {
-      "version": "6.19.8",
-      "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz",
-      "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==",
-      "dev": true
+      "version": "6.20.0",
+      "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz",
+      "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==",
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/unicode-canonical-property-names-ecmascript": {
       "version": "2.0.1",
       "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz",
       "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=4"
       }
@@ -11736,6 +12809,7 @@
       "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz",
       "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "unicode-canonical-property-names-ecmascript": "^2.0.0",
         "unicode-property-aliases-ecmascript": "^2.0.0"
@@ -11749,6 +12823,7 @@
       "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.0.tgz",
       "integrity": "sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=4"
       }
@@ -11758,6 +12833,7 @@
       "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz",
       "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=4"
       }
@@ -11767,6 +12843,7 @@
       "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
       "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">= 4.0.0"
       }
@@ -11776,6 +12853,7 @@
       "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
       "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">= 0.8"
       }
@@ -11785,6 +12863,7 @@
       "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz",
       "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=8"
       }
@@ -11808,6 +12887,7 @@
           "url": "https://github.com/sponsors/ai"
         }
       ],
+      "license": "MIT",
       "dependencies": {
         "escalade": "^3.2.0",
         "picocolors": "^1.1.0"
@@ -11824,6 +12904,7 @@
       "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
       "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
       "dev": true,
+      "license": "BSD-2-Clause",
       "dependencies": {
         "punycode": "^2.1.0"
       }
@@ -11832,13 +12913,15 @@
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
       "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/utils-merge": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
       "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">= 0.4.0"
       }
@@ -11848,6 +12931,7 @@
       "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz",
       "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==",
       "dev": true,
+      "license": "Apache-2.0",
       "dependencies": {
         "spdx-correct": "^3.0.0",
         "spdx-expression-parse": "^3.0.0"
@@ -11858,6 +12942,7 @@
       "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz",
       "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "spdx-exceptions": "^2.1.0",
         "spdx-license-ids": "^3.0.0"
@@ -11868,6 +12953,7 @@
       "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
       "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">= 0.8"
       }
@@ -11877,6 +12963,7 @@
       "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.1.tgz",
       "integrity": "sha512-LII3bXRFBZLlezoG5FfZVcXflZgWP/4dCwKtxd5ky9+LOtM4CS3bIRQsmR1KMnMW07jpE8fqR2lcxPZ+8sJIcw==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "clone": "^2.1.1",
         "clone-buffer": "^1.0.0",
@@ -11894,6 +12981,7 @@
       "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
       "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
       "dev": true,
+      "license": "ISC",
       "dependencies": {
         "isexe": "^2.0.0"
       },
@@ -11905,39 +12993,45 @@
       }
     },
     "node_modules/which-boxed-primitive": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz",
-      "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==",
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz",
+      "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "is-bigint": "^1.0.1",
-        "is-boolean-object": "^1.1.0",
-        "is-number-object": "^1.0.4",
-        "is-string": "^1.0.5",
-        "is-symbol": "^1.0.3"
+        "is-bigint": "^1.1.0",
+        "is-boolean-object": "^1.2.1",
+        "is-number-object": "^1.1.1",
+        "is-string": "^1.1.1",
+        "is-symbol": "^1.1.1"
+      },
+      "engines": {
+        "node": ">= 0.4"
       },
       "funding": {
         "url": "https://github.com/sponsors/ljharb"
       }
     },
     "node_modules/which-builtin-type": {
-      "version": "1.1.4",
-      "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.4.tgz",
-      "integrity": "sha512-bppkmBSsHFmIMSl8BO9TbsyzsvGjVoppt8xUiGzwiu/bhDCGxnpOKCxgqj6GuyHE0mINMDecBFPlOm2hzY084w==",
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz",
+      "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
+        "call-bound": "^1.0.2",
         "function.prototype.name": "^1.1.6",
         "has-tostringtag": "^1.0.2",
         "is-async-function": "^2.0.0",
-        "is-date-object": "^1.0.5",
-        "is-finalizationregistry": "^1.0.2",
+        "is-date-object": "^1.1.0",
+        "is-finalizationregistry": "^1.1.0",
         "is-generator-function": "^1.0.10",
-        "is-regex": "^1.1.4",
+        "is-regex": "^1.2.1",
         "is-weakref": "^1.0.2",
         "isarray": "^2.0.5",
-        "which-boxed-primitive": "^1.0.2",
+        "which-boxed-primitive": "^1.1.0",
         "which-collection": "^1.0.2",
-        "which-typed-array": "^1.1.15"
+        "which-typed-array": "^1.1.16"
       },
       "engines": {
         "node": ">= 0.4"
@@ -11950,13 +13044,15 @@
       "version": "2.0.5",
       "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz",
       "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/which-collection": {
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz",
       "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "is-map": "^2.0.3",
         "is-set": "^2.0.3",
@@ -11971,15 +13067,17 @@
       }
     },
     "node_modules/which-typed-array": {
-      "version": "1.1.15",
-      "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz",
-      "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==",
+      "version": "1.1.18",
+      "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.18.tgz",
+      "integrity": "sha512-qEcY+KJYlWyLH9vNbsr6/5j59AXk5ni5aakf8ldzBvGde6Iz4sxZGkJyWSAueTG7QhOvNRYb1lDdFmL5Td0QKA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "available-typed-arrays": "^1.0.7",
-        "call-bind": "^1.0.7",
+        "call-bind": "^1.0.8",
+        "call-bound": "^1.0.3",
         "for-each": "^0.3.3",
-        "gopd": "^1.0.1",
+        "gopd": "^1.2.0",
         "has-tostringtag": "^1.0.2"
       },
       "engines": {
@@ -11990,35 +13088,37 @@
       }
     },
     "node_modules/winston": {
-      "version": "3.16.0",
-      "resolved": "https://registry.npmjs.org/winston/-/winston-3.16.0.tgz",
-      "integrity": "sha512-xz7+cyGN5M+4CmmD4Npq1/4T+UZaz7HaeTlAruFUTjk79CNMq+P6H30vlE4z0qfqJ01VHYQwd7OZo03nYm/+lg==",
+      "version": "3.17.0",
+      "resolved": "https://registry.npmjs.org/winston/-/winston-3.17.0.tgz",
+      "integrity": "sha512-DLiFIXYC5fMPxaRg832S6F5mJYvePtmO5G9v9IgUFPhXm9/GkXarH/TUrBAVzhTCzAj9anE/+GjrgXp/54nOgw==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@colors/colors": "^1.6.0",
         "@dabh/diagnostics": "^2.0.2",
         "async": "^3.2.3",
         "is-stream": "^2.0.0",
-        "logform": "^2.6.0",
+        "logform": "^2.7.0",
         "one-time": "^1.0.0",
         "readable-stream": "^3.4.0",
         "safe-stable-stringify": "^2.3.1",
         "stack-trace": "0.0.x",
         "triple-beam": "^1.3.0",
-        "winston-transport": "^4.7.0"
+        "winston-transport": "^4.9.0"
       },
       "engines": {
         "node": ">= 12.0.0"
       }
     },
     "node_modules/winston-transport": {
-      "version": "4.8.0",
-      "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.8.0.tgz",
-      "integrity": "sha512-qxSTKswC6llEMZKgCQdaWgDuMJQnhuvF5f2Nk3SNXc4byfQ+voo2mX1Px9dkNOuR8p0KAjfPG29PuYUSIb+vSA==",
+      "version": "4.9.0",
+      "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.9.0.tgz",
+      "integrity": "sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "logform": "^2.6.1",
-        "readable-stream": "^4.5.2",
+        "logform": "^2.7.0",
+        "readable-stream": "^3.6.2",
         "triple-beam": "^1.3.0"
       },
       "engines": {
@@ -12026,19 +13126,18 @@
       }
     },
     "node_modules/winston-transport/node_modules/readable-stream": {
-      "version": "4.5.2",
-      "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz",
-      "integrity": "sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==",
+      "version": "3.6.2",
+      "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
+      "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "abort-controller": "^3.0.0",
-        "buffer": "^6.0.3",
-        "events": "^3.3.0",
-        "process": "^0.11.10",
-        "string_decoder": "^1.3.0"
+        "inherits": "^2.0.3",
+        "string_decoder": "^1.1.1",
+        "util-deprecate": "^1.0.1"
       },
       "engines": {
-        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+        "node": ">= 6"
       }
     },
     "node_modules/winston-transport/node_modules/string_decoder": {
@@ -12046,6 +13145,7 @@
       "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
       "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "safe-buffer": "~5.2.0"
       }
@@ -12054,13 +13154,15 @@
       "version": "3.2.6",
       "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz",
       "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/winston/node_modules/readable-stream": {
       "version": "3.6.2",
       "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
       "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "inherits": "^2.0.3",
         "string_decoder": "^1.1.1",
@@ -12075,6 +13177,7 @@
       "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
       "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "safe-buffer": "~5.2.0"
       }
@@ -12084,6 +13187,7 @@
       "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz",
       "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=0.10.0"
       }
@@ -12093,6 +13197,7 @@
       "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz",
       "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "ansi-styles": "^6.1.0",
         "string-width": "^5.0.1",
@@ -12111,6 +13216,7 @@
       "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
       "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "ansi-styles": "^4.0.0",
         "string-width": "^4.1.0",
@@ -12127,13 +13233,15 @@
       "version": "8.0.0",
       "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
       "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/wrap-ansi-cjs/node_modules/string-width": {
       "version": "4.2.3",
       "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
       "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "emoji-regex": "^8.0.0",
         "is-fullwidth-code-point": "^3.0.0",
@@ -12148,6 +13256,7 @@
       "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz",
       "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=12"
       },
@@ -12160,6 +13269,7 @@
       "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz",
       "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=12"
       },
@@ -12172,6 +13282,7 @@
       "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
       "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "ansi-regex": "^6.0.1"
       },
@@ -12186,13 +13297,15 @@
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
       "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
-      "dev": true
+      "dev": true,
+      "license": "ISC"
     },
     "node_modules/write-file-atomic": {
       "version": "5.0.1",
       "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.1.tgz",
       "integrity": "sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==",
       "dev": true,
+      "license": "ISC",
       "dependencies": {
         "imurmurhash": "^0.1.4",
         "signal-exit": "^4.0.1"
@@ -12206,6 +13319,7 @@
       "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz",
       "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=10.0.0"
       },
@@ -12236,6 +13350,7 @@
       "resolved": "https://registry.npmjs.org/xpath/-/xpath-0.0.32.tgz",
       "integrity": "sha512-rxMJhSIoiO8vXcWvSifKqhvV96GjiD5wYb8/QHdoRyQvraTpp4IEv944nhGausZZ3u7dhQXteZuZbaqfpB7uYw==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=0.6.0"
       }
@@ -12245,6 +13360,7 @@
       "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
       "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=0.4"
       }
@@ -12254,6 +13370,7 @@
       "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
       "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
       "dev": true,
+      "license": "ISC",
       "engines": {
         "node": ">=10"
       }
@@ -12262,13 +13379,15 @@
       "version": "3.1.1",
       "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
       "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
-      "dev": true
+      "dev": true,
+      "license": "ISC"
     },
     "node_modules/yaml": {
       "version": "1.10.2",
       "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz",
       "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==",
       "dev": true,
+      "license": "ISC",
       "engines": {
         "node": ">= 6"
       }
@@ -12278,6 +13397,7 @@
       "resolved": "https://registry.npmjs.org/yaml-eslint-parser/-/yaml-eslint-parser-1.2.3.tgz",
       "integrity": "sha512-4wZWvE398hCP7O8n3nXKu/vdq1HcH01ixYlCREaJL5NUMwQ0g3MaGFUBNSlmBtKmhbtVG/Cm6lyYmSVTEVil8A==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "eslint-visitor-keys": "^3.0.0",
         "lodash": "^4.17.21",
@@ -12295,6 +13415,7 @@
       "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
       "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==",
       "dev": true,
+      "license": "Apache-2.0",
       "engines": {
         "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
       },
@@ -12303,10 +13424,11 @@
       }
     },
     "node_modules/yaml-eslint-parser/node_modules/yaml": {
-      "version": "2.6.0",
-      "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.6.0.tgz",
-      "integrity": "sha512-a6ae//JvKDEra2kdi1qzCyrJW/WZCgFi8ydDV+eXExl95t+5R+ijnqHJbz9tmMh8FUjx3iv2fCQ4dclAQlO2UQ==",
+      "version": "2.6.1",
+      "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.6.1.tgz",
+      "integrity": "sha512-7r0XPzioN/Q9kXBro/XPnA6kznR73DHq+GXh5ON7ZozRO6aMjbmiBuKste2wslTFkC5d1dw0GooOCepZXJ2SAg==",
       "dev": true,
+      "license": "ISC",
       "bin": {
         "yaml": "bin.mjs"
       },
@@ -12319,6 +13441,7 @@
       "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz",
       "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "cliui": "^8.0.1",
         "escalade": "^3.1.1",
@@ -12337,6 +13460,7 @@
       "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz",
       "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==",
       "dev": true,
+      "license": "ISC",
       "engines": {
         "node": ">=10"
       }
@@ -12345,13 +13469,15 @@
       "version": "8.0.0",
       "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
       "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/yargs/node_modules/string-width": {
       "version": "4.2.3",
       "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
       "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "emoji-regex": "^8.0.0",
         "is-fullwidth-code-point": "^3.0.0",
@@ -12366,6 +13492,7 @@
       "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz",
       "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==",
       "dev": true,
+      "license": "ISC",
       "engines": {
         "node": ">=12"
       }
@@ -12375,6 +13502,7 @@
       "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
       "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=10"
       },
-- 
GitLab


From 95872d1e0d2a3aa849b348effe6bcf78ce2814e3 Mon Sep 17 00:00:00 2001
From: Zoltan Horvath <zoltan.horvath@ext.ec.europa.eu>
Date: Fri, 20 Dec 2024 12:11:48 +0100
Subject: [PATCH 083/137] ISAICP-9310: Make npm build:scripts work again

---
 web/themes/iop/src/js/glide.js             | 6 ++++--
 web/themes/ventuno/src/js/carousel.js      | 6 ++++--
 web/themes/ventuno/src/js/explore-block.js | 6 ++++--
 3 files changed, 12 insertions(+), 6 deletions(-)

diff --git a/web/themes/iop/src/js/glide.js b/web/themes/iop/src/js/glide.js
index 047803008c..10d0099164 100644
--- a/web/themes/iop/src/js/glide.js
+++ b/web/themes/iop/src/js/glide.js
@@ -7,8 +7,10 @@ import Glide, {
   Controls,
   Keyboard,
   Swipe,
-  // eslint-disable-next-line import/no-unresolved
-} from "@glidejs/glide/dist/glide.modular.esm";
+  // It is impossible to build this script with BLC-builder without the file
+  // extension since Glide 3.7.0+
+  // eslint-disable-next-line import/extensions
+} from "@glidejs/glide/dist/glide.modular.esm.js";
 
 (() => {
   Drupal.behaviors.iopGlide = {
diff --git a/web/themes/ventuno/src/js/carousel.js b/web/themes/ventuno/src/js/carousel.js
index 882c89b020..fb04230805 100644
--- a/web/themes/ventuno/src/js/carousel.js
+++ b/web/themes/ventuno/src/js/carousel.js
@@ -6,8 +6,10 @@ import Glide, {
   Controls,
   Breakpoints,
   Swipe,
-  // eslint-disable-next-line import/no-unresolved
-} from "@glidejs/glide/dist/glide.modular.esm";
+  // It is impossible to build this script with BLC-builder without the file
+  // extension since Glide 3.7.0+
+  // eslint-disable-next-line import/extensions
+} from "@glidejs/glide/dist/glide.modular.esm.js";
 import ControlsDisabler from "./helpers/glide.controlsDisabler.esm";
 
 ((Drupal, once) => {
diff --git a/web/themes/ventuno/src/js/explore-block.js b/web/themes/ventuno/src/js/explore-block.js
index 9db3fe1870..f2ad84a80c 100644
--- a/web/themes/ventuno/src/js/explore-block.js
+++ b/web/themes/ventuno/src/js/explore-block.js
@@ -6,8 +6,10 @@ import Glide, {
   Controls,
   Breakpoints,
   Swipe,
-  // eslint-disable-next-line import/no-unresolved
-} from "@glidejs/glide/dist/glide.modular.esm";
+  // It is impossible to build this script with BLC-builder without the file
+  // extension since Glide 3.7.0+
+  // eslint-disable-next-line import/extensions
+} from "@glidejs/glide/dist/glide.modular.esm.js";
 import ControlsDisabler from "./helpers/glide.controlsDisabler.esm";
 
 (() => {
-- 
GitLab


From a00e68db327594f5f6e0ade3e5858bbb54fc2ffa Mon Sep 17 00:00:00 2001
From: Zoltan Horvath <zoltan.horvath@ext.ec.europa.eu>
Date: Fri, 20 Dec 2024 12:14:33 +0100
Subject: [PATCH 084/137] ISAICP-9310: Rebuild the node.js managed part of the
 project

---
 web/themes/iop/assets/js/glide.min.js             | 2 +-
 web/themes/ventuno/assets/js/carousel.min.js      | 2 +-
 web/themes/ventuno/assets/js/explore-block.min.js | 2 +-
 3 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/web/themes/iop/assets/js/glide.min.js b/web/themes/iop/assets/js/glide.min.js
index b680c58556..d425daae86 100644
--- a/web/themes/iop/assets/js/glide.min.js
+++ b/web/themes/iop/assets/js/glide.min.js
@@ -1,6 +1,6 @@
 !function(t){"function"==typeof define&&define.amd?define(t):t()}((function(){"use strict";
 /*!
-   * Glide.js v3.6.2
+   * Glide.js v3.7.1
    * (c) 2013-2024 Jędrzej Chałubek (https://github.com/jedrzejchalubek/)
    * Released under the MIT License.
    */function t(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(t);e&&(i=i.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),n.push.apply(n,i)}return n}function e(e){for(var n=1;n<arguments.length;n++){var i=null!=arguments[n]?arguments[n]:{};n%2?t(Object(i),!0).forEach((function(t){s(e,t,i[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(i)):t(Object(i)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(i,t))}))}return e}function n(t){return n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},n(t)}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function r(t,e){for(var n=0;n<e.length;n++){var i=e[n];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(t,i.key,i)}}function o(t,e,n){return e&&r(t.prototype,e),n&&r(t,n),t}function s(t,e,n){return e in t?Object.defineProperty(t,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[e]=n,t}function u(t){return u=Object.setPrototypeOf?Object.getPrototypeOf:function(t){return t.__proto__||Object.getPrototypeOf(t)},u(t)}function a(t,e){return a=Object.setPrototypeOf||function(t,e){return t.__proto__=e,t},a(t,e)}function c(t,e){if(e&&("object"==typeof e||"function"==typeof e))return e;if(void 0!==e)throw new TypeError("Derived constructors may only return object or undefined");return function(t){if(void 0===t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return t}(t)}function l(t){var e=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(t){return!1}}();return function(){var n,i=u(t);if(e){var r=u(this).constructor;n=Reflect.construct(i,arguments,r)}else n=i.apply(this,arguments);return c(this,n)}}function f(){return f="undefined"!=typeof Reflect&&Reflect.get?Reflect.get:function(t,e,n){var i=function(t,e){for(;!Object.prototype.hasOwnProperty.call(t,e)&&null!==(t=u(t)););return t}(t,e);if(i){var r=Object.getOwnPropertyDescriptor(i,e);return r.get?r.get.call(arguments.length<3?t:n):r.value}},f.apply(this,arguments)}var d={type:"slider",startAt:0,perView:1,focusAt:0,gap:10,autoplay:!1,hoverpause:!0,keyboard:!0,bound:!1,swipeThreshold:80,dragThreshold:120,perSwipe:"",touchRatio:.5,touchAngle:45,animationDuration:400,rewind:!0,rewindDuration:800,animationTimingFunc:"cubic-bezier(.165, .840, .440, 1)",waitForTransition:!0,throttle:10,direction:"ltr",peek:0,cloningRatio:1,breakpoints:{},classes:{swipeable:"glide--swipeable",dragging:"glide--dragging",direction:{ltr:"glide--ltr",rtl:"glide--rtl"},type:{slider:"glide--slider",carousel:"glide--carousel"},slide:{clone:"glide__slide--clone",active:"glide__slide--active"},arrow:{disabled:"glide__arrow--disabled"},nav:{active:"glide__bullet--active"}}};function h(t){console.error("[Glide warn]: ".concat(t))}function v(t){return parseInt(t)}function p(t){return"string"==typeof t}function m(t){var e=n(t);return"function"===e||"object"===e&&!!t}function g(t){return"function"==typeof t}function y(t){return t.constructor===Array}function b(t,e,n){Object.defineProperty(t,e,n)}function w(t,n){var i=Object.assign({},t,n);if(n.hasOwnProperty("classes")){i.classes=Object.assign({},t.classes,n.classes);["direction","type","slide","arrow","nav"].forEach((function(r){n.classes.hasOwnProperty(r)&&(i.classes[r]=e(e({},t.classes[r]),n.classes[r]))}))}return n.hasOwnProperty("breakpoints")&&(i.breakpoints=Object.assign({},t.breakpoints,n.breakpoints)),i}var _=function(){function t(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};i(this,t),this.events=e,this.hop=e.hasOwnProperty}return o(t,[{key:"on",value:function(t,e){if(!y(t)){this.hop.call(this.events,t)||(this.events[t]=[]);var n=this.events[t].push(e)-1;return{remove:function(){delete this.events[t][n]}}}for(var i=0;i<t.length;i++)this.on(t[i],e)}},{key:"emit",value:function(t,e){if(y(t))for(var n=0;n<t.length;n++)this.emit(t[n],e);else this.hop.call(this.events,t)&&this.events[t].forEach((function(t){t(e||{})}))}}]),t}(),k=function(){function t(e){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};i(this,t),this._c={},this._t=[],this._e=new _,this.disabled=!1,this.selector=e,this.settings=w(d,n),this.index=this.settings.startAt}return o(t,[{key:"mount",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return this._e.emit("mount.before"),m(t)?this._c=function(t,e,n){var i={};for(var r in e)g(e[r])?i[r]=e[r](t,i,n):h("Extension must be a function");for(var o in i)g(i[o].mount)&&i[o].mount();return i}(this,t,this._e):h("You need to provide a object on `mount()`"),this._e.emit("mount.after"),this}},{key:"mutate",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];return y(t)?this._t=t:h("You need to provide a array on `mutate()`"),this}},{key:"update",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return this.settings=w(this.settings,t),t.hasOwnProperty("startAt")&&(this.index=t.startAt),this._e.emit("update"),this}},{key:"go",value:function(t){return this._c.Run.make(t),this}},{key:"move",value:function(t){return this._c.Transition.disable(),this._c.Move.make(t),this}},{key:"destroy",value:function(){return this._e.emit("destroy"),this}},{key:"play",value:function(){var t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];return t&&(this.settings.autoplay=t),this._e.emit("play"),this}},{key:"pause",value:function(){return this._e.emit("pause"),this}},{key:"disable",value:function(){return this.disabled=!0,this}},{key:"enable",value:function(){return this.disabled=!1,this}},{key:"on",value:function(t,e){return this._e.on(t,e),this}},{key:"isType",value:function(t){return this.settings.type===t}},{key:"settings",get:function(){return this._o},set:function(t){m(t)?this._o=t:h("Options must be an `object` instance.")}},{key:"index",get:function(){return this._i},set:function(t){this._i=v(t)}},{key:"type",get:function(){return this.settings.type}},{key:"disabled",get:function(){return this._d},set:function(t){this._d=!!t}}]),t}();function S(){return(new Date).getTime()}function O(t,e){var n,i,r,o,s=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},u=0,a=function(){u=!1===s.leading?0:S(),n=null,o=t.apply(i,r),n||(i=r=null)},c=function(){var c=S();u||!1!==s.leading||(u=c);var l=e-(c-u);return i=this,r=arguments,l<=0||l>e?(n&&(clearTimeout(n),n=null),u=c,o=t.apply(i,r),n||(i=r=null)):n||!1===s.trailing||(n=setTimeout(a,l)),o};return c.cancel=function(){clearTimeout(n),u=0,n=i=r=null},c}var T={ltr:["marginLeft","marginRight"],rtl:["marginRight","marginLeft"]};function x(t){if(t&&t.parentNode){for(var e=t.parentNode.firstChild,n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n}return[]}function H(t){return Array.prototype.slice.call(t)}var j=function(){function t(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};i(this,t),this.listeners=e}return o(t,[{key:"on",value:function(t,e,n){var i=arguments.length>3&&void 0!==arguments[3]&&arguments[3];p(t)&&(t=[t]);for(var r=0;r<t.length;r++)this.listeners[t[r]]=n,e.addEventListener(t[r],this.listeners[t[r]],i)}},{key:"off",value:function(t,e){var n=arguments.length>2&&void 0!==arguments[2]&&arguments[2];p(t)&&(t=[t]);for(var i=0;i<t.length;i++)e.removeEventListener(t[i],this.listeners[t[i]],n)}},{key:"destroy",value:function(){delete this.listeners}}]),t}();var A=["ltr","rtl"],P={">":"<","<":">","=":"="};function R(t,e){return{modify:function(t){return e.Direction.is("rtl")?-t:t}}}function E(t,e){return{modify:function(t){var n=Math.floor(t/e.Sizes.slideWidth);return t+e.Gaps.value*n}}}function L(t,e){return{modify:function(t){return t+e.Clones.grow/2}}}function z(t,e){return{modify:function(n){if(t.settings.focusAt>=0){var i=e.Peek.value;return m(i)?n-i.before:n-i}return n}}}function C(t,e){return{modify:function(n){var i=e.Gaps.value,r=e.Sizes.width,o=t.settings.focusAt,s=e.Sizes.slideWidth;return"center"===o?n-(r/2-s/2):n-s*o-i*o}}}var M=!1;try{var D=Object.defineProperty({},"passive",{get:function(){M=!0}});window.addEventListener("testPassive",null,D),window.removeEventListener("testPassive",null,D)}catch(t){}var B=M,W=["touchstart","mousedown"],V=["touchmove","mousemove"],q=["touchend","touchcancel","mouseup","mouseleave"],G=["mousedown","mousemove","mouseup","mouseleave"];function F(t,e,n){var i=new j,r=0,o=0,s=0,u=!1,a=!!B&&{passive:!0},c={mount:function(){this.bindSwipeStart()},start:function(e){if(!u&&!t.disabled){this.disable();var i=this.touches(e);r=null,o=v(i.pageX),s=v(i.pageY),this.bindSwipeMove(),this.bindSwipeEnd(),n.emit("swipe.start")}},move:function(i){if(!t.disabled){var u=t.settings,a=u.touchAngle,c=u.touchRatio,l=u.classes,f=this.touches(i),d=v(f.pageX)-o,h=v(f.pageY)-s,p=Math.abs(d<<2),m=Math.abs(h<<2),g=Math.sqrt(p+m),y=Math.sqrt(m);if(!(180*(r=Math.asin(y/g))/Math.PI<a))return!1;i.stopPropagation(),e.Move.make(d*parseFloat(c)),e.Html.root.classList.add(l.dragging),n.emit("swipe.move")}},end:function(i){if(!t.disabled){var s=t.settings,u=s.perSwipe,a=s.touchAngle,c=s.classes,l=this.touches(i),f=this.threshold(i),d=l.pageX-o,h=180*r/Math.PI;this.enable(),d>f&&h<a?e.Run.make(e.Direction.resolve("".concat(u,"<"))):d<-f&&h<a?e.Run.make(e.Direction.resolve("".concat(u,">"))):e.Move.make(),e.Html.root.classList.remove(c.dragging),this.unbindSwipeMove(),this.unbindSwipeEnd(),n.emit("swipe.end")}},bindSwipeStart:function(){var n=this,r=t.settings,o=r.swipeThreshold,s=r.dragThreshold;o&&i.on(W[0],e.Html.wrapper,(function(t){n.start(t)}),a),s&&i.on(W[1],e.Html.wrapper,(function(t){n.start(t)}),a)},unbindSwipeStart:function(){i.off(W[0],e.Html.wrapper,a),i.off(W[1],e.Html.wrapper,a)},bindSwipeMove:function(){var n=this;i.on(V,e.Html.wrapper,O((function(t){n.move(t)}),t.settings.throttle),a)},unbindSwipeMove:function(){i.off(V,e.Html.wrapper,a)},bindSwipeEnd:function(){var t=this;i.on(q,e.Html.wrapper,(function(e){t.end(e)}))},unbindSwipeEnd:function(){i.off(q,e.Html.wrapper)},touches:function(t){return G.indexOf(t.type)>-1?t:t.touches[0]||t.changedTouches[0]},threshold:function(e){var n=t.settings;return G.indexOf(e.type)>-1?n.dragThreshold:n.swipeThreshold},enable:function(){return u=!1,e.Transition.enable(),this},disable:function(){return u=!0,e.Transition.disable(),this}};return n.on("build.after",(function(){e.Html.root.classList.add(t.settings.classes.swipeable)})),n.on("destroy",(function(){c.unbindSwipeStart(),c.unbindSwipeMove(),c.unbindSwipeEnd(),i.destroy()})),c}var I='[data-glide-el^="controls"]',N="".concat(I,' [data-glide-dir*="<"]'),Y="".concat(I,' [data-glide-dir*=">"]');function X(t,e,n){var i=new j,r=!!B&&{passive:!0},o={mount:function(){this._n=e.Html.root.querySelectorAll('[data-glide-el="controls[nav]"]'),this._c=e.Html.root.querySelectorAll(I),this._arrowControls={previous:e.Html.root.querySelectorAll(N),next:e.Html.root.querySelectorAll(Y)},this.addBindings()},setActive:function(){for(var t=0;t<this._n.length;t++)this.addClass(this._n[t].children)},removeActive:function(){for(var t=0;t<this._n.length;t++)this.removeClass(this._n[t].children)},addClass:function(e){var n=t.settings,i=e[t.index];i&&(i.classList.add(n.classes.nav.active),x(i).forEach((function(t){t.classList.remove(n.classes.nav.active)})))},removeClass:function(e){var n=e[t.index];null==n||n.classList.remove(t.settings.classes.nav.active)},setArrowState:function(){if(!t.settings.rewind){var n=o._arrowControls.next,i=o._arrowControls.previous;this.resetArrowState(n,i),0===t.index&&this.disableArrow(i),t.index===e.Run.length&&this.disableArrow(n)}},resetArrowState:function(){for(var e=t.settings,n=arguments.length,i=new Array(n),r=0;r<n;r++)i[r]=arguments[r];i.forEach((function(t){H(t).forEach((function(t){t.classList.remove(e.classes.arrow.disabled)}))}))},disableArrow:function(){for(var e=t.settings,n=arguments.length,i=new Array(n),r=0;r<n;r++)i[r]=arguments[r];i.forEach((function(t){H(t).forEach((function(t){t.classList.add(e.classes.arrow.disabled)}))}))},addBindings:function(){for(var t=0;t<this._c.length;t++)this.bind(this._c[t].children)},removeBindings:function(){for(var t=0;t<this._c.length;t++)this.unbind(this._c[t].children)},bind:function(t){for(var e=0;e<t.length;e++)i.on("click",t[e],this.click),i.on("touchstart",t[e],this.click,r)},unbind:function(t){for(var e=0;e<t.length;e++)i.off(["click","touchstart"],t[e])},click:function(t){B||"touchstart"!==t.type||t.preventDefault();var n=t.currentTarget.getAttribute("data-glide-dir");e.Run.make(e.Direction.resolve(n))}};return b(o,"items",{get:function(){return o._c}}),n.on(["mount.after","move.after"],(function(){o.setActive()})),n.on(["mount.after","run"],(function(){o.setArrowState()})),n.on("destroy",(function(){o.removeBindings(),o.removeActive(),i.destroy()})),o}function K(t,e,n){var i=new j,r={mount:function(){t.settings.keyboard&&this.bind()},bind:function(){i.on("keyup",document,this.press)},unbind:function(){i.off("keyup",document)},press:function(n){var i=t.settings.perSwipe;["ArrowRight","ArrowLeft"].includes(n.code)&&e.Run.make(e.Direction.resolve("".concat(i).concat({ArrowRight:">",ArrowLeft:"<"}[n.code])))}};return n.on(["destroy","update"],(function(){r.unbind()})),n.on("update",(function(){r.mount()})),n.on("destroy",(function(){i.destroy()})),r}function J(t){return m(t)?(e=t,Object.keys(e).sort().reduce((function(t,n){return t[n]=e[n],t[n],t}),{})):(h("Breakpoints option must be an object"),{});var e}function Q(t,e,n){var i=new j,r=t.settings,o=J(r.breakpoints),s=Object.assign({},r),u={match:function(t){if(void 0!==window.matchMedia)for(var e in t)if(t.hasOwnProperty(e)&&window.matchMedia("(max-width: ".concat(e,"px)")).matches)return t[e];return s}};return Object.assign(r,u.match(o)),i.on("resize",window,O((function(){t.settings=w(r,u.match(o))}),t.settings.throttle)),n.on("update",(function(){o=J(o),s=Object.assign({},r)})),n.on("destroy",(function(){i.off("resize",window)})),u}var U={Html:function(t,e,n){var i={mount:function(){this.root=t.selector,this.track=this.root.querySelector('[data-glide-el="track"]'),this.collectSlides()},collectSlides:function(){this.slides=H(this.wrapper.children).filter((function(e){return!e.classList.contains(t.settings.classes.slide.clone)}))}};return b(i,"root",{get:function(){return i._r},set:function(t){p(t)&&(t=document.querySelector(t)),null!==t?i._r=t:h("Root element must be a existing Html node")}}),b(i,"track",{get:function(){return i._t},set:function(t){i._t=t}}),b(i,"wrapper",{get:function(){return i.track.children[0]}}),n.on("update",(function(){i.collectSlides()})),i},Translate:function(t,e,n){var i={set:function(n){var i=function(t,e,n){var i=[E,L,z,C].concat(t._t,[R]);return{mutate:function(r){for(var o=0;o<i.length;o++){var s=i[o];g(s)&&g(s().modify)?r=s(t,e,n).modify(r):h("Transformer should be a function that returns an object with `modify()` method")}return r}}}(t,e).mutate(n),r="translate3d(".concat(-1*i,"px, 0px, 0px)");e.Html.wrapper.style.mozTransform=r,e.Html.wrapper.style.webkitTransform=r,e.Html.wrapper.style.transform=r},remove:function(){e.Html.wrapper.style.transform=""},getStartIndex:function(){var n=e.Sizes.length,i=t.index,r=t.settings.perView;return e.Run.isOffset(">")||e.Run.isOffset("|>")?n+(i-r):(i+r)%n},getTravelDistance:function(){var n=e.Sizes.slideWidth*t.settings.perView;return e.Run.isOffset(">")||e.Run.isOffset("|>")?-1*n:n}};return n.on("move",(function(r){if(!t.isType("carousel")||!e.Run.isOffset())return i.set(r.movement);e.Transition.after((function(){n.emit("translate.jump"),i.set(e.Sizes.slideWidth*t.index)}));var o=e.Sizes.slideWidth*e.Translate.getStartIndex();return i.set(o-e.Translate.getTravelDistance())})),n.on("destroy",(function(){i.remove()})),i},Transition:function(t,e,n){var i=!1,r={compose:function(e){var n=t.settings;return i?"".concat(e," 0ms ").concat(n.animationTimingFunc):"".concat(e," ").concat(this.duration,"ms ").concat(n.animationTimingFunc)},set:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"transform";e.Html.wrapper.style.transition=this.compose(t)},remove:function(){e.Html.wrapper.style.transition=""},after:function(t){setTimeout((function(){t()}),this.duration)},enable:function(){i=!1,this.set()},disable:function(){i=!0,this.set()}};return b(r,"duration",{get:function(){var n=t.settings;return t.isType("slider")&&e.Run.offset?n.rewindDuration:n.animationDuration}}),n.on("move",(function(){r.set()})),n.on(["build.before","resize","translate.jump"],(function(){r.disable()})),n.on("run",(function(){r.enable()})),n.on("destroy",(function(){r.remove()})),r},Direction:function(t,e,n){var i={mount:function(){this.value=t.settings.direction},resolve:function(t){var e=t.slice(0,1);return this.is("rtl")?t.split(e).join(P[e]):t},is:function(t){return this.value===t},addClass:function(){e.Html.root.classList.add(t.settings.classes.direction[this.value])},removeClass:function(){e.Html.root.classList.remove(t.settings.classes.direction[this.value])}};return b(i,"value",{get:function(){return i._v},set:function(t){A.indexOf(t)>-1?i._v=t:h("Direction value must be `ltr` or `rtl`")}}),n.on(["destroy","update"],(function(){i.removeClass()})),n.on("update",(function(){i.mount()})),n.on(["build.before","update"],(function(){i.addClass()})),i},Peek:function(t,e,n){var i={mount:function(){this.value=t.settings.peek}};return b(i,"value",{get:function(){return i._v},set:function(t){m(t)?(t.before=v(t.before),t.after=v(t.after)):t=v(t),i._v=t}}),b(i,"reductor",{get:function(){var e=i.value,n=t.settings.perView;return m(e)?e.before/n+e.after/n:2*e/n}}),n.on(["resize","update"],(function(){i.mount()})),i},Sizes:function(t,e,n){var i={setupSlides:function(){for(var t="".concat(this.slideWidth,"px"),n=e.Html.slides,i=0;i<n.length;i++)n[i].style.width=t},setupWrapper:function(){e.Html.wrapper.style.width="".concat(this.wrapperSize,"px")},remove:function(){for(var t=e.Html.slides,n=0;n<t.length;n++)t[n].style.width="";e.Html.wrapper.style.width=""}};return b(i,"length",{get:function(){return e.Html.slides.length}}),b(i,"width",{get:function(){return e.Html.track.offsetWidth}}),b(i,"wrapperSize",{get:function(){return i.slideWidth*i.length+e.Gaps.grow+e.Clones.grow}}),b(i,"slideWidth",{get:function(){return i.width/t.settings.perView-e.Peek.reductor-e.Gaps.reductor}}),n.on(["build.before","resize","update"],(function(){i.setupSlides(),i.setupWrapper()})),n.on("destroy",(function(){i.remove()})),i},Gaps:function(t,e,n){var i={apply:function(t){for(var n=0,i=t.length;n<i;n++){var r=t[n].style,o=e.Direction.value;r[T[o][0]]=0!==n?"".concat(this.value/2,"px"):"",n!==t.length-1?r[T[o][1]]="".concat(this.value/2,"px"):r[T[o][1]]=""}},remove:function(t){for(var e=0,n=t.length;e<n;e++){var i=t[e].style;i.marginLeft="",i.marginRight=""}}};return b(i,"value",{get:function(){return v(t.settings.gap)}}),b(i,"grow",{get:function(){return i.value*e.Sizes.length}}),b(i,"reductor",{get:function(){var e=t.settings.perView;return i.value*(e-1)/e}}),n.on(["build.after","update"],O((function(){i.apply(e.Html.wrapper.children)}),30)),n.on("destroy",(function(){i.remove(e.Html.wrapper.children)})),i},Move:function(t,e,n){var i={mount:function(){this._o=0},make:function(){var t=this,i=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0;this.offset=i,n.emit("move",{movement:this.value}),e.Transition.after((function(){n.emit("move.after",{movement:t.value})}))}};return b(i,"offset",{get:function(){return i._o},set:function(t){i._o=function(t){return void 0===t}(t)?0:v(t)}}),b(i,"translate",{get:function(){return e.Sizes.slideWidth*t.index}}),b(i,"value",{get:function(){var t=this.offset,n=this.translate;return e.Direction.is("rtl")?n+t:n-t}}),n.on(["build.before","run"],(function(){i.make()})),i},Clones:function(t,e,n){var i={mount:function(){this.items=[],t.isType("carousel")&&(this.items=this.collect())},collect:function(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],i=e.Html.slides,r=t.settings,o=r.perView,s=r.classes,u=r.cloningRatio;if(i.length>0)for(var a=o+ +!!t.settings.peek+Math.round(o/2),c=i.slice(0,a).reverse(),l=i.slice(-1*a),f=0;f<Math.max(u,Math.floor(o/i.length));f++){for(var d=0;d<c.length;d++){var h=c[d].cloneNode(!0);h.classList.add(s.slide.clone),n.push(h)}for(var v=0;v<l.length;v++){var p=l[v].cloneNode(!0);p.classList.add(s.slide.clone),n.unshift(p)}}return n},append:function(){for(var t=this.items,n=e.Html,i=n.wrapper,r=n.slides,o=Math.floor(t.length/2),s=t.slice(0,o).reverse(),u=t.slice(-1*o).reverse(),a="".concat(e.Sizes.slideWidth,"px"),c=0;c<u.length;c++)i.appendChild(u[c]);for(var l=0;l<s.length;l++)i.insertBefore(s[l],r[0]);for(var f=0;f<t.length;f++)t[f].style.width=a},remove:function(){for(var t=this.items,n=0;n<t.length;n++)e.Html.wrapper.removeChild(t[n])}};return b(i,"grow",{get:function(){return(e.Sizes.slideWidth+e.Gaps.value)*i.items.length}}),n.on("update",(function(){i.remove(),i.mount(),i.append()})),n.on("build.before",(function(){t.isType("carousel")&&i.append()})),n.on("destroy",(function(){i.remove()})),i},Resize:function(t,e,n){var i=new j,r={mount:function(){this.bind()},bind:function(){i.on("resize",window,O((function(){n.emit("resize")}),t.settings.throttle))},unbind:function(){i.off("resize",window)}};return n.on("destroy",(function(){r.unbind(),i.destroy()})),r},Build:function(t,e,n){var i={mount:function(){n.emit("build.before"),this.typeClass(),this.activeClass(),n.emit("build.after")},typeClass:function(){e.Html.root.classList.add(t.settings.classes.type[t.settings.type])},activeClass:function(){var n=t.settings.classes,i=e.Html.slides[t.index];i&&(i.classList.add(n.slide.active),x(i).forEach((function(t){t.classList.remove(n.slide.active)})))},removeClasses:function(){var n=t.settings.classes,i=n.type,r=n.slide;e.Html.root.classList.remove(i[t.settings.type]),e.Html.slides.forEach((function(t){t.classList.remove(r.active)}))}};return n.on(["destroy","update"],(function(){i.removeClasses()})),n.on(["resize","update"],(function(){i.mount()})),n.on("move.after",(function(){i.activeClass()})),i},Run:function(t,e,n){var i={mount:function(){this._o=!1},make:function(i){var r=this;t.disabled||(!t.settings.waitForTransition||t.disable(),this.move=i,n.emit("run.before",this.move),this.calculate(),n.emit("run",this.move),e.Transition.after((function(){r.isStart()&&n.emit("run.start",r.move),r.isEnd()&&n.emit("run.end",r.move),r.isOffset()&&(r._o=!1,n.emit("run.offset",r.move)),n.emit("run.after",r.move),t.enable()})))},calculate:function(){var e=this.move,n=this.length,r=e.steps,o=e.direction,s=1;if("="===o)return t.settings.bound&&v(r)>n?void(t.index=n):void(t.index=r);if(">"!==o||">"!==r)if("<"!==o||"<"!==r){if("|"===o&&(s=t.settings.perView||1),">"===o||"|"===o&&">"===r){var u=function(e){var n=t.index;if(t.isType("carousel"))return n+e;return n+(e-n%e)}(s);return u>n&&(this._o=!0),void(t.index=function(e,n){var r=i.length;if(e<=r)return e;if(t.isType("carousel"))return e-(r+1);if(t.settings.rewind)return i.isBound()&&!i.isEnd()?r:0;if(i.isBound())return r;return Math.floor(r/n)*n}(u,s))}if("<"===o||"|"===o&&"<"===r){var a=function(e){var n=t.index;if(t.isType("carousel"))return n-e;var i=Math.ceil(n/e);return(i-1)*e}(s);return a<0&&(this._o=!0),void(t.index=function(e,n){var r=i.length;if(e>=0)return e;if(t.isType("carousel"))return e+(r+1);if(t.settings.rewind)return i.isBound()&&i.isStart()?r:Math.floor(r/n)*n;return 0}(a,s))}h("Invalid direction pattern [".concat(o).concat(r,"] has been used"))}else t.index=0;else t.index=n},isStart:function(){return t.index<=0},isEnd:function(){return t.index>=this.length},isOffset:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:void 0;return t?!!this._o&&("|>"===t?"|"===this.move.direction&&">"===this.move.steps:"|<"===t?"|"===this.move.direction&&"<"===this.move.steps:this.move.direction===t):this._o},isBound:function(){return t.isType("slider")&&"center"!==t.settings.focusAt&&t.settings.bound}};return b(i,"move",{get:function(){return this._m},set:function(t){var e=t.substr(1);this._m={direction:t.substr(0,1),steps:e?v(e)?v(e):e:0}}}),b(i,"length",{get:function(){var n=t.settings,i=e.Html.slides.length;return this.isBound()?i-1-(v(n.perView)-1)+v(n.focusAt):i-1}}),b(i,"offset",{get:function(){return this._o}}),i}},Z=function(t){!function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function");t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,writable:!0,configurable:!0}}),e&&a(t,e)}(n,t);var e=l(n);function n(){return i(this,n),e.apply(this,arguments)}return o(n,[{key:"mount",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return f(u(n.prototype),"mount",this).call(this,Object.assign({},U,t))}}]),n}(k);Drupal.behaviors.iopGlide={attach(){document.querySelectorAll(".glide").forEach((t=>{new Z(t,{type:"carousel",focusAt:"center",gap:56,perView:3,breakpoints:{1399:{gap:50},1199:{gap:44},991:{gap:36},767:{gap:16,perView:1}}}).mount({Breakpoints:Q,Controls:X,Keyboard:K,Swipe:F})}))}}}));
diff --git a/web/themes/ventuno/assets/js/carousel.min.js b/web/themes/ventuno/assets/js/carousel.min.js
index 9e0ab6bfee..0ba8e0f09b 100644
--- a/web/themes/ventuno/assets/js/carousel.min.js
+++ b/web/themes/ventuno/assets/js/carousel.min.js
@@ -1,6 +1,6 @@
 !function(t){"function"==typeof define&&define.amd?define(t):t()}((function(){"use strict";
 /*!
-   * Glide.js v3.6.2
+   * Glide.js v3.7.1
    * (c) 2013-2024 Jędrzej Chałubek (https://github.com/jedrzejchalubek/)
    * Released under the MIT License.
    */function t(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(t);e&&(i=i.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),n.push.apply(n,i)}return n}function e(e){for(var n=1;n<arguments.length;n++){var i=null!=arguments[n]?arguments[n]:{};n%2?t(Object(i),!0).forEach((function(t){s(e,t,i[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(i)):t(Object(i)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(i,t))}))}return e}function n(t){return n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},n(t)}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function r(t,e){for(var n=0;n<e.length;n++){var i=e[n];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(t,i.key,i)}}function o(t,e,n){return e&&r(t.prototype,e),n&&r(t,n),t}function s(t,e,n){return e in t?Object.defineProperty(t,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[e]=n,t}function a(t){return a=Object.setPrototypeOf?Object.getPrototypeOf:function(t){return t.__proto__||Object.getPrototypeOf(t)},a(t)}function u(t,e){return u=Object.setPrototypeOf||function(t,e){return t.__proto__=e,t},u(t,e)}function c(t,e){if(e&&("object"==typeof e||"function"==typeof e))return e;if(void 0!==e)throw new TypeError("Derived constructors may only return object or undefined");return function(t){if(void 0===t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return t}(t)}function l(t){var e=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(t){return!1}}();return function(){var n,i=a(t);if(e){var r=a(this).constructor;n=Reflect.construct(i,arguments,r)}else n=i.apply(this,arguments);return c(this,n)}}function f(){return f="undefined"!=typeof Reflect&&Reflect.get?Reflect.get:function(t,e,n){var i=function(t,e){for(;!Object.prototype.hasOwnProperty.call(t,e)&&null!==(t=a(t)););return t}(t,e);if(i){var r=Object.getOwnPropertyDescriptor(i,e);return r.get?r.get.call(arguments.length<3?t:n):r.value}},f.apply(this,arguments)}var d={type:"slider",startAt:0,perView:1,focusAt:0,gap:10,autoplay:!1,hoverpause:!0,keyboard:!0,bound:!1,swipeThreshold:80,dragThreshold:120,perSwipe:"",touchRatio:.5,touchAngle:45,animationDuration:400,rewind:!0,rewindDuration:800,animationTimingFunc:"cubic-bezier(.165, .840, .440, 1)",waitForTransition:!0,throttle:10,direction:"ltr",peek:0,cloningRatio:1,breakpoints:{},classes:{swipeable:"glide--swipeable",dragging:"glide--dragging",direction:{ltr:"glide--ltr",rtl:"glide--rtl"},type:{slider:"glide--slider",carousel:"glide--carousel"},slide:{clone:"glide__slide--clone",active:"glide__slide--active"},arrow:{disabled:"glide__arrow--disabled"},nav:{active:"glide__bullet--active"}}};function h(t){console.error("[Glide warn]: ".concat(t))}function v(t){return parseInt(t)}function p(t){return"string"==typeof t}function g(t){var e=n(t);return"function"===e||"object"===e&&!!t}function m(t){return"function"==typeof t}function b(t){return t.constructor===Array}function y(t,e,n){Object.defineProperty(t,e,n)}function w(t,n){var i=Object.assign({},t,n);if(n.hasOwnProperty("classes")){i.classes=Object.assign({},t.classes,n.classes);["direction","type","slide","arrow","nav"].forEach((function(r){n.classes.hasOwnProperty(r)&&(i.classes[r]=e(e({},t.classes[r]),n.classes[r]))}))}return n.hasOwnProperty("breakpoints")&&(i.breakpoints=Object.assign({},t.breakpoints,n.breakpoints)),i}var _=function(){function t(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};i(this,t),this.events=e,this.hop=e.hasOwnProperty}return o(t,[{key:"on",value:function(t,e){if(!b(t)){this.hop.call(this.events,t)||(this.events[t]=[]);var n=this.events[t].push(e)-1;return{remove:function(){delete this.events[t][n]}}}for(var i=0;i<t.length;i++)this.on(t[i],e)}},{key:"emit",value:function(t,e){if(b(t))for(var n=0;n<t.length;n++)this.emit(t[n],e);else this.hop.call(this.events,t)&&this.events[t].forEach((function(t){t(e||{})}))}}]),t}(),S=function(){function t(e){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};i(this,t),this._c={},this._t=[],this._e=new _,this.disabled=!1,this.selector=e,this.settings=w(d,n),this.index=this.settings.startAt}return o(t,[{key:"mount",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return this._e.emit("mount.before"),g(t)?this._c=function(t,e,n){var i={};for(var r in e)m(e[r])?i[r]=e[r](t,i,n):h("Extension must be a function");for(var o in i)m(i[o].mount)&&i[o].mount();return i}(this,t,this._e):h("You need to provide a object on `mount()`"),this._e.emit("mount.after"),this}},{key:"mutate",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];return b(t)?this._t=t:h("You need to provide a array on `mutate()`"),this}},{key:"update",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return this.settings=w(this.settings,t),t.hasOwnProperty("startAt")&&(this.index=t.startAt),this._e.emit("update"),this}},{key:"go",value:function(t){return this._c.Run.make(t),this}},{key:"move",value:function(t){return this._c.Transition.disable(),this._c.Move.make(t),this}},{key:"destroy",value:function(){return this._e.emit("destroy"),this}},{key:"play",value:function(){var t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];return t&&(this.settings.autoplay=t),this._e.emit("play"),this}},{key:"pause",value:function(){return this._e.emit("pause"),this}},{key:"disable",value:function(){return this.disabled=!0,this}},{key:"enable",value:function(){return this.disabled=!1,this}},{key:"on",value:function(t,e){return this._e.on(t,e),this}},{key:"isType",value:function(t){return this.settings.type===t}},{key:"settings",get:function(){return this._o},set:function(t){g(t)?this._o=t:h("Options must be an `object` instance.")}},{key:"index",get:function(){return this._i},set:function(t){this._i=v(t)}},{key:"type",get:function(){return this.settings.type}},{key:"disabled",get:function(){return this._d},set:function(t){this._d=!!t}}]),t}();function k(){return(new Date).getTime()}function O(t,e){var n,i,r,o,s=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},a=0,u=function(){a=!1===s.leading?0:k(),n=null,o=t.apply(i,r),n||(i=r=null)},c=function(){var c=k();a||!1!==s.leading||(a=c);var l=e-(c-a);return i=this,r=arguments,l<=0||l>e?(n&&(clearTimeout(n),n=null),a=c,o=t.apply(i,r),n||(i=r=null)):n||!1===s.trailing||(n=setTimeout(u,l)),o};return c.cancel=function(){clearTimeout(n),a=0,n=i=r=null},c}var T={ltr:["marginLeft","marginRight"],rtl:["marginRight","marginLeft"]};function x(t){if(t&&t.parentNode){for(var e=t.parentNode.firstChild,n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n}return[]}function H(t){return Array.prototype.slice.call(t)}var j=function(){function t(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};i(this,t),this.listeners=e}return o(t,[{key:"on",value:function(t,e,n){var i=arguments.length>3&&void 0!==arguments[3]&&arguments[3];p(t)&&(t=[t]);for(var r=0;r<t.length;r++)this.listeners[t[r]]=n,e.addEventListener(t[r],this.listeners[t[r]],i)}},{key:"off",value:function(t,e){var n=arguments.length>2&&void 0!==arguments[2]&&arguments[2];p(t)&&(t=[t]);for(var i=0;i<t.length;i++)e.removeEventListener(t[i],this.listeners[t[i]],n)}},{key:"destroy",value:function(){delete this.listeners}}]),t}();var A=["ltr","rtl"],P={">":"<","<":">","=":"="};function z(t,e){return{modify:function(t){return e.Direction.is("rtl")?-t:t}}}function E(t,e){return{modify:function(t){var n=Math.floor(t/e.Sizes.slideWidth);return t+e.Gaps.value*n}}}function L(t,e){return{modify:function(t){return t+e.Clones.grow/2}}}function R(t,e){return{modify:function(n){if(t.settings.focusAt>=0){var i=e.Peek.value;return g(i)?n-i.before:n-i}return n}}}function C(t,e){return{modify:function(n){var i=e.Gaps.value,r=e.Sizes.width,o=t.settings.focusAt,s=e.Sizes.slideWidth;return"center"===o?n-(r/2-s/2):n-s*o-i*o}}}var M=!1;try{var D=Object.defineProperty({},"passive",{get:function(){M=!0}});window.addEventListener("testPassive",null,D),window.removeEventListener("testPassive",null,D)}catch(t){}var V=M,B=["touchstart","mousedown"],W=["touchmove","mousemove"],q=["touchend","touchcancel","mouseup","mouseleave"],G=["mousedown","mousemove","mouseup","mouseleave"];function F(t,e,n){var i=new j,r=0,o=0,s=0,a=!1,u=!!V&&{passive:!0},c={mount:function(){this.bindSwipeStart()},start:function(e){if(!a&&!t.disabled){this.disable();var i=this.touches(e);r=null,o=v(i.pageX),s=v(i.pageY),this.bindSwipeMove(),this.bindSwipeEnd(),n.emit("swipe.start")}},move:function(i){if(!t.disabled){var a=t.settings,u=a.touchAngle,c=a.touchRatio,l=a.classes,f=this.touches(i),d=v(f.pageX)-o,h=v(f.pageY)-s,p=Math.abs(d<<2),g=Math.abs(h<<2),m=Math.sqrt(p+g),b=Math.sqrt(g);if(!(180*(r=Math.asin(b/m))/Math.PI<u))return!1;i.stopPropagation(),e.Move.make(d*parseFloat(c)),e.Html.root.classList.add(l.dragging),n.emit("swipe.move")}},end:function(i){if(!t.disabled){var s=t.settings,a=s.perSwipe,u=s.touchAngle,c=s.classes,l=this.touches(i),f=this.threshold(i),d=l.pageX-o,h=180*r/Math.PI;this.enable(),d>f&&h<u?e.Run.make(e.Direction.resolve("".concat(a,"<"))):d<-f&&h<u?e.Run.make(e.Direction.resolve("".concat(a,">"))):e.Move.make(),e.Html.root.classList.remove(c.dragging),this.unbindSwipeMove(),this.unbindSwipeEnd(),n.emit("swipe.end")}},bindSwipeStart:function(){var n=this,r=t.settings,o=r.swipeThreshold,s=r.dragThreshold;o&&i.on(B[0],e.Html.wrapper,(function(t){n.start(t)}),u),s&&i.on(B[1],e.Html.wrapper,(function(t){n.start(t)}),u)},unbindSwipeStart:function(){i.off(B[0],e.Html.wrapper,u),i.off(B[1],e.Html.wrapper,u)},bindSwipeMove:function(){var n=this;i.on(W,e.Html.wrapper,O((function(t){n.move(t)}),t.settings.throttle),u)},unbindSwipeMove:function(){i.off(W,e.Html.wrapper,u)},bindSwipeEnd:function(){var t=this;i.on(q,e.Html.wrapper,(function(e){t.end(e)}))},unbindSwipeEnd:function(){i.off(q,e.Html.wrapper)},touches:function(t){return G.indexOf(t.type)>-1?t:t.touches[0]||t.changedTouches[0]},threshold:function(e){var n=t.settings;return G.indexOf(e.type)>-1?n.dragThreshold:n.swipeThreshold},enable:function(){return a=!1,e.Transition.enable(),this},disable:function(){return a=!0,e.Transition.disable(),this}};return n.on("build.after",(function(){e.Html.root.classList.add(t.settings.classes.swipeable)})),n.on("destroy",(function(){c.unbindSwipeStart(),c.unbindSwipeMove(),c.unbindSwipeEnd(),i.destroy()})),c}var I='[data-glide-el^="controls"]',N="".concat(I,' [data-glide-dir*="<"]'),Y="".concat(I,' [data-glide-dir*=">"]');function X(t,e,n){var i=new j,r=!!V&&{passive:!0},o={mount:function(){this._n=e.Html.root.querySelectorAll('[data-glide-el="controls[nav]"]'),this._c=e.Html.root.querySelectorAll(I),this._arrowControls={previous:e.Html.root.querySelectorAll(N),next:e.Html.root.querySelectorAll(Y)},this.addBindings()},setActive:function(){for(var t=0;t<this._n.length;t++)this.addClass(this._n[t].children)},removeActive:function(){for(var t=0;t<this._n.length;t++)this.removeClass(this._n[t].children)},addClass:function(e){var n=t.settings,i=e[t.index];i&&(i.classList.add(n.classes.nav.active),x(i).forEach((function(t){t.classList.remove(n.classes.nav.active)})))},removeClass:function(e){var n=e[t.index];null==n||n.classList.remove(t.settings.classes.nav.active)},setArrowState:function(){if(!t.settings.rewind){var n=o._arrowControls.next,i=o._arrowControls.previous;this.resetArrowState(n,i),0===t.index&&this.disableArrow(i),t.index===e.Run.length&&this.disableArrow(n)}},resetArrowState:function(){for(var e=t.settings,n=arguments.length,i=new Array(n),r=0;r<n;r++)i[r]=arguments[r];i.forEach((function(t){H(t).forEach((function(t){t.classList.remove(e.classes.arrow.disabled)}))}))},disableArrow:function(){for(var e=t.settings,n=arguments.length,i=new Array(n),r=0;r<n;r++)i[r]=arguments[r];i.forEach((function(t){H(t).forEach((function(t){t.classList.add(e.classes.arrow.disabled)}))}))},addBindings:function(){for(var t=0;t<this._c.length;t++)this.bind(this._c[t].children)},removeBindings:function(){for(var t=0;t<this._c.length;t++)this.unbind(this._c[t].children)},bind:function(t){for(var e=0;e<t.length;e++)i.on("click",t[e],this.click),i.on("touchstart",t[e],this.click,r)},unbind:function(t){for(var e=0;e<t.length;e++)i.off(["click","touchstart"],t[e])},click:function(t){V||"touchstart"!==t.type||t.preventDefault();var n=t.currentTarget.getAttribute("data-glide-dir");e.Run.make(e.Direction.resolve(n))}};return y(o,"items",{get:function(){return o._c}}),n.on(["mount.after","move.after"],(function(){o.setActive()})),n.on(["mount.after","run"],(function(){o.setArrowState()})),n.on("destroy",(function(){o.removeBindings(),o.removeActive(),i.destroy()})),o}function $(t){return g(t)?(e=t,Object.keys(e).sort().reduce((function(t,n){return t[n]=e[n],t[n],t}),{})):(h("Breakpoints option must be an object"),{});var e}function J(t,e,n){var i=new j,r=t.settings,o=$(r.breakpoints),s=Object.assign({},r),a={match:function(t){if(void 0!==window.matchMedia)for(var e in t)if(t.hasOwnProperty(e)&&window.matchMedia("(max-width: ".concat(e,"px)")).matches)return t[e];return s}};return Object.assign(r,a.match(o)),i.on("resize",window,O((function(){t.settings=w(r,a.match(o))}),t.settings.throttle)),n.on("update",(function(){o=$(o),s=Object.assign({},r)})),n.on("destroy",(function(){i.off("resize",window)})),a}var K={Html:function(t,e,n){var i={mount:function(){this.root=t.selector,this.track=this.root.querySelector('[data-glide-el="track"]'),this.collectSlides()},collectSlides:function(){this.slides=H(this.wrapper.children).filter((function(e){return!e.classList.contains(t.settings.classes.slide.clone)}))}};return y(i,"root",{get:function(){return i._r},set:function(t){p(t)&&(t=document.querySelector(t)),null!==t?i._r=t:h("Root element must be a existing Html node")}}),y(i,"track",{get:function(){return i._t},set:function(t){i._t=t}}),y(i,"wrapper",{get:function(){return i.track.children[0]}}),n.on("update",(function(){i.collectSlides()})),i},Translate:function(t,e,n){var i={set:function(n){var i=function(t,e,n){var i=[E,L,R,C].concat(t._t,[z]);return{mutate:function(r){for(var o=0;o<i.length;o++){var s=i[o];m(s)&&m(s().modify)?r=s(t,e,n).modify(r):h("Transformer should be a function that returns an object with `modify()` method")}return r}}}(t,e).mutate(n),r="translate3d(".concat(-1*i,"px, 0px, 0px)");e.Html.wrapper.style.mozTransform=r,e.Html.wrapper.style.webkitTransform=r,e.Html.wrapper.style.transform=r},remove:function(){e.Html.wrapper.style.transform=""},getStartIndex:function(){var n=e.Sizes.length,i=t.index,r=t.settings.perView;return e.Run.isOffset(">")||e.Run.isOffset("|>")?n+(i-r):(i+r)%n},getTravelDistance:function(){var n=e.Sizes.slideWidth*t.settings.perView;return e.Run.isOffset(">")||e.Run.isOffset("|>")?-1*n:n}};return n.on("move",(function(r){if(!t.isType("carousel")||!e.Run.isOffset())return i.set(r.movement);e.Transition.after((function(){n.emit("translate.jump"),i.set(e.Sizes.slideWidth*t.index)}));var o=e.Sizes.slideWidth*e.Translate.getStartIndex();return i.set(o-e.Translate.getTravelDistance())})),n.on("destroy",(function(){i.remove()})),i},Transition:function(t,e,n){var i=!1,r={compose:function(e){var n=t.settings;return i?"".concat(e," 0ms ").concat(n.animationTimingFunc):"".concat(e," ").concat(this.duration,"ms ").concat(n.animationTimingFunc)},set:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"transform";e.Html.wrapper.style.transition=this.compose(t)},remove:function(){e.Html.wrapper.style.transition=""},after:function(t){setTimeout((function(){t()}),this.duration)},enable:function(){i=!1,this.set()},disable:function(){i=!0,this.set()}};return y(r,"duration",{get:function(){var n=t.settings;return t.isType("slider")&&e.Run.offset?n.rewindDuration:n.animationDuration}}),n.on("move",(function(){r.set()})),n.on(["build.before","resize","translate.jump"],(function(){r.disable()})),n.on("run",(function(){r.enable()})),n.on("destroy",(function(){r.remove()})),r},Direction:function(t,e,n){var i={mount:function(){this.value=t.settings.direction},resolve:function(t){var e=t.slice(0,1);return this.is("rtl")?t.split(e).join(P[e]):t},is:function(t){return this.value===t},addClass:function(){e.Html.root.classList.add(t.settings.classes.direction[this.value])},removeClass:function(){e.Html.root.classList.remove(t.settings.classes.direction[this.value])}};return y(i,"value",{get:function(){return i._v},set:function(t){A.indexOf(t)>-1?i._v=t:h("Direction value must be `ltr` or `rtl`")}}),n.on(["destroy","update"],(function(){i.removeClass()})),n.on("update",(function(){i.mount()})),n.on(["build.before","update"],(function(){i.addClass()})),i},Peek:function(t,e,n){var i={mount:function(){this.value=t.settings.peek}};return y(i,"value",{get:function(){return i._v},set:function(t){g(t)?(t.before=v(t.before),t.after=v(t.after)):t=v(t),i._v=t}}),y(i,"reductor",{get:function(){var e=i.value,n=t.settings.perView;return g(e)?e.before/n+e.after/n:2*e/n}}),n.on(["resize","update"],(function(){i.mount()})),i},Sizes:function(t,e,n){var i={setupSlides:function(){for(var t="".concat(this.slideWidth,"px"),n=e.Html.slides,i=0;i<n.length;i++)n[i].style.width=t},setupWrapper:function(){e.Html.wrapper.style.width="".concat(this.wrapperSize,"px")},remove:function(){for(var t=e.Html.slides,n=0;n<t.length;n++)t[n].style.width="";e.Html.wrapper.style.width=""}};return y(i,"length",{get:function(){return e.Html.slides.length}}),y(i,"width",{get:function(){return e.Html.track.offsetWidth}}),y(i,"wrapperSize",{get:function(){return i.slideWidth*i.length+e.Gaps.grow+e.Clones.grow}}),y(i,"slideWidth",{get:function(){return i.width/t.settings.perView-e.Peek.reductor-e.Gaps.reductor}}),n.on(["build.before","resize","update"],(function(){i.setupSlides(),i.setupWrapper()})),n.on("destroy",(function(){i.remove()})),i},Gaps:function(t,e,n){var i={apply:function(t){for(var n=0,i=t.length;n<i;n++){var r=t[n].style,o=e.Direction.value;r[T[o][0]]=0!==n?"".concat(this.value/2,"px"):"",n!==t.length-1?r[T[o][1]]="".concat(this.value/2,"px"):r[T[o][1]]=""}},remove:function(t){for(var e=0,n=t.length;e<n;e++){var i=t[e].style;i.marginLeft="",i.marginRight=""}}};return y(i,"value",{get:function(){return v(t.settings.gap)}}),y(i,"grow",{get:function(){return i.value*e.Sizes.length}}),y(i,"reductor",{get:function(){var e=t.settings.perView;return i.value*(e-1)/e}}),n.on(["build.after","update"],O((function(){i.apply(e.Html.wrapper.children)}),30)),n.on("destroy",(function(){i.remove(e.Html.wrapper.children)})),i},Move:function(t,e,n){var i={mount:function(){this._o=0},make:function(){var t=this,i=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0;this.offset=i,n.emit("move",{movement:this.value}),e.Transition.after((function(){n.emit("move.after",{movement:t.value})}))}};return y(i,"offset",{get:function(){return i._o},set:function(t){i._o=function(t){return void 0===t}(t)?0:v(t)}}),y(i,"translate",{get:function(){return e.Sizes.slideWidth*t.index}}),y(i,"value",{get:function(){var t=this.offset,n=this.translate;return e.Direction.is("rtl")?n+t:n-t}}),n.on(["build.before","run"],(function(){i.make()})),i},Clones:function(t,e,n){var i={mount:function(){this.items=[],t.isType("carousel")&&(this.items=this.collect())},collect:function(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],i=e.Html.slides,r=t.settings,o=r.perView,s=r.classes,a=r.cloningRatio;if(i.length>0)for(var u=o+ +!!t.settings.peek+Math.round(o/2),c=i.slice(0,u).reverse(),l=i.slice(-1*u),f=0;f<Math.max(a,Math.floor(o/i.length));f++){for(var d=0;d<c.length;d++){var h=c[d].cloneNode(!0);h.classList.add(s.slide.clone),n.push(h)}for(var v=0;v<l.length;v++){var p=l[v].cloneNode(!0);p.classList.add(s.slide.clone),n.unshift(p)}}return n},append:function(){for(var t=this.items,n=e.Html,i=n.wrapper,r=n.slides,o=Math.floor(t.length/2),s=t.slice(0,o).reverse(),a=t.slice(-1*o).reverse(),u="".concat(e.Sizes.slideWidth,"px"),c=0;c<a.length;c++)i.appendChild(a[c]);for(var l=0;l<s.length;l++)i.insertBefore(s[l],r[0]);for(var f=0;f<t.length;f++)t[f].style.width=u},remove:function(){for(var t=this.items,n=0;n<t.length;n++)e.Html.wrapper.removeChild(t[n])}};return y(i,"grow",{get:function(){return(e.Sizes.slideWidth+e.Gaps.value)*i.items.length}}),n.on("update",(function(){i.remove(),i.mount(),i.append()})),n.on("build.before",(function(){t.isType("carousel")&&i.append()})),n.on("destroy",(function(){i.remove()})),i},Resize:function(t,e,n){var i=new j,r={mount:function(){this.bind()},bind:function(){i.on("resize",window,O((function(){n.emit("resize")}),t.settings.throttle))},unbind:function(){i.off("resize",window)}};return n.on("destroy",(function(){r.unbind(),i.destroy()})),r},Build:function(t,e,n){var i={mount:function(){n.emit("build.before"),this.typeClass(),this.activeClass(),n.emit("build.after")},typeClass:function(){e.Html.root.classList.add(t.settings.classes.type[t.settings.type])},activeClass:function(){var n=t.settings.classes,i=e.Html.slides[t.index];i&&(i.classList.add(n.slide.active),x(i).forEach((function(t){t.classList.remove(n.slide.active)})))},removeClasses:function(){var n=t.settings.classes,i=n.type,r=n.slide;e.Html.root.classList.remove(i[t.settings.type]),e.Html.slides.forEach((function(t){t.classList.remove(r.active)}))}};return n.on(["destroy","update"],(function(){i.removeClasses()})),n.on(["resize","update"],(function(){i.mount()})),n.on("move.after",(function(){i.activeClass()})),i},Run:function(t,e,n){var i={mount:function(){this._o=!1},make:function(i){var r=this;t.disabled||(!t.settings.waitForTransition||t.disable(),this.move=i,n.emit("run.before",this.move),this.calculate(),n.emit("run",this.move),e.Transition.after((function(){r.isStart()&&n.emit("run.start",r.move),r.isEnd()&&n.emit("run.end",r.move),r.isOffset()&&(r._o=!1,n.emit("run.offset",r.move)),n.emit("run.after",r.move),t.enable()})))},calculate:function(){var e=this.move,n=this.length,r=e.steps,o=e.direction,s=1;if("="===o)return t.settings.bound&&v(r)>n?void(t.index=n):void(t.index=r);if(">"!==o||">"!==r)if("<"!==o||"<"!==r){if("|"===o&&(s=t.settings.perView||1),">"===o||"|"===o&&">"===r){var a=function(e){var n=t.index;if(t.isType("carousel"))return n+e;return n+(e-n%e)}(s);return a>n&&(this._o=!0),void(t.index=function(e,n){var r=i.length;if(e<=r)return e;if(t.isType("carousel"))return e-(r+1);if(t.settings.rewind)return i.isBound()&&!i.isEnd()?r:0;if(i.isBound())return r;return Math.floor(r/n)*n}(a,s))}if("<"===o||"|"===o&&"<"===r){var u=function(e){var n=t.index;if(t.isType("carousel"))return n-e;var i=Math.ceil(n/e);return(i-1)*e}(s);return u<0&&(this._o=!0),void(t.index=function(e,n){var r=i.length;if(e>=0)return e;if(t.isType("carousel"))return e+(r+1);if(t.settings.rewind)return i.isBound()&&i.isStart()?r:Math.floor(r/n)*n;return 0}(u,s))}h("Invalid direction pattern [".concat(o).concat(r,"] has been used"))}else t.index=0;else t.index=n},isStart:function(){return t.index<=0},isEnd:function(){return t.index>=this.length},isOffset:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:void 0;return t?!!this._o&&("|>"===t?"|"===this.move.direction&&">"===this.move.steps:"|<"===t?"|"===this.move.direction&&"<"===this.move.steps:this.move.direction===t):this._o},isBound:function(){return t.isType("slider")&&"center"!==t.settings.focusAt&&t.settings.bound}};return y(i,"move",{get:function(){return this._m},set:function(t){var e=t.substr(1);this._m={direction:t.substr(0,1),steps:e?v(e)?v(e):e:0}}}),y(i,"length",{get:function(){var n=t.settings,i=e.Html.slides.length;return this.isBound()?i-1-(v(n.perView)-1)+v(n.focusAt):i-1}}),y(i,"offset",{get:function(){return this._o}}),i}},Q=function(t){!function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function");t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,writable:!0,configurable:!0}}),e&&u(t,e)}(n,t);var e=l(n);function n(){return i(this,n),e.apply(this,arguments)}return o(n,[{key:"mount",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return f(a(n.prototype),"mount",this).call(this,Object.assign({},K,t))}}]),n}(S);const U="glide__arrow--left",Z="glide__arrow--right";function tt(t,e){return{mount(){t.settings.rewind||(t.on(["mount.after","resize"],(()=>{e.Sizes.length<=t.settings.perView?t.disable():t.enable()})),t.on(["mount.after","run","resize"],(()=>{e.Controls.items.forEach((n=>{const i=n.querySelector(`.${U}`);i&&(0===t.index||e.Sizes.length<=t.settings.perView?i.setAttribute("disabled",""):i.removeAttribute("disabled"));const r=n.querySelector(`.${Z}`);if(r){(t.settings.bound?t.index+(t.settings.perView-1):t.index)===e.Sizes.length-1||e.Sizes.length<=t.settings.perView?r.setAttribute("disabled",""):r.removeAttribute("disabled")}i.disabled&&r.disabled?n.classList.add("glide__arrows--disabled"):n.classList.remove("glide__arrows--disabled")}))})))}}}((t,e)=>{t.behaviors.glide={attach(t){e("glide",".carousel .glide",t).forEach((t=>{const e=new Q(t,{rewind:!1,bound:!0,dragThreshold:!1,gap:16,perView:4,breakpoints:{9999:{perView:4},1199:{perView:3},767:{perView:2},575:{perView:1}}});let n;const i=t=>{t.settings.perView!==t.previousPerView&&(t.previousPerView=t.settings.perView,t.enable().go("<<").disable())};e.on("resize",(()=>{n&&clearTimeout(n),n=setTimeout(i,50,e)})),e.mount({Controls:X,Breakpoints:J,Swipe:F,ControlsDisabler:tt}),e.previousPerView=e.settings.perView;const r=t.querySelector(".glide__arrow--right"),o=t.querySelector(".glide__arrow--left");r.addEventListener("click",(()=>{e.go(">")})),o.addEventListener("click",(()=>{e.go("<")})),e.on("run",(()=>{t.classList.add("glide-animating")})).on("run.after",(()=>{t.classList.remove("glide-animating")}))}))}}})(Drupal,once)}));
diff --git a/web/themes/ventuno/assets/js/explore-block.min.js b/web/themes/ventuno/assets/js/explore-block.min.js
index a22a910688..4687c90027 100644
--- a/web/themes/ventuno/assets/js/explore-block.min.js
+++ b/web/themes/ventuno/assets/js/explore-block.min.js
@@ -1,6 +1,6 @@
 !function(t){"function"==typeof define&&define.amd?define(t):t()}((function(){"use strict";
 /*!
-   * Glide.js v3.6.2
+   * Glide.js v3.7.1
    * (c) 2013-2024 Jędrzej Chałubek (https://github.com/jedrzejchalubek/)
    * Released under the MIT License.
    */function t(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(t);e&&(i=i.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),n.push.apply(n,i)}return n}function e(e){for(var n=1;n<arguments.length;n++){var i=null!=arguments[n]?arguments[n]:{};n%2?t(Object(i),!0).forEach((function(t){s(e,t,i[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(i)):t(Object(i)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(i,t))}))}return e}function n(t){return n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},n(t)}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function r(t,e){for(var n=0;n<e.length;n++){var i=e[n];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(t,i.key,i)}}function o(t,e,n){return e&&r(t.prototype,e),n&&r(t,n),t}function s(t,e,n){return e in t?Object.defineProperty(t,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[e]=n,t}function a(t){return a=Object.setPrototypeOf?Object.getPrototypeOf:function(t){return t.__proto__||Object.getPrototypeOf(t)},a(t)}function u(t,e){return u=Object.setPrototypeOf||function(t,e){return t.__proto__=e,t},u(t,e)}function c(t,e){if(e&&("object"==typeof e||"function"==typeof e))return e;if(void 0!==e)throw new TypeError("Derived constructors may only return object or undefined");return function(t){if(void 0===t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return t}(t)}function l(t){var e=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(t){return!1}}();return function(){var n,i=a(t);if(e){var r=a(this).constructor;n=Reflect.construct(i,arguments,r)}else n=i.apply(this,arguments);return c(this,n)}}function f(){return f="undefined"!=typeof Reflect&&Reflect.get?Reflect.get:function(t,e,n){var i=function(t,e){for(;!Object.prototype.hasOwnProperty.call(t,e)&&null!==(t=a(t)););return t}(t,e);if(i){var r=Object.getOwnPropertyDescriptor(i,e);return r.get?r.get.call(arguments.length<3?t:n):r.value}},f.apply(this,arguments)}var d={type:"slider",startAt:0,perView:1,focusAt:0,gap:10,autoplay:!1,hoverpause:!0,keyboard:!0,bound:!1,swipeThreshold:80,dragThreshold:120,perSwipe:"",touchRatio:.5,touchAngle:45,animationDuration:400,rewind:!0,rewindDuration:800,animationTimingFunc:"cubic-bezier(.165, .840, .440, 1)",waitForTransition:!0,throttle:10,direction:"ltr",peek:0,cloningRatio:1,breakpoints:{},classes:{swipeable:"glide--swipeable",dragging:"glide--dragging",direction:{ltr:"glide--ltr",rtl:"glide--rtl"},type:{slider:"glide--slider",carousel:"glide--carousel"},slide:{clone:"glide__slide--clone",active:"glide__slide--active"},arrow:{disabled:"glide__arrow--disabled"},nav:{active:"glide__bullet--active"}}};function h(t){console.error("[Glide warn]: ".concat(t))}function v(t){return parseInt(t)}function p(t){return"string"==typeof t}function m(t){var e=n(t);return"function"===e||"object"===e&&!!t}function g(t){return"function"==typeof t}function b(t){return t.constructor===Array}function y(t,e,n){Object.defineProperty(t,e,n)}function w(t,n){var i=Object.assign({},t,n);if(n.hasOwnProperty("classes")){i.classes=Object.assign({},t.classes,n.classes);["direction","type","slide","arrow","nav"].forEach((function(r){n.classes.hasOwnProperty(r)&&(i.classes[r]=e(e({},t.classes[r]),n.classes[r]))}))}return n.hasOwnProperty("breakpoints")&&(i.breakpoints=Object.assign({},t.breakpoints,n.breakpoints)),i}var _=function(){function t(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};i(this,t),this.events=e,this.hop=e.hasOwnProperty}return o(t,[{key:"on",value:function(t,e){if(!b(t)){this.hop.call(this.events,t)||(this.events[t]=[]);var n=this.events[t].push(e)-1;return{remove:function(){delete this.events[t][n]}}}for(var i=0;i<t.length;i++)this.on(t[i],e)}},{key:"emit",value:function(t,e){if(b(t))for(var n=0;n<t.length;n++)this.emit(t[n],e);else this.hop.call(this.events,t)&&this.events[t].forEach((function(t){t(e||{})}))}}]),t}(),S=function(){function t(e){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};i(this,t),this._c={},this._t=[],this._e=new _,this.disabled=!1,this.selector=e,this.settings=w(d,n),this.index=this.settings.startAt}return o(t,[{key:"mount",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return this._e.emit("mount.before"),m(t)?this._c=function(t,e,n){var i={};for(var r in e)g(e[r])?i[r]=e[r](t,i,n):h("Extension must be a function");for(var o in i)g(i[o].mount)&&i[o].mount();return i}(this,t,this._e):h("You need to provide a object on `mount()`"),this._e.emit("mount.after"),this}},{key:"mutate",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];return b(t)?this._t=t:h("You need to provide a array on `mutate()`"),this}},{key:"update",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return this.settings=w(this.settings,t),t.hasOwnProperty("startAt")&&(this.index=t.startAt),this._e.emit("update"),this}},{key:"go",value:function(t){return this._c.Run.make(t),this}},{key:"move",value:function(t){return this._c.Transition.disable(),this._c.Move.make(t),this}},{key:"destroy",value:function(){return this._e.emit("destroy"),this}},{key:"play",value:function(){var t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];return t&&(this.settings.autoplay=t),this._e.emit("play"),this}},{key:"pause",value:function(){return this._e.emit("pause"),this}},{key:"disable",value:function(){return this.disabled=!0,this}},{key:"enable",value:function(){return this.disabled=!1,this}},{key:"on",value:function(t,e){return this._e.on(t,e),this}},{key:"isType",value:function(t){return this.settings.type===t}},{key:"settings",get:function(){return this._o},set:function(t){m(t)?this._o=t:h("Options must be an `object` instance.")}},{key:"index",get:function(){return this._i},set:function(t){this._i=v(t)}},{key:"type",get:function(){return this.settings.type}},{key:"disabled",get:function(){return this._d},set:function(t){this._d=!!t}}]),t}();function k(){return(new Date).getTime()}function O(t,e){var n,i,r,o,s=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},a=0,u=function(){a=!1===s.leading?0:k(),n=null,o=t.apply(i,r),n||(i=r=null)},c=function(){var c=k();a||!1!==s.leading||(a=c);var l=e-(c-a);return i=this,r=arguments,l<=0||l>e?(n&&(clearTimeout(n),n=null),a=c,o=t.apply(i,r),n||(i=r=null)):n||!1===s.trailing||(n=setTimeout(u,l)),o};return c.cancel=function(){clearTimeout(n),a=0,n=i=r=null},c}var x={ltr:["marginLeft","marginRight"],rtl:["marginRight","marginLeft"]};function T(t){if(t&&t.parentNode){for(var e=t.parentNode.firstChild,n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n}return[]}function H(t){return Array.prototype.slice.call(t)}var j=function(){function t(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};i(this,t),this.listeners=e}return o(t,[{key:"on",value:function(t,e,n){var i=arguments.length>3&&void 0!==arguments[3]&&arguments[3];p(t)&&(t=[t]);for(var r=0;r<t.length;r++)this.listeners[t[r]]=n,e.addEventListener(t[r],this.listeners[t[r]],i)}},{key:"off",value:function(t,e){var n=arguments.length>2&&void 0!==arguments[2]&&arguments[2];p(t)&&(t=[t]);for(var i=0;i<t.length;i++)e.removeEventListener(t[i],this.listeners[t[i]],n)}},{key:"destroy",value:function(){delete this.listeners}}]),t}();var A=["ltr","rtl"],P={">":"<","<":">","=":"="};function z(t,e){return{modify:function(t){return e.Direction.is("rtl")?-t:t}}}function E(t,e){return{modify:function(t){var n=Math.floor(t/e.Sizes.slideWidth);return t+e.Gaps.value*n}}}function R(t,e){return{modify:function(t){return t+e.Clones.grow/2}}}function C(t,e){return{modify:function(n){if(t.settings.focusAt>=0){var i=e.Peek.value;return m(i)?n-i.before:n-i}return n}}}function L(t,e){return{modify:function(n){var i=e.Gaps.value,r=e.Sizes.width,o=t.settings.focusAt,s=e.Sizes.slideWidth;return"center"===o?n-(r/2-s/2):n-s*o-i*o}}}var M=!1;try{var D=Object.defineProperty({},"passive",{get:function(){M=!0}});window.addEventListener("testPassive",null,D),window.removeEventListener("testPassive",null,D)}catch(t){}var V=M,W=["touchstart","mousedown"],B=["touchmove","mousemove"],q=["touchend","touchcancel","mouseup","mouseleave"],G=["mousedown","mousemove","mouseup","mouseleave"];function F(t,e,n){var i=new j,r=0,o=0,s=0,a=!1,u=!!V&&{passive:!0},c={mount:function(){this.bindSwipeStart()},start:function(e){if(!a&&!t.disabled){this.disable();var i=this.touches(e);r=null,o=v(i.pageX),s=v(i.pageY),this.bindSwipeMove(),this.bindSwipeEnd(),n.emit("swipe.start")}},move:function(i){if(!t.disabled){var a=t.settings,u=a.touchAngle,c=a.touchRatio,l=a.classes,f=this.touches(i),d=v(f.pageX)-o,h=v(f.pageY)-s,p=Math.abs(d<<2),m=Math.abs(h<<2),g=Math.sqrt(p+m),b=Math.sqrt(m);if(!(180*(r=Math.asin(b/g))/Math.PI<u))return!1;i.stopPropagation(),e.Move.make(d*parseFloat(c)),e.Html.root.classList.add(l.dragging),n.emit("swipe.move")}},end:function(i){if(!t.disabled){var s=t.settings,a=s.perSwipe,u=s.touchAngle,c=s.classes,l=this.touches(i),f=this.threshold(i),d=l.pageX-o,h=180*r/Math.PI;this.enable(),d>f&&h<u?e.Run.make(e.Direction.resolve("".concat(a,"<"))):d<-f&&h<u?e.Run.make(e.Direction.resolve("".concat(a,">"))):e.Move.make(),e.Html.root.classList.remove(c.dragging),this.unbindSwipeMove(),this.unbindSwipeEnd(),n.emit("swipe.end")}},bindSwipeStart:function(){var n=this,r=t.settings,o=r.swipeThreshold,s=r.dragThreshold;o&&i.on(W[0],e.Html.wrapper,(function(t){n.start(t)}),u),s&&i.on(W[1],e.Html.wrapper,(function(t){n.start(t)}),u)},unbindSwipeStart:function(){i.off(W[0],e.Html.wrapper,u),i.off(W[1],e.Html.wrapper,u)},bindSwipeMove:function(){var n=this;i.on(B,e.Html.wrapper,O((function(t){n.move(t)}),t.settings.throttle),u)},unbindSwipeMove:function(){i.off(B,e.Html.wrapper,u)},bindSwipeEnd:function(){var t=this;i.on(q,e.Html.wrapper,(function(e){t.end(e)}))},unbindSwipeEnd:function(){i.off(q,e.Html.wrapper)},touches:function(t){return G.indexOf(t.type)>-1?t:t.touches[0]||t.changedTouches[0]},threshold:function(e){var n=t.settings;return G.indexOf(e.type)>-1?n.dragThreshold:n.swipeThreshold},enable:function(){return a=!1,e.Transition.enable(),this},disable:function(){return a=!0,e.Transition.disable(),this}};return n.on("build.after",(function(){e.Html.root.classList.add(t.settings.classes.swipeable)})),n.on("destroy",(function(){c.unbindSwipeStart(),c.unbindSwipeMove(),c.unbindSwipeEnd(),i.destroy()})),c}var I='[data-glide-el^="controls"]',N="".concat(I,' [data-glide-dir*="<"]'),Y="".concat(I,' [data-glide-dir*=">"]');function X(t,e,n){var i=new j,r=!!V&&{passive:!0},o={mount:function(){this._n=e.Html.root.querySelectorAll('[data-glide-el="controls[nav]"]'),this._c=e.Html.root.querySelectorAll(I),this._arrowControls={previous:e.Html.root.querySelectorAll(N),next:e.Html.root.querySelectorAll(Y)},this.addBindings()},setActive:function(){for(var t=0;t<this._n.length;t++)this.addClass(this._n[t].children)},removeActive:function(){for(var t=0;t<this._n.length;t++)this.removeClass(this._n[t].children)},addClass:function(e){var n=t.settings,i=e[t.index];i&&(i.classList.add(n.classes.nav.active),T(i).forEach((function(t){t.classList.remove(n.classes.nav.active)})))},removeClass:function(e){var n=e[t.index];null==n||n.classList.remove(t.settings.classes.nav.active)},setArrowState:function(){if(!t.settings.rewind){var n=o._arrowControls.next,i=o._arrowControls.previous;this.resetArrowState(n,i),0===t.index&&this.disableArrow(i),t.index===e.Run.length&&this.disableArrow(n)}},resetArrowState:function(){for(var e=t.settings,n=arguments.length,i=new Array(n),r=0;r<n;r++)i[r]=arguments[r];i.forEach((function(t){H(t).forEach((function(t){t.classList.remove(e.classes.arrow.disabled)}))}))},disableArrow:function(){for(var e=t.settings,n=arguments.length,i=new Array(n),r=0;r<n;r++)i[r]=arguments[r];i.forEach((function(t){H(t).forEach((function(t){t.classList.add(e.classes.arrow.disabled)}))}))},addBindings:function(){for(var t=0;t<this._c.length;t++)this.bind(this._c[t].children)},removeBindings:function(){for(var t=0;t<this._c.length;t++)this.unbind(this._c[t].children)},bind:function(t){for(var e=0;e<t.length;e++)i.on("click",t[e],this.click),i.on("touchstart",t[e],this.click,r)},unbind:function(t){for(var e=0;e<t.length;e++)i.off(["click","touchstart"],t[e])},click:function(t){V||"touchstart"!==t.type||t.preventDefault();var n=t.currentTarget.getAttribute("data-glide-dir");e.Run.make(e.Direction.resolve(n))}};return y(o,"items",{get:function(){return o._c}}),n.on(["mount.after","move.after"],(function(){o.setActive()})),n.on(["mount.after","run"],(function(){o.setArrowState()})),n.on("destroy",(function(){o.removeBindings(),o.removeActive(),i.destroy()})),o}function $(t){return m(t)?(e=t,Object.keys(e).sort().reduce((function(t,n){return t[n]=e[n],t[n],t}),{})):(h("Breakpoints option must be an object"),{});var e}function J(t,e,n){var i=new j,r=t.settings,o=$(r.breakpoints),s=Object.assign({},r),a={match:function(t){if(void 0!==window.matchMedia)for(var e in t)if(t.hasOwnProperty(e)&&window.matchMedia("(max-width: ".concat(e,"px)")).matches)return t[e];return s}};return Object.assign(r,a.match(o)),i.on("resize",window,O((function(){t.settings=w(r,a.match(o))}),t.settings.throttle)),n.on("update",(function(){o=$(o),s=Object.assign({},r)})),n.on("destroy",(function(){i.off("resize",window)})),a}var K={Html:function(t,e,n){var i={mount:function(){this.root=t.selector,this.track=this.root.querySelector('[data-glide-el="track"]'),this.collectSlides()},collectSlides:function(){this.slides=H(this.wrapper.children).filter((function(e){return!e.classList.contains(t.settings.classes.slide.clone)}))}};return y(i,"root",{get:function(){return i._r},set:function(t){p(t)&&(t=document.querySelector(t)),null!==t?i._r=t:h("Root element must be a existing Html node")}}),y(i,"track",{get:function(){return i._t},set:function(t){i._t=t}}),y(i,"wrapper",{get:function(){return i.track.children[0]}}),n.on("update",(function(){i.collectSlides()})),i},Translate:function(t,e,n){var i={set:function(n){var i=function(t,e,n){var i=[E,R,C,L].concat(t._t,[z]);return{mutate:function(r){for(var o=0;o<i.length;o++){var s=i[o];g(s)&&g(s().modify)?r=s(t,e,n).modify(r):h("Transformer should be a function that returns an object with `modify()` method")}return r}}}(t,e).mutate(n),r="translate3d(".concat(-1*i,"px, 0px, 0px)");e.Html.wrapper.style.mozTransform=r,e.Html.wrapper.style.webkitTransform=r,e.Html.wrapper.style.transform=r},remove:function(){e.Html.wrapper.style.transform=""},getStartIndex:function(){var n=e.Sizes.length,i=t.index,r=t.settings.perView;return e.Run.isOffset(">")||e.Run.isOffset("|>")?n+(i-r):(i+r)%n},getTravelDistance:function(){var n=e.Sizes.slideWidth*t.settings.perView;return e.Run.isOffset(">")||e.Run.isOffset("|>")?-1*n:n}};return n.on("move",(function(r){if(!t.isType("carousel")||!e.Run.isOffset())return i.set(r.movement);e.Transition.after((function(){n.emit("translate.jump"),i.set(e.Sizes.slideWidth*t.index)}));var o=e.Sizes.slideWidth*e.Translate.getStartIndex();return i.set(o-e.Translate.getTravelDistance())})),n.on("destroy",(function(){i.remove()})),i},Transition:function(t,e,n){var i=!1,r={compose:function(e){var n=t.settings;return i?"".concat(e," 0ms ").concat(n.animationTimingFunc):"".concat(e," ").concat(this.duration,"ms ").concat(n.animationTimingFunc)},set:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"transform";e.Html.wrapper.style.transition=this.compose(t)},remove:function(){e.Html.wrapper.style.transition=""},after:function(t){setTimeout((function(){t()}),this.duration)},enable:function(){i=!1,this.set()},disable:function(){i=!0,this.set()}};return y(r,"duration",{get:function(){var n=t.settings;return t.isType("slider")&&e.Run.offset?n.rewindDuration:n.animationDuration}}),n.on("move",(function(){r.set()})),n.on(["build.before","resize","translate.jump"],(function(){r.disable()})),n.on("run",(function(){r.enable()})),n.on("destroy",(function(){r.remove()})),r},Direction:function(t,e,n){var i={mount:function(){this.value=t.settings.direction},resolve:function(t){var e=t.slice(0,1);return this.is("rtl")?t.split(e).join(P[e]):t},is:function(t){return this.value===t},addClass:function(){e.Html.root.classList.add(t.settings.classes.direction[this.value])},removeClass:function(){e.Html.root.classList.remove(t.settings.classes.direction[this.value])}};return y(i,"value",{get:function(){return i._v},set:function(t){A.indexOf(t)>-1?i._v=t:h("Direction value must be `ltr` or `rtl`")}}),n.on(["destroy","update"],(function(){i.removeClass()})),n.on("update",(function(){i.mount()})),n.on(["build.before","update"],(function(){i.addClass()})),i},Peek:function(t,e,n){var i={mount:function(){this.value=t.settings.peek}};return y(i,"value",{get:function(){return i._v},set:function(t){m(t)?(t.before=v(t.before),t.after=v(t.after)):t=v(t),i._v=t}}),y(i,"reductor",{get:function(){var e=i.value,n=t.settings.perView;return m(e)?e.before/n+e.after/n:2*e/n}}),n.on(["resize","update"],(function(){i.mount()})),i},Sizes:function(t,e,n){var i={setupSlides:function(){for(var t="".concat(this.slideWidth,"px"),n=e.Html.slides,i=0;i<n.length;i++)n[i].style.width=t},setupWrapper:function(){e.Html.wrapper.style.width="".concat(this.wrapperSize,"px")},remove:function(){for(var t=e.Html.slides,n=0;n<t.length;n++)t[n].style.width="";e.Html.wrapper.style.width=""}};return y(i,"length",{get:function(){return e.Html.slides.length}}),y(i,"width",{get:function(){return e.Html.track.offsetWidth}}),y(i,"wrapperSize",{get:function(){return i.slideWidth*i.length+e.Gaps.grow+e.Clones.grow}}),y(i,"slideWidth",{get:function(){return i.width/t.settings.perView-e.Peek.reductor-e.Gaps.reductor}}),n.on(["build.before","resize","update"],(function(){i.setupSlides(),i.setupWrapper()})),n.on("destroy",(function(){i.remove()})),i},Gaps:function(t,e,n){var i={apply:function(t){for(var n=0,i=t.length;n<i;n++){var r=t[n].style,o=e.Direction.value;r[x[o][0]]=0!==n?"".concat(this.value/2,"px"):"",n!==t.length-1?r[x[o][1]]="".concat(this.value/2,"px"):r[x[o][1]]=""}},remove:function(t){for(var e=0,n=t.length;e<n;e++){var i=t[e].style;i.marginLeft="",i.marginRight=""}}};return y(i,"value",{get:function(){return v(t.settings.gap)}}),y(i,"grow",{get:function(){return i.value*e.Sizes.length}}),y(i,"reductor",{get:function(){var e=t.settings.perView;return i.value*(e-1)/e}}),n.on(["build.after","update"],O((function(){i.apply(e.Html.wrapper.children)}),30)),n.on("destroy",(function(){i.remove(e.Html.wrapper.children)})),i},Move:function(t,e,n){var i={mount:function(){this._o=0},make:function(){var t=this,i=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0;this.offset=i,n.emit("move",{movement:this.value}),e.Transition.after((function(){n.emit("move.after",{movement:t.value})}))}};return y(i,"offset",{get:function(){return i._o},set:function(t){i._o=function(t){return void 0===t}(t)?0:v(t)}}),y(i,"translate",{get:function(){return e.Sizes.slideWidth*t.index}}),y(i,"value",{get:function(){var t=this.offset,n=this.translate;return e.Direction.is("rtl")?n+t:n-t}}),n.on(["build.before","run"],(function(){i.make()})),i},Clones:function(t,e,n){var i={mount:function(){this.items=[],t.isType("carousel")&&(this.items=this.collect())},collect:function(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],i=e.Html.slides,r=t.settings,o=r.perView,s=r.classes,a=r.cloningRatio;if(i.length>0)for(var u=o+ +!!t.settings.peek+Math.round(o/2),c=i.slice(0,u).reverse(),l=i.slice(-1*u),f=0;f<Math.max(a,Math.floor(o/i.length));f++){for(var d=0;d<c.length;d++){var h=c[d].cloneNode(!0);h.classList.add(s.slide.clone),n.push(h)}for(var v=0;v<l.length;v++){var p=l[v].cloneNode(!0);p.classList.add(s.slide.clone),n.unshift(p)}}return n},append:function(){for(var t=this.items,n=e.Html,i=n.wrapper,r=n.slides,o=Math.floor(t.length/2),s=t.slice(0,o).reverse(),a=t.slice(-1*o).reverse(),u="".concat(e.Sizes.slideWidth,"px"),c=0;c<a.length;c++)i.appendChild(a[c]);for(var l=0;l<s.length;l++)i.insertBefore(s[l],r[0]);for(var f=0;f<t.length;f++)t[f].style.width=u},remove:function(){for(var t=this.items,n=0;n<t.length;n++)e.Html.wrapper.removeChild(t[n])}};return y(i,"grow",{get:function(){return(e.Sizes.slideWidth+e.Gaps.value)*i.items.length}}),n.on("update",(function(){i.remove(),i.mount(),i.append()})),n.on("build.before",(function(){t.isType("carousel")&&i.append()})),n.on("destroy",(function(){i.remove()})),i},Resize:function(t,e,n){var i=new j,r={mount:function(){this.bind()},bind:function(){i.on("resize",window,O((function(){n.emit("resize")}),t.settings.throttle))},unbind:function(){i.off("resize",window)}};return n.on("destroy",(function(){r.unbind(),i.destroy()})),r},Build:function(t,e,n){var i={mount:function(){n.emit("build.before"),this.typeClass(),this.activeClass(),n.emit("build.after")},typeClass:function(){e.Html.root.classList.add(t.settings.classes.type[t.settings.type])},activeClass:function(){var n=t.settings.classes,i=e.Html.slides[t.index];i&&(i.classList.add(n.slide.active),T(i).forEach((function(t){t.classList.remove(n.slide.active)})))},removeClasses:function(){var n=t.settings.classes,i=n.type,r=n.slide;e.Html.root.classList.remove(i[t.settings.type]),e.Html.slides.forEach((function(t){t.classList.remove(r.active)}))}};return n.on(["destroy","update"],(function(){i.removeClasses()})),n.on(["resize","update"],(function(){i.mount()})),n.on("move.after",(function(){i.activeClass()})),i},Run:function(t,e,n){var i={mount:function(){this._o=!1},make:function(i){var r=this;t.disabled||(!t.settings.waitForTransition||t.disable(),this.move=i,n.emit("run.before",this.move),this.calculate(),n.emit("run",this.move),e.Transition.after((function(){r.isStart()&&n.emit("run.start",r.move),r.isEnd()&&n.emit("run.end",r.move),r.isOffset()&&(r._o=!1,n.emit("run.offset",r.move)),n.emit("run.after",r.move),t.enable()})))},calculate:function(){var e=this.move,n=this.length,r=e.steps,o=e.direction,s=1;if("="===o)return t.settings.bound&&v(r)>n?void(t.index=n):void(t.index=r);if(">"!==o||">"!==r)if("<"!==o||"<"!==r){if("|"===o&&(s=t.settings.perView||1),">"===o||"|"===o&&">"===r){var a=function(e){var n=t.index;if(t.isType("carousel"))return n+e;return n+(e-n%e)}(s);return a>n&&(this._o=!0),void(t.index=function(e,n){var r=i.length;if(e<=r)return e;if(t.isType("carousel"))return e-(r+1);if(t.settings.rewind)return i.isBound()&&!i.isEnd()?r:0;if(i.isBound())return r;return Math.floor(r/n)*n}(a,s))}if("<"===o||"|"===o&&"<"===r){var u=function(e){var n=t.index;if(t.isType("carousel"))return n-e;var i=Math.ceil(n/e);return(i-1)*e}(s);return u<0&&(this._o=!0),void(t.index=function(e,n){var r=i.length;if(e>=0)return e;if(t.isType("carousel"))return e+(r+1);if(t.settings.rewind)return i.isBound()&&i.isStart()?r:Math.floor(r/n)*n;return 0}(u,s))}h("Invalid direction pattern [".concat(o).concat(r,"] has been used"))}else t.index=0;else t.index=n},isStart:function(){return t.index<=0},isEnd:function(){return t.index>=this.length},isOffset:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:void 0;return t?!!this._o&&("|>"===t?"|"===this.move.direction&&">"===this.move.steps:"|<"===t?"|"===this.move.direction&&"<"===this.move.steps:this.move.direction===t):this._o},isBound:function(){return t.isType("slider")&&"center"!==t.settings.focusAt&&t.settings.bound}};return y(i,"move",{get:function(){return this._m},set:function(t){var e=t.substr(1);this._m={direction:t.substr(0,1),steps:e?v(e)?v(e):e:0}}}),y(i,"length",{get:function(){var n=t.settings,i=e.Html.slides.length;return this.isBound()?i-1-(v(n.perView)-1)+v(n.focusAt):i-1}}),y(i,"offset",{get:function(){return this._o}}),i}},Q=function(t){!function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function");t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,writable:!0,configurable:!0}}),e&&u(t,e)}(n,t);var e=l(n);function n(){return i(this,n),e.apply(this,arguments)}return o(n,[{key:"mount",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return f(a(n.prototype),"mount",this).call(this,Object.assign({},K,t))}}]),n}(S);const U="glide__arrow--left",Z="glide__arrow--right";function tt(t,e){return{mount(){t.settings.rewind||(t.on(["mount.after","resize"],(()=>{e.Sizes.length<=t.settings.perView?t.disable():t.enable()})),t.on(["mount.after","run","resize"],(()=>{e.Controls.items.forEach((n=>{const i=n.querySelector(`.${U}`);i&&(0===t.index||e.Sizes.length<=t.settings.perView?i.setAttribute("disabled",""):i.removeAttribute("disabled"));const r=n.querySelector(`.${Z}`);if(r){(t.settings.bound?t.index+(t.settings.perView-1):t.index)===e.Sizes.length-1||e.Sizes.length<=t.settings.perView?r.setAttribute("disabled",""):r.removeAttribute("disabled")}i.disabled&&r.disabled?n.classList.add("glide__arrows--disabled"):n.classList.remove("glide__arrows--disabled")}))})))}}}Drupal.behaviors.glide={attach(){const t=document.querySelectorAll(".explore-block button.nav-link");function e(){document.querySelectorAll(".tab-pane.active .glide").forEach((t=>{new Q(t,{rewind:!1,bound:!0,dragThreshold:!1,gap:24,perView:4,wrapperWidth:300,breakpoints:{1199:{perView:3},991:{perView:2},767:{perView:1}}}).mount({Controls:X,Breakpoints:J,Swipe:F,ControlsDisabler:tt}).update({wrapperWidth:300})}))}for(let n=0;n<t.length;n++)t[n].addEventListener("click",(()=>{e()}));e()}}}));
-- 
GitLab


From 058945ec9a71030d8701b989c4b588016eb78517 Mon Sep 17 00:00:00 2001
From: Zoltan Horvath <zoltan.horvath@ext.ec.europa.eu>
Date: Fri, 20 Dec 2024 12:33:18 +0100
Subject: [PATCH 085/137] ISAICP-9310: Use composer for checking Behat version

---
 src/TaskRunner/Commands/JoinupEnvironmentCommands.php | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/TaskRunner/Commands/JoinupEnvironmentCommands.php b/src/TaskRunner/Commands/JoinupEnvironmentCommands.php
index 72bf714396..5a7f580a53 100644
--- a/src/TaskRunner/Commands/JoinupEnvironmentCommands.php
+++ b/src/TaskRunner/Commands/JoinupEnvironmentCommands.php
@@ -4,7 +4,7 @@
 
 namespace Joinup\TaskRunner\Commands;
 
-use Behat\Behat\ApplicationFactory;
+use Composer\InstalledVersions;
 use Drupal\Core\Database\Database;
 use EasyRdf\Http;
 use EcEuropa\Toolkit\TaskRunner\AbstractCommands;
@@ -164,7 +164,7 @@ protected function phpunitVersion(): string {
    *   The Behat version.
    */
   protected function behatVersion(): string {
-    return ApplicationFactory::VERSION;
+    return InstalledVersions::getVersion('behat/behat');
   }
 
   /**
-- 
GitLab


From 711404161a1da56528591a9765c46ba281cb41b6 Mon Sep 17 00:00:00 2001
From: Zoltan Horvath <zoltan.horvath@ext.ec.europa.eu>
Date: Fri, 20 Dec 2024 13:01:52 +0100
Subject: [PATCH 086/137] ISAICP-9310: Fix (S)CSS coding standard violations

---
 .../iop/src/scss/partials/overrides/_utilities.scss  | 12 ++++--------
 .../src/scss/partials/overrides/_utilities.scss      | 12 ++++--------
 2 files changed, 8 insertions(+), 16 deletions(-)

diff --git a/web/themes/iop/src/scss/partials/overrides/_utilities.scss b/web/themes/iop/src/scss/partials/overrides/_utilities.scss
index e014773e12..2d5ed3a7f5 100644
--- a/web/themes/iop/src/scss/partials/overrides/_utilities.scss
+++ b/web/themes/iop/src/scss/partials/overrides/_utilities.scss
@@ -57,12 +57,10 @@ $utilities: map.merge(
       values: $spacers,
     ),
     "link": null,
-    "font-weight":
-      map.merge(
+    "font-weight": map.merge(
         map.get($utilities, "font-weight"),
         (
-          values:
-            map.merge(
+          values: map.merge(
               map.get(map.get($utilities, "font-weight"), "values"),
               (
                 md: $font-weight-medium,
@@ -70,12 +68,10 @@ $utilities: map.merge(
             ),
         )
       ),
-    "font-size":
-      map.merge(
+    "font-size": map.merge(
         map.get($utilities, "font-size"),
         (
-          values:
-            map.merge(
+          values: map.merge(
               map.get(map.get($utilities, "font-size"), "values"),
               (
                 sm: $font-size-sm,
diff --git a/web/themes/ventuno/src/scss/partials/overrides/_utilities.scss b/web/themes/ventuno/src/scss/partials/overrides/_utilities.scss
index 280ca0a8e2..493a268a1e 100644
--- a/web/themes/ventuno/src/scss/partials/overrides/_utilities.scss
+++ b/web/themes/ventuno/src/scss/partials/overrides/_utilities.scss
@@ -96,12 +96,10 @@ $utilities: map.merge(
         2: 2,
       ),
     ),
-    "font-weight":
-      map.merge(
+    "font-weight": map.merge(
         map.get($utilities, "font-weight"),
         (
-          values:
-            map.merge(
+          values: map.merge(
               map.get(map.get($utilities, "font-weight"), "values"),
               (
                 md: $font-weight-medium,
@@ -109,12 +107,10 @@ $utilities: map.merge(
             ),
         )
       ),
-    "font-size":
-      map.merge(
+    "font-size": map.merge(
         map.get($utilities, "font-size"),
         (
-          values:
-            map.merge(
+          values: map.merge(
               map.get(map.get($utilities, "font-size"), "values"),
               (
                 sm: $font-size-sm,
-- 
GitLab


From 7333d9e5de876e170ad2674cdf356572d8911620 Mon Sep 17 00:00:00 2001
From: Zoltan Horvath <zoltan.horvath@ext.ec.europa.eu>
Date: Sat, 21 Dec 2024 08:41:19 +0100
Subject: [PATCH 087/137] ISAICP-9310: Downgrade ec-europa/*

---
 composer.lock | 26 ++++++++++++--------------
 1 file changed, 12 insertions(+), 14 deletions(-)

diff --git a/composer.lock b/composer.lock
index 69cba5ffeb..009e713e6a 100644
--- a/composer.lock
+++ b/composer.lock
@@ -20500,16 +20500,16 @@
         },
         {
             "name": "ec-europa/qa-automation",
-            "version": "9.4.0",
+            "version": "9.3.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/ec-europa/qa-automation.git",
-                "reference": "d7e5c27dce8f380e63acad93beea847bd85defd8"
+                "reference": "92c3b71b2c43e29fd46592661ef75e90ebb8389c"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/ec-europa/qa-automation/zipball/d7e5c27dce8f380e63acad93beea847bd85defd8",
-                "reference": "d7e5c27dce8f380e63acad93beea847bd85defd8",
+                "url": "https://api.github.com/repos/ec-europa/qa-automation/zipball/92c3b71b2c43e29fd46592661ef75e90ebb8389c",
+                "reference": "92c3b71b2c43e29fd46592661ef75e90ebb8389c",
                 "shasum": ""
             },
             "require": {
@@ -20547,20 +20547,20 @@
                 "issues": "https://github.com/ec-europa/qa-automation/issues",
                 "source": "https://github.com/ec-europa/qa-automation"
             },
-            "time": "2024-11-26T09:22:52+00:00"
+            "time": "2024-07-17T06:26:41+00:00"
         },
         {
             "name": "ec-europa/toolkit",
-            "version": "10.16.0",
+            "version": "10.14.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/ec-europa/toolkit.git",
-                "reference": "f52d6867d09664715bde4d04b36072b808e6b00a"
+                "reference": "75b891996632fed332d5379b435dac6d20ab639e"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/ec-europa/toolkit/zipball/f52d6867d09664715bde4d04b36072b808e6b00a",
-                "reference": "f52d6867d09664715bde4d04b36072b808e6b00a",
+                "url": "https://api.github.com/repos/ec-europa/toolkit/zipball/75b891996632fed332d5379b435dac6d20ab639e",
+                "reference": "75b891996632fed332d5379b435dac6d20ab639e",
                 "shasum": ""
             },
             "require": {
@@ -20569,10 +20569,8 @@
                 "consolidation/annotated-command": "^4.7.0",
                 "consolidation/robo": "^3.0 || ^4.0 || ^5.0",
                 "cweagans/composer-patches": "^1.7 || ^2.0",
-                "dantleech/gherkin-lint": "^0.2.3",
-                "drupal/coder": "^8.3.10",
                 "drush/drush": "^11.0.4 || ^12.0 || ^13.0",
-                "ec-europa/qa-automation": "^9.4.0",
+                "ec-europa/qa-automation": "^9.3",
                 "ec-europa/toolkit-composer-plugin": "^0.0.1",
                 "ext-curl": "*",
                 "ext-dom": "*",
@@ -20588,7 +20586,7 @@
                 "phpmd/phpmd": "^2.12",
                 "phpstan/phpstan": "^1.10",
                 "phpstan/phpstan-deprecation-rules": "^1.0",
-                "phpunit/phpunit": "^9.5 || ^10.0 || ^11.0",
+                "phpunit/phpunit": "^9.5 || ^10.0",
                 "squizlabs/php_codesniffer": "^3.7",
                 "vlucas/phpdotenv": "^5.6"
             },
@@ -20618,7 +20616,7 @@
                 "email": "DIGIT-NEXTEUROPA-QA@ec.europa.eu",
                 "source": "https://github.com/ec-europa/toolkit"
             },
-            "time": "2024-12-13T09:24:45+00:00"
+            "time": "2024-08-19T13:27:25+00:00"
         },
         {
             "name": "ec-europa/toolkit-composer-plugin",
-- 
GitLab


From 66231832834d3752268f4ebe874d9aaf824c8a09 Mon Sep 17 00:00:00 2001
From: Zoltan Horvath <zoltan.horvath@ext.ec.europa.eu>
Date: Sun, 29 Dec 2024 07:55:07 +0100
Subject: [PATCH 088/137] Revert "ISAICP-9310: Prepare update to drupal/facets
 3.0.0-beta4 - remove patches of resolved issues"

This reverts commit bde91a1c69ac1ad87a4237700904068cf7bc543c.
---
 composer.json                                 |    6 +-
 .../patch/php/drupal/facets/3259836-8.patch   |   27 +
 .../patch/php/drupal/facets/3379445.patch     | 1629 +++++++++++++++++
 .../patch/php/drupal/facets/3459093.patch     |   26 +
 .../drupal/facets/sa-contrib-2024-047.patch   |   39 +
 5 files changed, 1726 insertions(+), 1 deletion(-)
 create mode 100644 resources/patch/php/drupal/facets/3259836-8.patch
 create mode 100644 resources/patch/php/drupal/facets/3379445.patch
 create mode 100644 resources/patch/php/drupal/facets/3459093.patch
 create mode 100644 resources/patch/php/drupal/facets/sa-contrib-2024-047.patch

diff --git a/composer.json b/composer.json
index 51277ed316..c8316e051c 100644
--- a/composer.json
+++ b/composer.json
@@ -357,8 +357,12 @@
                 "Creation of dynamic property deprecated in PHP 8.2 @see https://www.drupal.org/i/3376919": "resources/patch/php/drupal/error_page/3376919.patch"
             },
             "drupal/facets": {
+                "Facets breaks all AJAX views that uses pagers even without facets @see https://www.drupal.org/i/3379445": "resources/patch/php/drupal/facets/3379445.patch",
                 "Facet Summary for Facet Items with a set dependency. @see https://www.drupal.org/i/2873480": "resources/patch/php/drupal/facets/2873480.patch",
-                "Add 0 option in 'Soft limit' and apply soft limit to facet root li tags and add. @see https://www.drupal.org/i/3208580 and https://www.drupal.org/i/3307082": "resources/patch/php/drupal/facets/3208580-and-3307082.patch"
+                "Add 0 option in 'Soft limit' and apply soft limit to facet root li tags and add. @see https://www.drupal.org/i/3208580 and https://www.drupal.org/i/3307082": "resources/patch/php/drupal/facets/3208580-and-3307082.patch",
+                "Config validation error for facets_processor.* @see https://www.drupal.org/project/facets/issues/3459093": "resources/patch/php/drupal/facets/3459093.patch",
+                "Fix FacetsHierarchy config schema issue @see https://www.drupal.org/project/facets/issues/3259836": "resources/patch/php/drupal/facets/3259836-8.patch",
+                "Facets - Critical - Cross Site Scripting - SA-CONTRIB-2024-047 @see https://www.drupal.org/sa-contrib-2024-047": "resources/patch/php/drupal/facets/sa-contrib-2024-047.patch"
             },
             "drupal/field_delimiter": {
                 "Doesn't work in layout builder. @see https://www.drupal.org/i/3099580": "resources/patch/php/drupal/field_delimiter/3099580.patch",
diff --git a/resources/patch/php/drupal/facets/3259836-8.patch b/resources/patch/php/drupal/facets/3259836-8.patch
new file mode 100644
index 0000000000..c14282be08
--- /dev/null
+++ b/resources/patch/php/drupal/facets/3259836-8.patch
@@ -0,0 +1,27 @@
+diff --git a/config/schema/facets.facet.schema.yml b/config/schema/facets.facet.schema.yml
+index a3e63079e8a8554de2e4674a98ccf28f73c2eb91..342f1c148465c62bde42dff496ef2676bef33281 100644
+--- a/config/schema/facets.facet.schema.yml
++++ b/config/schema/facets.facet.schema.yml
+@@ -52,7 +52,7 @@ facets.facet.*:
+           type: string
+           label: 'Plugin id'
+         config:
+-          type: facets.facet.[%parent.type]
++          type: plugin.plugin_configuration.facets_hierarchy.[%parent.type]
+           label: 'Configuration'
+     expand_hierarchy:
+       type: boolean
+diff --git a/config/schema/facets.processor.schema.yml b/config/schema/facets.processor.schema.yml
+index 045106e1de94b452ebd8f4aadce39b3a7bdfd998..929dfed548240d6f08ecb883523b45b6ffd572c5 100644
+--- a/config/schema/facets.processor.schema.yml
++++ b/config/schema/facets.processor.schema.yml
+@@ -1,6 +1,9 @@
+ plugin.plugin_configuration.facets_processor.*:
+   type: mapping
+ 
++plugin.plugin_configuration.facets_hierarchy.*:
++  type: mapping
++
+ plugin.plugin_configuration.facets_processor.count_widget_widget_order:
+   type: mapping
+   label: 'Count widget order'
diff --git a/resources/patch/php/drupal/facets/3379445.patch b/resources/patch/php/drupal/facets/3379445.patch
new file mode 100644
index 0000000000..804e020fd5
--- /dev/null
+++ b/resources/patch/php/drupal/facets/3379445.patch
@@ -0,0 +1,1629 @@
+diff --git a/composer.json b/composer.json
+index 11ccc31..a1b1ce7 100644
+--- a/composer.json
++++ b/composer.json
+@@ -12,9 +12,9 @@
+   "support": {
+     "issues": "https://www.drupal.org/project/issues/facets",
+     "irc": "irc://irc.freenode.org/drupal-search-api",
+-    "source": "git://git.drupal.org/project/facets.git"
++    "source": "https://git.drupalcode.org/project/facets.git"
+   },
+-  "license": "GPL-2.0+",
++  "license": "GPL-2.0-or-later",
+   "require-dev": {
+     "drupal/search_api": "^1.28||1.x-dev",
+     "drupal/jquery_ui_slider": "~2.0",
+@@ -26,6 +26,7 @@
+     "drupal/jquery_ui_touch_punch": "Required for the 'Facets Range Widget' module to work"
+   },
+   "conflict": {
++    "drupal/core": "<10.1.0",
+     "drupal/search_api": "<1.14"
+   }
+ }
+diff --git a/facets.info.yml b/facets.info.yml
+index f943533..0cd74a8 100644
+--- a/facets.info.yml
++++ b/facets.info.yml
+@@ -1,7 +1,7 @@
+ name: 'Facets'
+ type: module
+ description: 'Faceted search interfaces that can be used on Search API searchers.'
+-core_version_requirement: ^9.3 || ^10.0
++core_version_requirement: ^10.1
+ package: Search
+ configure: entity.facets_facet.collection
+ test_dependencies:
+diff --git a/facets.module b/facets.module
+index 66e8412..0841aa6 100644
+--- a/facets.module
++++ b/facets.module
+@@ -383,23 +383,3 @@ function facets_theme_suggestions_facets_result_item(array $variables) {
+   }
+   return $suggestions;
+ }
+-
+-/**
+- * Implements hook_views_data_alter().
+- */
+-function facets_views_data_alter(array &$data) {
+-
+-  /** @var \Drupal\search_api\IndexInterface $index */
+-  foreach (Index::loadMultiple() as $index) {
+-    $data['search_api_index_' . $index->id()]['facets'] = [
+-      'title' => t('Facets'),
+-      'help' => t('Displays facets in a filter or area.'),
+-      'filter' => [
+-        'id' => 'facets_filter',
+-      ],
+-      'area' => [
+-        'id' => 'facets_area',
+-      ],
+-    ];
+-  }
+-}
+diff --git a/facets.services.yml b/facets.services.yml
+index ba34b70..bb29dbc 100644
+--- a/facets.services.yml
++++ b/facets.services.yml
+@@ -39,10 +39,6 @@ services:
+     arguments: ['@plugin.manager.block']
+     tags:
+       - { name: event_subscriber }
+-  facets.route_alter:
+-    class: \Drupal\facets\EventSubscriber\RouteAlterSubscriber
+-    tags:
+-      - { name: event_subscriber }
+   facets.search_api_subscriber:
+     class: Drupal\facets\EventSubscriber\SearchApiSubscriber
+     arguments: ['@facets.manager']
+diff --git a/js/base-widget.js b/js/base-widget.js
+index de99c03..3a868d7 100644
+--- a/js/base-widget.js
++++ b/js/base-widget.js
+@@ -14,8 +14,7 @@
+    * class: "js-facets-widget".
+    *
+    * Events are doing following:
+-   * "facets_filter" - widget should trigger this event. The facets module will
+-   *   handle it accordingly in case of AJAX and Non-AJAX views.
++   * "facets_filter" - widget should trigger this event.
+    * "facets_filtering" - The facets module will trigger this event before
+    *   filter is executed.
+    *
+diff --git a/js/checkbox-widget.js b/js/checkbox-widget.js
+index 6dbb652..4430b93 100644
+--- a/js/checkbox-widget.js
++++ b/js/checkbox-widget.js
+@@ -88,21 +88,12 @@
+     var label = $('<label for="' + id + '">' + description + '</label>');
+
+     checkbox.on('change.facets', function (e) {
+-      if ($link.data('drupal-facet-ajax') == 0) {
+-        e.preventDefault();
++      e.preventDefault();
+
+-        var $widget = $(this).closest('.js-facets-widget');
++      var $widget = $(this).closest('.js-facets-widget');
+
+-        Drupal.facets.disableFacet($widget);
+-        $widget.trigger('facets_filter', [href]);
+-      }
+-      else {
+-        var current = $(this);
+-        if (current.is(':checked') && current.hasClass(single_selection_group)) {
+-          var $widget = current.closest('.js-facets-widget');
+-          $widget.find('input.' + single_selection_group + ':not(#' + current.attr('id') + ')').prop('checked', false);
+-        }
+-      }
++      Drupal.facets.disableFacet($widget);
++      $widget.trigger('facets_filter', [href]);
+     });
+
+     if (active) {
+diff --git a/js/dropdown-widget.js b/js/dropdown-widget.js
+index ecc0588..59d070c 100644
+--- a/js/dropdown-widget.js
++++ b/js/dropdown-widget.js
+@@ -53,7 +53,7 @@
+         .text(default_option_label);
+       $dropdown.append($default_option);
+
+-      $ul.prepend('<li class="default-option"><a href="' + window.location.href.split('?')[0] + '" data-drupal-facet-ajax="' + $ul.data('drupal-facet-ajax') +'">' + Drupal.checkPlain(default_option_label) + '</a></li>');
++      $ul.prepend('<li class="default-option"><a href="' + window.location.href.split('?')[0] + '">' + Drupal.checkPlain(default_option_label) + '</a></li>');
+
+       var has_active = false;
+       $links.each(function () {
+@@ -89,10 +89,8 @@
+       $dropdown.on('change.facets', function () {
+         var anchor = $($ul).find("[data-drupal-facet-item-id='" + $(this).find(':selected').data('drupalFacetItemId') + "']");
+         var $linkElement = (anchor.length > 0) ? $(anchor) : $ul.find('.default-option a');
+-        if ($linkElement.data('drupal-facet-ajax') == 0) {
+-          var url = $linkElement.attr('href');
+-          $(this).trigger('facets_filter', [ url ]);
+-        }
++        var url = $linkElement.attr('href');
++        $(this).trigger('facets_filter', [ url ]);
+       });
+
+       // Append empty text option.
+diff --git a/js/soft-limit.js b/js/soft-limit.js
+index d07e85e..a203352 100644
+--- a/js/soft-limit.js
++++ b/js/soft-limit.js
+@@ -43,7 +43,8 @@
+
+     // Hide facets over the limit.
+     facetsList.each(function () {
+-      $(once('applysoftlimit', $(this).children('li:gt(' + zero_based_limit + ')'))).hide();
++      var allLiElements = $(this).find('li');
++      $(once('applysoftlimit', allLiElements.slice(zero_based_limit + 1))).hide();
+     });
+
+     // Add "Show more" / "Show less" links.
+diff --git a/modules/facets_exposed_filters/facets_exposed_filters.info.yml b/modules/facets_exposed_filters/facets_exposed_filters.info.yml
+new file mode 100644
+index 0000000..db9ce5f
+--- /dev/null
++++ b/modules/facets_exposed_filters/facets_exposed_filters.info.yml
+@@ -0,0 +1,11 @@
++name: 'Facets exposed filters (Experimental)'
++type: module
++description: 'Render facets in exposed filters.'
++core_version_requirement: ^9.2 || ^10.1
++package: Search
++configure: entity.facets_facet.collection
++dependencies:
++  - search_api:search_api
++  - facets:facets
++  - drupal:views
++  - better_exposed_filters:better_exposed_filters
+diff --git a/modules/facets_exposed_filters/facets_exposed_filters.module b/modules/facets_exposed_filters/facets_exposed_filters.module
+new file mode 100644
+index 0000000..2c02efb
+--- /dev/null
++++ b/modules/facets_exposed_filters/facets_exposed_filters.module
+@@ -0,0 +1,46 @@
++<?php
++
++use Drupal\Core\Form\FormStateInterface;
++use Drupal\search_api\Entity\Index;
++
++/**
++ * Implements hook_views_data_alter().
++ */
++function facets_exposed_filters_views_data_alter(array &$data) {
++  /** @var \Drupal\search_api\IndexInterface $index */
++  foreach (Index::loadMultiple() as $index) {
++    $data['search_api_index_' . $index->id()]['facets'] = [
++      'title' => t('Facets'),
++      'help' => t('Displays facets in a filter or area.'),
++      'filter' => [
++        'id' => 'facets_filter',
++      ],
++      'area' => [
++        'id' => 'facets_area',
++      ],
++    ];
++  }
++}
++
++function facets_exposed_filters_form_facets_facet_edit_form_alter(&$form, FormStateInterface $form_state) {
++  $facet = \Drupal::routeMatch()->getParameter('facets_facet');
++  $facetsource_config = $facet->getFacetSourceConfig();
++
++  // Only alter form when views_exposed_filters url processor is active.
++  if (substr($facetsource_config->getUrlProcessorName(), 0, 21) === 'views_exposed_filters') {
++    // Hide processors who do not apply when using views_exposed_filters.
++    $form['widget'] = ['#type' => 'hidden', '#value' => 'views_exposed_filter'];
++
++    $form["facet_settings"]["only_visible_when_facet_source_is_visible"]['#access'] = FALSE;
++    $form["facet_settings"]["only_visible_when_facet_source_is_visible"]['#value'] = FALSE;
++
++    $form["facet_settings"]["url_alias"]['#access'] = FALSE;
++    $form["facet_settings"]["show_title"]['#access'] = FALSE;
++    $form["facet_settings"]["show_only_one_result"]['#access'] = FALSE;
++    $form["facet_settings"]["show_only_one_result"]['#value'] = FALSE;
++
++    $form["facet_settings"]["empty_behavior"]['#access'] = FALSE;
++    unset($form["facet_settings"]["show_only_one_result"]);
++  }
++}
++
+diff --git a/modules/facets_exposed_filters/src/Plugin/facets/url_processor/ViewsExposedFilters.php b/modules/facets_exposed_filters/src/Plugin/facets/url_processor/ViewsExposedFilters.php
+new file mode 100644
+index 0000000..6ba8c54
+--- /dev/null
++++ b/modules/facets_exposed_filters/src/Plugin/facets/url_processor/ViewsExposedFilters.php
+@@ -0,0 +1,122 @@
++<?php
++
++namespace Drupal\facets_exposed_filters\Plugin\facets\url_processor;
++
++use Drupal\Core\Cache\UnchangingCacheableDependencyTrait;
++use Drupal\Core\Entity\EntityTypeManagerInterface;
++use Drupal\Core\Url;
++use Drupal\facets\FacetInterface;
++use Drupal\facets\UrlProcessor\UrlProcessorPluginBase;
++use Drupal\views\Entity\View;
++use Symfony\Component\DependencyInjection\ContainerInterface;
++use Symfony\Component\HttpFoundation\Request;
++
++/**
++ * Query string URL processor.
++ *
++ * @FacetsUrlProcessor(
++ *   id = "views_exposed_filters",
++ *   label = @Translation("Views exposed filters"),
++ *   description = @Translation("Views exposed filters moves all url logic to
++ *   Views, which provides a better AJAX/Views integration.")
++ * )
++ */
++class ViewsExposedFilters extends UrlProcessorPluginBase {
++
++  use UnchangingCacheableDependencyTrait;
++
++  /**
++   * {@inheritdoc}
++   */
++  public function __construct(array $configuration, $plugin_id, $plugin_definition, Request $request, EntityTypeManagerInterface $entity_type_manager) {
++    parent::__construct($configuration, $plugin_id, $plugin_definition, $request, $entity_type_manager);
++    $this->initializeActiveFilters();
++  }
++
++  /**
++   * {@inheritdoc}
++   */
++  public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
++    return new static(
++      $configuration,
++      $plugin_id,
++      $plugin_definition,
++      $container->get('request_stack')->getCurrentRequest(),
++      $container->get('entity_type.manager'),
++    );
++  }
++
++  /**
++   * {@inheritdoc}
++   */
++  public function buildUrls(FacetInterface $facet, array $results) {
++    // No results are found for this facet, so don't try to create urls.
++    if (empty($results)) {
++      return [];
++    }
++
++    $display_id = $this->configuration['facet']->getFacetSource()->pluginDefinition["display_id"];
++    $parts = explode(':', $display_id);
++    $views_info = explode('__', $parts[1]);
++    $views_name = $views_info[0];
++    $views_display = $views_info[1];
++
++    // We dont build real urls here. Views will handle this part for us. However
++    // our code still depends on the url being set, so we set all results to use
++    // the views display url.
++    $url = Url::fromRoute('view.' . $views_name . '.' . $views_display);
++    foreach ($results as $key => $result) {
++      $results[$key]->setUrl($url);
++    }
++
++    return $results;
++  }
++
++  /**
++   * Initializes the active filters from the request query.
++   *
++   * Get all the filters that are active by checking the request query and store
++   * them in activeFilters which is an array where key is the facet id and value
++   * is an array of raw values.
++   */
++  protected function initializeActiveFilters() {
++    $url_parameters = $this->request->query;
++    $active_filters = [];
++    $display_id = $this->configuration['facet']->getFacetSource()->pluginDefinition["display_id"];
++    $parts = explode(':', $display_id);
++    $views_info = explode('__', $parts[1]);
++    $views_name = $views_info[0];
++    $views_display = $views_info[1];
++    $view = View::load($views_name);
++    $display = $view->getDisplay($views_display);
++    if (!isset($display["display_options"]["filters"])) {
++      $display = $view->getDisplay('default');
++    }
++    foreach ($display["display_options"]["filters"] as $filter) {
++      if ($filter["plugin_id"] == 'facets_filter') {
++        $facet_id = $filter['facet'];
++        $identifier = $filter["expose"]["identifier"];
++        $query_params = $url_parameters->all();
++        if (isset($query_params[$identifier]) && $query_params[$identifier]) {
++          if ($filter["expose"]["multiple"]) {
++            $active_filters[$facet_id] = $url_parameters->all()[$identifier];
++          }
++          else {
++            if ($url_parameters->all()[$identifier] != 'All') {
++              $active_filters[$facet_id][] = $url_parameters->all()[$identifier];
++            }
++          }
++        }
++      }
++    }
++    $this->activeFilters = $active_filters;
++  }
++
++  /**
++   * {@inheritdoc}
++   */
++  public function getCacheContexts() {
++    return ['url.query_args'];
++  }
++
++}
+diff --git a/modules/facets_exposed_filters/src/Plugin/facets/widget/ViewsExposedFilterWidget.php b/modules/facets_exposed_filters/src/Plugin/facets/widget/ViewsExposedFilterWidget.php
+new file mode 100644
+index 0000000..3196206
+--- /dev/null
++++ b/modules/facets_exposed_filters/src/Plugin/facets/widget/ViewsExposedFilterWidget.php
+@@ -0,0 +1,49 @@
++<?php
++
++namespace Drupal\facets_exposed_filters\Plugin\facets\widget;
++
++use Drupal\facets\FacetInterface;
++use Drupal\facets\Widget\WidgetPluginBase;
++
++/**
++ * A specific widget used with the views_exposed_filters url processor.
++ *
++ * @FacetsWidget(
++ *   id = "views_exposed_filter",
++ *   label = @Translation("Views exposed filters"),
++ * )
++ */
++class ViewsExposedFilterWidget extends WidgetPluginBase {
++
++  /**
++   * {@inheritdoc}
++   */
++  public function build(FacetInterface $facet) {
++    $results = $facet->getResults();
++    return $this->buildOneLevel($results);
++  }
++
++  /**
++   * Builds one level from results.
++   *
++   * @param \Drupal\facets\Result\ResultInterface[] $results
++   *   A list of results.
++   *
++   * @return array
++   *   Generated build.
++   */
++  protected function buildOneLevel(array $results): array {
++    $items = [];
++
++    foreach ($results as $result) {
++      $label = $result->getDisplayValue();
++      if ($this->getConfiguration()['show_numbers'] && $result->getCount() !== FALSE) {
++        $label .= ' ('. $result->getCount() .')';
++      }
++      $items[$result->getRawValue()] = $label;
++    }
++
++    return $items;
++  }
++
++}
+diff --git a/modules/facets_exposed_filters/src/Plugin/views/FacetsViewsPluginTrait.php b/modules/facets_exposed_filters/src/Plugin/views/FacetsViewsPluginTrait.php
+new file mode 100644
+index 0000000..0241793
+--- /dev/null
++++ b/modules/facets_exposed_filters/src/Plugin/views/FacetsViewsPluginTrait.php
+@@ -0,0 +1,78 @@
++<?php
++
++namespace Drupal\facets_exposed_filters\Plugin\views;
++
++use Drupal\Core\Form\FormStateInterface;
++
++/**
++ * Helper for the main Views plugin.
++ */
++trait FacetsViewsPluginTrait {
++
++  /**
++   * Builds the options form.
++   *
++   * @param array $form
++   *   The form array that is being added to.
++   * @param \Drupal\Core\Form\FormStateInterface $form_state
++   *   The form state object.
++   */
++  public function facetsViewsBuildOptionsForm(array &$form, FormStateInterface $form_state) {
++    $options = [];
++
++    /** @var \Drupal\facets\Entity\Facet[] $facets */
++    $facets = $this->facetStorage->loadMultiple();
++
++    $format = 'search_api:views_%s__%s__%s';
++    $source = sprintf($format, $this->view->getDisplay()
++      ->getPluginId(), $this->view->id(), $this->view->current_display);
++    foreach ($facets as $facet) {
++      if ($facet->getFacetSourceId() === $source) {
++        $options[$facet->id()] = $facet->label();
++      }
++    }
++
++    $form['facet'] = [
++      '#title' => 'Facet',
++      '#options' => $options,
++      '#type' => 'radios',
++      '#required' => TRUE,
++      '#default_value' => isset($this->options['facet']) ? $this->options['facet'] : NULL,
++    ];
++  }
++
++  /**
++   * Gets the facets to render.
++   *
++   * @return array
++   *   The facet blocks to be output, in render array format.
++   */
++  public function facetsViewsGetFacets() {
++    $build = [];
++
++    if (!$this->options['facet']) {
++      return $build;
++    }
++
++    /** @var \Drupal\facets\Entity\Facet $facet */
++    $facet = $this->facetStorage->load($this->options['facet']);
++    $facet_build = $this->facetManager->build($facet);
++
++    if (!isset($facet_build[0]) || !$facet_build[0]) {
++      return $build;
++    }
++
++    $options = [];
++    // Empty behavior is not supported. Ensure we have actual results.
++    if (isset($facet_build[0]) && !isset($facet_build[0]["#type"])) {
++      $build = [
++        '#type' => 'select',
++        '#options' => $facet_build[0],
++        '#multiple' => $this->options["expose"]["multiple"],
++      ];
++    }
++
++    return $build;
++  }
++
++}
+diff --git a/src/Plugin/views/area/FacetsArea.php b/modules/facets_exposed_filters/src/Plugin/views/area/FacetsArea.php
+similarity index 95%
+rename from src/Plugin/views/area/FacetsArea.php
+rename to modules/facets_exposed_filters/src/Plugin/views/area/FacetsArea.php
+index f3e7f59..fc5ed95 100644
+--- a/src/Plugin/views/area/FacetsArea.php
++++ b/modules/facets_exposed_filters/src/Plugin/views/area/FacetsArea.php
+@@ -1,12 +1,12 @@
+ <?php
+
+-namespace Drupal\facets\Plugin\views\area;
++namespace Drupal\facets_exposed_filters\Plugin\views\area;
+
+ use Drupal\Core\Block\BlockPluginInterface;
+ use Drupal\Core\Entity\EntityStorageInterface;
+ use Drupal\Core\Form\FormStateInterface;
+ use Drupal\facets\FacetManager\DefaultFacetManager;
+-use Drupal\facets\Plugin\views\FacetsViewsPluginTrait;
++use Drupal\facets_exposed_filters\Plugin\views\FacetsViewsPluginTrait;
+ use Drupal\views\Plugin\views\area\AreaPluginBase;
+ use Symfony\Component\DependencyInjection\ContainerInterface;
+
+diff --git a/src/Plugin/views/filter/FacetsFilter.php b/modules/facets_exposed_filters/src/Plugin/views/filter/FacetsFilter.php
+similarity index 84%
+rename from src/Plugin/views/filter/FacetsFilter.php
+rename to modules/facets_exposed_filters/src/Plugin/views/filter/FacetsFilter.php
+index bd44301..4be699a 100644
+--- a/src/Plugin/views/filter/FacetsFilter.php
++++ b/modules/facets_exposed_filters/src/Plugin/views/filter/FacetsFilter.php
+@@ -1,15 +1,14 @@
+ <?php
+
+-namespace Drupal\facets\Plugin\views\filter;
++namespace Drupal\facets_exposed_filters\Plugin\views\filter;
+
+ use Drupal\Component\Utility\Random;
+ use Drupal\Core\Block\BlockPluginInterface;
+ use Drupal\Core\Entity\EntityStorageInterface;
+ use Drupal\Core\Form\FormStateInterface;
+ use Drupal\facets\FacetManager\DefaultFacetManager;
+-use Drupal\facets\Plugin\views\FacetsViewsPluginTrait;
++use Drupal\facets_exposed_filters\Plugin\views\FacetsViewsPluginTrait;
+ use Drupal\views\Plugin\views\filter\FilterPluginBase;
+-use Drupal\views\Plugin\views\HandlerBase;
+ use Symfony\Component\DependencyInjection\ContainerInterface;
+
+ /**
+@@ -84,7 +83,8 @@ class FacetsFilter extends FilterPluginBase {
+     $options = parent::defineOptions();
+     $options['exposed'] = ['default' => TRUE];
+     $options['expose']['contains']['identifier'] = ['default' => 'facet_' . $random->name()];
+-    $options['facets']['default'] = [];
++    $options['expose']['contains']['multiple'] = ['default' => TRUE];
++    $options['facet']['default'] = NULL;
+     $options['label_display']['default'] = BlockPluginInterface::BLOCK_LABEL_VISIBLE;
+     return $options;
+   }
+@@ -93,7 +93,7 @@ class FacetsFilter extends FilterPluginBase {
+    * {@inheritdoc}
+    */
+   public function buildOptionsForm(&$form, FormStateInterface $form_state) {
+-    HandlerBase::buildOptionsForm($form, $form_state);
++    parent::buildOptionsForm($form, $form_state);
+     $this->facetsViewsBuildOptionsForm($form, $form_state);
+   }
+
+@@ -101,17 +101,26 @@ class FacetsFilter extends FilterPluginBase {
+    * {@inheritdoc}
+    */
+   public function adminSummary() {
+-    return implode(', ', array_filter($this->options['facets']));
++    return $this->options['facet'];
+   }
+
+   /**
+    * {@inheritdoc}
+    */
+   public function valueForm(&$form, FormStateInterface $form_state) {
++
++    // Dirty check if we are in views UI. Return no values as it removes
++    // settings from the view when editing settings for an existing facet
++    // filter.
++    if(isset($form["admin_label"])) {
++      $form['value'] = [];
++      return;
++    }
++
+     static $is_processing = NULL;
+
+     if ($is_processing) {
+-      $form_state->facets_not_built = TRUE;
++      $form_state->set('facets_not_built', TRUE);
+       $form['value'] = [];
+       return;
+     }
+diff --git a/modules/facets_range_widget/facets_range_widget.libraries.yml b/modules/facets_range_widget/facets_range_widget.libraries.yml
+index d994ac8..5c41972 100644
+--- a/modules/facets_range_widget/facets_range_widget.libraries.yml
++++ b/modules/facets_range_widget/facets_range_widget.libraries.yml
+@@ -23,6 +23,7 @@ slider:
+   dependencies:
+     - core/drupal
+     - core/drupalSettings
+-    - core/jquery.once
++    - core/jquery
++    - core/once
+     - facets_range_widget/jquery.ui.slider.pips
+     - jquery_ui_touch_punch/touch-punch
+diff --git a/modules/facets_range_widget/src/Plugin/facets/processor/RangeSliderProcessor.php b/modules/facets_range_widget/src/Plugin/facets/processor/RangeSliderProcessor.php
+index 62cf04a..b166fd8 100644
+--- a/modules/facets_range_widget/src/Plugin/facets/processor/RangeSliderProcessor.php
++++ b/modules/facets_range_widget/src/Plugin/facets/processor/RangeSliderProcessor.php
+@@ -52,13 +52,16 @@ class RangeSliderProcessor extends SliderProcessor implements PreQueryProcessorI
+       unset($active_filters['']);
+     }
+
++    /** @var \Drupal\facets\Utility\FacetsUrlGenerator $url_generator */
++    $url_generator = \Drupal::service('facets.utility.url_generator');
++
+     /** @var \Drupal\facets\Result\ResultInterface[] $results */
+     foreach ($results as &$result) {
+       $new_active_filters = $active_filters;
+       unset($new_active_filters[$facet->id()]);
+       // Add one generic query filter with the min and max placeholder.
+       $new_active_filters[$facet->id()][] = '(min:__range_slider_min__,max:__range_slider_max__)';
+-      $url = \Drupal::service('facets.utility.url_generator')->getUrl($new_active_filters, FALSE);
++      $url = $url_generator->getUrl($new_active_filters, FALSE);
+       $result->setUrl($url);
+     }
+
+diff --git a/modules/facets_searchbox_widget/facets_searchbox_widget.libraries.yml b/modules/facets_searchbox_widget/facets_searchbox_widget.libraries.yml
+index 468f213..c315e94 100755
+--- a/modules/facets_searchbox_widget/facets_searchbox_widget.libraries.yml
++++ b/modules/facets_searchbox_widget/facets_searchbox_widget.libraries.yml
+@@ -8,4 +8,5 @@ searchbox:
+   dependencies:
+     - core/drupal
+     - core/drupalSettings
+-    - core/jquery.once
++    - core/jquery
++    - core/once
+diff --git a/modules/facets_summary/src/Entity/FacetsSummary.php b/modules/facets_summary/src/Entity/FacetsSummary.php
+index ee3bd7c..b2e438a 100644
+--- a/modules/facets_summary/src/Entity/FacetsSummary.php
++++ b/modules/facets_summary/src/Entity/FacetsSummary.php
+@@ -3,6 +3,7 @@
+ namespace Drupal\facets_summary\Entity;
+
+ use Drupal\Core\Config\Entity\ConfigEntityBase;
++use Drupal\facets\Entity\Facet;
+ use Drupal\facets_summary\FacetsSummaryInterface;
+
+ /**
+@@ -316,6 +317,11 @@ class FacetsSummary extends ConfigEntityBase implements FacetsSummaryInterface {
+       $this->addDependencies($facet_source_dependencies);
+     }
+
++    foreach (array_keys($this->getFacets() ?? []) as $facet_id) {
++      $facet = Facet::load($facet_id);
++      $this->addDependency('config', $facet->getConfigDependencyName());
++    }
++
+     return $this;
+   }
+
+diff --git a/src/Cache/Context/FacetsFilterCacheContext.php b/src/Cache/Context/FacetsFilterCacheContext.php
+index 4fc20f5..e9f3341 100644
+--- a/src/Cache/Context/FacetsFilterCacheContext.php
++++ b/src/Cache/Context/FacetsFilterCacheContext.php
+@@ -7,7 +7,7 @@ use Drupal\Core\Cache\Context\CalculatedCacheContextInterface;
+ use Drupal\Core\Cache\Context\RequestStackCacheContextBase;
+
+ /**
+- * Defines the FacetsAjaxArgsCacheContext service, for per facets args caching.
++ * Defines the FacetsFilterCacheContext service, for per facets args caching.
+  *
+  * Cache context ID: 'facets_filter' (to vary by all request arguments).
+  * Calculated cache context ID: 'facets_filter:%key', e.g.'facets_filter:f'
+@@ -33,7 +33,7 @@ class FacetsFilterCacheContext extends RequestStackCacheContextBase implements C
+       return http_build_query($value);
+     }
+     elseif ($this->requestStack->getCurrentRequest()->request->has($arg)) {
+-      $value = $this->requestStack->getCurrentRequest()->request->get($arg);
++      $value = $this->requestStack->getCurrentRequest()->request->all()[$arg] ?? NULL;
+       if (is_array($value)) {
+         return http_build_query($value);
+       }
+diff --git a/src/Controller/FacetsViewsAjaxController.php b/src/Controller/FacetsViewsAjaxController.php
+deleted file mode 100644
+index 157a81e..0000000
+--- a/src/Controller/FacetsViewsAjaxController.php
++++ /dev/null
+@@ -1,88 +0,0 @@
+-<?php
+-
+-namespace Drupal\facets\Controller;
+-
+-use Drupal\Core\Ajax\ReplaceCommand;
+-use Drupal\Core\Cache\CacheableMetadata;
+-use Drupal\Core\Cache\CacheableResponseInterface;
+-use Drupal\Core\Render\BubbleableMetadata;
+-use Drupal\Core\Render\RenderContext;
+-use Drupal\views\Ajax\ViewAjaxResponse;
+-use Drupal\views\Controller\ViewAjaxController;
+-use Symfony\Component\HttpFoundation\Request;
+-
+-/**
+- * Controller that allows for to replace exposed forms in blocks.
+- */
+-class FacetsViewsAjaxController extends ViewAjaxController {
+-
+-  /**
+-   * {@inheritdoc}
+-   */
+-  public function ajaxView(Request $request) {
+-    $this->facetsRemoveQueryParams($request);
+-    $response = parent::ajaxView($request);
+-
+-    $view = $response->getView();
+-    $display = $view->getDisplay();
+-    if ($display->getOption('exposed_block') && $display->usesExposedFormInBlock()) {
+-      $metadata = $this->addExposedBlockToResponse($response);
+-      if ($response instanceof CacheableResponseInterface) {
+-        $response->addCacheableDependency($metadata);
+-      }
+-    }
+-
+-    return $response;
+-  }
+-
+-  /**
+-   * If there's an AJAX request, remove the 'f' and 'page' key.
+-   *
+-   * ... in case they are in the current browser URL.
+-   *
+-   * This only applies when the method is POST.
+-   *
+-   * @param \Symfony\Component\HttpFoundation\Request $request
+-   *   The request object to process.
+-   */
+-  protected function facetsRemoveQueryParams(Request $request) {
+-    if ($request->isXmlHttpRequest()) {
+-      // @todo replace hardcoded 'f' by facet setting.
+-      foreach (['f', 'page', 'fulltext'] as $key) {
+-        if ($request->query->has($key)) {
+-          $request->query->remove($key);
+-        }
+-      }
+-    }
+-  }
+-
+-  /**
+-   * Adds the exposed form to the response if necessary.
+-   */
+-  protected function addExposedBlockToResponse(ViewAjaxResponse $response): CacheableMetadata {
+-    $view = $response->getView();
+-    $context = new RenderContext();
+-    $exposed_block = $this->renderer->executeInRenderContext($context, function () use ($view) {
+-      $output = $view->display_handler->viewExposedFormBlocks();
+-      if (is_array($output) && !empty($output)) {
+-        return $output;
+-      }
+-
+-      return [];
+-    });
+-
+-    if (!$context->isEmpty() && !empty($exposed_block)) {
+-      $bubbleable_metadata = $context->pop();
+-      BubbleableMetadata::createFromRenderArray($exposed_block)
+-        ->merge($bubbleable_metadata)
+-        ->applyTo($exposed_block);
+-    }
+-
+-    // Replace exposed block.
+-    $selector = 'views-exposed-form-' . strtr($view->id(), '_', '-') . '-' . strtr($view->current_display, '_', '-');
+-    $response->addCommand(new ReplaceCommand("#" . $selector, $exposed_block));
+-
+-    return CacheableMetadata::createFromRenderArray($exposed_block);
+-  }
+-
+-}
+diff --git a/src/Entity/Facet.php b/src/Entity/Facet.php
+index 7e232a3..4deb3d2 100644
+--- a/src/Entity/Facet.php
++++ b/src/Entity/Facet.php
+@@ -1116,7 +1116,11 @@ class Facet extends ConfigEntityBase implements FacetInterface {
+    */
+   public function postSave(EntityStorageInterface $storage, $update = TRUE) {
+     parent::postSave($storage, $update);
+-    if (!$update) {
++    // If a facet is new, update the caching metadata of the facet source.
++    // But only if the facet has been created via the UI and not via config
++    // import.
++    // @see https://www.drupal.org/project/facets/issues/3395567
++    if (!$update && !\Drupal::service('config.installer')->isSyncing()) {
+       self::clearBlockCache();
+       // Register newly created facet within its source, for the caching.
+       if (($source = $this->getFacetSource()) && $source->getCacheMaxAge() !== 0) {
+diff --git a/src/EventSubscriber/RouteAlterSubscriber.php b/src/EventSubscriber/RouteAlterSubscriber.php
+deleted file mode 100644
+index 4d8fc9b..0000000
+--- a/src/EventSubscriber/RouteAlterSubscriber.php
++++ /dev/null
+@@ -1,32 +0,0 @@
+-<?php
+-
+-namespace Drupal\facets\EventSubscriber;
+-
+-use Drupal\Core\Routing\RouteBuildEvent;
+-use Drupal\Core\Routing\RoutingEvents;
+-use Symfony\Component\EventDispatcher\EventSubscriberInterface;
+-
+-/**
+- * Modify certain routes.
+- */
+-class RouteAlterSubscriber implements EventSubscriberInterface {
+-
+-  /**
+-   * {@inheritdoc}
+-   */
+-  public function onRouteAlter(RouteBuildEvent $event) {
+-    $collection = $event->getRouteCollection();
+-    if ($route = $collection->get('views.ajax')) {
+-      $route->setDefault('_controller', '\Drupal\facets\Controller\FacetsViewsAjaxController::ajaxView');
+-    }
+-  }
+-
+-  /**
+-   * {@inheritdoc}
+-   */
+-  public static function getSubscribedEvents() {
+-    $events[RoutingEvents::ALTER][] = ['onRouteAlter', -100];
+-    return $events;
+-  }
+-
+-}
+diff --git a/src/FacetManager/DefaultFacetManager.php b/src/FacetManager/DefaultFacetManager.php
+index 4282368..e07eefa 100644
+--- a/src/FacetManager/DefaultFacetManager.php
++++ b/src/FacetManager/DefaultFacetManager.php
+@@ -448,21 +448,6 @@ class DefaultFacetManager {
+           ],
+         ];
+       }
+-      else {
+-        // If the facet has no results, but it is being rendered trough AJAX it
+-        // should render an empty container. This is because the JavaScript
+-        // needs to be able to find a div to replace with the new content.
+-        return [
+-          [
+-            0 => $build,
+-            '#type' => 'container',
+-            '#attributes' => [
+-              'data-drupal-facet-id' => $built_facet->id(),
+-              'class' => ['facet-empty', 'facet-hidden'],
+-            ],
+-          ],
+-        ];
+-      }
+     }
+
+     return [$build];
+diff --git a/src/Plugin/Block/FacetBlock.php b/src/Plugin/Block/FacetBlock.php
+index 63c1c8e..5f561a2 100644
+--- a/src/Plugin/Block/FacetBlock.php
++++ b/src/Plugin/Block/FacetBlock.php
+@@ -93,11 +93,6 @@ class FacetBlock extends BlockBase implements ContainerFactoryPluginInterface {
+     if (!empty($build)) {
+       CacheableMetadata::createFromObject($this)->applyTo($build);
+
+-      // Add extra elements from facet source, for example, ajax scripts.
+-      // @see Drupal\facets\Plugin\facets\facet_source\SearchApiDisplay
+-      /** @var \Drupal\facets\FacetSource\FacetSourcePluginInterface $facet_source */
+-      $facet_source = $facet->getFacetSource();
+-
+       // Add contextual links only when we have results.
+       $build['#contextual_links']['facets_facet'] = [
+         'route_parameters' => ['facets_facet' => $facet->id()],
+diff --git a/src/Plugin/better_exposed_filters/filter/Facets.php b/src/Plugin/better_exposed_filters/filter/Facets.php
+deleted file mode 100644
+index 0f059e6..0000000
+--- a/src/Plugin/better_exposed_filters/filter/Facets.php
++++ /dev/null
+@@ -1,81 +0,0 @@
+-<?php
+-
+-namespace Drupal\facets\Plugin\better_exposed_filters\filter;
+-
+-use Drupal\better_exposed_filters\Plugin\better_exposed_filters\filter\FilterWidgetBase;
+-use Drupal\Core\Cache\CacheableMetadata;
+-use Drupal\Core\Form\FormStateInterface;
+-
+-/**
+- * Default widget implementation.
+- *
+- * @BetterExposedFiltersFilterWidget(
+- *   id = "facets",
+- *   label = @Translation("Facets"),
+- * )
+- */
+-class Facets extends FilterWidgetBase {
+-
+-  /**
+-   * {@inheritdoc}
+-   */
+-  public function exposedFormAlter(array &$form, FormStateInterface $form_state) {
+-    if ($form_state->facets_not_built ?? FALSE) {
+-      return;
+-    }
+-
+-    $field_id = $this->getExposedFilterFieldId();
+-    if (!empty($form[$field_id]) && !empty($form[$field_id]['#content'])) {
+-      $metadata = new CacheableMetadata();
+-      if (isset($form['#cache'])) {
+-        $metadata = CacheableMetadata::createFromRenderArray($form);
+-      }
+-
+-      foreach ($form[$field_id]['#content'] as &$facet_content) {
+-        /** @var \Drupal\facets\FacetInterface $facet */
+-        $facet = $facet_content['content'][0]['#facet'] ?? NULL;
+-        if (!$facet) {
+-          continue;
+-        }
+-
+-        switch ($facet->getWidgetInstance()->getPluginId()) {
+-          case 'array':
+-            // Not supported here.
+-            break;
+-
+-          case 'checkbox':
+-          case 'dropdown':
+-          case 'links':
+-          default:
+-            parent::exposedFormAlter($form, $form_state);
+-
+-            /** @var \Drupal\views\Plugin\views\filter\FilterPluginBase $filter */
+-            $filter = $this->handler;
+-
+-            if ($filter->view->ajaxEnabled() || $filter->view->display_handler->ajaxEnabled()) {
+-              array_walk_recursive( $facet_content, function(&$value, $key) {
+-                if ($key === 'data-drupal-facet-ajax') {
+-                  $value = '1';
+-                }
+-              });
+-            }
+-
+-            $metadata = $metadata->merge(CacheableMetadata::createFromRenderArray($facet_content));
+-
+-            break;
+-        }
+-      }
+-      unset($facet_content);
+-
+-      $metadata->applyTo($form);
+-    }
+-  }
+-
+-  public static function isApplicable($filter = NULL, array $filter_options = []) {
+-    $is_applicable = parent::isApplicable($filter, $filter_options);
+-    if (is_a($filter, 'Drupal\facets\Plugin\views\filter\FacetsFilter')) {
+-      $is_applicable = TRUE;
+-    }
+-    return $is_applicable;
+-  }
+-}
+diff --git a/src/Plugin/facets/processor/BooleanItemProcessor.php b/src/Plugin/facets/processor/BooleanItemProcessor.php
+index 070d39f..f9c0c2c 100644
+--- a/src/Plugin/facets/processor/BooleanItemProcessor.php
++++ b/src/Plugin/facets/processor/BooleanItemProcessor.php
+@@ -62,7 +62,7 @@ class BooleanItemProcessor extends ProcessorPluginBase implements BuildProcessor
+       '#title' => $this->t('On value'),
+       '#type' => 'textfield',
+       '#default_value' => $config['on_value'],
+-      '#description' => $this->t('Use this label instead of <em>0</em> for the <em>On</em> or <em>True</em> value. Leave empty to hide this item.'),
++      '#description' => $this->t('Use this label instead of <em>1</em> for the <em>On</em> or <em>True</em> value. Leave empty to hide this item.'),
+       '#states' => [
+         'required' => ['input[name="facet_settings[boolean_item][settings][off_value]"' => ['empty' => TRUE]],
+       ],
+@@ -72,7 +72,7 @@ class BooleanItemProcessor extends ProcessorPluginBase implements BuildProcessor
+       '#title' => $this->t('Off value'),
+       '#type' => 'textfield',
+       '#default_value' => $config['off_value'],
+-      '#description' => $this->t('Use this label instead of <em>1</em> for the <em>Off</em> or <em>False</em> value. Leave empty to hide this item.'),
++      '#description' => $this->t('Use this label instead of <em>0</em> for the <em>Off</em> or <em>False</em> value. Leave empty to hide this item.'),
+       '#states' => [
+         'required' => ['input[name="facet_settings[boolean_item][settings][on_value]"' => ['empty' => TRUE]],
+       ],
+diff --git a/src/Plugin/facets/processor/DisplayValueWidgetOrderProcessor.php b/src/Plugin/facets/processor/DisplayValueWidgetOrderProcessor.php
+index c148580..f92f46c 100644
+--- a/src/Plugin/facets/processor/DisplayValueWidgetOrderProcessor.php
++++ b/src/Plugin/facets/processor/DisplayValueWidgetOrderProcessor.php
+@@ -68,18 +68,18 @@ class DisplayValueWidgetOrderProcessor extends SortProcessorPluginBase implement
+    */
+   public function sortResults(Result $a, Result $b) {
+     // Get the transliterate values only once.
+-    if (!isset($a->transliterateDisplayValue)) {
+-      $a->transliterateDisplayValue = $this->transliteration->removeDiacritics($a->getDisplayValue());
++    if (!$a->get('transliterateDisplayValue')) {
++      $a->set('transliterateDisplayValue', $this->transliteration->removeDiacritics($a->getDisplayValue()));
+     }
+-    if (!isset($b->transliterateDisplayValue)) {
+-      $b->transliterateDisplayValue = $this->transliteration->removeDiacritics($b->getDisplayValue());
++    if (!$b->get('transliterateDisplayValue')) {
++      $b->set('transliterateDisplayValue', $this->transliteration->removeDiacritics($b->getDisplayValue()));
+     }
+
+     // Return the sort value.
+-    if ($a->transliterateDisplayValue == $b->transliterateDisplayValue) {
++    if ($a->get('transliterateDisplayValue') == $b->get('transliterateDisplayValue')) {
+       return 0;
+     }
+-    return strnatcasecmp($a->transliterateDisplayValue, $b->transliterateDisplayValue);
++    return strnatcasecmp($a->get('transliterateDisplayValue'), $b->get('transliterateDisplayValue'));
+   }
+
+ }
+diff --git a/src/Plugin/facets/processor/HideNonNarrowingResultProcessor.php b/src/Plugin/facets/processor/HideNonNarrowingResultProcessor.php
+index 010a737..25fef5f 100644
+--- a/src/Plugin/facets/processor/HideNonNarrowingResultProcessor.php
++++ b/src/Plugin/facets/processor/HideNonNarrowingResultProcessor.php
+@@ -27,16 +27,34 @@ class HideNonNarrowingResultProcessor extends ProcessorPluginBase implements Bui
+    * {@inheritdoc}
+    */
+   public function build(FacetInterface $facet, array $results) {
+-    $facet_results = $facet->getResults();
+-    $result_count = 0;
+-    foreach ($facet_results as $result) {
+-      if ($result->isActive()) {
+-        $result_count += $result->getCount();
++    $facetSource = $facet->getFacetSource();
++
++    if ($facetSource) {
++      $result_count = $facetSource->getCount();
++    }
++    else {
++      // @todo Backward compatibility, should be removed!
++      $facet_results = $facet->getResults();
++      $result_count = 0;
++      foreach ($facet_results as $result) {
++        if ($result->isActive()) {
++          $result_count += $result->getCount();
++        }
+       }
+     }
+
+     /** @var \Drupal\facets\Result\ResultInterface $result */
+     foreach ($results as $id => $result) {
++      $children_results = $result->getChildren();
++
++      if ($children_results) {
++        $reduced_children_results = $this->build($facet, $children_results);
++        $result->setChildren($reduced_children_results);
++        if ($reduced_children_results) {
++          continue;
++        }
++      }
++
+       if ((($result->getCount() == $result_count) || ($result->getCount() == 0)) && !$result->isActive() && !$result->hasActiveChildren()) {
+         unset($results[$id]);
+       }
+diff --git a/src/Plugin/facets/processor/TermWeightWidgetOrderProcessor.php b/src/Plugin/facets/processor/TermWeightWidgetOrderProcessor.php
+index bedfb2b..3b56512 100644
+--- a/src/Plugin/facets/processor/TermWeightWidgetOrderProcessor.php
++++ b/src/Plugin/facets/processor/TermWeightWidgetOrderProcessor.php
+@@ -71,38 +71,38 @@ class TermWeightWidgetOrderProcessor extends SortProcessorPluginBase implements
+    */
+   public function sortResults(Result $a, Result $b) {
+     // Get the term weight once.
+-    if (!isset($a->termWeight) || !isset($b->termWeight)) {
++    if ($a->get('termWeight') === NULL || $b->get('termWeight') === NULL) {
+       $ids = [];
+-      if (!isset($a->termWeight)) {
++      if ($a->get('termWeight') === NULL) {
+         $a_raw = $a->getRawValue();
+         $ids[] = $a_raw;
+       }
+-      if (!isset($b->termWeight)) {
++      if ($b->get('termWeight') === NULL) {
+         $b_raw = $b->getRawValue();
+         $ids[] = $b_raw;
+       }
+       $entities = $this->entityTypeManager
+         ->getStorage('taxonomy_term')
+         ->loadMultiple($ids);
+-      if (!isset($a->termWeight)) {
++      if ($a->get('termWeight') === NULL) {
+         if (empty($entities[$a_raw])) {
+           return 0;
+         }
+-        $a->termWeight = $entities[$a_raw]->getWeight();
++        $a->set('termWeight', $entities[$a_raw]->getWeight());
+       }
+-      if (!isset($b->termWeight)) {
++      if ($b->get('termWeight') === NULL) {
+         if (empty($entities[$b_raw])) {
+           return 0;
+         }
+-        $b->termWeight = $entities[$b_raw]->getWeight();
++        $b->set('termWeight', $entities[$b_raw]->getWeight());
+       }
+     }
+
+     // Return the sort value.
+-    if ($a->termWeight === $b->termWeight) {
++    if ($a->get('termWeight') === $b->get('termWeight')) {
+       return 0;
+     }
+-    return ($a->termWeight < $b->termWeight) ? -1 : 1;
++    return ($a->get('termWeight') < $b->get('termWeight')) ? -1 : 1;
+   }
+
+   /**
+diff --git a/src/Plugin/views/FacetsViewsPluginTrait.php b/src/Plugin/views/FacetsViewsPluginTrait.php
+deleted file mode 100644
+index df61f33..0000000
+--- a/src/Plugin/views/FacetsViewsPluginTrait.php
++++ /dev/null
+@@ -1,111 +0,0 @@
+-<?php
+-
+-namespace Drupal\facets\Plugin\views;
+-
+-use Drupal\Core\Block\BlockPluginInterface;
+-use Drupal\Core\Cache\CacheableMetadata;
+-use Drupal\Core\Form\FormStateInterface;
+-
+-/**
+- * Helper for the main Views plugin.
+- */
+-trait FacetsViewsPluginTrait {
+-
+-  /**
+-   * Builds the options form.
+-   *
+-   * @param array $form
+-   *   The form array that is being added to.
+-   * @param \Drupal\Core\Form\FormStateInterface $form_state
+-   *   The form state object.
+-   */
+-  public function facetsViewsBuildOptionsForm(array &$form, FormStateInterface $form_state) {
+-    $options = [];
+-
+-    /** @var \Drupal\facets\Entity\Facet[] $facets */
+-    $facets = $this->facetStorage->loadMultiple();
+-
+-    $format = 'search_api:views_%s__%s__%s';
+-    $source = sprintf($format, $this->view->getDisplay()->getPluginId(), $this->view->id(), $this->view->current_display);
+-    foreach ($facets as $facet) {
+-      if ($facet->getFacetSourceId() === $source) {
+-        $options[$facet->id()] = $facet->label();
+-      }
+-    }
+-
+-    $form['facets'] = [
+-      '#title' => 'Facets',
+-      '#options' => $options,
+-      '#type' => 'checkboxes',
+-      '#required' => TRUE,
+-      '#default_value' => isset($this->options['facets']) ? $this->options['facets'] : [],
+-    ];
+-
+-    $form['label_display'] = [
+-      '#type' => 'checkbox',
+-      '#title' => $this->t('Display block title'),
+-      '#default_value' => ($this->options['label_display'] === BlockPluginInterface::BLOCK_LABEL_VISIBLE),
+-      '#return_value' => BlockPluginInterface::BLOCK_LABEL_VISIBLE,
+-    ];
+-  }
+-
+-  /**
+-   * Gets the facets to render.
+-   *
+-   * @return array
+-   *   The facet blocks to be output, in render array format.
+-   */
+-  public function facetsViewsGetFacets() {
+-    $build = [];
+-
+-    /** @var \Drupal\facets\Entity\Facet[] $facets */
+-    $items = [];
+-    $facets = $this->facetStorage->loadMultiple(array_filter($this->options['facets']));
+-    foreach ($facets as $facet) {
+-      $facet_build = $this->facetManager->build($facet);
+-      if (!empty($facet_build)) {
+-        $item = [
+-          '#theme' => 'block',
+-          '#configuration' => [
+-            'provider' => 'facets',
+-            'label' => $facet->label(),
+-            'label_display' => ($this->options['label_display'] === BlockPluginInterface::BLOCK_LABEL_VISIBLE),
+-          ],
+-          '#id' => $facet->id(),
+-          '#plugin_id' => 'facet_block:' . $facet->id(),
+-          '#base_plugin_id' => 'facet_block',
+-          '#derivative_plugin_id' => $facet->id(),
+-          '#weight' => $facet->getWeight(),
+-          'content' => $facet_build,
+-        ];
+-
+-        $metadata = CacheableMetadata::createFromObject($facet);
+-        foreach (array_keys($this->view->getExposedInput()) as $input_key) {
+-          if ($input_key) {
+-            // Fulltext searches anf other exposed filters might influence a
+-            // facet.
+-            $metadata->addCacheContexts(['facets_filter:' . $input_key]);
+-          }
+-        }
+-
+-        $metadata->applyTo($item);
+-        if  ($metadata->getCacheMaxAge() != 0) {
+-          // Try to cache the rendered facet.
+-          $item['#cache']['keys'] = ['facet', $facet->id()];
+-        }
+-
+-        $items[] = $item;
+-      }
+-    }
+-
+-    if (!empty($items)) {
+-      $build = [
+-        '#theme' => 'facets_views_plugin',
+-        '#content' => $items,
+-      ];
+-    }
+-
+-    return $build;
+-  }
+-
+-}
+diff --git a/src/Result/Result.php b/src/Result/Result.php
+index 334dc68..40a0c2e 100644
+--- a/src/Result/Result.php
++++ b/src/Result/Result.php
+@@ -2,6 +2,7 @@
+
+ namespace Drupal\facets\Result;
+
++use Drupal\Component\Utility\NestedArray;
+ use Drupal\Core\Url;
+ use Drupal\facets\FacetInterface;
+
+@@ -10,6 +11,13 @@ use Drupal\facets\FacetInterface;
+  */
+ class Result implements ResultInterface {
+
++  /**
++   * The facet transliterate display value.
++   *
++   * @var string
++   */
++  public $transliterateDisplayValue;
++
+   /**
+    * The facet related to the result.
+    *
+@@ -73,6 +81,13 @@ class Result implements ResultInterface {
+    */
+   protected $children = [];
+
++  /**
++   * Storage for implementation-specific data.
++   *
++   * @var array
++   */
++  protected $storage = [];
++
+   /**
+    * Constructs a new result value object.
+    *
+@@ -221,4 +236,34 @@ class Result implements ResultInterface {
+     return $this->facet;
+   }
+
++  /**
++   * {@inheritdoc}
++   */
++  public function getStorage() {
++    return $this->storage;
++  }
++
++  /**
++   * {@inheritdoc}
++   */
++  public function setStorage(array $storage) {
++    $this->storage = $storage;
++    return $this;
++  }
++
++  /**
++   * {@inheritdoc}
++   */
++  public function get($property) {
++    return NestedArray::getValue($this->storage, (array) $property);
++  }
++
++  /**
++   * {@inheritdoc}
++   */
++  public function set($property, $value) {
++    NestedArray::setValue($this->storage, (array) $property, $value, TRUE);
++    return $this;
++  }
++
+ }
+diff --git a/src/Result/ResultInterface.php b/src/Result/ResultInterface.php
+index 3e23b63..36fbf18 100644
+--- a/src/Result/ResultInterface.php
++++ b/src/Result/ResultInterface.php
+@@ -145,4 +145,52 @@ interface ResultInterface {
+    */
+   public function getChildren();
+
++  /**
++   * Returns the entire set of arbitrary data.
++   *
++   * @return array
++   *   The entire set of arbitrary data storage for this result.
++   */
++  public function getStorage();
++
++  /**
++   * Sets the entire set of arbitrary data.
++   *
++   * @param array $storage
++   *   The entire set of arbitrary data to store for this result.
++   *
++   * @return $this
++   */
++  public function setStorage(array $storage);
++
++  /**
++   * Gets any arbitrary property.
++   *
++   * @param string|array $property
++   *   Properties are often stored as multi-dimensional associative arrays. If
++   *   $property is a string, it will return $storage[$property]. If $property
++   *   is an array, each element of the array will be used as a nested key. If
++   *   $property = ['foo', 'bar'] it will return $storage['foo']['bar'].
++   *
++   * @return mixed
++   *   The property, or the default if the property does not exist.
++   */
++  public function get($property);
++
++  /**
++   * Sets a value to an arbitrary property.
++   *
++   * @param string|array $property
++   *   Properties are often stored as multi-dimensional associative arrays. If
++   *   $property is a string, it will use $storage[$property] = $value. If
++   *   $property is an array, each element of the array will be used as a nested
++   *   key. If $property = ['foo', 'bar'] it will use
++   *   $storage['foo']['bar'] = $value.
++   * @param mixed $value
++   *   The value to set.
++   *
++   * @return $this
++   */
++  public function set($property, $value);
++
+ }
+diff --git a/src/Widget/WidgetPluginBase.php b/src/Widget/WidgetPluginBase.php
+index 1dc23b9..0d1a9d5 100644
+--- a/src/Widget/WidgetPluginBase.php
++++ b/src/Widget/WidgetPluginBase.php
+@@ -67,7 +67,6 @@ abstract class WidgetPluginBase extends PluginBase implements WidgetPluginInterf
+         'data-drupal-facet-filter-key' => $url_processor->getFilterKey(),
+         'data-drupal-facet-id' => $facet->id(),
+         'data-drupal-facet-alias' => $facet->getUrlAlias(),
+-        'data-drupal-facet-ajax' => '0',
+         'class' => [$facet->getActiveItems() ? 'facet-active' : 'facet-inactive'],
+       ],
+       '#context' => !empty($widget['type']) ? ['list_style' => $widget['type']] : [],
+@@ -197,7 +196,6 @@ abstract class WidgetPluginBase extends PluginBase implements WidgetPluginInterf
+     $items['#attributes']['data-drupal-facet-item-value'] = $result->getRawValue();
+     $items['#attributes']['data-drupal-facet-item-count'] = $result->getCount();
+     $items['#attributes']['data-drupal-facet-filter-value'] = $facet->getUrlAlias() . $url_processor->getSeparator() . $result->getRawValue();
+-    $items['#attributes']['data-drupal-facet-ajax'] = '0';
+
+     if ($facet->getShowOnlyOneResult()) {
+       $items['#attributes']['data-drupal-facet-single-selection-group'] = Html::getClass($facet->getUrlAlias());
+diff --git a/tests/src/Functional/FacetsUrlGeneratorTest.php b/tests/src/Functional/FacetsUrlGeneratorTest.php
+index 3b1ac62..a29b13e 100644
+--- a/tests/src/Functional/FacetsUrlGeneratorTest.php
++++ b/tests/src/Functional/FacetsUrlGeneratorTest.php
+@@ -64,7 +64,7 @@ class FacetsUrlGeneratorTest extends FacetsTestBase {
+
+     $url = $this->urlGenerator->getUrl(['test_facet' => ['fuzzy']]);
+
+-    $this->assertEquals('route:view.search_api_test_view.page_1;arg_0&arg_1&arg_2?f%5B0%5D=owl%3Afuzzy', $url->toUriString());
++    $this->assertEquals('route:view.search_api_test_view.page_1;arg_0&arg_1&arg_2&view_id=search_api_test_view&display_id=page_1?f%5B0%5D=owl%3Afuzzy', $url->toUriString());
+
+     // Setup search page URL with contextual parameters as current request and
+     // path.
+@@ -76,7 +76,7 @@ class FacetsUrlGeneratorTest extends FacetsTestBase {
+     \Drupal::service('path.current')->setPath($path);
+     $url = $this->urlGenerator->getUrl(['test_facet' => ['fuzzy']]);
+
+-    $this->assertEquals('route:view.search_api_test_view.page_1;arg_0=entity%3Aentity_test_mulrev_changed&arg_1=entity_test_mulrev_changed&arg_2?f%5B0%5D=owl%3Afuzzy', $url->toUriString());
++    $this->assertEquals('route:view.search_api_test_view.page_1;arg_0=entity%3Aentity_test_mulrev_changed&arg_1=entity_test_mulrev_changed&arg_2&view_id=search_api_test_view&display_id=page_1?f%5B0%5D=owl%3Afuzzy', $url->toUriString());
+     \Drupal::requestStack()->pop();
+   }
+
+@@ -93,7 +93,7 @@ class FacetsUrlGeneratorTest extends FacetsTestBase {
+     $facet->save();
+
+     $url = $this->urlGenerator->getUrl(['owl' => ['foo']]);
+-    $this->assertEquals('route:view.search_api_test_view.page_1;arg_0&arg_1&arg_2?f%5B0%5D=donkey%3Afoo', $url->toUriString());
++    $this->assertEquals('route:view.search_api_test_view.page_1;arg_0&arg_1&arg_2&view_id=search_api_test_view&display_id=page_1?f%5B0%5D=donkey%3Afoo', $url->toUriString());
+
+     // This won't work without it being in the request, so we need to do this
+     // from a block. We first click the link, check that the "orange" facet is
+diff --git a/tests/src/FunctionalJavascript/AjaxBehaviorTest.php b/tests/src/FunctionalJavascript/AjaxBehaviorTest.php
+index 3a638c1..cd5a53a 100644
+--- a/tests/src/FunctionalJavascript/AjaxBehaviorTest.php
++++ b/tests/src/FunctionalJavascript/AjaxBehaviorTest.php
+@@ -24,163 +24,6 @@ class AjaxBehaviorTest extends JsBase {
+     $view->save();
+   }
+
+-  /**
+-   * Tests ajax links.
+-   */
+-  public function testAjaxLinks() {
+-    // Create facets.
+-    $this->createFacet('owl');
+-    $this->createFacet('duck', 'keywords');
+-
+-    // Go to the views page.
+-    $this->drupalGet('search-api-test-fulltext');
+-
+-    // Make sure the blocks are shown on the page.
+-    $page = $this->getSession()->getPage();
+-    $block_owl = $page->findById('block-owl-block');
+-    $block_owl->isVisible();
+-    $block_duck = $page->findById('block-duck-block');
+-    $block_duck->isVisible();
+-    $this->assertSession()->pageTextContains('Displaying 5 search results');
+-
+-    // Check that the article link exists (and is formatted like a facet) link.
+-    $links = $this->xpath('//a//span[normalize-space(text())=:label]', [':label' => 'article']);
+-    $this->assertNotEmpty($links);
+-
+-    // Click the item facets.
+-    $owl_link = $this->assertSession()->elementExists("xpath", "//label[@for='owl-item']/span[1]");
+-    $owl_link->click();
+-
+-    $this->assertSession()->assertWaitOnAjaxRequest();
+-    $this->assertSession()->pageTextContains('Displaying 3 search results');
+-
+-    // Check that the article facet is now gone.
+-    $links = $this->xpath('//a//span[normalize-space(text())=:label]', [':label' => 'article']);
+-    $this->assertEmpty($links);
+-
+-    // Click the item facet again, and check that the article facet is back.
+-    $owl_link->click();
+-    $this->assertSession()->assertWaitOnAjaxRequest();
+-    $this->assertSession()->pageTextContains('Displaying 5 search results');
+-    $links = $this->xpath('//a//span[normalize-space(text())=:label]', [':label' => 'article']);
+-    $this->assertNotEmpty($links);
+-
+-    // Check that the strawberry link disappears when filtering on items.
+-    $links = $this->xpath('//a//span[normalize-space(text())=:label]', [':label' => 'strawberry']);
+-    $this->assertNotEmpty($links);
+-
+-    $owl_link->click();
+-    $this->assertSession()->assertWaitOnAjaxRequest();
+-    $links = $this->xpath('//a//span[normalize-space(text())=:label]', [':label' => 'strawberry']);
+-    $this->assertEmpty($links);
+-  }
+-
+-  /**
+-   * Tests ajax dropdown.
+-   */
+-  public function testAjaxDropdown() {
+-    // Create facets.
+-    $this->createFacet('owl');
+-    $this->createFacet('duck', 'category', 'dropdown', []);
+-
+-    // Go to the views page.
+-    $this->drupalGet('search-api-test-fulltext');
+-
+-    // Make sure the blocks are shown on the page.
+-    $page = $this->getSession()->getPage();
+-    $block_owl = $page->findById('block-owl-block');
+-    $block_owl->isVisible();
+-    $block_duck = $page->findById('block-duck-block');
+-    $block_duck->isVisible();
+-    $this->assertSession()->pageTextContains('Displaying 5 search results');
+-
+-    // Check that the article_category option disappears when filtering on item.
+-    $dropdown_entry = $this->xpath('//*[@id="block-duck-block"]/div/select/option[normalize-space(text())=:label]', [':label' => 'article_category']);
+-    $this->assertNotEmpty($dropdown_entry);
+-    $owl_link = $this->assertSession()->elementExists("xpath", "//label[@for='owl-item']/span[1]");
+-    $owl_link->click();
+-    $this->assertSession()->assertWaitOnAjaxRequest();
+-    $dropdown_entry = $this->xpath('//*[@id="block-duck-block"]/div/select/option[normalize-space(text())=:label]', [':label' => 'article_category']);
+-    $this->assertEmpty($dropdown_entry);
+-
+-    // Click the item facet again.
+-    $owl_link->click();
+-    $this->assertSession()->assertWaitOnAjaxRequest();
+-
+-    // Select the article_category in the dropdown.
+-    $dropdown = $this->xpath('//*[@id="block-duck-block"]/div/select');
+-    $dropdown[0]->selectOption('article_category');
+-    $this->assertSession()->assertWaitOnAjaxRequest();
+-
+-    $this->assertSession()->pageTextContains('Displaying 2 search results');
+-
+-    // Check that the article link exists (and is formatted like a facet) link.
+-    $links = $this->xpath('//a//span[normalize-space(text())=:label]', [':label' => 'article']);
+-    $this->assertNotEmpty($links);
+-    // Check that the item link didn't exists.
+-    $links = $this->xpath('//a//span[normalize-space(text())=:label]', [':label' => 'item']);
+-    $this->assertEmpty($links);
+-  }
+-
+-  /**
+-   * Tests ajax checkbox.
+-   */
+-  public function testAjaxCheckbox() {
+-    // Create facets.
+-    $this->createFacet('owl');
+-    $this->createFacet('duck', 'keywords', 'checkbox');
+-
+-    // Go to the views page.
+-    $this->drupalGet('search-api-test-fulltext');
+-
+-    // Make sure the blocks are shown on the page.
+-    $page = $this->getSession()->getPage();
+-    $block_owl = $page->findById('block-owl-block');
+-    $block_owl->isVisible();
+-    $block_duck = $page->findById('block-duck-block');
+-    $block_duck->isVisible();
+-    $this->assertSession()->pageTextContains('Displaying 5 search results');
+-
+-    // Check that the article link exists (and is formatted like a facet) link.
+-    $links = $this->xpath('//a//span[normalize-space(text())=:label]', [':label' => 'article']);
+-    $this->assertNotEmpty($links);
+-
+-    // Click the item facet.
+-    $owl_link = $this->assertSession()->elementExists("xpath", "//label[@for='owl-item']/span[1]");
+-    $owl_link->click();
+-
+-    $this->assertSession()->assertWaitOnAjaxRequest();
+-    $this->assertSession()->pageTextContains('Displaying 3 search results');
+-
+-    // Check that the article facet is now gone.
+-    $links = $this->xpath('//a//span[normalize-space(text())=:label]', [':label' => 'article']);
+-    $this->assertEmpty($links);
+-
+-    // Click the item facet again, and check that the article facet is back.
+-    $owl_link->click();
+-    $this->assertSession()->assertWaitOnAjaxRequest();
+-    $this->assertSession()->pageTextContains('Displaying 5 search results');
+-    $links = $this->xpath('//a//span[normalize-space(text())=:label]', [':label' => 'article']);
+-    $this->assertNotEmpty($links);
+-
+-    // Check that the strawberry link disappears when filtering on items.
+-    $links = $this->xpath('//a//span[normalize-space(text())=:label]', [':label' => 'strawberry']);
+-    $this->assertNotEmpty($links);
+-    $owl_link->click();
+-    $this->assertSession()->assertWaitOnAjaxRequest();
+-    $links = $this->xpath('//a//span[normalize-space(text())=:label]', [':label' => 'strawberry']);
+-    $this->assertEmpty($links);
+-    $owl_link->click();
+-
+-    $this->getSession()->getPage()->checkField('strawberry');
+-    // Check that the article link exists (and is formatted like a facet) link.
+-    $links = $this->xpath('//a//span[normalize-space(text())=:label]', [':label' => 'article']);
+-    $this->assertNotEmpty($links);
+-    // Check that the item link didn't exists.
+-    $links = $this->xpath('//a//span[normalize-space(text())=:label]', [':label' => 'item']);
+-    $this->assertEmpty($links);
+-  }
+-
+   /**
+    * Tests links with exposed filters.
+    */
+diff --git a/tests/src/Kernel/FacetManager/DefaultFacetManagerTest.php b/tests/src/Kernel/FacetManager/DefaultFacetManagerTest.php
+index 878da30..183c6fa 100644
+--- a/tests/src/Kernel/FacetManager/DefaultFacetManagerTest.php
++++ b/tests/src/Kernel/FacetManager/DefaultFacetManagerTest.php
+@@ -336,6 +336,7 @@ class DefaultFacetManagerTest extends EntityKernelTestBase {
+         // Added by views view source plugin.
+         'config:views.view.search_api_test_view',
+         'config:search_api.index.database_search_index',
++        'search_api_list:database_search_index',
+       ],
+     ];
+     return [
+@@ -348,15 +349,7 @@ class DefaultFacetManagerTest extends EntityKernelTestBase {
+       // strategy.
+       [
+         'search_api:views_page__search_api_test_view__page_2_sapi_tag',
+-        array_merge_recursive(
+-          $basic,
+-          [
+-            'tags' => [
+-              'search_api_list:database_search_index',
+-            ],
+-            'max-age' => Cache::PERMANENT,
+-          ]
+-        ),
++        $basic + ['max-age' => Cache::PERMANENT],
+       ],
+       // Expected cacheability for the facet with a source that has TIME cache
+       // strategy.
+diff --git a/tests/src/Unit/Result/ResultTest.php b/tests/src/Unit/Result/ResultTest.php
+index b70c844..e52c955 100644
+--- a/tests/src/Unit/Result/ResultTest.php
++++ b/tests/src/Unit/Result/ResultTest.php
+@@ -43,6 +43,15 @@ class ResultTest extends UnitTestCase {
+     $url = new Url('foo');
+     $result->setUrl($url);
+     $this->assertSame($url, $result->getUrl());
++
++    $property = ['foo', 'bar'];
++    $value = 'baz';
++    $result->set($property, $value);
++    $this->assertSame($value, $result->get($property));
++
++    $storage = ['foo' => ['bar']];
++    $result->setStorage($storage);
++    $this->assertSame($storage, $result->getStorage());
+   }
+
+ }
diff --git a/resources/patch/php/drupal/facets/3459093.patch b/resources/patch/php/drupal/facets/3459093.patch
new file mode 100644
index 0000000000..3e2a8db3fe
--- /dev/null
+++ b/resources/patch/php/drupal/facets/3459093.patch
@@ -0,0 +1,26 @@
+diff --git a/config/schema/facets.processor.schema.yml b/config/schema/facets.processor.schema.yml
+index 7154952fbac82c9b61dec65dc10f31ecfcb98479..045106e1de94b452ebd8f4aadce39b3a7bdfd998 100644
+--- a/config/schema/facets.processor.schema.yml
++++ b/config/schema/facets.processor.schema.yml
+@@ -1,5 +1,5 @@
+ plugin.plugin_configuration.facets_processor.*:
+-  type: config_object
++  type: mapping
+ 
+ plugin.plugin_configuration.facets_processor.count_widget_widget_order:
+   type: mapping
+diff --git a/modules/facets_summary/config/schema/facets_summary.processor.schema.yml b/modules/facets_summary/config/schema/facets_summary.processor.schema.yml
+index 13ef5949fbe6d3072f1e63610e8da7030faa0eb9..83a2009b79c951e7eaa774a2c8c410443e87c931 100644
+--- a/modules/facets_summary/config/schema/facets_summary.processor.schema.yml
++++ b/modules/facets_summary/config/schema/facets_summary.processor.schema.yml
+@@ -1,8 +1,8 @@
+ plugin.plugin_configuration.facets_summary_processor.show_summary:
+-  type: config_object
++  type: mapping
+ 
+ plugin.plugin_configuration.facets_summary_processor.show_count:
+-  type: config_object
++  type: mapping
+ 
+ plugin.plugin_configuration.facets_summary_processor.show_text_when_empty:
+   type: mapping
diff --git a/resources/patch/php/drupal/facets/sa-contrib-2024-047.patch b/resources/patch/php/drupal/facets/sa-contrib-2024-047.patch
new file mode 100644
index 0000000000..8c0788d3c2
--- /dev/null
+++ b/resources/patch/php/drupal/facets/sa-contrib-2024-047.patch
@@ -0,0 +1,39 @@
+From 718741fc321f7e2eef486c8233b4ea604149ce80 Mon Sep 17 00:00:00 2001
+From: Jimmy Henderickx <jimmyhdx@gmail.com>
+Date: Wed, 9 Oct 2024 09:23:41 +0200
+Subject: [PATCH] Facets Summary refactor
+
+---
+ .../FacetsSummaryManager/DefaultFacetsSummaryManager.php | 9 +++++++++
+ 1 file changed, 9 insertions(+)
+
+diff --git a/modules/facets_summary/src/FacetsSummaryManager/DefaultFacetsSummaryManager.php b/modules/facets_summary/src/FacetsSummaryManager/DefaultFacetsSummaryManager.php
+index bfb236cb..13408b96 100644
+--- a/modules/facets_summary/src/FacetsSummaryManager/DefaultFacetsSummaryManager.php
++++ b/modules/facets_summary/src/FacetsSummaryManager/DefaultFacetsSummaryManager.php
+@@ -12,6 +12,7 @@ use Drupal\facets_summary\Processor\BuildProcessorInterface;
+ use Drupal\facets_summary\Processor\ProcessorInterface;
+ use Drupal\facets_summary\Processor\ProcessorPluginManager;
+ use Drupal\facets_summary\FacetsSummaryInterface;
++use Drupal\Component\Utility\Xss;
+ 
+ /**
+  * The facet summary manager.
+@@ -156,6 +157,14 @@ class DefaultFacetsSummaryManager {
+       $build = $processor->build($facets_summary, $build, $facets);
+     }
+ 
++    if (isset($build["#items"])) {
++      foreach ($build["#items"] as &$item) {
++        if (isset($item["#title"]) and is_string($item["#title"])) {
++          $item["#title"] = Xss::filter($item["#title"]);
++        }
++      }
++    }
++
+     return $build;
+   }
+ 
+-- 
+GitLab
+
-- 
GitLab


From 1fca3b8b163b0792488f38ed118f72b84031ccfd Mon Sep 17 00:00:00 2001
From: Zoltan Horvath <zoltan.horvath@ext.ec.europa.eu>
Date: Sun, 29 Dec 2024 01:34:44 +0100
Subject: [PATCH 089/137] ISAICP-9310: Downgrade Facets back to 3.0.0-beta1

---
 composer.lock | 32 +++++++++++++++-----------------
 1 file changed, 15 insertions(+), 17 deletions(-)

diff --git a/composer.lock b/composer.lock
index 009e713e6a..9024b5a7e5 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": "b4ad3a65c29792adbf6a1e4af91863ff",
+    "content-hash": "cb2f167201654a3e5ebc78b2c5c6a922",
     "packages": [
         {
             "name": "asm89/stack-cors",
@@ -4008,30 +4008,28 @@
         },
         {
             "name": "drupal/facets",
-            "version": "3.0.0-beta4",
+            "version": "3.0.0-beta1",
             "source": {
                 "type": "git",
                 "url": "https://git.drupalcode.org/project/facets.git",
-                "reference": "3.0.0-beta4"
+                "reference": "3.0.0-beta1"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://ftp.drupal.org/files/projects/facets-3.0.0-beta4.zip",
-                "reference": "3.0.0-beta4",
-                "shasum": "949eef98b4b5d450a8a81bda2030583567dfb52d"
+                "url": "https://ftp.drupal.org/files/projects/facets-3.0.0-beta1.zip",
+                "reference": "3.0.0-beta1",
+                "shasum": "788ab7515e2e6aabd0e34c1ce54c29648c738b45"
             },
             "require": {
-                "drupal/core": "^10.1 || ^11"
+                "drupal/core": "^9.3 || ^10.0"
             },
             "conflict": {
-                "drupal/core": "<10.1.0",
-                "drupal/search_api": "<1.30"
+                "drupal/search_api": "<1.14"
             },
             "require-dev": {
-                "drupal/better_exposed_filters": "*",
-                "drupal/jquery_ui_slider": "^2.1",
-                "drupal/jquery_ui_touch_punch": "^1.1",
-                "drupal/search_api": "1.x-dev"
+                "drupal/jquery_ui_slider": "~2.0",
+                "drupal/jquery_ui_touch_punch": "~1.1",
+                "drupal/search_api": "^1.28||1.x-dev"
             },
             "suggest": {
                 "drupal/better_exposed_filters": "Required for AJAX support for facets rendered as views exposed filters",
@@ -4041,8 +4039,8 @@
             "type": "drupal-module",
             "extra": {
                 "drupal": {
-                    "version": "3.0.0-beta4",
-                    "datestamp": "1731954099",
+                    "version": "3.0.0-beta1",
+                    "datestamp": "1671208547",
                     "security-coverage": {
                         "status": "not-covered",
                         "message": "Beta releases are not covered by Drupal security advisories."
@@ -4051,7 +4049,7 @@
             },
             "notification-url": "https://packages.drupal.org/8/downloads",
             "license": [
-                "GPL-2.0-or-later"
+                "GPL-2.0+"
             ],
             "authors": [
                 {
@@ -4078,7 +4076,7 @@
             "description": "The Facet module allows site builders to easily create and manage faceted search interfaces.",
             "homepage": "https://www.drupal.org/project/facets",
             "support": {
-                "source": "https://git.drupalcode.org/project/facets.git",
+                "source": "git://git.drupal.org/project/facets.git",
                 "issues": "https://www.drupal.org/project/issues/facets",
                 "irc": "irc://irc.freenode.org/drupal-search-api"
             }
-- 
GitLab


From b4fa7e07ce89d5d01846666eaba271bc90a23f80 Mon Sep 17 00:00:00 2001
From: Zoltan Horvath <zoltan.horvath@ext.ec.europa.eu>
Date: Fri, 20 Dec 2024 16:31:10 +0100
Subject: [PATCH 090/137] ISAICP-9310: Remove leftover update tests

---
 tests/features/update/ISAICP-8924.feature | 15 ---------------
 tests/features/update/ISAICP-9210.feature | 21 ---------------------
 tests/features/update/ISAICP-9212.feature | 10 ----------
 3 files changed, 46 deletions(-)
 delete mode 100644 tests/features/update/ISAICP-8924.feature
 delete mode 100644 tests/features/update/ISAICP-9210.feature
 delete mode 100644 tests/features/update/ISAICP-9212.feature

diff --git a/tests/features/update/ISAICP-8924.feature b/tests/features/update/ISAICP-8924.feature
deleted file mode 100644
index 080fe3e081..0000000000
--- a/tests/features/update/ISAICP-8924.feature
+++ /dev/null
@@ -1,15 +0,0 @@
-@api @group-clone
-Feature: Test spatial coverage migration.
-
-  @update:joinup_core_post_update_200100
-  Scenario Outline: Check spatial coverage migration
-    Given I am logged in as a moderator
-    Then I visit "<url>"
-    And I click "Edit" in the "Entity actions" region
-    Then the "Geographical coverage" entity reference autocomplete widget should contain values "<values>"
-
-    Examples:
-      | url                                                                         | values                             |
-      | /collection/egovernment/document/document-management-common-module          | Spain (9881)                       |
-      | /collection/egovernment/news/be-nl-governments-will-not                     | Belgium (9873), Netherlands (9903) |
-      | /collection/open-source-observatory-osor/event/10th-libre-software-meeting  | France (9884)                      |
diff --git a/tests/features/update/ISAICP-9210.feature b/tests/features/update/ISAICP-9210.feature
deleted file mode 100644
index 7141a0a65a..0000000000
--- a/tests/features/update/ISAICP-9210.feature
+++ /dev/null
@@ -1,21 +0,0 @@
-@api @group-clone
-Feature: Test share functionality for solution.
-
-  @update:joinup_core_deploy_200100 @javascript
-  Scenario Outline: Check share functionality for solution
-    Given I visit "<url>"
-    And I click "Share"
-    Then a modal should open
-    And I should see the following lines of text:
-      | Share on               |
-      | Facebook               |
-      | Twitter                |
-      | Linkedin               |
-
-    Examples:
-      | url                                                                                                                           |
-      | /collection/spain-center-technology-transfer/solution/adaptation-accessing-electronic-dossier                                 |
-      | /collection/spain-center-technology-transfer/solution/local-administration-ocw-territorial-information-systems-local-entities |
-      | /collection/spain-center-technology-transfer/solution/electronic-headquarters-type-government-canary-islands                  |
-      | /collection/spain-center-technology-transfer/solution/external-signs-documents-jcyl                                           |
-      | /collection/spain-center-technology-transfer/solution/integrated-system-management-population-and-territory                   |
diff --git a/tests/features/update/ISAICP-9212.feature b/tests/features/update/ISAICP-9212.feature
deleted file mode 100644
index 3b1505f76f..0000000000
--- a/tests/features/update/ISAICP-9212.feature
+++ /dev/null
@@ -1,10 +0,0 @@
-@api @group-clone
-Feature: Test assessments epic.
-
-  @update:joinup_assessment_deploy_200100
-  Scenario: Check assessment report page update
-    Given I am logged in as a moderator
-    When I visit "/collection/assessments/assessment-reports"
-    Then I should see the heading "Assessment reports"
-    And I should see the link "New assessment"
-    And I should see "There's are no published assessment reports yet. You can add one by filling this questionnaire"
-- 
GitLab


From 85840edd7832f0fef63174ea757d9b5ce1326f83 Mon Sep 17 00:00:00 2001
From: Zoltan Horvath <zoltan.horvath@ext.ec.europa.eu>
Date: Sun, 29 Dec 2024 02:13:43 +0100
Subject: [PATCH 091/137] ISAICP-9310: Remove unused behat step definition

---
 tests/src/Context/FeatureContext.php | 44 ----------------------------
 1 file changed, 44 deletions(-)

diff --git a/tests/src/Context/FeatureContext.php b/tests/src/Context/FeatureContext.php
index 4bc9a28467..96cc45aa24 100644
--- a/tests/src/Context/FeatureContext.php
+++ b/tests/src/Context/FeatureContext.php
@@ -997,50 +997,6 @@ public function fillFieldWithValues(string $field, string $values): void {
     }
   }
 
-  /**
-   * Check a multi-value field value.
-   *
-   * @param string $field
-   *   The name of the field.
-   * @param string $values
-   *   A comma separated list of values.
-   *
-   * @throws \Exception
-   *   When the field cannot be found or the number of values is different from
-   *   the number of elements found.
-   *
-   * @Then the :field entity reference autocomplete widget should contain values :values
-   */
-  public function assertEntityReferenceAutocompleteFieldValues(string $field, string $values): void {
-    $values = $this->explodeCommaSeparatedStepArgument($values);
-
-    /** @var \Behat\Mink\Element\NodeElement[] $items */
-    $items = $this->getSession()->getPage()->findAll('named', ['field', $field]);
-
-    if (empty($items)) {
-      throw new \Exception("Cannot find field $field.");
-    }
-
-    // +1 because we have one empty field.
-    if (count($items) !== count($values) + 1) {
-      throw new \Exception('Expected ' . count($values) . ' items for field ' . $field . ', found ' . count($items));
-    }
-
-    $currrent_values = array_filter(
-      array_map(function ($item) {
-        return $item->getValue();
-      }, $items),
-      function ($value) {
-        return !empty($value);
-      }
-    );
-
-    $not_found = array_diff($currrent_values, $values);
-    if (!empty($not_found)) {
-      throw new \Exception(sprintf("Value '%s' not found in field '%s'", implode(', ', $not_found), $field));
-    }
-  }
-
   /**
    * Asserts that a whole region is not present in the page.
    *
-- 
GitLab


From 33d2da78b2c423e345d247f96a7f9970cb93984f Mon Sep 17 00:00:00 2001
From: Zoltan Horvath <zoltan.horvath@ext.ec.europa.eu>
Date: Fri, 20 Dec 2024 16:58:49 +0100
Subject: [PATCH 092/137] ISAICP-9310: Update Solr config for
 drupal/search_api_solr 4.3.7

---
 resources/solr/conf/schema.xml     | 2 +-
 resources/solr/conf/solrconfig.xml | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/resources/solr/conf/schema.xml b/resources/solr/conf/schema.xml
index 34a8dedebb..1382385a33 100644
--- a/resources/solr/conf/schema.xml
+++ b/resources/solr/conf/schema.xml
@@ -49,7 +49,7 @@
     that avoids logging every request
 -->
 
-<schema name="drupal-4.3.5-solr-8.x-0" version="1.6">
+<schema name="drupal-4.3.7-solr-8.x-0" version="1.6">
   <!-- attribute "name" is the name of this schema and is only used for display purposes.
        version="x.y" is Solr's version number for the schema syntax and
        semantics.  It should not normally be changed by applications.
diff --git a/resources/solr/conf/solrconfig.xml b/resources/solr/conf/solrconfig.xml
index f6fb0d35d5..c16e0cc98e 100644
--- a/resources/solr/conf/solrconfig.xml
+++ b/resources/solr/conf/solrconfig.xml
@@ -11,7 +11,7 @@
      For more details about configurations options that may appear in
      this file, see http://wiki.apache.org/solr/SolrConfigXml.
 -->
-<config name="drupal-4.3.5-solr-8.x-0" >
+<config name="drupal-4.3.7-solr-8.x-0" >
   <!-- In all configuration below, a prefix of "solr." for class names
        is an alias that causes solr to search appropriate packages,
        including org.apache.solr.(search|update|request|core|analysis)
-- 
GitLab


From 6761e371d71d376cb76957987d5173ecd0578f93 Mon Sep 17 00:00:00 2001
From: Ilias Dimopoulos <idimopoulos@hotmail.com>
Date: Fri, 3 Jan 2025 22:33:39 +0200
Subject: [PATCH 093/137] ISAICP-8839: Simplify the presave function for
 notifications.

---
 .../joinup_notification.module                  | 17 +++--------------
 1 file changed, 3 insertions(+), 14 deletions(-)

diff --git a/web/modules/custom/joinup_notification/joinup_notification.module b/web/modules/custom/joinup_notification/joinup_notification.module
index 69da4513d9..011512ed31 100644
--- a/web/modules/custom/joinup_notification/joinup_notification.module
+++ b/web/modules/custom/joinup_notification/joinup_notification.module
@@ -9,12 +9,9 @@
 
 use Drupal\Core\Entity\EntityInterface;
 use Drupal\Core\Render\Markup;
-use Drupal\joinup_community_content\Entity\CommunityContentInterface;
-use Drupal\joinup_distribution\Entity\DistributionInterface;
-use Drupal\joinup_group\Entity\GroupInterface;
 use Drupal\joinup_notification\Event\NotificationEvent;
 use Drupal\joinup_notification\NotificationEvents;
-use Drupal\joinup_release\Entity\ReleaseInterface;
+use Drupal\joinup_workflow\EntityWorkflowStateInterface;
 use Drupal\symfony_mailer_lite\Plugin\Mail\SymfonyMailer;
 
 /**
@@ -42,17 +39,9 @@ function joinup_notification_node_insert(EntityInterface $entity): void {
  * @see https://www.drupal.org/node/2833084
  */
 function joinup_notification_node_presave(EntityInterface $entity): void {
-  // @todo To be unified in ISAICP-8839 - maybe create a new interface?.
-  if (
-    $entity->isNew()
-      || !($entity instanceof CommunityContentInterface
-      || $entity instanceof DistributionInterface
-      || $entity instanceof ReleaseInterface
-      || $entity instanceof GroupInterface
-    )) {
-    return;
+  if (!$entity->isNew() && $entity instanceof EntityWorkflowStateInterface && $entity->hasWorkflow()) {
+    $entity->field_state_initial_value = $entity->get('field_state')->first()->getOriginalId();
   }
-  $entity->field_state_initial_value = $entity->get('field_state')->first()->getOriginalId();
 }
 
 /**
-- 
GitLab


From 3992e241a4e29c649077f6900a49d3afa13e4eb0 Mon Sep 17 00:00:00 2001
From: Adrian Lorenc <adrian.lorenc@gmail.com>
Date: Mon, 6 Jan 2025 10:03:54 +0100
Subject: [PATCH 094/137] ISAICP-9308: Use https://asset-packagist.org.

---
 composer.json |  31 +++++++++---
 composer.lock | 137 +++++++++++++++++++++++++++++++++++++++++++++++++-
 2 files changed, 161 insertions(+), 7 deletions(-)

diff --git a/composer.json b/composer.json
index c8316e051c..e36980c244 100644
--- a/composer.json
+++ b/composer.json
@@ -126,6 +126,11 @@
         "jakeasmith/http_build_url": "^1.0",
         "knplabs/github-api": "^3.13",
         "m4tthumphrey/php-gitlab-api": "^11.12",
+        "npm-asset/dompurify": "^3.0.9",
+        "npm-asset/jquery-colorbox": "^1.6.4",
+        "npm-asset/jquery-jsonview": "^1.2.3",
+        "npm-asset/slick-carousel": ">1.8.1 || <1.8.1",
+        "oomphinc/composer-installers-extender": "^2.0",
         "openeuropa/composer-artifacts": "^1.0",
         "openeuropa/gisco-geocoding-provider": "^1.0",
         "openeuropa/oe_bootstrap_theme": "^1.0",
@@ -186,15 +191,16 @@
             "php": "8.3"
         },
         "allow-plugins": {
-            "dealerdirect/phpcodesniffer-composer-installer": true,
-            "cweagans/composer-patches": true,
             "composer/installers": true,
+            "cweagans/composer-patches": true,
+            "dealerdirect/phpcodesniffer-composer-installer": true,
             "drupal/core-composer-scaffold": true,
+            "ec-europa/toolkit-composer-plugin": true,
+            "oomphinc/composer-installers-extender": true,
             "openeuropa/composer-artifacts": true,
-            "phpstan/extension-installer": true,
             "php-http/discovery": true,
-            "ec-europa/toolkit-composer-plugin": true,
-            "phpro/grumphp-shim": true
+            "phpro/grumphp-shim": true,
+            "phpstan/extension-installer": true
         }
     },
     "autoload": {
@@ -238,7 +244,14 @@
         ]
     },
     "extra": {
+        "installer-types": [
+            "bower-asset",
+            "npm-asset"
+        ],
         "installer-paths": {
+            "web/libraries/slick": [
+                "npm-asset/slick-carousel"
+            ],
             "drush/Commands/{$name}": [
                 "type:drupal-drush"
             ],
@@ -249,7 +262,9 @@
                 "type:drupal-core"
             ],
             "web/libraries/{$name}": [
-                "type:drupal-library"
+                "type:drupal-library",
+                "type:bower-asset",
+                "type:npm-asset"
             ],
             "web/modules/contrib/{$name}": [
                 "type:drupal-module"
@@ -504,6 +519,10 @@
             "type": "composer",
             "url": "https://packages.drupal.org/8"
         },
+        {
+            "type": "composer",
+            "url": "https://asset-packagist.org"
+        },
         {
             "type": "package",
             "package": {
diff --git a/composer.lock b/composer.lock
index 9024b5a7e5..15661c68a8 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": "cb2f167201654a3e5ebc78b2c5c6a922",
+    "content-hash": "10055e7cd3e5efee7561164730fefbda",
     "packages": [
         {
             "name": "asm89/stack-cors",
@@ -12318,6 +12318,141 @@
             },
             "time": "2024-10-08T18:51:32+00:00"
         },
+        {
+            "name": "npm-asset/dompurify",
+            "version": "3.2.3",
+            "dist": {
+                "type": "tar",
+                "url": "https://registry.npmjs.org/dompurify/-/dompurify-3.2.3.tgz"
+            },
+            "require": {
+                "npm-asset/types--trusted-types": ">=2.0.7,<3.0.0"
+            },
+            "type": "npm-asset",
+            "license": [
+                "(MPL-2.0 OR Apache-2.0)"
+            ]
+        },
+        {
+            "name": "npm-asset/jquery",
+            "version": "3.7.1",
+            "dist": {
+                "type": "tar",
+                "url": "https://registry.npmjs.org/jquery/-/jquery-3.7.1.tgz"
+            },
+            "type": "npm-asset",
+            "license": [
+                "MIT"
+            ]
+        },
+        {
+            "name": "npm-asset/jquery-colorbox",
+            "version": "1.6.4",
+            "dist": {
+                "type": "tar",
+                "url": "https://registry.npmjs.org/jquery-colorbox/-/jquery-colorbox-1.6.4.tgz"
+            },
+            "require": {
+                "npm-asset/jquery": ">=1.3.2"
+            },
+            "type": "npm-asset",
+            "license": [
+                "MIT"
+            ]
+        },
+        {
+            "name": "npm-asset/jquery-jsonview",
+            "version": "1.2.3",
+            "dist": {
+                "type": "tar",
+                "url": "https://registry.npmjs.org/jquery-jsonview/-/jquery-jsonview-1.2.3.tgz"
+            },
+            "type": "npm-asset",
+            "license": [
+                "MIT"
+            ]
+        },
+        {
+            "name": "npm-asset/slick-carousel",
+            "version": "1.8.0",
+            "dist": {
+                "type": "tar",
+                "url": "https://registry.npmjs.org/slick-carousel/-/slick-carousel-1.8.0.tgz"
+            },
+            "type": "npm-asset",
+            "license": [
+                "MIT"
+            ]
+        },
+        {
+            "name": "npm-asset/types--trusted-types",
+            "version": "2.0.7",
+            "dist": {
+                "type": "tar",
+                "url": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz"
+            },
+            "type": "npm-asset",
+            "license": [
+                "MIT"
+            ]
+        },
+        {
+            "name": "oomphinc/composer-installers-extender",
+            "version": "2.0.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/oomphinc/composer-installers-extender.git",
+                "reference": "cbf4b6f9a24153b785d09eee755b995ba87bd5f9"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/oomphinc/composer-installers-extender/zipball/cbf4b6f9a24153b785d09eee755b995ba87bd5f9",
+                "reference": "cbf4b6f9a24153b785d09eee755b995ba87bd5f9",
+                "shasum": ""
+            },
+            "require": {
+                "composer-plugin-api": "^1.1 || ^2.0",
+                "composer/installers": "^1.0 || ^2.0",
+                "php": ">=7.1"
+            },
+            "require-dev": {
+                "composer/composer": "^2.0",
+                "phpunit/phpunit": "^7.2",
+                "squizlabs/php_codesniffer": "^3.3"
+            },
+            "type": "composer-plugin",
+            "extra": {
+                "class": "OomphInc\\ComposerInstallersExtender\\Plugin"
+            },
+            "autoload": {
+                "psr-4": {
+                    "OomphInc\\ComposerInstallersExtender\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Stephen Beemsterboer",
+                    "email": "stephen@oomphinc.com",
+                    "homepage": "https://github.com/balbuf"
+                },
+                {
+                    "name": "Nathan Dentzau",
+                    "email": "nate@oomphinc.com",
+                    "homepage": "http://oomph.is/ndentzau"
+                }
+            ],
+            "description": "Extend the composer/installers plugin to accept any arbitrary package type.",
+            "homepage": "http://www.oomphinc.com/",
+            "support": {
+                "issues": "https://github.com/oomphinc/composer-installers-extender/issues",
+                "source": "https://github.com/oomphinc/composer-installers-extender/tree/2.0.1"
+            },
+            "time": "2021-12-15T12:32:42+00:00"
+        },
         {
             "name": "openeuropa/composer-artifacts",
             "version": "1.0.0-alpha1",
-- 
GitLab


From c86745179efbf092d50a16ea36ade87c0131331c Mon Sep 17 00:00:00 2001
From: Adrian Lorenc <adrian.lorenc@gmail.com>
Date: Mon, 6 Jan 2025 10:13:04 +0100
Subject: [PATCH 095/137] ISAICP-9308: Remove copy-libraries and packages.

---
 package-lock.json           | 53 +------------------------------------
 package.json                |  8 ++----
 scripts/node/copy-libraries | 15 -----------
 3 files changed, 3 insertions(+), 73 deletions(-)
 delete mode 100755 scripts/node/copy-libraries

diff --git a/package-lock.json b/package-lock.json
index 77bbc9add9..b9868dc98c 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -5,16 +5,11 @@
   "packages": {
     "": {
       "name": "joinup",
-      "hasInstallScript": true,
       "license": "EUPL-1.2",
       "dependencies": {
         "@glidejs/glide": "^3.6.0",
-        "dompurify": "^3.0.9",
-        "jquery-colorbox": "^1.6.4",
-        "jquery-jsonview": "^1.2.3",
         "mmenu-light": "^3.2.2",
-        "priority-plus": "^1.5.1",
-        "slick-carousel": ">1.8.1 || <1.8.1"
+        "priority-plus": "^1.5.1"
       },
       "devDependencies": {
         "@openeuropa/bcl-bootstrap": "1.2.0",
@@ -2778,13 +2773,6 @@
       "dev": true,
       "license": "MIT"
     },
-    "node_modules/@types/trusted-types": {
-      "version": "2.0.7",
-      "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz",
-      "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==",
-      "license": "MIT",
-      "optional": true
-    },
     "node_modules/@ungap/structured-clone": {
       "version": "1.2.1",
       "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.1.tgz",
@@ -4829,15 +4817,6 @@
         "url": "https://github.com/fb55/domhandler?sponsor=1"
       }
     },
-    "node_modules/dompurify": {
-      "version": "3.2.3",
-      "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.2.3.tgz",
-      "integrity": "sha512-U1U5Hzc2MO0oW3DF+G9qYN0aT7atAou4AgI0XjWz061nyBPbdxkfdhfy5uMgGn6+oLFCfn44ZGbdDqCzVmlOWA==",
-      "license": "(MPL-2.0 OR Apache-2.0)",
-      "optionalDependencies": {
-        "@types/trusted-types": "^2.0.7"
-      }
-    },
     "node_modules/domutils": {
       "version": "3.1.0",
       "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz",
@@ -7400,27 +7379,6 @@
         "node": ">= 10.13.0"
       }
     },
-    "node_modules/jquery": {
-      "version": "3.7.1",
-      "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.7.1.tgz",
-      "integrity": "sha512-m4avr8yL8kmFN8psrbFFFmB/If14iN5o9nw/NgnnM+kybDJpRsAynV2BsfpTYrTRysYUdADVD7CkUUizgkpLfg==",
-      "license": "MIT"
-    },
-    "node_modules/jquery-colorbox": {
-      "version": "1.6.4",
-      "resolved": "https://registry.npmjs.org/jquery-colorbox/-/jquery-colorbox-1.6.4.tgz",
-      "integrity": "sha512-nC5xs9dSmIZ5n62a9HreGJTUmZJwfZ2DQXDVnHKs3Z2VNg91o8FFGeu7OWcCxYj7QIkrCGoMypaCftrR8YEJsA==",
-      "license": "MIT",
-      "dependencies": {
-        "jquery": ">=1.3.2"
-      }
-    },
-    "node_modules/jquery-jsonview": {
-      "version": "1.2.3",
-      "resolved": "https://registry.npmjs.org/jquery-jsonview/-/jquery-jsonview-1.2.3.tgz",
-      "integrity": "sha512-f7nbWtNbhb/xIa9lTTw4rGkrlLVxqkfoi6bO+Dy5IK+9UGwM/vbEJZdfQgRnwj38nUXMbdMQUSWqaIhBCe71dQ==",
-      "license": "MIT"
-    },
     "node_modules/js-tokens": {
       "version": "4.0.0",
       "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
@@ -11158,15 +11116,6 @@
         "url": "https://github.com/chalk/slice-ansi?sponsor=1"
       }
     },
-    "node_modules/slick-carousel": {
-      "version": "1.8.0",
-      "resolved": "https://registry.npmjs.org/slick-carousel/-/slick-carousel-1.8.0.tgz",
-      "integrity": "sha512-MSMpaUJoeM7svF+pWDOZpme4PyxZ4SBCWpyBdFvw97RSeRYrjs+EsMT0fQpRxH2Qu7axEuS8d1uA7/G7IGm0CQ==",
-      "license": "MIT",
-      "peerDependencies": {
-        "jquery": ">=1.8.0"
-      }
-    },
     "node_modules/slim-select": {
       "version": "1.27.1",
       "resolved": "https://registry.npmjs.org/slim-select/-/slim-select-1.27.1.tgz",
diff --git a/package.json b/package.json
index d59e40b007..d8adb21d44 100644
--- a/package.json
+++ b/package.json
@@ -36,12 +36,8 @@
   },
   "dependencies": {
     "@glidejs/glide": "^3.6.0",
-    "dompurify": "^3.0.9",
-    "jquery-colorbox": "^1.6.4",
-    "jquery-jsonview": "^1.2.3",
     "mmenu-light": "^3.2.2",
-    "priority-plus": "^1.5.1",
-    "slick-carousel": ">1.8.1 || <1.8.1"
+    "priority-plus": "^1.5.1"
   },
   "scripts": {
     "watch": "npm-watch",
@@ -53,7 +49,7 @@
     "build:styles": "cross-env bcl-builder styles",
     "build:copy": "cross-env bcl-builder copy",
     "build:sprite": "cross-env bcl-builder sprite",
-    "postinstall": "patch-package --patch-dir=resources/patch/node && ./scripts/node/copy-libraries"
+    "postinstall": "patch-package --patch-dir=resources/patch/node"
   },
   "watch": {
     "build:styles": {
diff --git a/scripts/node/copy-libraries b/scripts/node/copy-libraries
deleted file mode 100755
index 63f1f6e994..0000000000
--- a/scripts/node/copy-libraries
+++ /dev/null
@@ -1,15 +0,0 @@
-#!/bin/bash
-
-WEB_LIBRARY_ROOT="web/libraries"
-
-echo "Copy required JavaScript libraries to '$WEB_LIBRARY_ROOT'"
-
-# Copy jQuery JSONView into the libraries folder.
-mkdir -p "$WEB_LIBRARY_ROOT/jquery-jsonview/dist" && cp node_modules/jquery-jsonview/dist/* "$WEB_LIBRARY_ROOT/jquery-jsonview/dist/"
-
-# Copy Slick Carousel library.
-mkdir -p "$WEB_LIBRARY_ROOT/slick" && cp -r "node_modules/slick-carousel/slick" "$WEB_LIBRARY_ROOT/slick"
-
-# Colorbox: Copy DOMPurify and Colorbox libraries.
-cp -r "node_modules/dompurify" "$WEB_LIBRARY_ROOT/dompurify"
-cp -r "node_modules/jquery-colorbox" "$WEB_LIBRARY_ROOT/colorbox"
-- 
GitLab


From 3ef60477aa71e81dadf14ff23b9a13e5b7a02b0c Mon Sep 17 00:00:00 2001
From: Adrian Lorenc <adrian.lorenc@gmail.com>
Date: Mon, 6 Jan 2025 10:21:11 +0100
Subject: [PATCH 096/137] ISAICP-9308: Add js-cookie.

---
 composer.json |  1 +
 composer.lock | 14 +++++++++++++-
 2 files changed, 14 insertions(+), 1 deletion(-)

diff --git a/composer.json b/composer.json
index e36980c244..b79a104399 100644
--- a/composer.json
+++ b/composer.json
@@ -129,6 +129,7 @@
         "npm-asset/dompurify": "^3.0.9",
         "npm-asset/jquery-colorbox": "^1.6.4",
         "npm-asset/jquery-jsonview": "^1.2.3",
+        "npm-asset/js-cookie": "^3.0.5",
         "npm-asset/slick-carousel": ">1.8.1 || <1.8.1",
         "oomphinc/composer-installers-extender": "^2.0",
         "openeuropa/composer-artifacts": "^1.0",
diff --git a/composer.lock b/composer.lock
index 15661c68a8..398ca47e23 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": "10055e7cd3e5efee7561164730fefbda",
+    "content-hash": "d74d2f63d161c364067011dc77450cab",
     "packages": [
         {
             "name": "asm89/stack-cors",
@@ -12372,6 +12372,18 @@
                 "MIT"
             ]
         },
+        {
+            "name": "npm-asset/js-cookie",
+            "version": "3.0.5",
+            "dist": {
+                "type": "tar",
+                "url": "https://registry.npmjs.org/js-cookie/-/js-cookie-3.0.5.tgz"
+            },
+            "type": "npm-asset",
+            "license": [
+                "MIT"
+            ]
+        },
         {
             "name": "npm-asset/slick-carousel",
             "version": "1.8.0",
-- 
GitLab


From 4e2f70f9caa56551aa0604030cbada025382bc7b Mon Sep 17 00:00:00 2001
From: Adrian Lorenc <adrian.lorenc@gmail.com>
Date: Mon, 6 Jan 2025 10:39:55 +0100
Subject: [PATCH 097/137] ISAICP-9308: js-cookie library is deprecated.

---
 .../custom/collection/collection.info.yml     |  1 +
 .../collection/collection.libraries.yml       |  2 +-
 .../contact_information.info.yml              | 19 ++++++++++---------
 .../contact_information.libraries.yml         |  2 +-
 4 files changed, 13 insertions(+), 11 deletions(-)

diff --git a/web/modules/custom/collection/collection.info.yml b/web/modules/custom/collection/collection.info.yml
index a80c142275..093c706e9c 100644
--- a/web/modules/custom/collection/collection.info.yml
+++ b/web/modules/custom/collection/collection.info.yml
@@ -22,5 +22,6 @@ dependencies:
   - joinup:oe_newsroom_newsletter
   - joinup:owner
   - joinup:search_api_field
+  - js_cookie:js_cookie
   - smart_trim:smart_trim
   - state_machine:state_machine
diff --git a/web/modules/custom/collection/collection.libraries.yml b/web/modules/custom/collection/collection.libraries.yml
index 3bd99f6aae..8a26985579 100644
--- a/web/modules/custom/collection/collection.libraries.yml
+++ b/web/modules/custom/collection/collection.libraries.yml
@@ -6,4 +6,4 @@ subscribe_dialog:
     - core/drupal.ajax
     - core/drupalSettings
     - core/once
-    - core/js-cookie
+    - js_cookie/js-cookie
diff --git a/web/modules/custom/contact_information/contact_information.info.yml b/web/modules/custom/contact_information/contact_information.info.yml
index ef8432a738..8dae4d5891 100644
--- a/web/modules/custom/contact_information/contact_information.info.yml
+++ b/web/modules/custom/contact_information/contact_information.info.yml
@@ -5,12 +5,13 @@ package: Joinup
 core_version_requirement: ">= 9.4"
 
 dependencies:
-  - 'drupal:language'
-  - 'drupal:link'
-  - 'drupal:text'
-  - 'email_confirmer:email_confirmer'
-  - 'email_contact:email_contact'
-  - 'joinup:joinup_core'
-  - 'joinup:joinup_group'
-  - 'joinup:joinup_workflow'
-  - 'state_machine:state_machine'
+  - drupal:language
+  - drupal:link
+  - drupal:text
+  - email_confirmer:email_confirmer
+  - email_contact:email_contact
+  - joinup:joinup_core
+  - joinup:joinup_group
+  - joinup:joinup_workflow
+  - js_cookie:js_cookie
+  - state_machine:state_machine
diff --git a/web/modules/custom/contact_information/contact_information.libraries.yml b/web/modules/custom/contact_information/contact_information.libraries.yml
index c1a1287ee9..7e1525f75f 100644
--- a/web/modules/custom/contact_information/contact_information.libraries.yml
+++ b/web/modules/custom/contact_information/contact_information.libraries.yml
@@ -4,7 +4,7 @@ contact-us:
     js/contact-us.js: {}
   dependencies:
     - core/drupal
-    - core/js-cookie
+    - js_cookie/js-cookie
 
 contactus:
   js:
-- 
GitLab


From 1ad2c79deea9d1837e7301c42fa1d284ccbe3fe3 Mon Sep 17 00:00:00 2001
From: Adrian Lorenc <adrian.lorenc@gmail.com>
Date: Mon, 6 Jan 2025 10:40:08 +0100
Subject: [PATCH 098/137] ISAICP-9308: Update path.

---
 composer.json | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/composer.json b/composer.json
index b79a104399..54b18632a6 100644
--- a/composer.json
+++ b/composer.json
@@ -253,6 +253,9 @@
             "web/libraries/slick": [
                 "npm-asset/slick-carousel"
             ],
+            "web/libraries/colorbox": [
+                "npm-asset/jquery-colorbox"
+            ],
             "drush/Commands/{$name}": [
                 "type:drupal-drush"
             ],
-- 
GitLab


From f5cbd70716fc636f2d2a79324764acaff2f72965 Mon Sep 17 00:00:00 2001
From: Adrian Lorenc <adrian.lorenc@gmail.com>
Date: Mon, 6 Jan 2025 10:41:24 +0100
Subject: [PATCH 099/137] ISAICP-9308: Update lock file.

---
 composer.lock | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/composer.lock b/composer.lock
index 398ca47e23..5f11c59345 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": "d74d2f63d161c364067011dc77450cab",
+    "content-hash": "9b962c3f372c9bb9149b054866255496",
     "packages": [
         {
             "name": "asm89/stack-cors",
-- 
GitLab


From 1477828b39ff630ec26bbbf850db7b2eb0ba856a Mon Sep 17 00:00:00 2001
From: Adrian Lorenc <adrian.lorenc@gmail.com>
Date: Tue, 7 Jan 2025 10:06:19 +0100
Subject: [PATCH 100/137] ISAICP-9055: Remove wip.

---
 tests/features/communities/oss_catalogue/oss_catalogue.feature | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/tests/features/communities/oss_catalogue/oss_catalogue.feature b/tests/features/communities/oss_catalogue/oss_catalogue.feature
index bf071ebdaa..477c9e50dd 100644
--- a/tests/features/communities/oss_catalogue/oss_catalogue.feature
+++ b/tests/features/communities/oss_catalogue/oss_catalogue.feature
@@ -128,8 +128,7 @@ Feature:
     When I go to the content page of the type "oss_solution" with the title "Foo"
     Then I should see the text "Foo's GIT description"
 
-  # TODO: Re-enable this test in ISAICP-9055.
-  @wip @loggedErrors
+  @loggedErrors
   Scenario: All necessary OSS Solution fields are visible on node page.
     Given oss_contact content:
       | title           |
-- 
GitLab


From 22dcfd0c63ec73100d6edc84c31c261fb02bd725 Mon Sep 17 00:00:00 2001
From: Adrian Lorenc <adrian.lorenc@gmail.com>
Date: Tue, 7 Jan 2025 11:45:42 +0100
Subject: [PATCH 101/137] ISAICP-9055: Use composer/spdx-licenses.

---
 composer.json                                 |   1 +
 composer.lock                                 | 162 +++++++++---------
 .../custom/eu_oss_catalogue/composer.json     |  14 +-
 3 files changed, 83 insertions(+), 94 deletions(-)

diff --git a/composer.json b/composer.json
index c8316e051c..9d27a83da5 100644
--- a/composer.json
+++ b/composer.json
@@ -15,6 +15,7 @@
         "cfpinto/graphql": "^2.0",
         "claudiu-cristea/drupal-cache-adapter": "^1.0",
         "composer/installers": "^2",
+        "composer/spdx-licenses": "^1.5",
         "cweagans/composer-patches": "^1.7",
         "drupal/addtocal": "^3.0",
         "drupal/allowed_formats": "^3.0",
diff --git a/composer.lock b/composer.lock
index 9024b5a7e5..509e3953eb 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": "cb2f167201654a3e5ebc78b2c5c6a922",
+    "content-hash": "a8a6de88c0116205678c889a4246d960",
     "packages": [
         {
             "name": "asm89/stack-cors",
@@ -681,6 +681,86 @@
             ],
             "time": "2024-09-19T14:15:21+00:00"
         },
+        {
+            "name": "composer/spdx-licenses",
+            "version": "1.5.8",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/composer/spdx-licenses.git",
+                "reference": "560bdcf8deb88ae5d611c80a2de8ea9d0358cc0a"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/composer/spdx-licenses/zipball/560bdcf8deb88ae5d611c80a2de8ea9d0358cc0a",
+                "reference": "560bdcf8deb88ae5d611c80a2de8ea9d0358cc0a",
+                "shasum": ""
+            },
+            "require": {
+                "php": "^5.3.2 || ^7.0 || ^8.0"
+            },
+            "require-dev": {
+                "phpstan/phpstan": "^0.12.55",
+                "symfony/phpunit-bridge": "^4.2 || ^5"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-main": "1.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Composer\\Spdx\\": "src"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Nils Adermann",
+                    "email": "naderman@naderman.de",
+                    "homepage": "http://www.naderman.de"
+                },
+                {
+                    "name": "Jordi Boggiano",
+                    "email": "j.boggiano@seld.be",
+                    "homepage": "http://seld.be"
+                },
+                {
+                    "name": "Rob Bast",
+                    "email": "rob.bast@gmail.com",
+                    "homepage": "http://robbast.nl"
+                }
+            ],
+            "description": "SPDX licenses list and validation library.",
+            "keywords": [
+                "license",
+                "spdx",
+                "validator"
+            ],
+            "support": {
+                "irc": "ircs://irc.libera.chat:6697/composer",
+                "issues": "https://github.com/composer/spdx-licenses/issues",
+                "source": "https://github.com/composer/spdx-licenses/tree/1.5.8"
+            },
+            "funding": [
+                {
+                    "url": "https://packagist.com",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/composer",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/composer/composer",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2023-11-20T07:44:33+00:00"
+        },
         {
             "name": "consolidation/annotated-command",
             "version": "4.10.1",
@@ -18665,86 +18745,6 @@
             ],
             "time": "2024-11-12T16:29:46+00:00"
         },
-        {
-            "name": "composer/spdx-licenses",
-            "version": "1.5.8",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/composer/spdx-licenses.git",
-                "reference": "560bdcf8deb88ae5d611c80a2de8ea9d0358cc0a"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/composer/spdx-licenses/zipball/560bdcf8deb88ae5d611c80a2de8ea9d0358cc0a",
-                "reference": "560bdcf8deb88ae5d611c80a2de8ea9d0358cc0a",
-                "shasum": ""
-            },
-            "require": {
-                "php": "^5.3.2 || ^7.0 || ^8.0"
-            },
-            "require-dev": {
-                "phpstan/phpstan": "^0.12.55",
-                "symfony/phpunit-bridge": "^4.2 || ^5"
-            },
-            "type": "library",
-            "extra": {
-                "branch-alias": {
-                    "dev-main": "1.x-dev"
-                }
-            },
-            "autoload": {
-                "psr-4": {
-                    "Composer\\Spdx\\": "src"
-                }
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "MIT"
-            ],
-            "authors": [
-                {
-                    "name": "Nils Adermann",
-                    "email": "naderman@naderman.de",
-                    "homepage": "http://www.naderman.de"
-                },
-                {
-                    "name": "Jordi Boggiano",
-                    "email": "j.boggiano@seld.be",
-                    "homepage": "http://seld.be"
-                },
-                {
-                    "name": "Rob Bast",
-                    "email": "rob.bast@gmail.com",
-                    "homepage": "http://robbast.nl"
-                }
-            ],
-            "description": "SPDX licenses list and validation library.",
-            "keywords": [
-                "license",
-                "spdx",
-                "validator"
-            ],
-            "support": {
-                "irc": "ircs://irc.libera.chat:6697/composer",
-                "issues": "https://github.com/composer/spdx-licenses/issues",
-                "source": "https://github.com/composer/spdx-licenses/tree/1.5.8"
-            },
-            "funding": [
-                {
-                    "url": "https://packagist.com",
-                    "type": "custom"
-                },
-                {
-                    "url": "https://github.com/composer",
-                    "type": "github"
-                },
-                {
-                    "url": "https://tidelift.com/funding/github/packagist/composer/composer",
-                    "type": "tidelift"
-                }
-            ],
-            "time": "2023-11-20T07:44:33+00:00"
-        },
         {
             "name": "composer/xdebug-handler",
             "version": "3.0.5",
diff --git a/web/modules/custom/eu_oss_catalogue/composer.json b/web/modules/custom/eu_oss_catalogue/composer.json
index cc60082c61..382f65c065 100644
--- a/web/modules/custom/eu_oss_catalogue/composer.json
+++ b/web/modules/custom/eu_oss_catalogue/composer.json
@@ -30,7 +30,7 @@
         "drupal/multivalue_form_element": "^1.0",
         "knplabs/github-api": "^3.0",
         "m4tthumphrey/php-gitlab-api": "^11.11",
-        "spdx/license-list-data": "1.0.0"
+        "composer/spdx-licenses": "^1.5"
     },
     "require-dev": {
         "drupal/http_request_mock": "^1.1",
@@ -56,18 +56,6 @@
         }
     },
     "repositories": [
-        {
-            "type": "package",
-            "package": {
-                "name": "spdx/license-list-data",
-                "version": "1.0.0",
-                "source": {
-                    "url": "https://github.com/spdx/license-list-data",
-                    "type": "git",
-                    "reference": "main"
-                }
-            }
-        },
         {
             "type": "composer",
             "url": "https://packages.drupal.org/8"
-- 
GitLab


From 0d4d94d451e809b7ad92c229cf80844655b08621 Mon Sep 17 00:00:00 2001
From: Adrian Lorenc <adrian.lorenc@gmail.com>
Date: Tue, 7 Jan 2025 11:46:17 +0100
Subject: [PATCH 102/137] ISAICP-9055: Limit duplications.

---
 .../eu_oss_catalogue/src/EuOssCatalogueInstallHelper.php | 9 ++++++++-
 1 file changed, 8 insertions(+), 1 deletion(-)

diff --git a/web/modules/custom/eu_oss_catalogue/src/EuOssCatalogueInstallHelper.php b/web/modules/custom/eu_oss_catalogue/src/EuOssCatalogueInstallHelper.php
index 8d8d5be7c6..4bbc6778d7 100644
--- a/web/modules/custom/eu_oss_catalogue/src/EuOssCatalogueInstallHelper.php
+++ b/web/modules/custom/eu_oss_catalogue/src/EuOssCatalogueInstallHelper.php
@@ -21,7 +21,14 @@ class EuOssCatalogueInstallHelper {
   public static function createTerms(array $items, array &$context): void {
     $termStorage = \Drupal::entityTypeManager()->getStorage('taxonomy_term');
     foreach ($items as $item) {
-      $termStorage->create($item)->save();
+      $existingTerms = $termStorage->loadByProperties([
+        'name' => $item['name'],
+        'vid' => $item['vid'],
+      ]);
+
+      if (empty($existingTerms)) {
+        $termStorage->create($item)->save();
+      }
     }
     $context['message'] = t('Imported @count terms in controlled vocabularies', [
       '@count' => count($items),
-- 
GitLab


From a0f28a27e5c854b01d0bb4e89c382bee7f50ed9f Mon Sep 17 00:00:00 2001
From: Adrian Lorenc <adrian.lorenc@gmail.com>
Date: Tue, 7 Jan 2025 11:48:22 +0100
Subject: [PATCH 103/137] ISAICP-9055: Re-import spdx-licenses.

---
 .../joinup_oss_catalogue.install              | 36 +++++++++++++++++++
 1 file changed, 36 insertions(+)
 create mode 100644 web/modules/custom/joinup_communities/joinup_oss_catalogue/joinup_oss_catalogue.install

diff --git a/web/modules/custom/joinup_communities/joinup_oss_catalogue/joinup_oss_catalogue.install b/web/modules/custom/joinup_communities/joinup_oss_catalogue/joinup_oss_catalogue.install
new file mode 100644
index 0000000000..173977967c
--- /dev/null
+++ b/web/modules/custom/joinup_communities/joinup_oss_catalogue/joinup_oss_catalogue.install
@@ -0,0 +1,36 @@
+<?php
+
+/**
+ * @file
+ * Install, update, install functionality for Joinup OSS Catalogue module.
+ */
+
+declare(strict_types=1);
+
+use Drupal\Component\Serialization\Json;
+use Drupal\Core\Batch\BatchBuilder;
+use Drupal\eu_oss_catalogue\EuOssCatalogueInstallHelper;
+
+/**
+ * Re-import spdx-licenses.
+ */
+function joinup_oss_catalogue_update_200101(): void {
+  $terms = [];
+
+  $licencesJsonFile = DRUPAL_ROOT . "/../vendor/composer/spdx-licenses/res/spdx-licenses.json";
+  $licences = Json::decode(file_get_contents($licencesJsonFile));
+  foreach ($licences as $name => $licence) {
+    $terms[] = ['vid' => 'oss_licence', 'name' => $name];
+  }
+
+  $pathResolver = \Drupal::getContainer()->get('extension.path.resolver');
+  $batchBuilder = (new BatchBuilder())
+    ->setFile($pathResolver->getPath('module', 'joinup_oss_catalogue') . '/joinup_oss_catalogue.install')
+    ->setProgressive(FALSE);
+
+  foreach (array_chunk($terms, 50) as $chunk) {
+    $batchBuilder->addOperation(EuOssCatalogueInstallHelper::class . '::createTerms', [$chunk]);
+  }
+
+  batch_set($batchBuilder->toArray());
+}
-- 
GitLab


From 3c94dffb6a0e7d322725aa368567e1c6a5e15838 Mon Sep 17 00:00:00 2001
From: Adrian Lorenc <adrian.lorenc@gmail.com>
Date: Tue, 7 Jan 2025 11:55:51 +0100
Subject: [PATCH 104/137] ISAICP-9055: Update number of imported terms.

---
 .../eu_oss_catalogue/src/EuOssCatalogueInstallHelper.php     | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/web/modules/custom/eu_oss_catalogue/src/EuOssCatalogueInstallHelper.php b/web/modules/custom/eu_oss_catalogue/src/EuOssCatalogueInstallHelper.php
index 4bbc6778d7..adf49c746e 100644
--- a/web/modules/custom/eu_oss_catalogue/src/EuOssCatalogueInstallHelper.php
+++ b/web/modules/custom/eu_oss_catalogue/src/EuOssCatalogueInstallHelper.php
@@ -20,6 +20,8 @@ class EuOssCatalogueInstallHelper {
    */
   public static function createTerms(array $items, array &$context): void {
     $termStorage = \Drupal::entityTypeManager()->getStorage('taxonomy_term');
+    $imported = 0;
+
     foreach ($items as $item) {
       $existingTerms = $termStorage->loadByProperties([
         'name' => $item['name'],
@@ -28,10 +30,11 @@ public static function createTerms(array $items, array &$context): void {
 
       if (empty($existingTerms)) {
         $termStorage->create($item)->save();
+        $imported++;
       }
     }
     $context['message'] = t('Imported @count terms in controlled vocabularies', [
-      '@count' => count($items),
+      '@count' => $imported,
     ]);
   }
 
-- 
GitLab


From dde8039d9c44f11f30b4759810766cf1ab0b34fc Mon Sep 17 00:00:00 2001
From: Adrian Lorenc <adrian.lorenc@gmail.com>
Date: Tue, 7 Jan 2025 11:56:09 +0100
Subject: [PATCH 105/137] ISAICP-9055: Update hook name.

---
 .../joinup_oss_catalogue/joinup_oss_catalogue.install           | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/web/modules/custom/joinup_communities/joinup_oss_catalogue/joinup_oss_catalogue.install b/web/modules/custom/joinup_communities/joinup_oss_catalogue/joinup_oss_catalogue.install
index 173977967c..b712ac2cc3 100644
--- a/web/modules/custom/joinup_communities/joinup_oss_catalogue/joinup_oss_catalogue.install
+++ b/web/modules/custom/joinup_communities/joinup_oss_catalogue/joinup_oss_catalogue.install
@@ -14,7 +14,7 @@
 /**
  * Re-import spdx-licenses.
  */
-function joinup_oss_catalogue_update_200101(): void {
+function joinup_oss_catalogue_update_200200(): void {
   $terms = [];
 
   $licencesJsonFile = DRUPAL_ROOT . "/../vendor/composer/spdx-licenses/res/spdx-licenses.json";
-- 
GitLab


From 19850d1bf1329724dd7ffdc39ba45bdc86ec143e Mon Sep 17 00:00:00 2001
From: Ilias Dimopoulos <idimopoulos@hotmail.com>
Date: Wed, 8 Jan 2025 01:36:02 +0200
Subject: [PATCH 106/137] ISAICP-9330: Include behat patch to fix XDEBUG
 failing sessions.

---
 composer.json                             |  3 +++
 composer.lock                             |  2 +-
 resources/patch/php/behat/behat/1581.diff | 15 +++++++++++++++
 3 files changed, 19 insertions(+), 1 deletion(-)
 create mode 100644 resources/patch/php/behat/behat/1581.diff

diff --git a/composer.json b/composer.json
index c8316e051c..c1983afc9a 100644
--- a/composer.json
+++ b/composer.json
@@ -292,6 +292,9 @@
             "drupal/core": "-p2"
         },
         "patches": {
+            "behat/behat": {
+                "Do not disable xdebug if an active session is found @see https://github.com/Behat/Behat/pull/1581": "resources/patch/php/behat/behat/1581.diff"
+            },
             "drupal/addtocal": {
                 "Uncaught TypeError: $(...).once is not a function @see https://www.drupal.org/project/addtocal/issues/3372354": "resources/patch/php/drupal/addtocal/3372354.patch"
             },
diff --git a/composer.lock b/composer.lock
index 9024b5a7e5..76742236b2 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": "cb2f167201654a3e5ebc78b2c5c6a922",
+    "content-hash": "3b5724f5dca3f294c095aaa636e49abb",
     "packages": [
         {
             "name": "asm89/stack-cors",
diff --git a/resources/patch/php/behat/behat/1581.diff b/resources/patch/php/behat/behat/1581.diff
new file mode 100644
index 0000000000..66bea148be
--- /dev/null
+++ b/resources/patch/php/behat/behat/1581.diff
@@ -0,0 +1,15 @@
+diff --git a/src/Behat/Testwork/Cli/Application.php b/src/Behat/Testwork/Cli/Application.php
+index 25435a9b0..669cc5b8b 100644
+--- a/src/Behat/Testwork/Cli/Application.php
++++ b/src/Behat/Testwork/Cli/Application.php
+@@ -99,7 +99,9 @@ public function getDefaultInputDefinition(): InputDefinition
+      */
+     public function doRun(InputInterface $input, OutputInterface $output): int
+     {
+-        $isXdebugAllowed = $input->hasParameterOption('--xdebug');
++        $isXdebugAllowed = $input->hasParameterOption('--xdebug') ||
++            (extension_loaded('xdebug') && xdebug_is_debugger_active());
++
+         if (!$isXdebugAllowed) {
+             $xdebugHandler = new XdebugHandler('behat');
+             $xdebugHandler->setPersistent();
\ No newline at end of file
-- 
GitLab


From 16fc9378d4c700d9c715cb452254c867e189c84e Mon Sep 17 00:00:00 2001
From: Adrian Lorenc <adrian.lorenc@gmail.com>
Date: Fri, 3 Jan 2025 09:09:22 +0100
Subject: [PATCH 107/137] ISAICP-9314: Dont display label.

---
 ...ity_view_display.node.solution.view_mode_tile_horizontal.yml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/config/sync/core.entity_view_display.node.solution.view_mode_tile_horizontal.yml b/config/sync/core.entity_view_display.node.solution.view_mode_tile_horizontal.yml
index ff69a96323..9fb1af1575 100644
--- a/config/sync/core.entity_view_display.node.solution.view_mode_tile_horizontal.yml
+++ b/config/sync/core.entity_view_display.node.solution.view_mode_tile_horizontal.yml
@@ -46,7 +46,7 @@ mode: view_mode_tile_horizontal
 content:
   abstract:
     type: field_fallback_formatter
-    label: above
+    label: hidden
     settings:
       main_field_formatter_id: string
       main_field_formatter_settings:
-- 
GitLab


From 916d5e35acc101e95f661b4f6523afd7ed5d8bef Mon Sep 17 00:00:00 2001
From: Adrian Lorenc <adrian.lorenc@gmail.com>
Date: Fri, 3 Jan 2025 09:43:50 +0100
Subject: [PATCH 108/137] ISAICP-9314: Dont display label.

---
 .../sync/core.entity_view_display.node.solution.highlighted.yml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/config/sync/core.entity_view_display.node.solution.highlighted.yml b/config/sync/core.entity_view_display.node.solution.highlighted.yml
index 7e9801ebe9..f3c368686f 100644
--- a/config/sync/core.entity_view_display.node.solution.highlighted.yml
+++ b/config/sync/core.entity_view_display.node.solution.highlighted.yml
@@ -49,7 +49,7 @@ mode: highlighted
 content:
   abstract:
     type: field_fallback_formatter
-    label: above
+    label: hidden
     settings:
       main_field_formatter_id: string
       main_field_formatter_settings:
-- 
GitLab


From e11a07bfb0a9d06f8bad876f10a88dd70e402b0e Mon Sep 17 00:00:00 2001
From: Adrian Lorenc <adrian.lorenc@gmail.com>
Date: Fri, 3 Jan 2025 10:42:46 +0100
Subject: [PATCH 109/137] ISAICP-9314: Remove highlighted display for solution.

---
 ...view_display.node.solution.highlighted.yml | 165 ------------------
 .../node--solution--highlighted.html.twig     |  18 --
 2 files changed, 183 deletions(-)
 delete mode 100644 config/sync/core.entity_view_display.node.solution.highlighted.yml
 delete mode 100644 web/themes/ventuno/templates/content/node--solution--highlighted.html.twig

diff --git a/config/sync/core.entity_view_display.node.solution.highlighted.yml b/config/sync/core.entity_view_display.node.solution.highlighted.yml
deleted file mode 100644
index f3c368686f..0000000000
--- a/config/sync/core.entity_view_display.node.solution.highlighted.yml
+++ /dev/null
@@ -1,165 +0,0 @@
-uuid: a03c0d6b-e77e-4cd8-9ad6-753a76f4b047
-langcode: en
-status: true
-dependencies:
-  config:
-    - core.entity_view_mode.node.highlighted
-    - field.field.node.solution.abstract
-    - field.field.node.solution.body
-    - field.field.node.solution.contact
-    - field.field.node.solution.content_creation
-    - field.field.node.solution.description
-    - field.field.node.solution.documentation
-    - field.field.node.solution.field_keywords
-    - field.field.node.solution.field_shared_in
-    - field.field.node.solution.field_state
-    - field.field.node.solution.field_topic
-    - field.field.node.solution.group_moderation
-    - field.field.node.solution.landing_page
-    - field.field.node.solution.language
-    - field.field.node.solution.list_related_entities
-    - field.field.node.solution.listing_content
-    - field.field.node.solution.logo
-    - field.field.node.solution.metrics_page
-    - field.field.node.solution.og_audience
-    - field.field.node.solution.owner
-    - field.field.node.solution.process_status
-    - field.field.node.solution.related_solutions
-    - field.field.node.solution.release_number
-    - field.field.node.solution.short_id
-    - field.field.node.solution.site_featured
-    - field.field.node.solution.solution_type
-    - field.field.node.solution.spatial_coverage
-    - field.field.node.solution.translation
-    - node.type.solution
-    - responsive_image.styles.highlighted_content
-  module:
-    - field_delimiter
-    - field_fallback_formatter
-    - field_formatter_range
-    - joinup_html_stripper
-    - joinup_slick
-    - responsive_image
-    - template_suggestion
-    - user
-id: node.solution.highlighted
-targetEntityType: node
-bundle: solution
-mode: highlighted
-content:
-  abstract:
-    type: field_fallback_formatter
-    label: hidden
-    settings:
-      main_field_formatter_id: string
-      main_field_formatter_settings:
-        link_to_entity: false
-      fallback_field_id: description
-      fallback_field_formatter_id: joinup_html_stripper_stripped
-      fallback_field_formatter_settings:
-        trim_length: 200
-    third_party_settings:
-      template_suggestion:
-        template_suggestion: ''
-    weight: 2
-    region: content
-  field_topic:
-    type: entity_reference_label
-    label: hidden
-    settings:
-      link: true
-    third_party_settings:
-      field_delimiter:
-        delimiter: ''
-      field_formatter_range:
-        order: 0
-        limit: 2
-        offset: 0
-      joinup_slick:
-        preset: ''
-        field_label: true
-        custom_label: ''
-      template_suggestion:
-        template_suggestion: ''
-    weight: 1
-    region: content
-  logo:
-    type: responsive_image
-    label: hidden
-    settings:
-      responsive_image_style: highlighted_content
-      image_link: content
-      image_loading:
-        attribute: lazy
-    third_party_settings:
-      template_suggestion:
-        template_suggestion: ''
-    weight: 0
-    region: content
-  solution_type:
-    type: entity_reference_label
-    label: hidden
-    settings:
-      link: false
-    third_party_settings:
-      field_delimiter:
-        delimiter: ''
-      field_formatter_range:
-        order: 0
-        limit: 1
-        offset: 0
-      joinup_slick:
-        preset: ''
-        field_label: true
-        custom_label: ''
-      template_suggestion:
-        template_suggestion: ''
-    weight: 3
-    region: content
-hidden:
-  body: true
-  collections: true
-  contact: true
-  content_creation: true
-  description: true
-  distributions: true
-  documentation: true
-  download_total: true
-  eif_perspective: true
-  featured: true
-  field_keywords: true
-  field_shared_in: true
-  field_state: true
-  flag_interoperability: true
-  flag_like: true
-  group_moderation: true
-  landing_page: true
-  langcode: true
-  language: true
-  links: true
-  list_related_entities: true
-  listing_content: true
-  members: true
-  metrics_page: true
-  node_solution_listing_content_inline_facets: true
-  node_solution_listing_content_top: true
-  og_audience: true
-  og_group: true
-  owner: true
-  pinned_in: true
-  process_status: true
-  published_at: true
-  read_more: true
-  related_solution: true
-  related_solutions: true
-  release_number: true
-  releases_overview: true
-  report: true
-  search_api_excerpt: true
-  share_link: true
-  short_id: true
-  site_featured: true
-  solution_subscribe: true
-  spatial_coverage: true
-  translation: true
-  uri: true
diff --git a/web/themes/ventuno/templates/content/node--solution--highlighted.html.twig b/web/themes/ventuno/templates/content/node--solution--highlighted.html.twig
deleted file mode 100644
index c3a75fb573..0000000000
--- a/web/themes/ventuno/templates/content/node--solution--highlighted.html.twig
+++ /dev/null
@@ -1,18 +0,0 @@
-{#
-/**
- * @file
- * Themeing for rdf entities.
- */
-#}
-<article{{ attributes }}>
-  {{ content.field_is_logo }}
-  {{ content.field_topic }}
-  {{ title_prefix }}
-  {% if not page and not is_label_hidden %}
-    <h2{{ title_attributes }}>
-      <a href="{{ url }}" rel="bookmark">{{ label }}</a>
-    </h2>
-  {% endif %}
-  {{ title_suffix }}
-  {{ content|without('logo', 'field_topic') }}
-</article>
-- 
GitLab


From 39eec3e2930e9d813e3ff666badefaa42869003b Mon Sep 17 00:00:00 2001
From: Adrian Lorenc <adrian.lorenc@gmail.com>
Date: Fri, 3 Jan 2025 10:43:48 +0100
Subject: [PATCH 110/137] ISAICP-9314: Remove highlighted display for custom
 page.

---
 ...w_display.node.custom_page.highlighted.yml | 83 -------------------
 1 file changed, 83 deletions(-)
 delete mode 100644 config/sync/core.entity_view_display.node.custom_page.highlighted.yml

diff --git a/config/sync/core.entity_view_display.node.custom_page.highlighted.yml b/config/sync/core.entity_view_display.node.custom_page.highlighted.yml
deleted file mode 100644
index 5d4e53ad4b..0000000000
--- a/config/sync/core.entity_view_display.node.custom_page.highlighted.yml
+++ /dev/null
@@ -1,83 +0,0 @@
-uuid: 0d0a3168-3657-461f-ac8e-a2efca96a2b1
-langcode: en
-status: true
-dependencies:
-  config:
-    - core.entity_view_mode.node.highlighted
-    - field.field.node.custom_page.abstract
-    - field.field.node.custom_page.field_attachment
-    - field.field.node.custom_page.field_custom_page_logo
-    - field.field.node.custom_page.field_hide_title
-    - field.field.node.custom_page.field_keywords
-    - field.field.node.custom_page.field_paragraphs_body
-    - field.field.node.custom_page.field_state
-    - field.field.node.custom_page.field_topic
-    - field.field.node.custom_page.og_audience
-    - node.type.custom_page
-  module:
-    - field_fallback_formatter
-    - joinup_core
-    - link
-    - template_suggestion
-    - user
-id: node.custom_page.highlighted
-targetEntityType: node
-bundle: custom_page
-mode: highlighted
-content:
-  abstract:
-    type: field_fallback_formatter
-    label: visually_hidden
-    settings:
-      main_field_formatter_id: string
-      main_field_formatter_settings:
-        link_to_entity: false
-      fallback_field_id: field_paragraphs_body
-      fallback_field_formatter_id: filtered_entity_reference_bundles
-      fallback_field_formatter_settings:
-        view_mode: tile
-        filtered_entity_bundles:
-          - simple_paragraph
-          - text
-        trim_length: 200
-        trim_chars: ...
-    third_party_settings:
-      template_suggestion:
-        template_suggestion: ''
-    weight: 1
-    region: content
-  flag_like:
-    settings: {  }
-    third_party_settings: {  }
-    weight: 10
-    region: content
-  links:
-    settings: {  }
-    third_party_settings: {  }
-    weight: 100
-    region: content
-  report:
-    type: link
-    label: hidden
-    settings:
-      trim_length: 80
-      url_only: false
-      url_plain: false
-      rel: ''
-      target: ''
-    third_party_settings: {  }
-    weight: 50
-    region: content
-hidden:
-  field_attachment: true
-  field_custom_page_logo: true
-  field_hide_title: true
-  field_keywords: true
-  field_paragraphs_body: true
-  field_state: true
-  field_topic: true
-  langcode: true
-  og_audience: true
-  published_at: true
-  search_api_excerpt: true
-  share_link: true
-- 
GitLab


From c596cf949e374685a62c47b12a4a194698ffa1bb Mon Sep 17 00:00:00 2001
From: Adrian Lorenc <adrian.lorenc@gmail.com>
Date: Fri, 3 Jan 2025 12:13:34 +0100
Subject: [PATCH 111/137] ISAICP-9314: Labels should not be displayed.

---
 tests/features/joinup_search/search.feature | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/tests/features/joinup_search/search.feature b/tests/features/joinup_search/search.feature
index 37614f9f84..09e9fc2906 100644
--- a/tests/features/joinup_search/search.feature
+++ b/tests/features/joinup_search/search.feature
@@ -852,7 +852,9 @@ Feature: Global search
     And I should see the text "The collection pull abstract." in the "Pull alpha" card
     And I should see the text "Random abstract." in the "Col for Sol javi" card
     And I should see the text "The solution pull abstract." in the "Solution pull" card
+    And I should not see the text "Abstract" in the "Solution pull" tile
     And I should see the text "This is the solution javi description" in the "Solution javi" card
+    And I should not see the text "Description" in the "Solution javi" tile
     And I should see the text "The solution roll abstract." in the "Solution roll" card
     And I should see the text "This is the solution net description" in the "Solution net" card
     And I should see the text "Lorem ipsum abstract" in the "Custom example abstract" card
-- 
GitLab


From 8b9853ee5ad1c1f9b8c6dd4761d8ecb355006624 Mon Sep 17 00:00:00 2001
From: Claudiu Cristea <clau.cristea@gmail.com>
Date: Thu, 9 Jan 2025 12:02:23 +0200
Subject: [PATCH 112/137] ISAICP-9334: Remove Behat debug leftovers.

---
 tests/features/community_content/moderation.feature | 1 -
 tests/features/solution/solution.contact.feature    | 1 -
 2 files changed, 2 deletions(-)

diff --git a/tests/features/community_content/moderation.feature b/tests/features/community_content/moderation.feature
index 9cd515a5da..248286c29b 100644
--- a/tests/features/community_content/moderation.feature
+++ b/tests/features/community_content/moderation.feature
@@ -180,7 +180,6 @@ Feature: Moderate community content
     And I should not see the text "Black-body spectrum radiation"
 
     # Now repeat this for the solution.
-    And I break
     When I am logged in as a facilitator of the "Survey For Supernovae" solution
     And I go to the homepage of the "Survey For Supernovae" solution
     And I click "Moderate content" in the "Entity actions" region
diff --git a/tests/features/solution/solution.contact.feature b/tests/features/solution/solution.contact.feature
index ab50ddce6e..4ff1ff3eba 100644
--- a/tests/features/solution/solution.contact.feature
+++ b/tests/features/solution/solution.contact.feature
@@ -27,7 +27,6 @@ Feature: Contact form for solution
     # Anonymous case.
     When I am not logged in
     And I go to the homepage of the "Six exclusion advantages" solution
-    And I break
     Then I should see the link "John Revoked"
     # Page was rendered, but in the meantime, contact is changed on backend.
     Given there are no preexisting log records on the site
-- 
GitLab


From 2cf0e2ffa0c44af09bf6fa039d60adffdf0ea285 Mon Sep 17 00:00:00 2001
From: Claudiu Cristea <clau.cristea@gmail.com>
Date: Thu, 9 Jan 2025 15:44:14 +0200
Subject: [PATCH 113/137] ISAICP-9334: Convert to site clean test.

---
 .../collection/collection_overview.feature    |  2 +
 .../joinup_assessment/assessment.feature      | 69 ++++++++-----------
 tests/src/Context/AssessmentContext.php       | 42 ++++++++++-
 .../custom/joinup_test/joinup_test.install    |  9 +--
 4 files changed, 73 insertions(+), 49 deletions(-)

diff --git a/tests/features/collection/collection_overview.feature b/tests/features/collection/collection_overview.feature
index d2cefcdff8..7e3f97e36a 100644
--- a/tests/features/collection/collection_overview.feature
+++ b/tests/features/collection/collection_overview.feature
@@ -31,6 +31,8 @@ Feature: Collections Overview
       | Connecting Europe |
       # Created in 8:31am.
       | E-health          |
+      # Created 2015-01-01 08:00am.
+      | The Portal        |
 
     When I am an anonymous user
     And I visit the collection overview
diff --git a/tests/features/joinup_assessment/assessment.feature b/tests/features/joinup_assessment/assessment.feature
index b0c4110b50..caa2580ee3 100644
--- a/tests/features/joinup_assessment/assessment.feature
+++ b/tests/features/joinup_assessment/assessment.feature
@@ -1,4 +1,4 @@
-@api @group-clone @demoAssessment
+@api @group-e @demoAssessment
 Feature: Assessments
 
   Scenario: Create an assessment report out of a webform.
@@ -8,11 +8,9 @@ Feature: Assessments
       | Notify moderator | moderator | notify_moderator@test.com | Notify     | Moderator   |
 
     Given I am logged in as Regular
-    And I check "I agree to the Legal notice document"
-    And I press "Submit"
 
     When I am at "/collection/assessments/assessment-reports/questionnaire"
-    Then I see the text "Best practice for interoperability assessments" in the "Header" region
+    Then I see the text "Interoperability assessments space" in the "Header" region
     And I should see the heading "Online form for Assessments"
 
     # 1st page.
@@ -124,8 +122,8 @@ Feature: Assessments
       | Solutions not in the Portal (link) {Empty}                                                                                              |
       | Have you discovered any remaining barriers to cross-border interoperability? No                                                         |
       | 4. Supporting documents                                                                                                                 |
-      | Binding requirements supporting documents {Empty}                                                                                                   |
-      | General Assessment supporting documents {Empty}                                                                                                     |
+      | Binding requirements supporting documents {Empty}                                                                                       |
+      | General Assessment supporting documents {Empty}                                                                                         |
       | Please add any other comment you would like to share. {Empty}                                                                           |
 
     # Make sure assessment reports are not leaking into manage content list.
@@ -177,8 +175,8 @@ Feature: Assessments
       | Solutions not in the Portal (link) {Empty}                                                                                              |
       | Have you discovered any remaining barriers to cross-border interoperability? No                                                         |
       | 4. Supporting documents                                                                                                                 |
-      | Binding requirements supporting documents {Empty}                                                                                                   |
-      | General Assessment supporting documents {Empty}                                                                                                     |
+      | Binding requirements supporting documents {Empty}                                                                                       |
+      | General Assessment supporting documents {Empty}                                                                                         |
       | Please add any other comment you would like to share. {Empty}                                                                           |
 
     When I move backward one page
@@ -290,14 +288,12 @@ Feature: Assessments
       | Solutions not in the Portal (link) {Empty}                                                                         |
       | Have you discovered any remaining barriers to cross-border interoperability? No                                    |
       | 4. Supporting documents                                                                                            |
-      | Binding requirements supporting documents {Empty}                                                                              |
-      | General Assessment supporting documents {Empty}                                                                                |
+      | Binding requirements supporting documents {Empty}                                                                  |
+      | General Assessment supporting documents {Empty}                                                                    |
       | Please add any other comment you would like to share. {Empty}                                                      |
 
   Scenario Outline: Check organization field value.
     Given I am logged in as an "authenticated user"
-    And I check "I agree to the Legal notice document"
-    And I press "Submit"
 
     When I am at "/collection/assessments/assessment-reports/questionnaire"
     Then I should see the heading "Online form for Assessments"
@@ -322,7 +318,7 @@ Feature: Assessments
     Then I should see the success message "Your assessment is being moderated. If approved, a report will be published on the assessment reports page. Moderators might require changes to this submission but you will be notified by email in this case."
 
     When I am at "/collection/assessments/assessment-reports/questionnaire/submissions"
-    Then I see the text "Best practice for interoperability assessments" in the "Header" region
+    Then I see the text "Interoperability assessments space" in the "Header" region
     And I should see the text "<organisation>"
 
     Examples:
@@ -339,8 +335,6 @@ Feature: Assessments
     And I go to "/collection/assessments/assessment-reports/questionnaire"
     Then I should not see the link "Download PDF" in the "Content" region
 
-    When I check "I agree to the Legal notice document"
-    And I press "Submit"
     # 1st page.
     And I select "European Union agency" from "Type of public sector body"
     And I select "Eurojust" from "Select your Agency"
@@ -381,39 +375,34 @@ Feature: Assessments
     Then I should see the heading "Sign in to continue"
 
     When I am logged in as a user with the authenticated role
-    And I check "I agree to the Legal notice document"
-    And I press "Submit"
     And I go to the latest assessment submission
     Then I should see the heading "Access denied"
     When I go to the pdf download link of the latest assessment submission
     Then I should see the heading "Access denied"
 
   Scenario: Assessment reports are listed in a distinct page and in search.
-    # Publish the collection, otherwise the nodes will not be published. This
-    # does not affect the visibility of the node in the view below as we force
-    # them as published, but it does affect the custom page listing below.
-    Given the workflow state of the "Best practice for interoperability assessments" collection is changed to "published"
+    Given I am an anonymous user
     When I go to "/collection/assessments/assessment-reports"
     Then I should see the heading "Assessment reports"
     And I should see the link "New assessment"
     And I should not see the link "My submissions"
     And I should see the text "There's are no published assessment reports yet. You can add one by filling this questionnaire"
     And assessment_report content:
-      | title         | state     | created              | organization         | collection                                     |
-      | Assessment 1  | published | 2020-01-01T00:00:00Z | default organization |                                                |
-      | Assessment 2  | published | 2020-01-02T00:00:00Z | default organization |                                                |
-      | Assessment 3  | published | 2020-01-03T00:00:00Z | default organization | Best practice for interoperability assessments |
-      | Assessment 4  | published | 2020-01-04T00:00:00Z | default organization | Best practice for interoperability assessments |
-      | Assessment 5  | published | 2020-01-05T00:00:00Z | default organization | Best practice for interoperability assessments |
-      | Assessment 6  | published | 2020-01-06T00:00:00Z | default organization | Best practice for interoperability assessments |
-      | Assessment 7  | published | 2020-01-07T00:00:00Z | default organization | Best practice for interoperability assessments |
-      | Assessment 8  | published | 2020-01-08T00:00:00Z | default organization | Best practice for interoperability assessments |
-      | Assessment 9  | published | 2020-01-09T00:00:00Z | default organization | Best practice for interoperability assessments |
-      | Assessment 10 | published | 2020-01-10T00:00:00Z | default organization | Best practice for interoperability assessments |
-      | Assessment 11 | published | 2020-01-11T00:00:00Z | default organization | Best practice for interoperability assessments |
-      | Assessment 12 | published | 2020-01-12T00:00:00Z | default organization | Best practice for interoperability assessments |
-
-    When I go to "/collection/assessments/assessment-reports"
+      | title         | state     | created              | organization         | collection                         |
+      | Assessment 1  | published | 2020-01-01T00:00:00Z | default organization |                                    |
+      | Assessment 2  | published | 2020-01-02T00:00:00Z | default organization |                                    |
+      | Assessment 3  | published | 2020-01-03T00:00:00Z | default organization | Interoperability assessments space |
+      | Assessment 4  | published | 2020-01-04T00:00:00Z | default organization | Interoperability assessments space |
+      | Assessment 5  | published | 2020-01-05T00:00:00Z | default organization | Interoperability assessments space |
+      | Assessment 6  | published | 2020-01-06T00:00:00Z | default organization | Interoperability assessments space |
+      | Assessment 7  | published | 2020-01-07T00:00:00Z | default organization | Interoperability assessments space |
+      | Assessment 8  | published | 2020-01-08T00:00:00Z | default organization | Interoperability assessments space |
+      | Assessment 9  | published | 2020-01-09T00:00:00Z | default organization | Interoperability assessments space |
+      | Assessment 10 | published | 2020-01-10T00:00:00Z | default organization | Interoperability assessments space |
+      | Assessment 11 | published | 2020-01-11T00:00:00Z | default organization | Interoperability assessments space |
+      | Assessment 12 | published | 2020-01-12T00:00:00Z | default organization | Interoperability assessments space |
+
+    When I go to the "Assessment reports" custom_page
     Then I should see the heading "Assessment reports"
     And I should see the link "New assessment"
     And I should not see the link "My submissions"
@@ -434,8 +423,8 @@ Feature: Assessments
     And I should not see the "Assessment 1" tile
 
     Given custom_page content:
-      | title              | state     | collection                                     |
-      | Custom assessments | published | Best practice for interoperability assessments |
+      | title              | state     | collection                         |
+      | Custom assessments | published | Interoperability assessments space |
     And I append "content_listing" to "field_paragraphs_body" field in "node" entity with following "Custom assessments" title:
       | content_listing:value | a:7:{s:6:"fields";a:1:{s:20:"content_listing_type";a:2:{s:6:"weight";i:-1;s:6:"region";s:3:"top";}}s:7:"enabled";i:1;s:13:"query_presets";s:33:"organization\|default organization";s:13:"show_archived";s:10:"unarchived";s:5:"limit";s:2:"12";s:11:"show_shared";i:0;s:13:"global_search";i:0;} |
     When I go to the "Custom assessments" custom_page
@@ -455,7 +444,7 @@ Feature: Assessments
     # Advanced search page.
     Given I am an anonymous user
     When I visit "/search"
-    Then I should see the following "Content types" facet items "Collections,Solutions,News,Events,Documents,Assessment reports,Discussions,Releases,Custom pages,Licences,User profiles" in this order
+    Then I should see the following "Content types" facet items "Collections,Assessment reports,Custom pages" in this order
     When I click "Assessment reports"
 
     Then I should see the following tiles in the correct order:
@@ -469,8 +458,6 @@ Feature: Assessments
       | Assessment 5  |
       | Assessment 4  |
       | Assessment 3  |
-      | Assessment 2  |
-      | Assessment 1  |
 
     When I am logged in as a moderator
     When I go to "/collection/assessments/assessment-reports"
diff --git a/tests/src/Context/AssessmentContext.php b/tests/src/Context/AssessmentContext.php
index 96cbfc8c20..99c6166899 100644
--- a/tests/src/Context/AssessmentContext.php
+++ b/tests/src/Context/AssessmentContext.php
@@ -7,7 +7,10 @@
 use Drupal\Core\Url;
 use Drupal\DrupalExtension\Context\RawDrupalContext;
 use Drupal\joinup\Traits\EntityTrait;
+use Drupal\joinup\Traits\TestingEntitiesTrait;
 use Drupal\joinup_assessment\AssessmentInterface;
+use Drupal\node\Entity\Node;
+use Drupal\paragraphs\Entity\Paragraph;
 use Drupal\webform\WebformSubmissionInterface;
 
 /**
@@ -16,6 +19,7 @@
 class AssessmentContext extends RawDrupalContext {
 
   use EntityTrait;
+  use TestingEntitiesTrait;
 
   /**
    * Latest submission ID before scenario.
@@ -79,7 +83,43 @@ public function visitLatestAssessmentReport(): void {
    *
    * @BeforeScenario @demoAssessment
    */
-  public function storeLatestSubmissionId(): void {
+  public function beforeAssessmentsDemo(): void {
+    $collection = Node::create([
+      'type' => 'collection',
+      'uuid' => AssessmentInterface::GROUP_UUID,
+      'title' => 'Interoperability assessments space',
+      'short_id' => 'assessments',
+      'field_state' => 'published',
+    ]);
+    $collection->save();
+    $this->entities['node'][$collection->id()] = $collection;
+
+    $reportsPage = Node::create([
+      'type' => 'custom_page',
+      'title' => 'Assessment reports',
+      'og_audience' => $collection,
+      'field_state' => 'published',
+      'uuid' => AssessmentInterface::ASSESSMENT_REPORTS_UUID,
+      'field_paragraphs_body' => [
+        Paragraph::create([
+          'type' => 'block',
+          'paragraph_block' => [
+            'plugin_id' => 'views_block:assessment_reports-list',
+            'settings' => [
+              'id' => 'views_block:assessment_reports-list',
+              'label' => '',
+              'label_display' => FALSE,
+              'provider' => 'views',
+              'views_label' => '',
+              'items_per_page' => 10,
+            ],
+          ],
+        ]),
+      ],
+    ]);
+    $reportsPage->save();
+    $this->entities['node'][$reportsPage->id()] = $reportsPage;
+
     $this->latestSubmissionId = $this->getLatestSubmissionId() ?? 0;
   }
 
diff --git a/web/modules/custom/joinup_test/joinup_test.install b/web/modules/custom/joinup_test/joinup_test.install
index 10cb4bcd6d..aa7cb1dc5d 100644
--- a/web/modules/custom/joinup_test/joinup_test.install
+++ b/web/modules/custom/joinup_test/joinup_test.install
@@ -10,7 +10,6 @@
 use Drupal\Component\Serialization\Yaml;
 use Drupal\Core\Field\Plugin\Field\FieldType\EntityReferenceItemInterface;
 use Drupal\joinup_collection\JoinupCollectionHelper;
-use Drupal\search_api\Plugin\search_api\datasource\ContentEntity;
 use Drupal\taxonomy\TermInterface;
 use Drupal\text\Plugin\Field\FieldType\TextItemBase;
 
@@ -111,13 +110,9 @@ function joinup_test_install($is_syncing): void {
 
     ]);
     $collection->save();
-    \Drupal::state()->set('joinup_test.joinup_collection.created', TRUE);
 
-    $indexes = ContentEntity::getIndexesForEntity($collection);
-    foreach ($indexes as $index) {
-      $index->setOption('index_directly', TRUE);
-      $index->trackItemsUpdated('entity:node', [$collection->id() . ':en']);
-    }
+    \Drupal::getContainer()->get('search_api.post_request_indexing')->destruct();
+    \Drupal::state()->set('joinup_test.joinup_collection.created', TRUE);
   }
 }
 
-- 
GitLab


From b6d2353e26143431a7b4813eb5d750f864bb50a8 Mon Sep 17 00:00:00 2001
From: Adrian Lorenc <adrian.lorenc@gmail.com>
Date: Mon, 13 Jan 2025 09:49:39 +0100
Subject: [PATCH 114/137] ISAICP-9336: The portal node sometimes is not
 indexed.

---
 tests/features/joinup_assessment/assessment.feature |  2 +-
 tests/features/joinup_search/search.feature         | 11 ++++++-----
 2 files changed, 7 insertions(+), 6 deletions(-)

diff --git a/tests/features/joinup_assessment/assessment.feature b/tests/features/joinup_assessment/assessment.feature
index caa2580ee3..0e4f3186ee 100644
--- a/tests/features/joinup_assessment/assessment.feature
+++ b/tests/features/joinup_assessment/assessment.feature
@@ -444,7 +444,7 @@ Feature: Assessments
     # Advanced search page.
     Given I am an anonymous user
     When I visit "/search"
-    Then I should see the following "Content types" facet items "Collections,Assessment reports,Custom pages" in this order
+    Then I should see the following "Content types" facet items "Collections,Assessment reports,Custom pages,User profiles" in this order
     When I click "Assessment reports"
 
     Then I should see the following tiles in the correct order:
diff --git a/tests/features/joinup_search/search.feature b/tests/features/joinup_search/search.feature
index 09e9fc2906..0906a9a401 100644
--- a/tests/features/joinup_search/search.feature
+++ b/tests/features/joinup_search/search.feature
@@ -140,22 +140,22 @@ Feature: Global search
     Then I should see the text "SEARCH RESULTS (2)"
 
     Given I am on the search page
-    When I check the "User profiles (1)" checkbox from the "Content types" facet
+    When I check the "User profiles (2)" checkbox from the "Content types" facet
     Then the "User profiles" content checkbox item should be selected
-    And I should see 1 tile
+    And I should see 2 tile
 
     Given I click "Clear filters"
     When I check the "News (5)" checkbox from the "Content types" facet
     Then the "News" content checkbox item should be selected
     # The Portal collection is included
-    And the "Content types" checkbox facet should allow selecting the following values "Collections (2), Solutions (2), News (5), User profiles (1)"
+    And the "Content types" checkbox facet should allow selecting the following values "Collections (2), Solutions (2), News (5), User profiles (2)"
 
     When I check the "Solutions (2)" checkbox from the "Content types" facet
     Then the "Solutions" content checkbox item should be selected
     And the "News" content checkbox item should be selected
     And I should see the following facet summary "Solutions, News"
     # The Portal collection is included
-    Then the "Content types" checkbox facet should allow selecting the following values "Collections (2), Solutions (2), News (5), User profiles (1)"
+    Then the "Content types" checkbox facet should allow selecting the following values "Collections (2), Solutions (2), News (5), User profiles (2)"
     And the "topic" checkbox facet should allow selecting the following values "eGov (1), Info (1), Statistics and Analysis (1), Social and Political (5), Demography (1), E-inclusion (4)"
     Then I click show more from the "spatial coverage" facet
     And the "spatial coverage" checkbox facet should allow selecting the following values "European Union (1), Luxembourg (5)"
@@ -277,7 +277,7 @@ Feature: Global search
 
     When I visit the search page
     # The Portal collection is included
-    Then the "Content types" checkbox facet should allow selecting the following values "Collections (3), Solution (1), News (1), Events (2), Document (1), Discussion (1), Release (1), Custom page (1), Licence (1), User profiles (2)"
+    Then the "Content types" checkbox facet should allow selecting the following values "Collections (3), Solution (1), News (1), Events (2), Document (1), Discussion (1), Release (1), Custom page (1), Licence (1), User profiles (3)"
 
     # "A beta" word does not show "You must include at least one positive keyword with 3 characters or more." error message.
     When I enter "A beta" in the search bar and press enter
@@ -650,6 +650,7 @@ Feature: Global search
       | Red revolution      |
       # The Portal collection is installed in all tests. See joinup_test.install
       | The Portal          |
+      | admin               |
 
   @javascript
   Scenario: Anonymous user can find facets summary
-- 
GitLab


From 2969d326b0cec4465eec5d8b4be5098c832902b8 Mon Sep 17 00:00:00 2001
From: Adrian Lorenc <adrian.lorenc@gmail.com>
Date: Mon, 13 Jan 2025 09:50:13 +0100
Subject: [PATCH 115/137] ISAICP-9336: The portal node sometimes is not
 indexed.

---
 resources/runner/toolkit.yml | 13 +++++++++++++
 1 file changed, 13 insertions(+)

diff --git a/resources/runner/toolkit.yml b/resources/runner/toolkit.yml
index e87e922b7d..992bc3498d 100644
--- a/resources/runner/toolkit.yml
+++ b/resources/runner/toolkit.yml
@@ -37,6 +37,19 @@ toolkit:
         - task: remove
           file: ${toolkit.build.dist.root}/node_modules
 
+  test:
+    behat:
+      commands:
+        before:
+          - task: exec
+            command: |
+              if [ "${BEHATSUITE}" != "default" ]; then
+                ${drush.bin} search-api:clear published
+                ${drush.bin} search-api:rebuild-tracker published
+                ${drush.bin} search-api-index published
+                ${drush.bin} search-api:status published
+              fi
+
   install:
     clone:
       commands:
-- 
GitLab


From a5637e146630bd2d5eb57064379da406ba17e54b Mon Sep 17 00:00:00 2001
From: Adrian Lorenc <adrian.lorenc@gmail.com>
Date: Tue, 7 Jan 2025 15:22:50 +0100
Subject: [PATCH 116/137] ISAICP-9326: Display "N/A" in case of empty.

---
 config/sync/views.view.report_users_list.yml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/config/sync/views.view.report_users_list.yml b/config/sync/views.view.report_users_list.yml
index db02c07663..4572a5ab79 100644
--- a/config/sync/views.view.report_users_list.yml
+++ b/config/sync/views.view.report_users_list.yml
@@ -578,7 +578,7 @@ display:
           element_wrapper_type: ''
           element_wrapper_class: ''
           element_default_classes: true
-          empty: ''
+          empty: N/A
           hide_empty: false
           empty_zero: false
           hide_alter_empty: true
-- 
GitLab


From 5b818ed0059c19eb0acfd7df273906deffd66905 Mon Sep 17 00:00:00 2001
From: Adrian Lorenc <adrian.lorenc@gmail.com>
Date: Tue, 7 Jan 2025 15:33:39 +0100
Subject: [PATCH 117/137] ISAICP-9055: Overwrite no access value.

---
 .../joinup_reports/joinup_reports.module      | 26 +++++++++++++++++++
 1 file changed, 26 insertions(+)
 create mode 100644 web/modules/custom/joinup_reports/joinup_reports.module

diff --git a/web/modules/custom/joinup_reports/joinup_reports.module b/web/modules/custom/joinup_reports/joinup_reports.module
new file mode 100644
index 0000000000..277ce05c17
--- /dev/null
+++ b/web/modules/custom/joinup_reports/joinup_reports.module
@@ -0,0 +1,26 @@
+<?php
+
+/**
+ * @file
+ * Hook implementations for the Joinup Reports module.
+ */
+
+declare(strict_types=1);
+
+use Drupal\views\ViewExecutable;
+
+/**
+ * Implements hook_views_pre_render().
+ */
+function joinup_reports_views_pre_render(ViewExecutable $view): void {
+  if ($view->id() !== 'report_users_list') {
+    return;
+  }
+
+  foreach ($view->result as &$row) {
+    $lastAccess = $row->_entity->get('access')->getString();
+    if ($lastAccess === '0') {
+      $row->_entity->get('access')->setValue(NULL);
+    }
+  }
+}
-- 
GitLab


From 68c5882b57afb80b2154772e59f2577cfdd360c6 Mon Sep 17 00:00:00 2001
From: Zoltan Horvath <zoltan.horvath@ext.ec.europa.eu>
Date: Wed, 8 Jan 2025 11:03:22 +0100
Subject: [PATCH 118/137] ISAICP-9326: Remove unnecessary reference

---
 web/modules/custom/joinup_reports/joinup_reports.module | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/web/modules/custom/joinup_reports/joinup_reports.module b/web/modules/custom/joinup_reports/joinup_reports.module
index 277ce05c17..f9bed87f0d 100644
--- a/web/modules/custom/joinup_reports/joinup_reports.module
+++ b/web/modules/custom/joinup_reports/joinup_reports.module
@@ -17,7 +17,7 @@ function joinup_reports_views_pre_render(ViewExecutable $view): void {
     return;
   }
 
-  foreach ($view->result as &$row) {
+  foreach ($view->result as $row) {
     $lastAccess = $row->_entity->get('access')->getString();
     if ($lastAccess === '0') {
       $row->_entity->get('access')->setValue(NULL);
-- 
GitLab


From 0c59a29119e580e5e2819f5f4adf9ee4124849f1 Mon Sep 17 00:00:00 2001
From: Adrian Lorenc <adrian.lorenc@gmail.com>
Date: Fri, 3 Jan 2025 13:40:54 +0100
Subject: [PATCH 119/137] ISAICP-9246: Remove rdf templates.

---
 .../rdf-entity--view-mode-tile.html.twig      | 17 -------
 ...ntity--asset-distribution--label.html.twig | 34 -------------
 ...ntity--eif-perspective--solution.html.twig | 49 -------------------
 ...d-access-url--asset-distribution.html.twig | 20 --------
 ...d-ad-licence--asset-distribution.html.twig | 11 -----
 ...ntity--field-ar-logo--collection.html.twig | 10 ----
 ...-entity--field-is-logo--solution.html.twig |  9 ----
 7 files changed, 150 deletions(-)
 delete mode 100644 web/themes/iop/templates/rdf_entity/rdf-entity--view-mode-tile.html.twig
 delete mode 100644 web/themes/ventuno/templates/field/field--no-wrappers--rdf-entity--asset-distribution--label.html.twig
 delete mode 100644 web/themes/ventuno/templates/field/field--rdf-entity--eif-perspective--solution.html.twig
 delete mode 100644 web/themes/ventuno/templates/field/field--rdf-entity--field-ad-access-url--asset-distribution.html.twig
 delete mode 100644 web/themes/ventuno/templates/field/field--rdf-entity--field-ad-licence--asset-distribution.html.twig
 delete mode 100644 web/themes/ventuno/templates/field/field--rdf-entity--field-ar-logo--collection.html.twig
 delete mode 100644 web/themes/ventuno/templates/field/field--rdf-entity--field-is-logo--solution.html.twig

diff --git a/web/themes/iop/templates/rdf_entity/rdf-entity--view-mode-tile.html.twig b/web/themes/iop/templates/rdf_entity/rdf-entity--view-mode-tile.html.twig
deleted file mode 100644
index 7d131e3fd7..0000000000
--- a/web/themes/iop/templates/rdf_entity/rdf-entity--view-mode-tile.html.twig
+++ /dev/null
@@ -1,17 +0,0 @@
-{#
-/**
- * @file
- * Themeing for rdf entities.
- */
-#}
-<article{{ attributes.addClass('tile') }}>
-  {{ title_prefix }}
-  {% if not page %}
-    <h2{{ title_attributes }}>
-      <a href="{{ url }}" rel="bookmark">{{ label }}</a>
-    </h2>
-  {% endif %}
-  {{ title_suffix }}
-
-  {{ content }}
-</article>
diff --git a/web/themes/ventuno/templates/field/field--no-wrappers--rdf-entity--asset-distribution--label.html.twig b/web/themes/ventuno/templates/field/field--no-wrappers--rdf-entity--asset-distribution--label.html.twig
deleted file mode 100644
index 491f3c310a..0000000000
--- a/web/themes/ventuno/templates/field/field--no-wrappers--rdf-entity--asset-distribution--label.html.twig
+++ /dev/null
@@ -1,34 +0,0 @@
-{#
-/**
- * @file
- * Default template for a field.
- */
-#}
-{%
-  set title_classes = [
-    'field__label',
-    'fw-bold',
-    label_display == 'visually_hidden' ? 'visually-hidden',
-  ]
-%}
-
-{% if label_hidden %}
-  {% if multiple %}
-    {% for item in items %}
-      <div{{ item.attributes.addClass('field__item') }}>{{ item.content }}</div>
-    {% endfor %}
-  {% else %}
-    {% for item in items %}
-      {{ item.content }}
-    {% endfor %}
-  {% endif %}
-{% else %}
-  <div{{ title_attributes.addClass(title_classes) }}>
-    {{ label }}{% if label_display == 'inline' %}<span class="me-1">:</span>{% endif %}
-  </div>
-  {% if multiple %}
-    {% for item in items %}
-      <div{{ item.attributes.addClass('field__item') }}>{{ item.content }}</div>
-    {% endfor %}
-  {% endif %}
-{% endif %}
diff --git a/web/themes/ventuno/templates/field/field--rdf-entity--eif-perspective--solution.html.twig b/web/themes/ventuno/templates/field/field--rdf-entity--eif-perspective--solution.html.twig
deleted file mode 100644
index 729bc46d99..0000000000
--- a/web/themes/ventuno/templates/field/field--rdf-entity--eif-perspective--solution.html.twig
+++ /dev/null
@@ -1,49 +0,0 @@
-{#
-/**
- * @file
- * Default template for a field.
- */
-#}
-{%
-  set classes = [
-    'field--name-' ~ field_name|clean_class,
-    bundle|clean_class ~ '__' ~ field_name_clean|clean_class,
-    label_display == 'inline' ? 'd-flex',
-  ]
-%}
-{%
-  set title_classes = [
-    'field__label',
-    'fw-bold',
-    label_display == 'visually_hidden' ? 'visually-hidden',
-  ]
-%}
-
-{% if label_hidden %}
-  {% if multiple %}
-    <div{{ attributes.addClass(classes) }}>
-      {% for item in items %}
-        <div{{ item.attributes.addClass('field__item') }}>{{ item.content }}</div>
-      {% endfor %}
-    </div>
-  {% else %}
-    {% for item in items %}
-      <div{{ attributes.addClass(classes) }}>{{ item.content }}</div>
-    {% endfor %}
-  {% endif %}
-{% else %}
-  <div{{ attributes.addClass(classes) }}>
-    <div{{ title_attributes.addClass(title_classes) }}>
-      {{ label }}{% if label_display == 'inline' %}<span class="me-1">:</span>{% endif %}
-    </div>
-    {% if multiple %}
-    <div class="field__items">
-      {% endif %}
-      {% for item in items %}
-        <div{{ item.attributes.addClass('field__item') }}>{{ item.content }}</div>
-      {% endfor %}
-      {% if multiple %}
-    </div>
-    {% endif %}
-  </div>
-{% endif %}
diff --git a/web/themes/ventuno/templates/field/field--rdf-entity--field-ad-access-url--asset-distribution.html.twig b/web/themes/ventuno/templates/field/field--rdf-entity--field-ad-access-url--asset-distribution.html.twig
deleted file mode 100644
index 0786a91ff9..0000000000
--- a/web/themes/ventuno/templates/field/field--rdf-entity--field-ad-access-url--asset-distribution.html.twig
+++ /dev/null
@@ -1,20 +0,0 @@
-{#
-/**
- * @file
- * Default template for a field.
- */
-#}
-{%
-  set classes = [
-    'field--name-' ~ field_name|clean_class,
-    bundle|clean_class ~ '__' ~ field_name_clean|clean_class,
-    'd-flex',
-    'justify-content-center',
-    'mt-3',
-  ]
-%}
-<div{{ attributes.addClass(classes) }}>
-  {% for item in items %}
-    {{ item.content }}
-  {% endfor %}
-</div>
diff --git a/web/themes/ventuno/templates/field/field--rdf-entity--field-ad-licence--asset-distribution.html.twig b/web/themes/ventuno/templates/field/field--rdf-entity--field-ad-licence--asset-distribution.html.twig
deleted file mode 100644
index b0d7dfb762..0000000000
--- a/web/themes/ventuno/templates/field/field--rdf-entity--field-ad-licence--asset-distribution.html.twig
+++ /dev/null
@@ -1,11 +0,0 @@
-{#
-/**
- * @file
- * Override for field--rdf-entity--field-ad-licence--asset-distribution.html.twig.
- * This field is supposed to return a link where the title attribute is
- * expected to contain the title of the label.
- */
-#}
-{% for item in items %}
-  <a href="{{ item.content['#url'] }}" title="{{ item.content['#title'] }}">{{ item.content['#title'] }}</a>
-{% endfor %}
diff --git a/web/themes/ventuno/templates/field/field--rdf-entity--field-ar-logo--collection.html.twig b/web/themes/ventuno/templates/field/field--rdf-entity--field-ar-logo--collection.html.twig
deleted file mode 100644
index 6b2b875402..0000000000
--- a/web/themes/ventuno/templates/field/field--rdf-entity--field-ar-logo--collection.html.twig
+++ /dev/null
@@ -1,10 +0,0 @@
-{#
-/**
- * @file
- * Default template for a field.
- */
-#}
-
-{% for item in items %}
-  {{ item.content }}
-{% endfor %}
diff --git a/web/themes/ventuno/templates/field/field--rdf-entity--field-is-logo--solution.html.twig b/web/themes/ventuno/templates/field/field--rdf-entity--field-is-logo--solution.html.twig
deleted file mode 100644
index ea3da524b6..0000000000
--- a/web/themes/ventuno/templates/field/field--rdf-entity--field-is-logo--solution.html.twig
+++ /dev/null
@@ -1,9 +0,0 @@
-{#
-/**
- * @file
- * Default template for a field.
- */
-#}
-{% for item in items %}
-  {{ item.content }}
-{% endfor %}
-- 
GitLab


From 8896ab0cb92a2fd26c35f2e45940fd48ab1be9c5 Mon Sep 17 00:00:00 2001
From: Adrian Lorenc <adrian.lorenc@gmail.com>
Date: Fri, 3 Jan 2025 13:57:39 +0100
Subject: [PATCH 120/137] ISAICP-9246: Update css classes.

---
 .../custom/joinup_core/src/ETransBlockConfiguration.php       | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/web/modules/custom/joinup_core/src/ETransBlockConfiguration.php b/web/modules/custom/joinup_core/src/ETransBlockConfiguration.php
index 4f229fcbaf..cbf5c51d1c 100644
--- a/web/modules/custom/joinup_core/src/ETransBlockConfiguration.php
+++ b/web/modules/custom/joinup_core/src/ETransBlockConfiguration.php
@@ -70,11 +70,11 @@ class ETransBlockConfiguration {
       ],
       CollectionInterface::class => [
         'include' => '.layout-content .layout',
-        'exclude' => '.block-field-blockrdf-entitycollectionfield-collection-content',
+        'exclude' => '.block-field-blocknodecollectionlisting-content',
       ],
       SolutionInterface::class => [
         'include' => '.layout-content .layout',
-        'exclude' => '.block-field-blockrdf-entitysolutionfield-is-content, .block-extra-field-blockrdf-entitysolutionrelated-solutions',
+        'exclude' => '.block-field-blocknodesolutionlisting-content, .block-extra-field-blocknodesolutionrelated-solutions',
       ],
     ],
     'routes' => [
-- 
GitLab


From 2fd59cd59b3ae6559dc64e0273584185a65f9d04 Mon Sep 17 00:00:00 2001
From: Adrian Lorenc <adrian.lorenc@gmail.com>
Date: Thu, 9 Jan 2025 10:33:10 +0100
Subject: [PATCH 121/137] ISAICP-9331: Update wrapper_type.

---
 config/sync/webform.webform.assessment.yml | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/config/sync/webform.webform.assessment.yml b/config/sync/webform.webform.assessment.yml
index 939a18848a..19d2bc0784 100644
--- a/config/sync/webform.webform.assessment.yml
+++ b/config/sync/webform.webform.assessment.yml
@@ -194,8 +194,9 @@ elements: |-
       '#options':
         'Yes': 'Yes'
         'No': 'No'
-      '#options__properties': ''
       '#required': true
+      '#wrapper_type': form_element
+      '#options__properties': ''
     reference_of_the_linked_assessment:
       '#type': textfield
       '#title': 'Reference of the linked assessment'
-- 
GitLab


From 6be00ac38760e3c5e533c9e39a5c76a6b489aabb Mon Sep 17 00:00:00 2001
From: Adrian Lorenc <adrian.lorenc@gmail.com>
Date: Thu, 9 Jan 2025 14:20:22 +0100
Subject: [PATCH 122/137] ISAICP-9331: Updates.

---
 config/sync/node.type.assessment_report.yml   |  2 +-
 config/sync/views.view.assessment_reports.yml |  2 +-
 config/sync/webform.webform.assessment.yml    | 21 ++++++++-----------
 .../joinup_assessment/assessment.feature      | 12 +++++------
 .../joinup_assessment.module                  |  2 +-
 5 files changed, 18 insertions(+), 21 deletions(-)

diff --git a/config/sync/node.type.assessment_report.yml b/config/sync/node.type.assessment_report.yml
index 8167f19b98..77a111134e 100644
--- a/config/sync/node.type.assessment_report.yml
+++ b/config/sync/node.type.assessment_report.yml
@@ -29,7 +29,7 @@ third_party_settings:
 label_singular: 'assessment report'
 label_plural: 'assessment reports'
 label_count:
-  no_count_capitalize: "Assessment report\x03Assessment reports"
+  no_count_capitalize: !!binary QXNzZXNzbWVudCByZXBvcnQDQXNzZXNzbWVudCByZXBvcnRz
 name: 'Assessment report'
 type: assessment_report
 description: 'Interoperability assessment report'
diff --git a/config/sync/views.view.assessment_reports.yml b/config/sync/views.view.assessment_reports.yml
index 11030740df..140cdcb0d6 100644
--- a/config/sync/views.view.assessment_reports.yml
+++ b/config/sync/views.view.assessment_reports.yml
@@ -133,7 +133,7 @@ display:
           admin_label: ''
           plugin_id: text_custom
           empty: true
-          content: 'There''s are no published assessment reports yet. You can add one by filling this <a href="/collection/assessments/assessment-reports/questionnaire">questionnaire</a>'
+          content: 'There are no published assessment reports yet. You can add one by filling this <a href="/collection/assessments/assessment-reports/questionnaire">questionnaire</a>'
           tokenize: false
       sorts:
         created:
diff --git a/config/sync/webform.webform.assessment.yml b/config/sync/webform.webform.assessment.yml
index 19d2bc0784..60e30ae745 100644
--- a/config/sync/webform.webform.assessment.yml
+++ b/config/sync/webform.webform.assessment.yml
@@ -22,7 +22,7 @@ elements: |-
     '#next_button_label': Next
     general_info_intro:
       '#type': processed_text
-      '#text': "<h2><strong>This section collects general information on your interoperability assessment.</strong></h2><p>Please complete the form below by entering accurate and up-to date information in all the required fields. You can 'Save' the current progress of the report or you can 'Submit' it once finalised. The report will be published on the Portal after the European Commission has checked that it complies with the assessment guidelines.</p>"
+      '#text': '<p>This section collects general information on your interoperability assessment.</p>'
       '#format': content_editor
     report_provider:
       '#type': processed_text
@@ -51,7 +51,6 @@ elements: |-
         'Czech Republic': 'Czech Republic'
         Germany: Germany
         Denmark: Denmark
-        England: England
         Spain: Spain
         Finland: Finland
         France: France
@@ -216,11 +215,11 @@ elements: |-
     '#next_button_label': Next
     intro_section_three:
       '#type': processed_text
-      '#text': '<p>This section collects information on the assessed binding requirements.</p><p><a>The concept of ‘B</a>inding requirements’ is defined in Article&nbsp;2(15) IEA&nbsp;as:</p><ul><li>an obligation, prohibition, condition, criterion or limit;</li><li>of a legal, organisational, semantic or technical nature;&nbsp;</li><li>which is set by a Union entity or a public sector body;</li><li>concerning one or more trans-European digital public services; and&nbsp;</li><li>which has an effect on cross-border interoperability.</li></ul><p>When assessing if a requirement is ‘binding’ according to the IEA, one essential factor is whether the requirement has consequences for other organisations taking part in the provision of the public service (i.e., an effect on cross-border interoperability). For instance, a technical requirement that becomes mandatory only for the deciding party but <strong>still limits the choices left to others</strong> can be considered a binding requirement.</p><p>Binding requirements will usually arise from legislation. A binding requirement in a law could, for example, concern:</p><ul><li>the collection, processing, generation, exchange or sharing of data between Union entities or public sector bodies (e.g.&nbsp;a regulation on public registries);</li><li>the automation or digitalisation of public services (e.g.&nbsp;the use of AI in a public service or a digital driving licence);</li><li>the use of new or existing network and information systems (e.g.&nbsp;the use of the ‘once-only’ technical system from Single Digital Gateway Regulation: Regulation (EU) 2018/1724&nbsp;).</li></ul><p>For more information please consult the guidelines.</p>'
+      '#text': '<p>This section collects information on the assessed binding requirements.</p><p><a>The concept of ‘B</a>inding requirements’ is defined in Article&nbsp;2(15) IEA&nbsp;as:</p><ul><li>an obligation, prohibition, condition, criterion or limit;</li><li>of a legal, organisational, semantic or technical nature;&nbsp;</li><li>which is set by a Union entity or a public sector body;</li><li>concerning one or more trans-European digital public services; and&nbsp;</li><li>which has an effect on cross-border interoperability.</li></ul><p>For more information please consult the guidelines.</p>'
       '#format': content_editor
     trans_european_digital_public_services_concerned:
       '#type': processed_text
-      '#text': '<h2>Trans-European digital public service(s) concerned</h2><p>Services are to be considered trans-European digital public services when they fulfil the cumulative requirements set out in Article 2(2) of the IEA. In other words, the services are:</p><p>‘<em>Digital services&nbsp;provided by Union entities or public sector bodies&nbsp;to one another or to natural or legal persons in the Union, and&nbsp;requiring interaction across Member State borders, among Union entities or between Union entities and public sector bodies, by means of their network and information systems.</em>’ &nbsp; –&nbsp; Article 2(2) IEA</p>'
+      '#text': '<h2>Trans-European digital public service(s) concerned</h2><p>Services are to be considered trans-European digital public services when they fulfil the cumulative requirements set out in Article 2(2) of the IEA.</p><p>‘<em>Digital services&nbsp;provided by Union entities or public sector bodies&nbsp;to one another or to natural or legal persons in the Union, and&nbsp;requiring interaction across Member State borders, among Union entities or between Union entities and public sector bodies, by means of their network and information systems.</em>’ &nbsp; –&nbsp; Article 2(2) IEA</p>'
       '#format': content_editor
     horizontal_rule:
       '#type': webform_horizontal_rule
@@ -228,8 +227,8 @@ elements: |-
       '#type': radios
       '#title': 'The binding requirements identified concern:'
       '#options':
-        'One or few specific trans-European digital public services': 'One or few specific trans-European digital public services'
-        'Potentially many trans-European digital public services': 'Potentially many trans-European digital public services'
+        'Limited trans-European digital public services (1-5 specific TEDP services)': 'Limited trans-European digital public services (1-5 specific TEDP services)'
+        'Potentially many trans-European digital public services (6 or more TEDP services)': 'Potentially many trans-European digital public services (6 or more TEDP services)'
       '#options__properties': ''
     trans_european_digital_public_service_concerned:
       '#type': textfield
@@ -238,7 +237,7 @@ elements: |-
       '#states':
         visible:
           ':input[name="binding_requirements_identified_concern"]':
-            value: 'One or few specific trans-European digital public services'
+            value: 'Limited trans-European digital public services (1-5 specific TEDP services)'
       '#multiple__sorting': false
       '#multiple__operations': false
       '#multiple__add_more_input': false
@@ -290,7 +289,7 @@ elements: |-
           '#options':
             Data: Data
             Systems: Systems
-          '#title': 'Select all relevant '
+          '#title': 'Binding requirement affects (select all relevant)'
     stakeholders_affected:
       '#type': processed_text
       '#prefix': '<p>&nbsp;</p>'
@@ -298,7 +297,7 @@ elements: |-
       '#format': content_editor
     data_processed_by:
       '#type': checkboxes
-      '#title': 'This data will potentially be processed by:'
+      '#title': 'Select the groups of stakeholders to which binding requirement(s) are relevant:'
       '#options':
         'Local public sector body': 'Local public sector body'
         'Regional public sector body': 'Regional public sector body'
@@ -319,7 +318,6 @@ elements: |-
       '#multiple__add': false
       '#multiple__add_more_input': false
       '#multiple__add_more_button_label': 'Add country'
-      '#wrapper_type': form_element
       '#label_attributes':
         class:
           - mb-0
@@ -339,7 +337,6 @@ elements: |-
             'Czech Republic': 'Czech Republic'
             Germany: Germany
             Denmark: Denmark
-            England: England
             Spain: Spain
             Finland: Finland
             France: France
@@ -367,7 +364,7 @@ elements: |-
       '#format': content_editor
     interoperable_europe_identification:
       '#type': processed_text
-      '#text': '<p>The Interoperable Europe Act requires the identification of effects on cross-border interoperability, i.e., on the legal, organisational, semantic and technical interoperability of digital public services that exchange data across borders.</p><p>Taking the EIF as the main starting point for your assessment means considering the extent to which the proposed requirements enable or hinder interoperability. This could also show whether additional requirements are needed. As explained above, it is necessary to keep in mind that <strong>the assessment does not need to show the way towards full interoperability, but it should help detect ways towards&nbsp;</strong><em><strong>more&nbsp;</strong></em><strong>interoperability.</strong></p><p>As such, the identification should take into account the European Interoperability Framework with the dimensions mentioned above.</p><p>Please tick the most appropriate and provide a brief description.</p>'
+      '#text': '<p>The Interoperable Europe Act requires the identification of effects on cross-border interoperability, i.e., on the legal, organisational, semantic and technical interoperability of digital public services that exchange data across borders.</p><p>Taking the EIF as the main starting point for your assessment means considering the extent to which the proposed requirements enable or hinder interoperability. This could also show whether additional requirements are needed. As explained above, it is necessary to keep in mind that <strong>the assessment does not need to show the way towards full interoperability, but it should help detect ways towards&nbsp;</strong><em><strong>more&nbsp;</strong></em><strong>interoperability.</strong></p><p>Please tick the most appropriate and provide a brief description.</p>'
       '#format': content_editor
     identified_effects_cross_border_legal:
       '#type': webform_custom_composite
diff --git a/tests/features/joinup_assessment/assessment.feature b/tests/features/joinup_assessment/assessment.feature
index 0e4f3186ee..4a19bcc1c3 100644
--- a/tests/features/joinup_assessment/assessment.feature
+++ b/tests/features/joinup_assessment/assessment.feature
@@ -385,8 +385,8 @@ Feature: Assessments
     When I go to "/collection/assessments/assessment-reports"
     Then I should see the heading "Assessment reports"
     And I should see the link "New assessment"
-    And I should not see the link "My submissions"
-    And I should see the text "There's are no published assessment reports yet. You can add one by filling this questionnaire"
+    And I should not see the link "My assessments"
+    And I should see the text "There are no published assessment reports yet. You can add one by filling this questionnaire"
     And assessment_report content:
       | title         | state     | created              | organization         | collection                         |
       | Assessment 1  | published | 2020-01-01T00:00:00Z | default organization |                                    |
@@ -405,8 +405,8 @@ Feature: Assessments
     When I go to the "Assessment reports" custom_page
     Then I should see the heading "Assessment reports"
     And I should see the link "New assessment"
-    And I should not see the link "My submissions"
-    And I should not see the text "There's are no published assessment reports yet. You can add one by filling this questionnaire"
+    And I should not see the link "My assessments"
+    And I should not see the text "There are no published assessment reports yet. You can add one by filling this questionnaire"
     # Reports are shown in creation descending order in a 10 pager listing.
     And I should see the following tiles in the correct order:
       | Assessment 12 |
@@ -463,5 +463,5 @@ Feature: Assessments
     When I go to "/collection/assessments/assessment-reports"
     Then I should see the heading "Assessment reports"
     And I should see the link "New assessment"
-    And I should see the link "My submissions"
-    And I should not see the text "There's are no published assessment reports yet. You can add one by filling this questionnaire"
+    And I should see the link "My assessments"
+    And I should not see the text "There are no published assessment reports yet. You can add one by filling this questionnaire"
diff --git a/web/modules/custom/joinup_assessment/joinup_assessment.module b/web/modules/custom/joinup_assessment/joinup_assessment.module
index 8631160b12..d4b95c76c6 100644
--- a/web/modules/custom/joinup_assessment/joinup_assessment.module
+++ b/web/modules/custom/joinup_assessment/joinup_assessment.module
@@ -47,7 +47,7 @@ function joinup_assessment_preprocess_views_view(array &$variables): void {
   if ($view->id() === 'assessment_reports' && $view->current_display === 'list') {
     $variables['header']['my_submissions'] = [
       '#type' => 'link',
-      '#title' => t('My submissions'),
+      '#title' => t('My assessments'),
       '#url' => Url::fromUserInput('/collection/assessments/assessment-reports/questionnaire/submissions'),
       '#attributes' => [
         'class' => ['m-3'],
-- 
GitLab


From eee94de8a106ddf2b0b5c402175c2961f9ce9c5c Mon Sep 17 00:00:00 2001
From: Adrian Lorenc <adrian.lorenc@gmail.com>
Date: Thu, 9 Jan 2025 14:36:24 +0100
Subject: [PATCH 123/137] ISAICP-9331: Updates tests.

---
 tests/features/joinup_assessment/assessment.feature | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/tests/features/joinup_assessment/assessment.feature b/tests/features/joinup_assessment/assessment.feature
index 4a19bcc1c3..1546e247a6 100644
--- a/tests/features/joinup_assessment/assessment.feature
+++ b/tests/features/joinup_assessment/assessment.feature
@@ -112,7 +112,7 @@ Feature: Assessments
       | The binding requirements identified concern: {Empty}                                                                                    |
       | Specify the concerned function of trans-European digital public service(s): Defense                                                     |
       | List the binding requirement(s) assessed. {Empty}                                                                                       |
-      | This data will potentially be processed by: {Empty}                                                                                     |
+      | Select the groups of stakeholders to which binding requirement(s) are relevant: {Empty}                                                 |
       | Identified effects on cross-border legal interoperability {Empty}                                                                       |
       | Identified effects on cross-border organisational interoperability {Empty}                                                              |
       | Identified effects on cross-border semantic interoperability {Empty}                                                                    |
@@ -165,7 +165,7 @@ Feature: Assessments
       | The binding requirements identified concern: {Empty}                                                                                    |
       | Specify the concerned function of trans-European digital public service(s): Defense                                                     |
       | List the binding requirement(s) assessed. {Empty}                                                                                       |
-      | This data will potentially be processed by: {Empty}                                                                                     |
+      | Select the groups of stakeholders to which binding requirement(s) are relevant: {Empty}                                                 |
       | Identified effects on cross-border legal interoperability {Empty}                                                                       |
       | Identified effects on cross-border organisational interoperability {Empty}                                                              |
       | Identified effects on cross-border semantic interoperability {Empty}                                                                    |
@@ -278,7 +278,7 @@ Feature: Assessments
       | The binding requirements identified concern: {Empty}                                                               |
       | Specify the concerned function of trans-European digital public service(s): Defense                                |
       | List the binding requirement(s) assessed. {Empty}                                                                  |
-      | This data will potentially be processed by: {Empty}                                                                |
+      | Select the groups of stakeholders to which binding requirement(s) are relevant: {Empty}                            |
       | Identified effects on cross-border legal interoperability {Empty}                                                  |
       | Identified effects on cross-border organisational interoperability {Empty}                                         |
       | Identified effects on cross-border semantic interoperability {Empty}                                               |
-- 
GitLab


From d58e208498e1f41074405536171cecb361d333b6 Mon Sep 17 00:00:00 2001
From: Claudiu Cristea <clau.cristea@gmail.com>
Date: Fri, 10 Jan 2025 12:53:25 +0200
Subject: [PATCH 124/137] ISAICP-9331: Replace non-breaking spaces with spaces.

---
 config/sync/webform.webform.assessment.yml | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/config/sync/webform.webform.assessment.yml b/config/sync/webform.webform.assessment.yml
index 60e30ae745..5c6f25e573 100644
--- a/config/sync/webform.webform.assessment.yml
+++ b/config/sync/webform.webform.assessment.yml
@@ -215,11 +215,11 @@ elements: |-
     '#next_button_label': Next
     intro_section_three:
       '#type': processed_text
-      '#text': '<p>This section collects information on the assessed binding requirements.</p><p><a>The concept of ‘B</a>inding requirements’ is defined in Article&nbsp;2(15) IEA&nbsp;as:</p><ul><li>an obligation, prohibition, condition, criterion or limit;</li><li>of a legal, organisational, semantic or technical nature;&nbsp;</li><li>which is set by a Union entity or a public sector body;</li><li>concerning one or more trans-European digital public services; and&nbsp;</li><li>which has an effect on cross-border interoperability.</li></ul><p>For more information please consult the guidelines.</p>'
+      '#text': '<p>This section collects information on the assessed binding requirements.</p><p>The concept of ‘Binding requirements’ is defined in Article 2(15) IEA as:</p><ul><li>an obligation, prohibition, condition, criterion or limit;</li><li>of a legal, organisational, semantic or technical nature;</li><li>which is set by a Union entity or a public sector body;</li><li>concerning one or more trans-European digital public services; and </li><li>which has an effect on cross-border interoperability.</li></ul><p>For more information please consult the guidelines.</p>'
       '#format': content_editor
     trans_european_digital_public_services_concerned:
       '#type': processed_text
-      '#text': '<h2>Trans-European digital public service(s) concerned</h2><p>Services are to be considered trans-European digital public services when they fulfil the cumulative requirements set out in Article 2(2) of the IEA.</p><p>‘<em>Digital services&nbsp;provided by Union entities or public sector bodies&nbsp;to one another or to natural or legal persons in the Union, and&nbsp;requiring interaction across Member State borders, among Union entities or between Union entities and public sector bodies, by means of their network and information systems.</em>’ &nbsp; –&nbsp; Article 2(2) IEA</p>'
+      '#text': '<h2>Trans-European digital public service(s) concerned</h2><p>Services are to be considered trans-European digital public services when they fulfil the cumulative requirements set out in Article 2(2) of the IEA.</p><p>‘<em>Digital services provided by Union entities or public sector bodies to one another or to natural or legal persons in the Union, and requiring interaction across Member State borders, among Union entities or between Union entities and public sector bodies, by means of their network and information systems.</em>’ – Article 2(2) IEA</p>'
       '#format': content_editor
     horizontal_rule:
       '#type': webform_horizontal_rule
@@ -364,7 +364,7 @@ elements: |-
       '#format': content_editor
     interoperable_europe_identification:
       '#type': processed_text
-      '#text': '<p>The Interoperable Europe Act requires the identification of effects on cross-border interoperability, i.e., on the legal, organisational, semantic and technical interoperability of digital public services that exchange data across borders.</p><p>Taking the EIF as the main starting point for your assessment means considering the extent to which the proposed requirements enable or hinder interoperability. This could also show whether additional requirements are needed. As explained above, it is necessary to keep in mind that <strong>the assessment does not need to show the way towards full interoperability, but it should help detect ways towards&nbsp;</strong><em><strong>more&nbsp;</strong></em><strong>interoperability.</strong></p><p>Please tick the most appropriate and provide a brief description.</p>'
+      '#text': '<p>The Interoperable Europe Act requires the identification of effects on cross-border interoperability, i.e., on the legal, organisational, semantic and technical interoperability of digital public services that exchange data across borders.</p><p>Taking the EIF as the main starting point for your assessment means considering the extent to which the proposed requirements enable or hinder interoperability. This could also show whether additional requirements are needed. As explained above, it is necessary to keep in mind that <strong>the assessment does not need to show the way towards full interoperability, but it should help detect ways towards </strong><em><strong>more </strong></em><strong>interoperability.</strong></p><p>Please tick the most appropriate and provide a brief description.</p>'
       '#format': content_editor
     identified_effects_cross_border_legal:
       '#type': webform_custom_composite
-- 
GitLab


From a92d70dd711446b68cc9999ca65dbe2fe517a0e8 Mon Sep 17 00:00:00 2001
From: Herve Donner <hervedonner@gmail.com>
Date: Mon, 16 Dec 2024 09:21:56 +0100
Subject: [PATCH 125/137] ISAICP-8536: Normalize date format in digest emails.

---
 ...isplay.node.custom_page.digest_message.yml | 28 ++------
 ...w_display.node.document.digest_message.yml |  4 +-
 ...view_display.node.event.digest_message.yml |  9 +--
 ...w_display.node.event.highlighted_event.yml |  1 +
 .../config/schema/joinup_core.schema.yml      |  3 +
 .../CondensedDateRangeFormatter.php           | 67 ++++++++++++-------
 web/themes/ventuno/includes/node.inc          | 16 +++--
 .../content/node--digest-message.html.twig    | 33 +++------
 8 files changed, 78 insertions(+), 83 deletions(-)

diff --git a/config/sync/core.entity_view_display.node.custom_page.digest_message.yml b/config/sync/core.entity_view_display.node.custom_page.digest_message.yml
index 0e123c11a0..cf2c49dd35 100644
--- a/config/sync/core.entity_view_display.node.custom_page.digest_message.yml
+++ b/config/sync/core.entity_view_display.node.custom_page.digest_message.yml
@@ -17,7 +17,6 @@ dependencies:
   module:
     - field_fallback_formatter
     - joinup_core
-    - link
     - template_suggestion
     - user
 id: node.custom_page.digest_message
@@ -44,29 +43,7 @@ content:
     third_party_settings:
       template_suggestion:
         template_suggestion: ''
-    weight: 1
-    region: content
-  flag_like:
-    settings: {  }
-    third_party_settings: {  }
-    weight: 10
-    region: content
-  links:
-    settings: {  }
-    third_party_settings: {  }
-    weight: 100
-    region: content
-  report:
-    type: link
-    label: hidden
-    settings:
-      trim_length: 80
-      url_only: false
-      url_plain: false
-      rel: ''
-      target: ''
-    third_party_settings: {  }
-    weight: 50
+    weight: 0
     region: content
 hidden:
   field_attachment: true
@@ -76,8 +53,11 @@ hidden:
   field_paragraphs_body: true
   field_state: true
   field_topic: true
+  flag_like: true
   langcode: true
+  links: true
   og_audience: true
   published_at: true
+  report: true
   search_api_excerpt: true
   share_link: true
diff --git a/config/sync/core.entity_view_display.node.document.digest_message.yml b/config/sync/core.entity_view_display.node.document.digest_message.yml
index 0916dfb28a..3af215e2bb 100644
--- a/config/sync/core.entity_view_display.node.document.digest_message.yml
+++ b/config/sync/core.entity_view_display.node.document.digest_message.yml
@@ -67,11 +67,11 @@ content:
     weight: 3
     region: content
   field_document_publication_date:
-    type: datetime_default
+    type: datetime_custom
     label: hidden
     settings:
       timezone_override: ''
-      format_type: date_only
+      date_format: 'd F Y'
     third_party_settings:
       template_suggestion:
         template_suggestion: bare
diff --git a/config/sync/core.entity_view_display.node.event.digest_message.yml b/config/sync/core.entity_view_display.node.event.digest_message.yml
index 262caec924..fc31342a56 100644
--- a/config/sync/core.entity_view_display.node.event.digest_message.yml
+++ b/config/sync/core.entity_view_display.node.event.digest_message.yml
@@ -66,10 +66,11 @@ content:
     settings:
       timezone_override: ''
       separator: to
-      default_format: 'd m Y'
+      default_format: 'd F Y'
       day_diff_format: d
       month_diff_format: 'd F'
       year_diff_format: 'd F Y'
+      plain_text: true
     third_party_settings:
       template_suggestion:
         template_suggestion: bare
@@ -85,11 +86,6 @@ content:
         template_suggestion: ''
     weight: 2
     region: content
-  links:
-    settings: {  }
-    third_party_settings: {  }
-    weight: 0
-    region: content
 hidden:
   featured: true
   field_attachment: true
@@ -112,6 +108,7 @@ hidden:
   field_topic: true
   flag_like: true
   langcode: true
+  links: true
   og_audience: true
   pinned_in: true
   published_at: true
diff --git a/config/sync/core.entity_view_display.node.event.highlighted_event.yml b/config/sync/core.entity_view_display.node.event.highlighted_event.yml
index 7a6672f8ec..6018f295d3 100644
--- a/config/sync/core.entity_view_display.node.event.highlighted_event.yml
+++ b/config/sync/core.entity_view_display.node.event.highlighted_event.yml
@@ -52,6 +52,7 @@ content:
       day_diff_format: d
       month_diff_format: d/m
       year_diff_format: d/m/Y
+      plain_text: false
     third_party_settings:
       template_suggestion:
         template_suggestion: ''
diff --git a/web/modules/custom/joinup_core/config/schema/joinup_core.schema.yml b/web/modules/custom/joinup_core/config/schema/joinup_core.schema.yml
index 356cfb3ac4..151b22b2f9 100644
--- a/web/modules/custom/joinup_core/config/schema/joinup_core.schema.yml
+++ b/web/modules/custom/joinup_core/config/schema/joinup_core.schema.yml
@@ -54,6 +54,9 @@ field.formatter.settings.daterange_condensed:
     year_diff_format:
       type: date_format
       label: 'Different years format'
+    plain_text:
+      type: boolean
+      label: 'Render as plain text'
 
 field.formatter.settings.addtocall_daterange_condensed:
   type: field.formatter.settings.addtocal_view
diff --git a/web/modules/custom/joinup_core/src/Plugin/Field/FieldFormatter/CondensedDateRangeFormatter.php b/web/modules/custom/joinup_core/src/Plugin/Field/FieldFormatter/CondensedDateRangeFormatter.php
index 15c5502154..078386f7ea 100644
--- a/web/modules/custom/joinup_core/src/Plugin/Field/FieldFormatter/CondensedDateRangeFormatter.php
+++ b/web/modules/custom/joinup_core/src/Plugin/Field/FieldFormatter/CondensedDateRangeFormatter.php
@@ -26,20 +26,21 @@ class CondensedDateRangeFormatter extends DateTimeFormatterBase {
   /**
    * {@inheritdoc}
    */
-  public static function defaultSettings() {
+  public static function defaultSettings(): array {
     return [
       'separator' => 'to',
       'default_format' => 'd m Y',
       'day_diff_format' => 'd',
       'month_diff_format' => 'd F',
       'year_diff_format' => 'd F Y',
+      'plain_text' => FALSE,
     ] + parent::defaultSettings();
   }
 
   /**
    * {@inheritdoc}
    */
-  public function settingsForm(array $form, FormStateInterface $form_state) {
+  public function settingsForm(array $form, FormStateInterface $form_state): array {
     $form = parent::settingsForm($form, $form_state);
 
     $form['separator'] = [
@@ -77,6 +78,13 @@ public function settingsForm(array $form, FormStateInterface $form_state) {
       '#default_value' => $this->getSetting('year_diff_format'),
     ];
 
+    $form['plain_text'] = [
+      '#type' => 'checkbox',
+      '#title' => $this->t('Render as plain text'),
+      '#description' => $this->t('Omits the ISO date attributes.'),
+      '#default_value' => $this->getSetting('plain_text'),
+    ];
+
     $form['help_text'] = [
       '#markup' => $this->t('See <a href="http://php.net/manual/function.date.php" target="_blank">the documentation for PHP date formats</a>.'),
     ];
@@ -87,22 +95,26 @@ public function settingsForm(array $form, FormStateInterface $form_state) {
   /**
    * {@inheritdoc}
    */
-  public function settingsSummary() {
+  public function settingsSummary(): array {
     $summary = parent::settingsSummary();
 
     if ($separator = $this->getSetting('separator')) {
       $summary[] = $this->t('Separator: %separator', ['%separator' => $separator]);
     }
 
+    $plain_text = $this->getSetting('plain_text');
+    $summary[] = $this->t('Plain text: %value', ['%value' => $plain_text ? $this->t('yes') : $this->t('no')]);
+
     return $summary;
   }
 
   /**
    * {@inheritdoc}
    */
-  public function viewElements(FieldItemListInterface $items, $langcode) {
+  public function viewElements(FieldItemListInterface $items, $langcode): array {
     $elements = [];
     $separator = $this->getSetting('separator');
+    $plain_text = $this->getSetting('plain_text');
 
     foreach ($items as $delta => $item) {
       if (!empty($item->start_date) && !empty($item->end_date)) {
@@ -114,7 +126,9 @@ public function viewElements(FieldItemListInterface $items, $langcode) {
         // If the two dates formatted with the default format are the same,
         // render only one.
         if ($this->formatDate($start_date) === $this->formatDate($end_date)) {
-          $elements[$delta] = $this->buildDateWithIsoAttribute($start_date);
+          $elements[$delta] = $plain_text
+            ? $this->buildDate($start_date)
+            : $this->buildDateWithIsoAttribute($start_date);
           continue;
         }
 
@@ -133,9 +147,9 @@ public function viewElements(FieldItemListInterface $items, $langcode) {
         }
 
         $elements[$delta] = [
-          'start_date' => $this->buildDateWithIsoAttribute($start_date, $format),
+          'start_date' => $plain_text ? $this->buildDate($start_date, $format) : $this->buildDateWithIsoAttribute($start_date, $format),
           'separator' => ['#plain_text' => ' ' . $separator . ' '],
-          'end_date' => $this->buildDateWithIsoAttribute($end_date),
+          'end_date' => $plain_text ? $this->buildDate($end_date) : $this->buildDateWithIsoAttribute($end_date),
         ];
       }
     }
@@ -146,27 +160,34 @@ public function viewElements(FieldItemListInterface $items, $langcode) {
   /**
    * {@inheritdoc}
    */
-  protected function formatDate($date, $format = NULL) {
-    $format = $format ? $format : $this->getSetting('default_format');
+  protected function formatDate($date, $format = NULL): string {
+    $format = $format ?: $this->getSetting('default_format');
     $timezone = $this->getSetting('timezone_override');
     return $this->dateFormatter->format($date->getTimestamp(), 'custom', $format, $timezone != '' ? $timezone : NULL);
   }
 
   /**
-   * Creates a render array from a date object with ISO date attribute.
-   *
-   * @param \Drupal\Core\Datetime\DrupalDateTime $date
-   *   A date object.
-   * @param null|string $format
-   *   The format of the displayed date. NULL to use the default one.
-   *
-   * @return array
-   *   A render array.
+   * {@inheritdoc}
    */
-  protected function buildDateWithIsoAttribute(DrupalDateTime $date, $format = NULL): array {
-    $format = $format ? $format : $this->getSetting('year_diff_format');
+  protected function buildDate(DrupalDateTime $date, ?string $format = NULL): array {
+    $this->setTimeZone($date);
+    return [
+      '#markup' => $this->formatDate($date, $format),
+      '#cache' => [
+        'contexts' => [
+          'timezone',
+        ],
+      ],
+    ];
+  }
 
-    if ($this->getFieldSetting('datetime_type') == DateTimeItem::DATETIME_TYPE_DATE) {
+  /**
+   * {@inheritdoc}
+   */
+  protected function buildDateWithIsoAttribute(DrupalDateTime $date, ?string $format = NULL): array {
+    $format = $format ?: $this->getSetting('year_diff_format');
+
+    if ($this->getFieldSetting('datetime_type') === DateTimeItem::DATETIME_TYPE_DATE) {
       // A date without time will pick up the current time, use the default.
       $date->setDefaultDateTime();
     }
@@ -176,7 +197,7 @@ protected function buildDateWithIsoAttribute(DrupalDateTime $date, $format = NUL
 
     $this->setTimeZone($date);
 
-    $build = [
+    return [
       '#theme' => 'time',
       '#text' => $this->formatDate($date, $format),
       '#html' => FALSE,
@@ -189,8 +210,6 @@ protected function buildDateWithIsoAttribute(DrupalDateTime $date, $format = NUL
         ],
       ],
     ];
-
-    return $build;
   }
 
 }
diff --git a/web/themes/ventuno/includes/node.inc b/web/themes/ventuno/includes/node.inc
index c5db978f0c..b8559d1e6f 100644
--- a/web/themes/ventuno/includes/node.inc
+++ b/web/themes/ventuno/includes/node.inc
@@ -208,9 +208,15 @@ function ventuno_theme_suggestions_joinup_release_releases_download_alter(array
 function ventuno_preprocess_node__digest_message(&$variables): void {
   $node = $variables['node'];
   assert($node instanceof NodeInterface);
-
-  $publicationTime = $node instanceof EntityPublicationTimeInterface
-    ? $node->getPublicationTime()
-    : NULL;
-  $variables['publication_timestamp'] = $publicationTime ?: $node->getCreatedTime();
+  /** @var \Drupal\Core\Datetime\DateFormatterInterface $date_formatter */
+  $date_formatter = \Drupal::service('date.formatter');
+  $date_format = 'date_only_text_month';
+
+  // Digest item date.
+  $variables['digest_item_date'] = match (TRUE) {
+    isset($variables['content']['field_event_date']) => $variables['content']['field_event_date'],
+    isset($variables['content']['field_document_publication_date']) => $variables['content']['field_document_publication_date'],
+    $node instanceof EntityPublicationTimeInterface && $node->getPublicationTime() => $date_formatter->format($node->getPublicationTime(), $date_format),
+    default => $date_formatter->format($node->getCreatedTime(), $date_format),
+  };
 }
diff --git a/web/themes/ventuno/templates/content/node--digest-message.html.twig b/web/themes/ventuno/templates/content/node--digest-message.html.twig
index 0380775cc5..9e0c0a2961 100644
--- a/web/themes/ventuno/templates/content/node--digest-message.html.twig
+++ b/web/themes/ventuno/templates/content/node--digest-message.html.twig
@@ -6,41 +6,32 @@
  * @see template_preprocess_node()
  */
 #}
-{% if content.field_document_publication_date|render %}
-  {% set publication_date = content.field_document_publication_date|render %}
-{% elseif content.field_event_date|render %}
-  {% set publication_date = content.field_event_date|render %}
-{% endif %}
-
 {% if content.field_short_title|render %}
-  {% set node_title = content.field_short_title|render %}
+  {% set digest_item_title = content.field_short_title|render %}
 {% else %}
-  {% set node_title = label %}
+  {% set digest_item_title = label %}
 {% endif %}
 
 {% if content.field_news_logo|render|striptags|trim %}
-  {% set image_url = site_url ~ content.field_news_logo|render|striptags|trim %}
+  {% set digest_item_img = site_url ~ content.field_news_logo|render|striptags|trim %}
 {% elseif content.field_event_logo|render|striptags|trim %}
-  {% set image_url = site_url ~ content.field_event_logo|render|striptags|trim %}
+  {% set digest_item_img = site_url ~ content.field_event_logo|render|striptags|trim %}
 {% else %}
-  {% set image_url = site_url ~ '/' ~ directory ~ '/assets/images/digest-message/' ~ node.bundle ~ '_icon.png' %}
+  {% set digest_item_img = site_url ~ '/' ~ directory ~ '/assets/images/digest-message/' ~ node.bundle ~ '_icon.png' %}
 {% endif %}
 
-{% set description = content.abstract ?? content.body %}
-{% if content.description %}
-  {% set description = content.description %}
-{% endif %}
+{% set digest_item_body = content.description ?? content.abstract ?? content.body %}
 
 <table role="presentation">
   <tbody>
   <tr>
     <td class="bg-primary p-3">
-      <span class="d-inline-flex flex-row fw-bold fs-sm text-white text-uppercase">{{ publication_date ?: publication_timestamp|format_date('date_only') }}</span>
+      <span class="d-inline-flex flex-row fw-bold fs-sm text-white text-uppercase">{{ digest_item_date }}</span>
     </td>
   </tr>
   <tr>
     <td class="fs-lg fw-bold">
-      <a class="text-primary text-none" href="{{ url }}">{{ node_title }}</a>
+      <a class="text-primary text-none" href="{{ url }}">{{ digest_item_title }}</a>
     </td>
   </tr>
   <tr>
@@ -52,12 +43,10 @@
       <table role="presentation">
         <tbody>
         <tr>
-          {% if image_url %}
-            <td style="width: 200px;" class="d-none d-sm-block me-3"><a href="{{ url }}"><img src="{{ image_url }}" width="200" alt=""/></a></td>
-            <td style="width: 20px;" class="d-none d-sm-block">&nbsp;</td>
-          {% endif %}
+          <td style="width: 200px;" class="d-none d-sm-block me-3"><a href="{{ url }}"><img src="{{ digest_item_img }}" width="200" alt=""/></a></td>
+          <td style="width: 20px;" class="d-none d-sm-block">&nbsp;</td>
           <td style="vertical-align: top;">
-            {{ description }}
+            {{ digest_item_body }}
           </td>
         </tr>
         </tbody>
-- 
GitLab


From 7050ae44a8ad3687ebb6643dcf5054b14b52fe51 Mon Sep 17 00:00:00 2001
From: Adrian Lorenc <adrian.lorenc@gmail.com>
Date: Mon, 6 Jan 2025 15:30:11 +0100
Subject: [PATCH 126/137] ISAICP-9322: Update report.

---
 .../src/Form/ExportStatisticsPerGroupForm.php | 124 ++++++------------
 1 file changed, 40 insertions(+), 84 deletions(-)

diff --git a/web/modules/custom/joinup_reports/src/Form/ExportStatisticsPerGroupForm.php b/web/modules/custom/joinup_reports/src/Form/ExportStatisticsPerGroupForm.php
index 975dff3042..c2260e44ea 100644
--- a/web/modules/custom/joinup_reports/src/Form/ExportStatisticsPerGroupForm.php
+++ b/web/modules/custom/joinup_reports/src/Form/ExportStatisticsPerGroupForm.php
@@ -10,9 +10,8 @@
 use Drupal\Core\Datetime\DateFormatterInterface;
 use Drupal\Core\Entity\EntityTypeManagerInterface;
 use Drupal\Core\Form\FormStateInterface;
+use Drupal\joinup_group\JoinupGroupHelper;
 use Drupal\joinup_reports\ExportBatchedDataFormBase;
-use Drupal\joinup_solution\Entity\SolutionInterface;
-use Drupal\rdf_sync\RdfSyncConnectionInterface;
 use Symfony\Component\DependencyInjection\ContainerInterface;
 
 /**
@@ -26,7 +25,6 @@ public function __construct(
     protected TimeInterface $time,
     protected EntityTypeManagerInterface $entityTypeManager,
     protected Connection $mysql,
-    protected RdfSyncConnectionInterface $sparql,
   ) {
     parent::__construct($cache, $dateFormatter, $time);
   }
@@ -34,14 +32,13 @@ public function __construct(
   /**
    * {@inheritdoc}
    */
-  public static function create(ContainerInterface $container) {
+  public static function create(ContainerInterface $container): self {
     return new static(
       $container->get('cache.default'),
       $container->get('date.formatter'),
       $container->get('datetime.time'),
       $container->get('entity_type.manager'),
-      $container->get('database'),
-      $container->get('rdf_sync.connection'),
+      $container->get('database')
     );
   }
 
@@ -83,36 +80,17 @@ public function getFormId(): string {
    */
   public function generateData(array &$form, FormStateInterface $form_state): void {
     // Query to fetch all groups.
-    $ids_query = <<<QUERY
-SELECT * WHERE
-{
-    {
-        SELECT DISTINCT ?entity_id
-        FROM <http://joinup.eu/solution/published>
-        WHERE {
-            ?entity_id <http://joinup.eu/is/workflow_status> ?o .
-            FILTER (!regex(?o, "archived", "i"))
-        }
-    }
-    UNION
-    {
-        SELECT DISTINCT ?entity_id
-        FROM <http://joinup.eu/collection/published>
-        WHERE {
-            ?entity_id a ?bundle_uri .
-        }
-    }
-}
-QUERY;
-
-    // Initialize almost everything (some counters are not initialized here).
-    $query_results = $this->sparql->query($ids_query);
+    $storage = $this->entityTypeManager->getStorage('node');
+    $query = $storage->getQuery()->accessCheck(FALSE)
+      ->condition('status', 1)
+      ->condition('field_state', 'archived', '<>')
+      ->condition('type', array_values(JoinupGroupHelper::GROUP_BUNDLES), 'IN');
 
     $batch_operations = [];
-    foreach ($query_results->getArrayCopy() as $query_result) {
+    foreach ($query->execute() as $nid) {
       $batch_operations[] = [
         [$this, 'generateGroupStatistics'],
-        [$query_result->entity_id],
+        [$nid],
       ];
     }
 
@@ -136,24 +114,23 @@ public function generateData(array &$form, FormStateInterface $form_state): void
    *   The batch context.
    */
   public function generateGroupStatistics(string $entity_id, array &$context): void {
-    $rdf_storage = $this->entityTypeManager->getStorage('node');
+    $storage = $this->entityTypeManager->getStorage('node');
     /** @var \Drupal\collection\Entity\CollectionInterface|\Drupal\joinup_solution\Entity\SolutionInterface $group */
-    $group = $rdf_storage->load((string) $entity_id);
+    $group = $storage->load($entity_id);
+
     // Fetch the nodes that belong to the group.
     $group_content_data = $this->mysql->query(
       $this->getGroupContentQuery(), [':parent_entity_id' => $entity_id]
     )->fetchAll();
     $group_content = [
-      // Node entities.
-      'custom_page' => ['active' => 0, 'archived' => 0],
-      'discussion' => ['active' => 0, 'archived' => 0],
-      'document' => ['active' => 0, 'archived' => 0],
-      'event' => ['active' => 0, 'archived' => 0],
-      'news' => ['active' => 0, 'archived' => 0],
-      'distribution' => 0,
-      // RDF entities.
-      'solution' => 0,
-      'release' => 0,
+      'custom_page' => ['published' => 0, 'archived' => 0],
+      'discussion' => ['published' => 0, 'archived' => 0],
+      'document' => ['published' => 0, 'archived' => 0],
+      'event' => ['published' => 0, 'archived' => 0],
+      'news' => ['published' => 0, 'archived' => 0],
+      'distribution' => ['published' => 0, 'archived' => 0],
+      'solution' => ['published' => 0, 'archived' => 0],
+      'release' => ['published' => 0, 'archived' => 0],
     ];
 
     foreach ($group_content_data as $data) {
@@ -161,11 +138,6 @@ public function generateGroupStatistics(string $entity_id, array &$context): voi
         continue;
       }
 
-      if (is_int($group_content[$data->type])) {
-        $group_content[$data->type] += $data->entities;
-        continue;
-      }
-
       if (is_array($group_content[$data->type]) && isset($group_content[$data->type][$data->state])) {
         $group_content[$data->type][$data->state] += $data->entities;
       }
@@ -174,24 +146,20 @@ public function generateGroupStatistics(string $entity_id, array &$context): voi
     // Get the group content ids.
     $content = $group->getGroupContentIds();
     $content_ids = [];
+    $content_ids[] = $group->id();
 
-    array_walk_recursive($content, function ($value) use (&$content_ids): void {
+    array_walk_recursive($content, function($value) use (&$content_ids): void {
       $content_ids[] = $value;
     });
 
-    // For solutions, count releases and distributions.
-    if ($group instanceof SolutionInterface) {
-      foreach ($group->releases_and_distributions->referencedEntities() as $entity) {
-        $group_content[$entity->bundle()]++;
-      }
-      $content_ids[] = $group->id();
-    }
-    // For collections simply pass the number of solutions (affiliates).
-    else {
-      $group_content['solution'] = $group->field_ar_affiliates->count();
-    }
+    $description = $group->get($group->getDescriptionField())->value;
 
-    $description = $group->hasField('field_ar_description') ? $group->field_ar_description->value : $group->field_is_description->value;
+    $total_published = 0;
+    $total_archived = 0;
+    foreach ($group_content as $content_data) {
+      $total_published += $content_data['published'];
+      $total_archived += $content_data['archived'];
+    }
 
     // Add data to the final array.
     $context['results']['data'][$group->id()] = [
@@ -201,28 +169,16 @@ public function generateGroupStatistics(string $entity_id, array &$context): voi
       'Last update date' => \Drupal::getContainer()
         ->get('date.formatter')
         ->format($group->getChangedTime(), 'c'),
-      'Custom pages' => $group_content['custom_page']['active'],
-      'Discussions' => $group_content['discussion']['active'],
-      'Documents' => $group_content['document']['active'],
-      'Events' => $group_content['event']['active'],
-      'News' => $group_content['news']['active'],
-      'Solutions' => $group_content['solution'],
-      'Releases' => $group_content['release'],
-      'Distributions' => $group_content['distribution'],
-      'Total number of items' =>
-      $group_content['custom_page']['active']
-      + $group_content['discussion']['active']
-      + $group_content['document']['active']
-      + $group_content['event']['active']
-      + $group_content['news']['active']
-      + $group_content['release']
-      + $group_content['distribution'],
-      'Total number of archived items' =>
-      $group_content['custom_page']['archived']
-      + $group_content['discussion']['archived']
-      + $group_content['document']['archived']
-      + $group_content['event']['archived']
-      + $group_content['news']['archived'],
+      'Custom pages' => $group_content['custom_page']['published'],
+      'Discussions' => $group_content['discussion']['published'],
+      'Documents' => $group_content['document']['published'],
+      'Events' => $group_content['event']['published'],
+      'News' => $group_content['news']['published'],
+      'Solutions' => $group_content['solution']['published'],
+      'Releases' => $group_content['release']['published'],
+      'Distributions' => $group_content['distribution']['published'],
+      'Total number of items' => $total_published,
+      'Total number of archived items' => $total_archived,
       'Number of members' => $group->getActiveMemberCount(),
       'Description word count' => str_word_count(strip_tags($description)),
       'Total number of likes' => !empty($content_ids) ? $this->getLikesCount($content_ids) : 0,
-- 
GitLab


From 9a583ff38a04f6f7d29f91de956b3204c9c2d7aa Mon Sep 17 00:00:00 2001
From: Adrian Lorenc <adrian.lorenc@gmail.com>
Date: Mon, 6 Jan 2025 15:30:59 +0100
Subject: [PATCH 127/137] ISAICP-9322: Fix phpcs.

---
 .../joinup_reports/src/Form/ExportStatisticsPerGroupForm.php    | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/web/modules/custom/joinup_reports/src/Form/ExportStatisticsPerGroupForm.php b/web/modules/custom/joinup_reports/src/Form/ExportStatisticsPerGroupForm.php
index c2260e44ea..7b05ab1697 100644
--- a/web/modules/custom/joinup_reports/src/Form/ExportStatisticsPerGroupForm.php
+++ b/web/modules/custom/joinup_reports/src/Form/ExportStatisticsPerGroupForm.php
@@ -148,7 +148,7 @@ public function generateGroupStatistics(string $entity_id, array &$context): voi
     $content_ids = [];
     $content_ids[] = $group->id();
 
-    array_walk_recursive($content, function($value) use (&$content_ids): void {
+    array_walk_recursive($content, function ($value) use (&$content_ids): void {
       $content_ids[] = $value;
     });
 
-- 
GitLab


From e0bc92f6e0454d934a5dfd1fcae2e1d176d3efeb Mon Sep 17 00:00:00 2001
From: Adrian Lorenc <adrian.lorenc@gmail.com>
Date: Tue, 7 Jan 2025 08:55:00 +0100
Subject: [PATCH 128/137] ISAICP-9322: Use NodeInterface::PUBLISHED.

---
 .../joinup_reports/src/Form/ExportStatisticsPerGroupForm.php   | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/web/modules/custom/joinup_reports/src/Form/ExportStatisticsPerGroupForm.php b/web/modules/custom/joinup_reports/src/Form/ExportStatisticsPerGroupForm.php
index 7b05ab1697..d4f1e58f5c 100644
--- a/web/modules/custom/joinup_reports/src/Form/ExportStatisticsPerGroupForm.php
+++ b/web/modules/custom/joinup_reports/src/Form/ExportStatisticsPerGroupForm.php
@@ -12,6 +12,7 @@
 use Drupal\Core\Form\FormStateInterface;
 use Drupal\joinup_group\JoinupGroupHelper;
 use Drupal\joinup_reports\ExportBatchedDataFormBase;
+use Drupal\node\NodeInterface;
 use Symfony\Component\DependencyInjection\ContainerInterface;
 
 /**
@@ -82,7 +83,7 @@ public function generateData(array &$form, FormStateInterface $form_state): void
     // Query to fetch all groups.
     $storage = $this->entityTypeManager->getStorage('node');
     $query = $storage->getQuery()->accessCheck(FALSE)
-      ->condition('status', 1)
+      ->condition('status', NodeInterface::PUBLISHED)
       ->condition('field_state', 'archived', '<>')
       ->condition('type', array_values(JoinupGroupHelper::GROUP_BUNDLES), 'IN');
 
-- 
GitLab


From 9ce6a366ca1e6b6640d73497b96ce732c10a8a5c Mon Sep 17 00:00:00 2001
From: Zoltan Horvath <zoltan.horvath@ext.ec.europa.eu>
Date: Fri, 6 Dec 2024 07:43:43 +0100
Subject: [PATCH 129/137] ISAICP-9161: Add CKEditor5 stylesheet to make content
 in Layout Paragraphs editor look similar to front end

---
 bcl-builder.config.js                         | 16 +++++++++++++++
 web/themes/iop/iop.theme                      |  7 +++++++
 .../css/editor.layout-paragraphs.min.css      |  2 ++
 web/themes/ventuno/includes/layout.inc        |  7 +++++++
 .../scss/components/paragraphs/paragraph.scss | 10 +---------
 .../src/scss/editor.layout-paragraphs.scss    | 20 +++++++++++++++++++
 .../ventuno/src/scss/partials/_core.scss      |  2 ++
 .../scss/partials/mixins/_general.mixins.scss | 12 +++++++++++
 .../partials/mixins/_paragraph.mixins.scss    | 14 +++++++++++++
 .../src/scss/partials/overrides/_general.scss |  8 +-------
 web/themes/ventuno/ventuno.info.yml           |  3 +++
 11 files changed, 85 insertions(+), 16 deletions(-)
 create mode 100644 web/themes/ventuno/assets/css/editor.layout-paragraphs.min.css
 create mode 100644 web/themes/ventuno/src/scss/editor.layout-paragraphs.scss
 create mode 100644 web/themes/ventuno/src/scss/partials/mixins/_general.mixins.scss
 create mode 100644 web/themes/ventuno/src/scss/partials/mixins/_paragraph.mixins.scss

diff --git a/bcl-builder.config.js b/bcl-builder.config.js
index 56dd51c474..4a6f23f99c 100644
--- a/bcl-builder.config.js
+++ b/bcl-builder.config.js
@@ -1201,6 +1201,22 @@ module.exports = {
         sourceMap: "file",
       },
     },
+    // Editor.
+    {
+      entry: path.resolve(
+        outputFolder,
+        `${ventuno}src/scss/editor.layout-paragraphs.scss`,
+      ),
+      dest: path.resolve(
+        outputFolder,
+        `${ventuno}assets/css/editor.layout-paragraphs.min.css`,
+      ),
+      options: {
+        minify: true,
+        includePaths,
+        sourceMap: "file",
+      },
+    },
     // IOP
     // Components (SMACSS)
     {
diff --git a/web/themes/iop/iop.theme b/web/themes/iop/iop.theme
index 19ad8a2317..c41c03cde9 100644
--- a/web/themes/iop/iop.theme
+++ b/web/themes/iop/iop.theme
@@ -99,6 +99,13 @@ function iop_preprocess_page(array &$variables): void {
   }
 }
 
+/**
+ * Implements template_preprocess_HOOK() for html.
+ */
+function iop_preprocess_html(array &$variables): void {
+  $variables['html_attributes']->removeClass('t-ventuno')->addClass('t-iop');
+}
+
 /**
  * Implements hook_preprocess_HOOK().
  */
diff --git a/web/themes/ventuno/assets/css/editor.layout-paragraphs.min.css b/web/themes/ventuno/assets/css/editor.layout-paragraphs.min.css
new file mode 100644
index 0000000000..a5fd701da4
--- /dev/null
+++ b/web/themes/ventuno/assets/css/editor.layout-paragraphs.min.css
@@ -0,0 +1,2 @@
+.layout-paragraphs-component-form .ck table td{min-width:100px;vertical-align:top}@media (min-width:768px){.layout-paragraphs-component-form .ck table{table-layout:fixed}}.layout-paragraphs-component-form .ck figure.drupal-media:has(.media-video){display:block;width:100%}@media (min-width:768px){.layout-paragraphs-component-form .ck figure[data-view-mode=media_library_full_width]{max-width:100%}}.t-ventuno .layout-paragraphs-component-form .ck .media-video{margin-bottom:1rem;max-width:648px;width:100%}.t-ventuno .layout-paragraphs-component-form .ck .media-video iframe{max-width:100%}
+/*# sourceMappingURL=editor.layout-paragraphs.min.css.map */
\ No newline at end of file
diff --git a/web/themes/ventuno/includes/layout.inc b/web/themes/ventuno/includes/layout.inc
index 5b0c16e0f5..3c5f4ca14e 100644
--- a/web/themes/ventuno/includes/layout.inc
+++ b/web/themes/ventuno/includes/layout.inc
@@ -115,6 +115,13 @@ function ventuno_preprocess_html(array &$variables): void {
   if ($variables['user']->isAuthenticated()) {
     $variables['#attached']['library'][] = 'ventuno/toolbar';
   }
+
+  // CKEditor5 stylesheets are not calculated dynamically for every route, but
+  // computed only based on the default theme settings. This means that on the
+  // pages where we use IOP theme, we still will use the ckeditor5-stylesheets
+  // from Ventuno's info.yml file. Hence we add a theme-specific class here what
+  // we replace in IOP.
+  $variables['html_attributes']->addClass('t-ventuno');
 }
 
 /**
diff --git a/web/themes/ventuno/src/scss/components/paragraphs/paragraph.scss b/web/themes/ventuno/src/scss/components/paragraphs/paragraph.scss
index da78b2cbb8..fadb4b42a6 100644
--- a/web/themes/ventuno/src/scss/components/paragraphs/paragraph.scss
+++ b/web/themes/ventuno/src/scss/components/paragraphs/paragraph.scss
@@ -2,15 +2,7 @@
 
 .paragraph,
 .fieldset--textarea {
-  table {
-    td {
-      min-width: 100px;
-      vertical-align: top;
-    }
-    @include media-breakpoint-up(md) {
-      table-layout: fixed;
-    }
-  }
+  @include paragraph-table;
 
   figure {
     figcaption {
diff --git a/web/themes/ventuno/src/scss/editor.layout-paragraphs.scss b/web/themes/ventuno/src/scss/editor.layout-paragraphs.scss
new file mode 100644
index 0000000000..35a7c4c8bd
--- /dev/null
+++ b/web/themes/ventuno/src/scss/editor.layout-paragraphs.scss
@@ -0,0 +1,20 @@
+@import "partials/core";
+
+.layout-paragraphs-component-form .ck {
+  @include paragraph-table;
+
+  figure.drupal-media:has(.media-video) {
+    display: block;
+    width: 100%;
+  }
+
+  @include media-breakpoint-up(md) {
+    figure[data-view-mode="media_library_full_width"] {
+      max-width: 100%;
+    }
+  }
+
+  @at-root .t-ventuno & .media-video {
+    @include ventuno-media-video;
+  }
+}
diff --git a/web/themes/ventuno/src/scss/partials/_core.scss b/web/themes/ventuno/src/scss/partials/_core.scss
index 6bbfdbf5cf..df4e1c7f9b 100644
--- a/web/themes/ventuno/src/scss/partials/_core.scss
+++ b/web/themes/ventuno/src/scss/partials/_core.scss
@@ -32,3 +32,5 @@
 
 @import "mixins/bootstrap-icons";
 @import "mixins/full-width-background-colors";
+@import "mixins/general.mixins";
+@import "mixins/paragraph.mixins";
diff --git a/web/themes/ventuno/src/scss/partials/mixins/_general.mixins.scss b/web/themes/ventuno/src/scss/partials/mixins/_general.mixins.scss
new file mode 100644
index 0000000000..5ec52d5bba
--- /dev/null
+++ b/web/themes/ventuno/src/scss/partials/mixins/_general.mixins.scss
@@ -0,0 +1,12 @@
+// @file
+// Component styles from _general to be reused also in editor styles.
+
+// Dirty hack to make videos responsive and half width.
+@mixin ventuno-media-video() {
+  width: 100%;
+  max-width: 648px;
+  margin-bottom: $spacer;
+  iframe {
+    max-width: 100%;
+  }
+}
diff --git a/web/themes/ventuno/src/scss/partials/mixins/_paragraph.mixins.scss b/web/themes/ventuno/src/scss/partials/mixins/_paragraph.mixins.scss
new file mode 100644
index 0000000000..79e1bc2848
--- /dev/null
+++ b/web/themes/ventuno/src/scss/partials/mixins/_paragraph.mixins.scss
@@ -0,0 +1,14 @@
+// @file
+// Component styles from paragraphs to make them reusable in editor styles.
+
+@mixin paragraph-table() {
+  table {
+    td {
+      min-width: 100px;
+      vertical-align: top;
+    }
+    @include media-breakpoint-up(md) {
+      table-layout: fixed;
+    }
+  }
+}
diff --git a/web/themes/ventuno/src/scss/partials/overrides/_general.scss b/web/themes/ventuno/src/scss/partials/overrides/_general.scss
index 1afe0c49f9..02901e09be 100644
--- a/web/themes/ventuno/src/scss/partials/overrides/_general.scss
+++ b/web/themes/ventuno/src/scss/partials/overrides/_general.scss
@@ -4,15 +4,9 @@
     display: inline-block;
   }
 
-  // Dirty hack to make videos responsive and half width.
   .drupal-media:has(.media-video),
   .media-video {
-    width: 100%;
-    max-width: 648px;
-    margin-bottom: $spacer;
-    iframe {
-      max-width: 100%;
-    }
+    @include ventuno-media-video;
   }
 }
 
diff --git a/web/themes/ventuno/ventuno.info.yml b/web/themes/ventuno/ventuno.info.yml
index 6933ee1a2b..c88992b9a8 100644
--- a/web/themes/ventuno/ventuno.info.yml
+++ b/web/themes/ventuno/ventuno.info.yml
@@ -12,6 +12,9 @@ libraries:
   - ventuno/theme
   - ventuno/tables
 
+ckeditor5-stylesheets:
+  - assets/css/editor.layout-paragraphs.min.css
+
 libraries-extend:
   core/drupal.ajax:
     - ventuno/ajax-throbber
-- 
GitLab


From 121d56d73d724190e4c0521d61be9ca371fc5b75 Mon Sep 17 00:00:00 2001
From: Zoltan Horvath <zoltan.horvath@ext.ec.europa.eu>
Date: Mon, 9 Dec 2024 10:56:07 +0100
Subject: [PATCH 130/137] ISAICP-9161: Add tests to check LP editor styling
 manually

---
 .../paragraphs/simple-media-alignment.feature | 38 +++++++++++++++++++
 1 file changed, 38 insertions(+)
 create mode 100644 tests/features/paragraphs/simple-media-alignment.feature

diff --git a/tests/features/paragraphs/simple-media-alignment.feature b/tests/features/paragraphs/simple-media-alignment.feature
new file mode 100644
index 0000000000..c52f1bc6cc
--- /dev/null
+++ b/tests/features/paragraphs/simple-media-alignment.feature
@@ -0,0 +1,38 @@
+@api @javascript @group-clone @wip
+Feature: Front end rendering of embed media.
+  How to test:
+  Navigate to joinup_test.module and comment out the line attaching joinup_test/testing.css_disable_transitions.
+  Remove the @wip tag.
+  Add a longer sleep to the last step's definition and look around while it happens.
+
+  Scenario Outline: Rendering of aligned remote video media
+    Given custom_page content:
+      | title            | collection   | state     | topic | field_paragraphs_body |
+      | Media embed test | <collection> | published | Tools | <h2>What is Lorem Ipsum?</h2><drupal-media data-entity-type="media" data-entity-uuid="<media-uuid-left>" data-align="left">&nbsp;</drupal-media><p><strong>Lorem Ipsum</strong> is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.</p></div><div><h2>Why do we use it?</h2><p>It is a long established fact that a reader will be distracted by the readable content of a page when looking at its layout. The point of using Lorem Ipsum is that it has a more-or-less normal distribution of letters, as opposed to using 'Content here, content here', making it look like readable English. Many desktop publishing packages and web page editors now use Lorem Ipsum as their default model text, and a search for 'lorem ipsum' will uncover many web sites still in their infancy. Various versions have evolved over the years, sometimes by accident, sometimes on purpose (injected humour and the like).</p></div><div><h2>Where does it come from?</h2><p>Contrary to popular belief, Lorem Ipsum is not simply random text. It has roots in a piece of classical Latin literature from 45 BC, making it over 2000 years old.&nbsp;</p><drupal-media data-entity-type="media" data-entity-uuid="<media-uuid-right>" data-align="right">&nbsp;</drupal-media><p>Richard McClintock, a Latin professor at Hampden-Sydney College in Virginia, looked up one of the more obscure Latin words, consectetur, from a Lorem Ipsum passage, and going through the cites of the word in classical literature, discovered the undoubtable source. Lorem Ipsum comes from sections 1.10.32 and 1.10.33 of "de Finibus Bonorum et Malorum" (The Extremes of Good and Evil) by Cicero, written in 45 BC. This book is a treatise on the theory of ethics, very popular during the Renaissance. The first line of Lorem Ipsum, "Lorem ipsum dolor sit amet..", comes from a line in section 1.10.32.</p><p>The standard chunk of Lorem Ipsum used since the 1500s is reproduced below for those interested. Sections 1.10.32 and 1.10.33 from "de Finibus Bonorum et Malorum" by Cicero are also reproduced in their exact original form, accompanied by English versions from the 1914 translation by H. Rackham.</p></div><div><h2>Where can I get some?</h2><p>There are many variations of passages of Lorem Ipsum available, but the majority have suffered alteration in some form, by injected humour, or randomised words which don't look even slightly believable.&nbsp;</p><drupal-media data-entity-type="media" data-entity-uuid="<media-uuid-center>" data-align="center">&nbsp;</drupal-media><p>If you are going to use a passage of Lorem Ipsum, you need to be sure there isn't anything embarrassing hidden in the middle of text. All the Lorem Ipsum generators on the Internet tend to repeat predefined chunks as necessary, making this the first true generator on the Internet. It uses a dictionary of over 200 Latin words, combined with a handful of model sentence structures, to generate Lorem Ipsum which looks reasonable. The generated Lorem Ipsum is therefore always free from repetition, injected humour, or non-characteristic words etc.</p><drupal-media data-entity-type="media" data-entity-uuid="<media-uuid-default>">&nbsp;</drupal-media> |
+    Given I am logged in as a moderator
+    And I visit the "Media embed test" custom page
+    And I open the header local tasks menu
+    And I click "Edit"
+    And I click "Edit" in the "Content" region
+    And I should see the text "I hope this text never appears on the page"
+
+    Examples:
+      | collection           | media-uuid-left                      | media-uuid-right                     | media-uuid-center                    | media-uuid-default                   |
+      | Interoperable Europe | 76ca044a-b295-477f-8851-31c8b22f73e5 | d9a455f1-066e-42c2-8dab-105a135e2828 | e9fff388-f0bf-47a1-a0ff-809c049e4aa0 | d4582c9f-15fa-4d37-a320-158054bdb496 |
+      | The Portal           | e0df146f-e681-42b1-b4ac-84fee022d89d | 3137346f-7815-4162-a787-b3eb1541f0d1 | 68796820-ac4a-43c4-ab11-b90c6d4cad19 | d40e7d9a-bc56-44a3-a980-5d724a9f2c86 |
+
+  Scenario Outline: Rendering of aligned image media
+    Given custom_page content:
+      | title            | collection   | state     | topic | field_paragraphs_body |
+      | Media embed test | <collection> | published | Tools | <drupal-media data-entity-type="media" data-entity-uuid="<media-uuid-left>" data-align="left">&nbsp;</drupal-media><h2>What is Lorem Ipsum?</h2><p><strong>Lorem Ipsum</strong> is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.</p></div><div><h2>Why do we use it?</h2><p>It is a long established fact that a reader will be distracted by the readable content of a page when looking at its layout. The point of using Lorem Ipsum is that it has a more-or-less normal distribution of letters, as opposed to using 'Content here, content here', making it look like readable English. Many desktop publishing packages and web page editors now use Lorem Ipsum as their default model text, and a search for 'lorem ipsum' will uncover many web sites still in their infancy. Various versions have evolved over the years, sometimes by accident, sometimes on purpose (injected humour and the like).</p></div><div><drupal-media data-entity-type="media" data-entity-uuid="<media-uuid-right>" data-view-mode="media_library_one_third_width" data-align="right">&nbsp;</drupal-media><h2>Where does it come from?</h2><p>Contrary to popular belief, Lorem Ipsum is not simply random text. It has roots in a piece of classical Latin literature from 45 BC, making it over 2000 years old.&nbsp;</p><p>Richard McClintock, a Latin professor at Hampden-Sydney College in Virginia, looked up one of the more obscure Latin words, consectetur, from a Lorem Ipsum passage, and going through the cites of the word in classical literature, discovered the undoubtable source. Lorem Ipsum comes from sections 1.10.32 and 1.10.33 of "de Finibus Bonorum et Malorum" (The Extremes of Good and Evil) by Cicero, written in 45 BC. This book is a treatise on the theory of ethics, very popular during the Renaissance. The first line of Lorem Ipsum, "Lorem ipsum dolor sit amet..", comes from a line in section 1.10.32.</p><p>The standard chunk of Lorem Ipsum used since the 1500s is reproduced below for those interested. Sections 1.10.32 and 1.10.33 from "de Finibus Bonorum et Malorum" by Cicero are also reproduced in their exact original form, accompanied by English versions from the 1914 translation by H. Rackham.</p></div><div><h2>Where can I get some?</h2><drupal-media data-entity-type="media" data-entity-uuid="<media-uuid-center>" data-align="center">&nbsp;</drupal-media><p>There are many variations of passages of Lorem Ipsum available, but the majority have suffered alteration in some form, by injected humour, or randomised words which don't look even slightly believable.&nbsp;</p><p>If you are going to use a passage of Lorem Ipsum, you need to be sure there isn't anything embarrassing hidden in the middle of text. All the Lorem Ipsum generators on the Internet tend to repeat predefined chunks as necessary, making this the first true generator on the Internet. It uses a dictionary of over 200 Latin words, combined with a handful of model sentence structures, to generate Lorem Ipsum which looks reasonable. The generated Lorem Ipsum is therefore always free from repetition, injected humour, or non-characteristic words etc.</p><drupal-media data-entity-type="media" data-entity-uuid="<media-uuid-default>" data-view-mode="media_library_full_width">&nbsp;</drupal-media> |
+    Given I am logged in as a moderator
+    And I visit the "Media embed test" custom page
+    And I open the header local tasks menu
+    And I click "Edit"
+    And I click "Edit" in the "Content" region
+    And I should see the text "I hope this text never appears on the page"
+
+    Examples:
+      | collection           | media-uuid-left                      | media-uuid-right                     | media-uuid-center                    | media-uuid-default                   |
+      | Interoperable Europe | c530e047-9741-4e69-862a-5923c8650579 | 0c8a0ef9-e9e6-4df7-a087-566d48dd9fef | 4883466f-f3d3-437a-8285-0b046539f0e3 | 27e4c635-09d3-42ca-9af9-d12a358654f2 |
+      | The Portal           | 8056f47e-e0bc-4257-a381-2597a3aa1e37 | 65a24ac4-65c7-45bb-a090-8c3b0cd13547 | 58c115e0-5811-4ef1-a0df-7cdfd899a695 | 757b876f-df24-49ef-81c3-bb58953c7553 |
-- 
GitLab


From 36efe5dd0037b7f5ed8f6b21be229ea16becfa2c Mon Sep 17 00:00:00 2001
From: Claudiu Cristea <clau.cristea@gmail.com>
Date: Fri, 10 Jan 2025 12:07:17 +0200
Subject: [PATCH 131/137] ISAICP-9161: Recompile assets.

---
 web/themes/iop/assets/css/glide.core.min.css      | 2 +-
 web/themes/iop/assets/js/glide.min.js             | 4 ++--
 web/themes/ventuno/assets/css/glide.core.min.css  | 2 +-
 web/themes/ventuno/assets/js/carousel.min.js      | 4 ++--
 web/themes/ventuno/assets/js/explore-block.min.js | 4 ++--
 5 files changed, 8 insertions(+), 8 deletions(-)

diff --git a/web/themes/iop/assets/css/glide.core.min.css b/web/themes/iop/assets/css/glide.core.min.css
index 4dae0fd6b8..4f611b375f 100644
--- a/web/themes/iop/assets/css/glide.core.min.css
+++ b/web/themes/iop/assets/css/glide.core.min.css
@@ -1 +1 @@
-.glide{position:relative;width:100%;box-sizing:border-box}.glide *{box-sizing:inherit}.glide__track{overflow:hidden}.glide__slides{position:relative;width:100%;list-style:none;backface-visibility:hidden;transform-style:preserve-3d;touch-action:pan-Y;overflow:hidden;margin:0;padding:0;white-space:nowrap;display:flex;flex-wrap:nowrap;will-change:transform}.glide__slides--dragging{user-select:none}.glide__slide{width:100%;height:100%;flex-shrink:0;white-space:normal;user-select:none;-webkit-touch-callout:none;-webkit-tap-highlight-color:transparent}.glide__slide a{user-select:none;-webkit-user-drag:none;-moz-user-select:none;-ms-user-select:none}.glide__arrows{-webkit-touch-callout:none;user-select:none}.glide__bullets{-webkit-touch-callout:none;user-select:none}.glide--rtl{direction:rtl}.glide__lazy__loaded{-webkit-animation:fadeInFromNone .5s ease-in 0s forwards;animation:fadeInFromNone .5s ease-in 0s forwards}@keyframes fadeInFromNone{0%{visibility:hidden;opacity:0}1%{visibility:visible;opacity:0}100%{visibility:visible;opacity:1}}/*# sourceMappingURL=glide.core.min.css.map */
+.glide{position:relative;width:100%;box-sizing:border-box}.glide *{box-sizing:inherit}.glide__track{overflow:hidden}.glide__slides{position:relative;width:100%;list-style:none;backface-visibility:hidden;transform-style:preserve-3d;touch-action:pan-Y;overflow:hidden;margin:0;padding:0;white-space:nowrap;display:flex;flex-wrap:nowrap;will-change:transform}.glide__slides--dragging{user-select:none}.glide__slide{width:100%;height:100%;flex-shrink:0;white-space:normal;user-select:none;-webkit-touch-callout:none;-webkit-tap-highlight-color:transparent}.glide__slide a{user-select:none;-webkit-user-drag:none;-moz-user-select:none;-ms-user-select:none}.glide__arrows{-webkit-touch-callout:none;user-select:none}.glide__bullets{-webkit-touch-callout:none;user-select:none}.glide--rtl{direction:rtl}/*# sourceMappingURL=glide.core.min.css.map */
diff --git a/web/themes/iop/assets/js/glide.min.js b/web/themes/iop/assets/js/glide.min.js
index 0293687b71..f5473d9d4b 100644
--- a/web/themes/iop/assets/js/glide.min.js
+++ b/web/themes/iop/assets/js/glide.min.js
@@ -1,7 +1,7 @@
 !function(t){"function"==typeof define&&define.amd?define(t):t()}((function(){"use strict";
 /*!
    * Glide.js v3.6.0
-   * (c) 2013-2023 Jędrzej Chałubek (https://github.com/jedrzejchalubek/)
+   * (c) 2013-2022 Jędrzej Chałubek (https://github.com/jedrzejchalubek/)
    * Released under the MIT License.
-   */function t(e){return t="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},t(e)}function e(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function n(t,e){for(var n=0;n<e.length;n++){var i=e[n];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(t,i.key,i)}}function i(t,e,i){return e&&n(t.prototype,e),i&&n(t,i),t}function r(t){return r=Object.setPrototypeOf?Object.getPrototypeOf:function(t){return t.__proto__||Object.getPrototypeOf(t)},r(t)}function o(t,e){return o=Object.setPrototypeOf||function(t,e){return t.__proto__=e,t},o(t,e)}function s(t,e){if(e&&("object"==typeof e||"function"==typeof e))return e;if(void 0!==e)throw new TypeError("Derived constructors may only return object or undefined");return function(t){if(void 0===t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return t}(t)}function a(t){var e=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(t){return!1}}();return function(){var n,i=r(t);if(e){var o=r(this).constructor;n=Reflect.construct(i,arguments,o)}else n=i.apply(this,arguments);return s(this,n)}}function u(){return u="undefined"!=typeof Reflect&&Reflect.get?Reflect.get:function(t,e,n){var i=function(t,e){for(;!Object.prototype.hasOwnProperty.call(t,e)&&null!==(t=r(t)););return t}(t,e);if(i){var o=Object.getOwnPropertyDescriptor(i,e);return o.get?o.get.call(arguments.length<3?t:n):o.value}},u.apply(this,arguments)}var c={type:"slider",startAt:0,perView:1,focusAt:0,gap:10,autoplay:!1,hoverpause:!0,keyboard:!0,bound:!1,swipeThreshold:80,dragThreshold:120,perSwipe:"",touchRatio:.5,touchAngle:45,animationDuration:400,rewind:!0,rewindDuration:800,animationTimingFunc:"cubic-bezier(.165, .840, .440, 1)",waitForTransition:!0,throttle:10,direction:"ltr",peek:0,cloningRatio:1,breakpoints:{},lazy:!1,lazyScrollThreshold:1.2,lazyInitialSlidesLoaded:2,classes:{swipeable:"glide--swipeable",dragging:"glide--dragging",direction:{ltr:"glide--ltr",rtl:"glide--rtl"},type:{slider:"glide--slider",carousel:"glide--carousel"},slide:{clone:"glide__slide--clone",active:"glide__slide--active"},arrow:{disabled:"glide__arrow--disabled"},nav:{active:"glide__bullet--active"}}};function l(t){console.error("[Glide warn]: ".concat(t))}function f(t){return parseInt(t)}function d(t){return"string"==typeof t}function h(e){var n=t(e);return"function"===n||"object"===n&&!!e}function v(t){return"function"==typeof t}function p(t){return t.constructor===Array}function m(t,e,n){Object.defineProperty(t,e,n)}function g(t,e){var n=Object.assign({},t,e);return e.hasOwnProperty("classes")&&(n.classes=Object.assign({},t.classes,e.classes),e.classes.hasOwnProperty("direction")&&(n.classes.direction=Object.assign({},t.classes.direction,e.classes.direction)),e.classes.hasOwnProperty("type")&&(n.classes.type=Object.assign({},t.classes.type,e.classes.type)),e.classes.hasOwnProperty("slide")&&(n.classes.slide=Object.assign({},t.classes.slide,e.classes.slide)),e.classes.hasOwnProperty("arrow")&&(n.classes.arrow=Object.assign({},t.classes.arrow,e.classes.arrow)),e.classes.hasOwnProperty("nav")&&(n.classes.nav=Object.assign({},t.classes.nav,e.classes.nav))),e.hasOwnProperty("breakpoints")&&(n.breakpoints=Object.assign({},t.breakpoints,e.breakpoints)),n}var y=function(){function t(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};e(this,t),this.events=n,this.hop=n.hasOwnProperty}return i(t,[{key:"on",value:function(t,e){if(!p(t)){this.hop.call(this.events,t)||(this.events[t]=[]);var n=this.events[t].push(e)-1;return{remove:function(){delete this.events[t][n]}}}for(var i=0;i<t.length;i++)this.on(t[i],e)}},{key:"emit",value:function(t,e){if(p(t))for(var n=0;n<t.length;n++)this.emit(t[n],e);else this.hop.call(this.events,t)&&this.events[t].forEach((function(t){t(e||{})}))}}]),t}(),w=function(){function t(n){var i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};e(this,t),this._c={},this._t=[],this._e=new y,this.disabled=!1,this.selector=n,this.settings=g(c,i),this.index=this.settings.startAt}return i(t,[{key:"mount",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return this._e.emit("mount.before"),h(t)?this._c=function(t,e,n){var i={};for(var r in e)v(e[r])?i[r]=e[r](t,i,n):l("Extension must be a function");for(var o in i)v(i[o].mount)&&i[o].mount();return i}(this,t,this._e):l("You need to provide a object on `mount()`"),this._e.emit("mount.after"),this}},{key:"mutate",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];return p(t)?this._t=t:l("You need to provide a array on `mutate()`"),this}},{key:"update",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return this.settings=g(this.settings,t),t.hasOwnProperty("startAt")&&(this.index=t.startAt),this._e.emit("update"),this}},{key:"go",value:function(t){return this._c.Run.make(t),this}},{key:"move",value:function(t){return this._c.Transition.disable(),this._c.Move.make(t),this}},{key:"destroy",value:function(){return this._e.emit("destroy"),this}},{key:"play",value:function(){var t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];return t&&(this.settings.autoplay=t),this._e.emit("play"),this}},{key:"pause",value:function(){return this._e.emit("pause"),this}},{key:"disable",value:function(){return this.disabled=!0,this}},{key:"enable",value:function(){return this.disabled=!1,this}},{key:"on",value:function(t,e){return this._e.on(t,e),this}},{key:"isType",value:function(t){return this.settings.type===t}},{key:"settings",get:function(){return this._o},set:function(t){h(t)?this._o=t:l("Options must be an `object` instance.")}},{key:"index",get:function(){return this._i},set:function(t){this._i=f(t)}},{key:"type",get:function(){return this.settings.type}},{key:"disabled",get:function(){return this._d},set:function(t){this._d=!!t}}]),t}();function b(){return(new Date).getTime()}function _(t,e,n){var i,r,o,s,a=0;n||(n={});var u=function(){a=!1===n.leading?0:b(),i=null,s=t.apply(r,o),i||(r=o=null)},c=function(){var c=b();a||!1!==n.leading||(a=c);var l=e-(c-a);return r=this,o=arguments,l<=0||l>e?(i&&(clearTimeout(i),i=null),a=c,s=t.apply(r,o),i||(r=o=null)):i||!1===n.trailing||(i=setTimeout(u,l)),s};return c.cancel=function(){clearTimeout(i),a=0,i=r=o=null},c}var k={ltr:["marginLeft","marginRight"],rtl:["marginRight","marginLeft"]};function S(t){if(t&&t.parentNode){for(var e=t.parentNode.firstChild,n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n}return[]}function O(t){return!!(t&&t instanceof window.HTMLElement)}function T(t){return Array.prototype.slice.call(t)}var x='[data-glide-el="track"]';var H=function(){function t(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};e(this,t),this.listeners=n}return i(t,[{key:"on",value:function(t,e,n){var i=arguments.length>3&&void 0!==arguments[3]&&arguments[3];d(t)&&(t=[t]);for(var r=0;r<t.length;r++)this.listeners[t[r]]=n,e.addEventListener(t[r],this.listeners[t[r]],i)}},{key:"off",value:function(t,e){var n=arguments.length>2&&void 0!==arguments[2]&&arguments[2];d(t)&&(t=[t]);for(var i=0;i<t.length;i++)e.removeEventListener(t[i],this.listeners[t[i]],n)}},{key:"destroy",value:function(){delete this.listeners}}]),t}();var A=["ltr","rtl"],j={">":"<","<":">","=":"="};function R(t,e){return{modify:function(t){return e.Direction.is("rtl")?-t:t}}}function z(t,e){return{modify:function(t){var n=Math.floor(t/e.Sizes.slideWidth);return t+e.Gaps.value*n}}}function P(t,e){return{modify:function(t){return t+e.Clones.grow/2}}}function L(t,e){return{modify:function(n){if(t.settings.focusAt>=0){var i=e.Peek.value;return h(i)?n-i.before:n-i}return n}}}function C(t,e){return{modify:function(n){var i=e.Gaps.value,r=e.Sizes.width,o=t.settings.focusAt,s=e.Sizes.slideWidth;return"center"===o?n-(r/2-s/2):n-s*o-i*o}}}var E=!1;try{var M=Object.defineProperty({},"passive",{get:function(){E=!0}});window.addEventListener("testPassive",null,M),window.removeEventListener("testPassive",null,M)}catch(t){}var D=E,B=["touchstart","mousedown"],W=["touchmove","mousemove"],V=["touchend","touchcancel","mouseup","mouseleave"],q=["mousedown","mousemove","mouseup","mouseleave"];function G(t,e,n){var i=new H,r=0,o=0,s=0,a=!1,u=!!D&&{passive:!0},c={mount:function(){this.bindSwipeStart()},start:function(e){if(!a&&!t.disabled){this.disable();var i=this.touches(e);r=null,o=f(i.pageX),s=f(i.pageY),this.bindSwipeMove(),this.bindSwipeEnd(),n.emit("swipe.start")}},move:function(i){if(!t.disabled){var a=t.settings,u=a.touchAngle,c=a.touchRatio,l=a.classes,d=this.touches(i),h=f(d.pageX)-o,v=f(d.pageY)-s,p=Math.abs(h<<2),m=Math.abs(v<<2),g=Math.sqrt(p+m),y=Math.sqrt(m);if(!(180*(r=Math.asin(y/g))/Math.PI<u))return!1;i.stopPropagation(),e.Move.make(h*parseFloat(c)),e.Html.root.classList.add(l.dragging),n.emit("swipe.move")}},end:function(i){if(!t.disabled){var s=t.settings,a=s.perSwipe,u=s.touchAngle,c=s.classes,l=this.touches(i),f=this.threshold(i),d=l.pageX-o,h=180*r/Math.PI;this.enable(),d>f&&h<u?e.Run.make(e.Direction.resolve("".concat(a,"<"))):d<-f&&h<u?e.Run.make(e.Direction.resolve("".concat(a,">"))):e.Move.make(),e.Html.root.classList.remove(c.dragging),this.unbindSwipeMove(),this.unbindSwipeEnd(),n.emit("swipe.end")}},bindSwipeStart:function(){var n=this,r=t.settings,o=r.swipeThreshold,s=r.dragThreshold;o&&i.on(B[0],e.Html.wrapper,(function(t){n.start(t)}),u),s&&i.on(B[1],e.Html.wrapper,(function(t){n.start(t)}),u)},unbindSwipeStart:function(){i.off(B[0],e.Html.wrapper,u),i.off(B[1],e.Html.wrapper,u)},bindSwipeMove:function(){var n=this;i.on(W,e.Html.wrapper,_((function(t){n.move(t)}),t.settings.throttle),u)},unbindSwipeMove:function(){i.off(W,e.Html.wrapper,u)},bindSwipeEnd:function(){var t=this;i.on(V,e.Html.wrapper,(function(e){t.end(e)}))},unbindSwipeEnd:function(){i.off(V,e.Html.wrapper)},touches:function(t){return q.indexOf(t.type)>-1?t:t.touches[0]||t.changedTouches[0]},threshold:function(e){var n=t.settings;return q.indexOf(e.type)>-1?n.dragThreshold:n.swipeThreshold},enable:function(){return a=!1,e.Transition.enable(),this},disable:function(){return a=!0,e.Transition.disable(),this}};return n.on("build.after",(function(){e.Html.root.classList.add(t.settings.classes.swipeable)})),n.on("destroy",(function(){c.unbindSwipeStart(),c.unbindSwipeMove(),c.unbindSwipeEnd(),i.destroy()})),c}var I='[data-glide-el^="controls"]',F="".concat(I,' [data-glide-dir*="<"]'),N="".concat(I,' [data-glide-dir*=">"]');function Y(t,e,n){var i=new H,r=!!D&&{passive:!0},o={mount:function(){this._n=e.Html.root.querySelectorAll('[data-glide-el="controls[nav]"]'),this._c=e.Html.root.querySelectorAll(I),this._arrowControls={previous:e.Html.root.querySelectorAll(F),next:e.Html.root.querySelectorAll(N)},this.addBindings()},setActive:function(){for(var t=0;t<this._n.length;t++)this.addClass(this._n[t].children)},removeActive:function(){for(var t=0;t<this._n.length;t++)this.removeClass(this._n[t].children)},addClass:function(e){var n=t.settings,i=e[t.index];i&&i&&(i.classList.add(n.classes.nav.active),S(i).forEach((function(t){t.classList.remove(n.classes.nav.active)})))},removeClass:function(e){var n=e[t.index];n&&n.classList.remove(t.settings.classes.nav.active)},setArrowState:function(){if(!t.settings.rewind){var n=o._arrowControls.next,i=o._arrowControls.previous;this.resetArrowState(n,i),0===t.index&&this.disableArrow(i),t.index===e.Run.length&&this.disableArrow(n)}},resetArrowState:function(){for(var e=t.settings,n=arguments.length,i=new Array(n),r=0;r<n;r++)i[r]=arguments[r];i.forEach((function(t){T(t).forEach((function(t){t.classList.remove(e.classes.arrow.disabled)}))}))},disableArrow:function(){for(var e=t.settings,n=arguments.length,i=new Array(n),r=0;r<n;r++)i[r]=arguments[r];i.forEach((function(t){T(t).forEach((function(t){t.classList.add(e.classes.arrow.disabled)}))}))},addBindings:function(){for(var t=0;t<this._c.length;t++)this.bind(this._c[t].children)},removeBindings:function(){for(var t=0;t<this._c.length;t++)this.unbind(this._c[t].children)},bind:function(t){for(var e=0;e<t.length;e++)i.on("click",t[e],this.click),i.on("touchstart",t[e],this.click,r)},unbind:function(t){for(var e=0;e<t.length;e++)i.off(["click","touchstart"],t[e])},click:function(t){D||"touchstart"!==t.type||t.preventDefault();var n=t.currentTarget.getAttribute("data-glide-dir");e.Run.make(e.Direction.resolve(n))}};return m(o,"items",{get:function(){return o._c}}),n.on(["mount.after","move.after"],(function(){o.setActive()})),n.on(["mount.after","run"],(function(){o.setArrowState()})),n.on("destroy",(function(){o.removeBindings(),o.removeActive(),i.destroy()})),o}function X(t,e,n){var i=new H,r={mount:function(){t.settings.keyboard&&this.bind()},bind:function(){i.on("keyup",document,this.press)},unbind:function(){i.off("keyup",document)},press:function(n){var i=t.settings.perSwipe;"ArrowRight"===n.code&&e.Run.make(e.Direction.resolve("".concat(i,">"))),"ArrowLeft"===n.code&&e.Run.make(e.Direction.resolve("".concat(i,"<")))}};return n.on(["destroy","update"],(function(){r.unbind()})),n.on("update",(function(){r.mount()})),n.on("destroy",(function(){i.destroy()})),r}function K(t){return h(t)?(e=t,Object.keys(e).sort().reduce((function(t,n){return t[n]=e[n],t[n],t}),{})):(l("Breakpoints option must be an object"),{});var e}function J(t,e,n){var i=new H,r=t.settings,o=K(r.breakpoints),s=Object.assign({},r),a={match:function(t){if(void 0!==window.matchMedia)for(var e in t)if(t.hasOwnProperty(e)&&window.matchMedia("(max-width: ".concat(e,"px)")).matches)return t[e];return s}};return Object.assign(r,a.match(o)),i.on("resize",window,_((function(){t.settings=g(r,a.match(o))}),t.settings.throttle)),n.on("update",(function(){o=K(o),s=Object.assign({},r)})),n.on("destroy",(function(){i.off("resize",window)})),a}var Q={Html:function(t,e,n){var i={mount:function(){this.root=t.selector,this.track=this.root.querySelector(x),this.collectSlides()},collectSlides:function(){this.slides=T(this.wrapper.children).filter((function(e){return!e.classList.contains(t.settings.classes.slide.clone)}))}};return m(i,"root",{get:function(){return i._r},set:function(t){d(t)&&(t=document.querySelector(t)),O(t)?i._r=t:l("Root element must be a existing Html node")}}),m(i,"track",{get:function(){return i._t},set:function(t){O(t)?i._t=t:l("Could not find track element. Please use ".concat(x," attribute."))}}),m(i,"wrapper",{get:function(){return i.track.children[0]}}),n.on("update",(function(){i.collectSlides()})),i},Translate:function(t,e,n){var i={set:function(n){var i=function(t,e,n){var i=[z,P,L,C].concat(t._t,[R]);return{mutate:function(r){for(var o=0;o<i.length;o++){var s=i[o];v(s)&&v(s().modify)?r=s(t,e,n).modify(r):l("Transformer should be a function that returns an object with `modify()` method")}return r}}}(t,e).mutate(n),r="translate3d(".concat(-1*i,"px, 0px, 0px)");e.Html.wrapper.style.mozTransform=r,e.Html.wrapper.style.webkitTransform=r,e.Html.wrapper.style.transform=r},remove:function(){e.Html.wrapper.style.transform=""},getStartIndex:function(){var n=e.Sizes.length,i=t.index,r=t.settings.perView;return e.Run.isOffset(">")||e.Run.isOffset("|>")?n+(i-r):(i+r)%n},getTravelDistance:function(){var n=e.Sizes.slideWidth*t.settings.perView;return e.Run.isOffset(">")||e.Run.isOffset("|>")?-1*n:n}};return n.on("move",(function(r){if(!t.isType("carousel")||!e.Run.isOffset())return i.set(r.movement);e.Transition.after((function(){n.emit("translate.jump"),i.set(e.Sizes.slideWidth*t.index)}));var o=e.Sizes.slideWidth*e.Translate.getStartIndex();return i.set(o-e.Translate.getTravelDistance())})),n.on("destroy",(function(){i.remove()})),i},Transition:function(t,e,n){var i=!1,r={compose:function(e){var n=t.settings;return i?"".concat(e," 0ms ").concat(n.animationTimingFunc):"".concat(e," ").concat(this.duration,"ms ").concat(n.animationTimingFunc)},set:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"transform";e.Html.wrapper.style.transition=this.compose(t)},remove:function(){e.Html.wrapper.style.transition=""},after:function(t){setTimeout((function(){t()}),this.duration)},enable:function(){i=!1,this.set()},disable:function(){i=!0,this.set()}};return m(r,"duration",{get:function(){var n=t.settings;return t.isType("slider")&&e.Run.offset?n.rewindDuration:n.animationDuration}}),n.on("move",(function(){r.set()})),n.on(["build.before","resize","translate.jump"],(function(){r.disable()})),n.on("run",(function(){r.enable()})),n.on("destroy",(function(){r.remove()})),r},Direction:function(t,e,n){var i={mount:function(){this.value=t.settings.direction},resolve:function(t){var e=t.slice(0,1);return this.is("rtl")?t.split(e).join(j[e]):t},is:function(t){return this.value===t},addClass:function(){e.Html.root.classList.add(t.settings.classes.direction[this.value])},removeClass:function(){e.Html.root.classList.remove(t.settings.classes.direction[this.value])}};return m(i,"value",{get:function(){return i._v},set:function(t){A.indexOf(t)>-1?i._v=t:l("Direction value must be `ltr` or `rtl`")}}),n.on(["destroy","update"],(function(){i.removeClass()})),n.on("update",(function(){i.mount()})),n.on(["build.before","update"],(function(){i.addClass()})),i},Peek:function(t,e,n){var i={mount:function(){this.value=t.settings.peek}};return m(i,"value",{get:function(){return i._v},set:function(t){h(t)?(t.before=f(t.before),t.after=f(t.after)):t=f(t),i._v=t}}),m(i,"reductor",{get:function(){var e=i.value,n=t.settings.perView;return h(e)?e.before/n+e.after/n:2*e/n}}),n.on(["resize","update"],(function(){i.mount()})),i},Sizes:function(t,e,n){var i={setupSlides:function(){for(var t="".concat(this.slideWidth,"px"),n=e.Html.slides,i=0;i<n.length;i++)n[i].style.width=t},setupWrapper:function(){e.Html.wrapper.style.width="".concat(this.wrapperSize,"px")},remove:function(){for(var t=e.Html.slides,n=0;n<t.length;n++)t[n].style.width="";e.Html.wrapper.style.width=""}};return m(i,"length",{get:function(){return e.Html.slides.length}}),m(i,"width",{get:function(){return e.Html.track.offsetWidth}}),m(i,"wrapperSize",{get:function(){return i.slideWidth*i.length+e.Gaps.grow+e.Clones.grow}}),m(i,"slideWidth",{get:function(){return i.width/t.settings.perView-e.Peek.reductor-e.Gaps.reductor}}),n.on(["build.before","resize","update"],(function(){i.setupSlides(),i.setupWrapper()})),n.on("destroy",(function(){i.remove()})),i},Gaps:function(t,e,n){var i={apply:function(t){for(var n=0,i=t.length;n<i;n++){var r=t[n].style,o=e.Direction.value;r[k[o][0]]=0!==n?"".concat(this.value/2,"px"):"",n!==t.length-1?r[k[o][1]]="".concat(this.value/2,"px"):r[k[o][1]]=""}},remove:function(t){for(var e=0,n=t.length;e<n;e++){var i=t[e].style;i.marginLeft="",i.marginRight=""}}};return m(i,"value",{get:function(){return f(t.settings.gap)}}),m(i,"grow",{get:function(){return i.value*e.Sizes.length}}),m(i,"reductor",{get:function(){var e=t.settings.perView;return i.value*(e-1)/e}}),n.on(["build.after","update"],_((function(){i.apply(e.Html.wrapper.children)}),30)),n.on("destroy",(function(){i.remove(e.Html.wrapper.children)})),i},Move:function(t,e,n){var i={mount:function(){this._o=0},make:function(){var t=this,i=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0;this.offset=i,n.emit("move",{movement:this.value}),e.Transition.after((function(){n.emit("move.after",{movement:t.value})}))}};return m(i,"offset",{get:function(){return i._o},set:function(t){i._o=function(t){return void 0===t}(t)?0:f(t)}}),m(i,"translate",{get:function(){return e.Sizes.slideWidth*t.index}}),m(i,"value",{get:function(){var t=this.offset,n=this.translate;return e.Direction.is("rtl")?n+t:n-t}}),n.on(["build.before","run"],(function(){i.make()})),i},Clones:function(t,e,n){var i={mount:function(){this.items=[],t.isType("carousel")&&(this.items=this.collect())},collect:function(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],i=e.Html.slides,r=t.settings,o=r.perView,s=r.classes,a=r.cloningRatio;if(0!==i.length)for(var u=o+ +!!t.settings.peek+Math.round(o/2),c=i.slice(0,u).reverse(),l=i.slice(-1*u),f=0;f<Math.max(a,Math.floor(o/i.length));f++){for(var d=0;d<c.length;d++){var h=c[d].cloneNode(!0);h.classList.add(s.slide.clone),n.push(h)}for(var v=0;v<l.length;v++){var p=l[v].cloneNode(!0);p.classList.add(s.slide.clone),n.unshift(p)}}return n},append:function(){for(var t=this.items,n=e.Html,i=n.wrapper,r=n.slides,o=Math.floor(t.length/2),s=t.slice(0,o).reverse(),a=t.slice(-1*o).reverse(),u="".concat(e.Sizes.slideWidth,"px"),c=0;c<a.length;c++)i.appendChild(a[c]);for(var l=0;l<s.length;l++)i.insertBefore(s[l],r[0]);for(var f=0;f<t.length;f++)t[f].style.width=u},remove:function(){for(var t=this.items,n=0;n<t.length;n++)e.Html.wrapper.removeChild(t[n])}};return m(i,"grow",{get:function(){return(e.Sizes.slideWidth+e.Gaps.value)*i.items.length}}),n.on("update",(function(){i.remove(),i.mount(),i.append()})),n.on("build.before",(function(){t.isType("carousel")&&i.append()})),n.on("destroy",(function(){i.remove()})),i},Resize:function(t,e,n){var i=new H,r={mount:function(){this.bind()},bind:function(){i.on("resize",window,_((function(){n.emit("resize")}),t.settings.throttle))},unbind:function(){i.off("resize",window)}};return n.on("destroy",(function(){r.unbind(),i.destroy()})),r},Build:function(t,e,n){var i={mount:function(){n.emit("build.before"),this.typeClass(),this.activeClass(),n.emit("build.after")},typeClass:function(){e.Html.root.classList.add(t.settings.classes.type[t.settings.type])},activeClass:function(){var n=t.settings.classes,i=e.Html.slides[t.index];i&&(i.classList.add(n.slide.active),S(i).forEach((function(t){t.classList.remove(n.slide.active)})))},removeClasses:function(){var n=t.settings.classes,i=n.type,r=n.slide;e.Html.root.classList.remove(i[t.settings.type]),e.Html.slides.forEach((function(t){t.classList.remove(r.active)}))}};return n.on(["destroy","update"],(function(){i.removeClasses()})),n.on(["resize","update"],(function(){i.mount()})),n.on("move.after",(function(){i.activeClass()})),i},Run:function(t,e,n){var i={mount:function(){this._o=!1},make:function(i){var r=this;t.disabled||(!t.settings.waitForTransition||t.disable(),this.move=i,n.emit("run.before",this.move),this.calculate(),n.emit("run",this.move),e.Transition.after((function(){r.isStart()&&n.emit("run.start",r.move),r.isEnd()&&n.emit("run.end",r.move),r.isOffset()&&(r._o=!1,n.emit("run.offset",r.move)),n.emit("run.after",r.move),t.enable()})))},calculate:function(){var e=this.move,n=this.length,r=e.steps,o=e.direction,s=1;if("="===o)return t.settings.bound&&f(r)>n?void(t.index=n):void(t.index=r);if(">"!==o||">"!==r)if("<"!==o||"<"!==r){if("|"===o&&(s=t.settings.perView||1),">"===o||"|"===o&&">"===r){var a=function(e){var n=t.index;if(t.isType("carousel"))return n+e;return n+(e-n%e)}(s);return a>n&&(this._o=!0),void(t.index=function(e,n){var r=i.length;if(e<=r)return e;if(t.isType("carousel"))return e-(r+1);if(t.settings.rewind)return i.isBound()&&!i.isEnd()?r:0;if(i.isBound())return r;return Math.floor(r/n)*n}(a,s))}if("<"===o||"|"===o&&"<"===r){var u=function(e){var n=t.index;if(t.isType("carousel"))return n-e;var i=Math.ceil(n/e);return(i-1)*e}(s);return u<0&&(this._o=!0),void(t.index=function(e,n){var r=i.length;if(e>=0)return e;if(t.isType("carousel"))return e+(r+1);if(t.settings.rewind)return i.isBound()&&i.isStart()?r:Math.floor(r/n)*n;return 0}(u,s))}l("Invalid direction pattern [".concat(o).concat(r,"] has been used"))}else t.index=0;else t.index=n},isStart:function(){return t.index<=0},isEnd:function(){return t.index>=this.length},isOffset:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:void 0;return t?!!this._o&&("|>"===t?"|"===this.move.direction&&">"===this.move.steps:"|<"===t?"|"===this.move.direction&&"<"===this.move.steps:this.move.direction===t):this._o},isBound:function(){return t.isType("slider")&&"center"!==t.settings.focusAt&&t.settings.bound}};return m(i,"move",{get:function(){return this._m},set:function(t){var e=t.substr(1);this._m={direction:t.substr(0,1),steps:e?f(e)?f(e):e:0}}}),m(i,"length",{get:function(){var n=t.settings,i=e.Html.slides.length;return this.isBound()?i-1-(f(n.perView)-1)+f(n.focusAt):i-1}}),m(i,"offset",{get:function(){return this._o}}),i}},U=function(t){!function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function");t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,writable:!0,configurable:!0}}),e&&o(t,e)}(s,t);var n=a(s);function s(){return e(this,s),n.apply(this,arguments)}return i(s,[{key:"mount",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return u(r(s.prototype),"mount",this).call(this,Object.assign({},Q,t))}}]),s}(w);Drupal.behaviors.iopGlide={attach(){document.querySelectorAll(".glide").forEach((t=>{new U(t,{type:"carousel",focusAt:"center",gap:56,perView:3,breakpoints:{1399:{gap:50},1199:{gap:44},991:{gap:36},767:{gap:16,perView:1}}}).mount({Breakpoints:J,Controls:Y,Keyboard:X,Swipe:G})}))}}}));
+   */function t(e){return t="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},t(e)}function e(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function n(t,e){for(var n=0;n<e.length;n++){var i=e[n];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(t,i.key,i)}}function i(t,e,i){return e&&n(t.prototype,e),i&&n(t,i),t}function r(t){return r=Object.setPrototypeOf?Object.getPrototypeOf:function(t){return t.__proto__||Object.getPrototypeOf(t)},r(t)}function o(t,e){return o=Object.setPrototypeOf||function(t,e){return t.__proto__=e,t},o(t,e)}function s(t,e){if(e&&("object"==typeof e||"function"==typeof e))return e;if(void 0!==e)throw new TypeError("Derived constructors may only return object or undefined");return function(t){if(void 0===t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return t}(t)}function a(t){var e=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(t){return!1}}();return function(){var n,i=r(t);if(e){var o=r(this).constructor;n=Reflect.construct(i,arguments,o)}else n=i.apply(this,arguments);return s(this,n)}}function u(){return u="undefined"!=typeof Reflect&&Reflect.get?Reflect.get:function(t,e,n){var i=function(t,e){for(;!Object.prototype.hasOwnProperty.call(t,e)&&null!==(t=r(t)););return t}(t,e);if(i){var o=Object.getOwnPropertyDescriptor(i,e);return o.get?o.get.call(arguments.length<3?t:n):o.value}},u.apply(this,arguments)}var c={type:"slider",startAt:0,perView:1,focusAt:0,gap:10,autoplay:!1,hoverpause:!0,keyboard:!0,bound:!1,swipeThreshold:80,dragThreshold:120,perSwipe:"",touchRatio:.5,touchAngle:45,animationDuration:400,rewind:!0,rewindDuration:800,animationTimingFunc:"cubic-bezier(.165, .840, .440, 1)",waitForTransition:!0,throttle:10,direction:"ltr",peek:0,cloningRatio:1,breakpoints:{},classes:{swipeable:"glide--swipeable",dragging:"glide--dragging",direction:{ltr:"glide--ltr",rtl:"glide--rtl"},type:{slider:"glide--slider",carousel:"glide--carousel"},slide:{clone:"glide__slide--clone",active:"glide__slide--active"},arrow:{disabled:"glide__arrow--disabled"},nav:{active:"glide__bullet--active"}}};function l(t){console.error("[Glide warn]: ".concat(t))}function f(t){return parseInt(t)}function d(t){return"string"==typeof t}function h(e){var n=t(e);return"function"===n||"object"===n&&!!e}function v(t){return"function"==typeof t}function p(t){return t.constructor===Array}function m(t,e,n){Object.defineProperty(t,e,n)}function g(t,e){var n=Object.assign({},t,e);return e.hasOwnProperty("classes")&&(n.classes=Object.assign({},t.classes,e.classes),e.classes.hasOwnProperty("direction")&&(n.classes.direction=Object.assign({},t.classes.direction,e.classes.direction)),e.classes.hasOwnProperty("type")&&(n.classes.type=Object.assign({},t.classes.type,e.classes.type)),e.classes.hasOwnProperty("slide")&&(n.classes.slide=Object.assign({},t.classes.slide,e.classes.slide)),e.classes.hasOwnProperty("arrow")&&(n.classes.arrow=Object.assign({},t.classes.arrow,e.classes.arrow)),e.classes.hasOwnProperty("nav")&&(n.classes.nav=Object.assign({},t.classes.nav,e.classes.nav))),e.hasOwnProperty("breakpoints")&&(n.breakpoints=Object.assign({},t.breakpoints,e.breakpoints)),n}var y=function(){function t(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};e(this,t),this.events=n,this.hop=n.hasOwnProperty}return i(t,[{key:"on",value:function(t,e){if(!p(t)){this.hop.call(this.events,t)||(this.events[t]=[]);var n=this.events[t].push(e)-1;return{remove:function(){delete this.events[t][n]}}}for(var i=0;i<t.length;i++)this.on(t[i],e)}},{key:"emit",value:function(t,e){if(p(t))for(var n=0;n<t.length;n++)this.emit(t[n],e);else this.hop.call(this.events,t)&&this.events[t].forEach((function(t){t(e||{})}))}}]),t}(),w=function(){function t(n){var i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};e(this,t),this._c={},this._t=[],this._e=new y,this.disabled=!1,this.selector=n,this.settings=g(c,i),this.index=this.settings.startAt}return i(t,[{key:"mount",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return this._e.emit("mount.before"),h(t)?this._c=function(t,e,n){var i={};for(var r in e)v(e[r])?i[r]=e[r](t,i,n):l("Extension must be a function");for(var o in i)v(i[o].mount)&&i[o].mount();return i}(this,t,this._e):l("You need to provide a object on `mount()`"),this._e.emit("mount.after"),this}},{key:"mutate",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];return p(t)?this._t=t:l("You need to provide a array on `mutate()`"),this}},{key:"update",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return this.settings=g(this.settings,t),t.hasOwnProperty("startAt")&&(this.index=t.startAt),this._e.emit("update"),this}},{key:"go",value:function(t){return this._c.Run.make(t),this}},{key:"move",value:function(t){return this._c.Transition.disable(),this._c.Move.make(t),this}},{key:"destroy",value:function(){return this._e.emit("destroy"),this}},{key:"play",value:function(){var t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];return t&&(this.settings.autoplay=t),this._e.emit("play"),this}},{key:"pause",value:function(){return this._e.emit("pause"),this}},{key:"disable",value:function(){return this.disabled=!0,this}},{key:"enable",value:function(){return this.disabled=!1,this}},{key:"on",value:function(t,e){return this._e.on(t,e),this}},{key:"isType",value:function(t){return this.settings.type===t}},{key:"settings",get:function(){return this._o},set:function(t){h(t)?this._o=t:l("Options must be an `object` instance.")}},{key:"index",get:function(){return this._i},set:function(t){this._i=f(t)}},{key:"type",get:function(){return this.settings.type}},{key:"disabled",get:function(){return this._d},set:function(t){this._d=!!t}}]),t}();function b(){return(new Date).getTime()}function _(t,e,n){var i,r,o,s,a=0;n||(n={});var u=function(){a=!1===n.leading?0:b(),i=null,s=t.apply(r,o),i||(r=o=null)},c=function(){var c=b();a||!1!==n.leading||(a=c);var l=e-(c-a);return r=this,o=arguments,l<=0||l>e?(i&&(clearTimeout(i),i=null),a=c,s=t.apply(r,o),i||(r=o=null)):i||!1===n.trailing||(i=setTimeout(u,l)),s};return c.cancel=function(){clearTimeout(i),a=0,i=r=o=null},c}var k={ltr:["marginLeft","marginRight"],rtl:["marginRight","marginLeft"]};function S(t){if(t&&t.parentNode){for(var e=t.parentNode.firstChild,n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n}return[]}function O(t){return!!(t&&t instanceof window.HTMLElement)}function T(t){return Array.prototype.slice.call(t)}var x='[data-glide-el="track"]';var H=function(){function t(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};e(this,t),this.listeners=n}return i(t,[{key:"on",value:function(t,e,n){var i=arguments.length>3&&void 0!==arguments[3]&&arguments[3];d(t)&&(t=[t]);for(var r=0;r<t.length;r++)this.listeners[t[r]]=n,e.addEventListener(t[r],this.listeners[t[r]],i)}},{key:"off",value:function(t,e){var n=arguments.length>2&&void 0!==arguments[2]&&arguments[2];d(t)&&(t=[t]);for(var i=0;i<t.length;i++)e.removeEventListener(t[i],this.listeners[t[i]],n)}},{key:"destroy",value:function(){delete this.listeners}}]),t}();var A=["ltr","rtl"],j={">":"<","<":">","=":"="};function R(t,e){return{modify:function(t){return e.Direction.is("rtl")?-t:t}}}function P(t,e){return{modify:function(t){var n=Math.floor(t/e.Sizes.slideWidth);return t+e.Gaps.value*n}}}function C(t,e){return{modify:function(t){return t+e.Clones.grow/2}}}function E(t,e){return{modify:function(n){if(t.settings.focusAt>=0){var i=e.Peek.value;return h(i)?n-i.before:n-i}return n}}}function L(t,e){return{modify:function(n){var i=e.Gaps.value,r=e.Sizes.width,o=t.settings.focusAt,s=e.Sizes.slideWidth;return"center"===o?n-(r/2-s/2):n-s*o-i*o}}}var M=!1;try{var z=Object.defineProperty({},"passive",{get:function(){M=!0}});window.addEventListener("testPassive",null,z),window.removeEventListener("testPassive",null,z)}catch(t){}var D=M,B=["touchstart","mousedown"],W=["touchmove","mousemove"],V=["touchend","touchcancel","mouseup","mouseleave"],q=["mousedown","mousemove","mouseup","mouseleave"];function G(t,e,n){var i=new H,r=0,o=0,s=0,a=!1,u=!!D&&{passive:!0},c={mount:function(){this.bindSwipeStart()},start:function(e){if(!a&&!t.disabled){this.disable();var i=this.touches(e);r=null,o=f(i.pageX),s=f(i.pageY),this.bindSwipeMove(),this.bindSwipeEnd(),n.emit("swipe.start")}},move:function(i){if(!t.disabled){var a=t.settings,u=a.touchAngle,c=a.touchRatio,l=a.classes,d=this.touches(i),h=f(d.pageX)-o,v=f(d.pageY)-s,p=Math.abs(h<<2),m=Math.abs(v<<2),g=Math.sqrt(p+m),y=Math.sqrt(m);if(!(180*(r=Math.asin(y/g))/Math.PI<u))return!1;i.stopPropagation(),e.Move.make(h*parseFloat(c)),e.Html.root.classList.add(l.dragging),n.emit("swipe.move")}},end:function(i){if(!t.disabled){var s=t.settings,a=s.perSwipe,u=s.touchAngle,c=s.classes,l=this.touches(i),f=this.threshold(i),d=l.pageX-o,h=180*r/Math.PI;this.enable(),d>f&&h<u?e.Run.make(e.Direction.resolve("".concat(a,"<"))):d<-f&&h<u?e.Run.make(e.Direction.resolve("".concat(a,">"))):e.Move.make(),e.Html.root.classList.remove(c.dragging),this.unbindSwipeMove(),this.unbindSwipeEnd(),n.emit("swipe.end")}},bindSwipeStart:function(){var n=this,r=t.settings,o=r.swipeThreshold,s=r.dragThreshold;o&&i.on(B[0],e.Html.wrapper,(function(t){n.start(t)}),u),s&&i.on(B[1],e.Html.wrapper,(function(t){n.start(t)}),u)},unbindSwipeStart:function(){i.off(B[0],e.Html.wrapper,u),i.off(B[1],e.Html.wrapper,u)},bindSwipeMove:function(){var n=this;i.on(W,e.Html.wrapper,_((function(t){n.move(t)}),t.settings.throttle),u)},unbindSwipeMove:function(){i.off(W,e.Html.wrapper,u)},bindSwipeEnd:function(){var t=this;i.on(V,e.Html.wrapper,(function(e){t.end(e)}))},unbindSwipeEnd:function(){i.off(V,e.Html.wrapper)},touches:function(t){return q.indexOf(t.type)>-1?t:t.touches[0]||t.changedTouches[0]},threshold:function(e){var n=t.settings;return q.indexOf(e.type)>-1?n.dragThreshold:n.swipeThreshold},enable:function(){return a=!1,e.Transition.enable(),this},disable:function(){return a=!0,e.Transition.disable(),this}};return n.on("build.after",(function(){e.Html.root.classList.add(t.settings.classes.swipeable)})),n.on("destroy",(function(){c.unbindSwipeStart(),c.unbindSwipeMove(),c.unbindSwipeEnd(),i.destroy()})),c}var F='[data-glide-el^="controls"]',I="".concat(F,' [data-glide-dir*="<"]'),N="".concat(F,' [data-glide-dir*=">"]');function Y(t,e,n){var i=new H,r=!!D&&{passive:!0},o={mount:function(){this._n=e.Html.root.querySelectorAll('[data-glide-el="controls[nav]"]'),this._c=e.Html.root.querySelectorAll(F),this._arrowControls={previous:e.Html.root.querySelectorAll(I),next:e.Html.root.querySelectorAll(N)},this.addBindings()},setActive:function(){for(var t=0;t<this._n.length;t++)this.addClass(this._n[t].children)},removeActive:function(){for(var t=0;t<this._n.length;t++)this.removeClass(this._n[t].children)},addClass:function(e){var n=t.settings,i=e[t.index];i&&i&&(i.classList.add(n.classes.nav.active),S(i).forEach((function(t){t.classList.remove(n.classes.nav.active)})))},removeClass:function(e){var n=e[t.index];n&&n.classList.remove(t.settings.classes.nav.active)},setArrowState:function(){if(!t.settings.rewind){var n=o._arrowControls.next,i=o._arrowControls.previous;this.resetArrowState(n,i),0===t.index&&this.disableArrow(i),t.index===e.Run.length&&this.disableArrow(n)}},resetArrowState:function(){for(var e=t.settings,n=arguments.length,i=new Array(n),r=0;r<n;r++)i[r]=arguments[r];i.forEach((function(t){T(t).forEach((function(t){t.classList.remove(e.classes.arrow.disabled)}))}))},disableArrow:function(){for(var e=t.settings,n=arguments.length,i=new Array(n),r=0;r<n;r++)i[r]=arguments[r];i.forEach((function(t){T(t).forEach((function(t){t.classList.add(e.classes.arrow.disabled)}))}))},addBindings:function(){for(var t=0;t<this._c.length;t++)this.bind(this._c[t].children)},removeBindings:function(){for(var t=0;t<this._c.length;t++)this.unbind(this._c[t].children)},bind:function(t){for(var e=0;e<t.length;e++)i.on("click",t[e],this.click),i.on("touchstart",t[e],this.click,r)},unbind:function(t){for(var e=0;e<t.length;e++)i.off(["click","touchstart"],t[e])},click:function(t){D||"touchstart"!==t.type||t.preventDefault();var n=t.currentTarget.getAttribute("data-glide-dir");e.Run.make(e.Direction.resolve(n))}};return m(o,"items",{get:function(){return o._c}}),n.on(["mount.after","move.after"],(function(){o.setActive()})),n.on(["mount.after","run"],(function(){o.setArrowState()})),n.on("destroy",(function(){o.removeBindings(),o.removeActive(),i.destroy()})),o}function X(t,e,n){var i=new H,r={mount:function(){t.settings.keyboard&&this.bind()},bind:function(){i.on("keyup",document,this.press)},unbind:function(){i.off("keyup",document)},press:function(n){var i=t.settings.perSwipe;"ArrowRight"===n.code&&e.Run.make(e.Direction.resolve("".concat(i,">"))),"ArrowLeft"===n.code&&e.Run.make(e.Direction.resolve("".concat(i,"<")))}};return n.on(["destroy","update"],(function(){r.unbind()})),n.on("update",(function(){r.mount()})),n.on("destroy",(function(){i.destroy()})),r}function K(t){return h(t)?(e=t,Object.keys(e).sort().reduce((function(t,n){return t[n]=e[n],t[n],t}),{})):(l("Breakpoints option must be an object"),{});var e}function J(t,e,n){var i=new H,r=t.settings,o=K(r.breakpoints),s=Object.assign({},r),a={match:function(t){if(void 0!==window.matchMedia)for(var e in t)if(t.hasOwnProperty(e)&&window.matchMedia("(max-width: ".concat(e,"px)")).matches)return t[e];return s}};return Object.assign(r,a.match(o)),i.on("resize",window,_((function(){t.settings=g(r,a.match(o))}),t.settings.throttle)),n.on("update",(function(){o=K(o),s=Object.assign({},r)})),n.on("destroy",(function(){i.off("resize",window)})),a}var Q={Html:function(t,e,n){var i={mount:function(){this.root=t.selector,this.track=this.root.querySelector(x),this.collectSlides()},collectSlides:function(){this.slides=T(this.wrapper.children).filter((function(e){return!e.classList.contains(t.settings.classes.slide.clone)}))}};return m(i,"root",{get:function(){return i._r},set:function(t){d(t)&&(t=document.querySelector(t)),O(t)?i._r=t:l("Root element must be a existing Html node")}}),m(i,"track",{get:function(){return i._t},set:function(t){O(t)?i._t=t:l("Could not find track element. Please use ".concat(x," attribute."))}}),m(i,"wrapper",{get:function(){return i.track.children[0]}}),n.on("update",(function(){i.collectSlides()})),i},Translate:function(t,e,n){var i={set:function(n){var i=function(t,e,n){var i=[P,C,E,L].concat(t._t,[R]);return{mutate:function(r){for(var o=0;o<i.length;o++){var s=i[o];v(s)&&v(s().modify)?r=s(t,e,n).modify(r):l("Transformer should be a function that returns an object with `modify()` method")}return r}}}(t,e).mutate(n),r="translate3d(".concat(-1*i,"px, 0px, 0px)");e.Html.wrapper.style.mozTransform=r,e.Html.wrapper.style.webkitTransform=r,e.Html.wrapper.style.transform=r},remove:function(){e.Html.wrapper.style.transform=""},getStartIndex:function(){var n=e.Sizes.length,i=t.index,r=t.settings.perView;return e.Run.isOffset(">")||e.Run.isOffset("|>")?n+(i-r):(i+r)%n},getTravelDistance:function(){var n=e.Sizes.slideWidth*t.settings.perView;return e.Run.isOffset(">")||e.Run.isOffset("|>")?-1*n:n}};return n.on("move",(function(r){if(!t.isType("carousel")||!e.Run.isOffset())return i.set(r.movement);e.Transition.after((function(){n.emit("translate.jump"),i.set(e.Sizes.slideWidth*t.index)}));var o=e.Sizes.slideWidth*e.Translate.getStartIndex();return i.set(o-e.Translate.getTravelDistance())})),n.on("destroy",(function(){i.remove()})),i},Transition:function(t,e,n){var i=!1,r={compose:function(e){var n=t.settings;return i?"".concat(e," 0ms ").concat(n.animationTimingFunc):"".concat(e," ").concat(this.duration,"ms ").concat(n.animationTimingFunc)},set:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"transform";e.Html.wrapper.style.transition=this.compose(t)},remove:function(){e.Html.wrapper.style.transition=""},after:function(t){setTimeout((function(){t()}),this.duration)},enable:function(){i=!1,this.set()},disable:function(){i=!0,this.set()}};return m(r,"duration",{get:function(){var n=t.settings;return t.isType("slider")&&e.Run.offset?n.rewindDuration:n.animationDuration}}),n.on("move",(function(){r.set()})),n.on(["build.before","resize","translate.jump"],(function(){r.disable()})),n.on("run",(function(){r.enable()})),n.on("destroy",(function(){r.remove()})),r},Direction:function(t,e,n){var i={mount:function(){this.value=t.settings.direction},resolve:function(t){var e=t.slice(0,1);return this.is("rtl")?t.split(e).join(j[e]):t},is:function(t){return this.value===t},addClass:function(){e.Html.root.classList.add(t.settings.classes.direction[this.value])},removeClass:function(){e.Html.root.classList.remove(t.settings.classes.direction[this.value])}};return m(i,"value",{get:function(){return i._v},set:function(t){A.indexOf(t)>-1?i._v=t:l("Direction value must be `ltr` or `rtl`")}}),n.on(["destroy","update"],(function(){i.removeClass()})),n.on("update",(function(){i.mount()})),n.on(["build.before","update"],(function(){i.addClass()})),i},Peek:function(t,e,n){var i={mount:function(){this.value=t.settings.peek}};return m(i,"value",{get:function(){return i._v},set:function(t){h(t)?(t.before=f(t.before),t.after=f(t.after)):t=f(t),i._v=t}}),m(i,"reductor",{get:function(){var e=i.value,n=t.settings.perView;return h(e)?e.before/n+e.after/n:2*e/n}}),n.on(["resize","update"],(function(){i.mount()})),i},Sizes:function(t,e,n){var i={setupSlides:function(){for(var t="".concat(this.slideWidth,"px"),n=e.Html.slides,i=0;i<n.length;i++)n[i].style.width=t},setupWrapper:function(){e.Html.wrapper.style.width="".concat(this.wrapperSize,"px")},remove:function(){for(var t=e.Html.slides,n=0;n<t.length;n++)t[n].style.width="";e.Html.wrapper.style.width=""}};return m(i,"length",{get:function(){return e.Html.slides.length}}),m(i,"width",{get:function(){return e.Html.track.offsetWidth}}),m(i,"wrapperSize",{get:function(){return i.slideWidth*i.length+e.Gaps.grow+e.Clones.grow}}),m(i,"slideWidth",{get:function(){return i.width/t.settings.perView-e.Peek.reductor-e.Gaps.reductor}}),n.on(["build.before","resize","update"],(function(){i.setupSlides(),i.setupWrapper()})),n.on("destroy",(function(){i.remove()})),i},Gaps:function(t,e,n){var i={apply:function(t){for(var n=0,i=t.length;n<i;n++){var r=t[n].style,o=e.Direction.value;r[k[o][0]]=0!==n?"".concat(this.value/2,"px"):"",n!==t.length-1?r[k[o][1]]="".concat(this.value/2,"px"):r[k[o][1]]=""}},remove:function(t){for(var e=0,n=t.length;e<n;e++){var i=t[e].style;i.marginLeft="",i.marginRight=""}}};return m(i,"value",{get:function(){return f(t.settings.gap)}}),m(i,"grow",{get:function(){return i.value*e.Sizes.length}}),m(i,"reductor",{get:function(){var e=t.settings.perView;return i.value*(e-1)/e}}),n.on(["build.after","update"],_((function(){i.apply(e.Html.wrapper.children)}),30)),n.on("destroy",(function(){i.remove(e.Html.wrapper.children)})),i},Move:function(t,e,n){var i={mount:function(){this._o=0},make:function(){var t=this,i=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0;this.offset=i,n.emit("move",{movement:this.value}),e.Transition.after((function(){n.emit("move.after",{movement:t.value})}))}};return m(i,"offset",{get:function(){return i._o},set:function(t){i._o=function(t){return void 0===t}(t)?0:f(t)}}),m(i,"translate",{get:function(){return e.Sizes.slideWidth*t.index}}),m(i,"value",{get:function(){var t=this.offset,n=this.translate;return e.Direction.is("rtl")?n+t:n-t}}),n.on(["build.before","run"],(function(){i.make()})),i},Clones:function(t,e,n){var i={mount:function(){this.items=[],t.isType("carousel")&&(this.items=this.collect())},collect:function(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],i=e.Html.slides,r=t.settings,o=r.perView,s=r.classes,a=r.cloningRatio;if(0!==i.length)for(var u=o+ +!!t.settings.peek+Math.round(o/2),c=i.slice(0,u).reverse(),l=i.slice(-1*u),f=0;f<Math.max(a,Math.floor(o/i.length));f++){for(var d=0;d<c.length;d++){var h=c[d].cloneNode(!0);h.classList.add(s.slide.clone),n.push(h)}for(var v=0;v<l.length;v++){var p=l[v].cloneNode(!0);p.classList.add(s.slide.clone),n.unshift(p)}}return n},append:function(){for(var t=this.items,n=e.Html,i=n.wrapper,r=n.slides,o=Math.floor(t.length/2),s=t.slice(0,o).reverse(),a=t.slice(-1*o).reverse(),u="".concat(e.Sizes.slideWidth,"px"),c=0;c<a.length;c++)i.appendChild(a[c]);for(var l=0;l<s.length;l++)i.insertBefore(s[l],r[0]);for(var f=0;f<t.length;f++)t[f].style.width=u},remove:function(){for(var t=this.items,n=0;n<t.length;n++)e.Html.wrapper.removeChild(t[n])}};return m(i,"grow",{get:function(){return(e.Sizes.slideWidth+e.Gaps.value)*i.items.length}}),n.on("update",(function(){i.remove(),i.mount(),i.append()})),n.on("build.before",(function(){t.isType("carousel")&&i.append()})),n.on("destroy",(function(){i.remove()})),i},Resize:function(t,e,n){var i=new H,r={mount:function(){this.bind()},bind:function(){i.on("resize",window,_((function(){n.emit("resize")}),t.settings.throttle))},unbind:function(){i.off("resize",window)}};return n.on("destroy",(function(){r.unbind(),i.destroy()})),r},Build:function(t,e,n){var i={mount:function(){n.emit("build.before"),this.typeClass(),this.activeClass(),n.emit("build.after")},typeClass:function(){e.Html.root.classList.add(t.settings.classes.type[t.settings.type])},activeClass:function(){var n=t.settings.classes,i=e.Html.slides[t.index];i&&(i.classList.add(n.slide.active),S(i).forEach((function(t){t.classList.remove(n.slide.active)})))},removeClasses:function(){var n=t.settings.classes,i=n.type,r=n.slide;e.Html.root.classList.remove(i[t.settings.type]),e.Html.slides.forEach((function(t){t.classList.remove(r.active)}))}};return n.on(["destroy","update"],(function(){i.removeClasses()})),n.on(["resize","update"],(function(){i.mount()})),n.on("move.after",(function(){i.activeClass()})),i},Run:function(t,e,n){var i={mount:function(){this._o=!1},make:function(i){var r=this;t.disabled||(!t.settings.waitForTransition||t.disable(),this.move=i,n.emit("run.before",this.move),this.calculate(),n.emit("run",this.move),e.Transition.after((function(){r.isStart()&&n.emit("run.start",r.move),r.isEnd()&&n.emit("run.end",r.move),r.isOffset()&&(r._o=!1,n.emit("run.offset",r.move)),n.emit("run.after",r.move),t.enable()})))},calculate:function(){var e=this.move,n=this.length,r=e.steps,o=e.direction,s=1;if("="===o)return t.settings.bound&&f(r)>n?void(t.index=n):void(t.index=r);if(">"!==o||">"!==r)if("<"!==o||"<"!==r){if("|"===o&&(s=t.settings.perView||1),">"===o||"|"===o&&">"===r){var a=function(e){var n=t.index;if(t.isType("carousel"))return n+e;return n+(e-n%e)}(s);return a>n&&(this._o=!0),void(t.index=function(e,n){var r=i.length;if(e<=r)return e;if(t.isType("carousel"))return e-(r+1);if(t.settings.rewind)return i.isBound()&&!i.isEnd()?r:0;if(i.isBound())return r;return Math.floor(r/n)*n}(a,s))}if("<"===o||"|"===o&&"<"===r){var u=function(e){var n=t.index;if(t.isType("carousel"))return n-e;var i=Math.ceil(n/e);return(i-1)*e}(s);return u<0&&(this._o=!0),void(t.index=function(e,n){var r=i.length;if(e>=0)return e;if(t.isType("carousel"))return e+(r+1);if(t.settings.rewind)return i.isBound()&&i.isStart()?r:Math.floor(r/n)*n;return 0}(u,s))}l("Invalid direction pattern [".concat(o).concat(r,"] has been used"))}else t.index=0;else t.index=n},isStart:function(){return t.index<=0},isEnd:function(){return t.index>=this.length},isOffset:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:void 0;return t?!!this._o&&("|>"===t?"|"===this.move.direction&&">"===this.move.steps:"|<"===t?"|"===this.move.direction&&"<"===this.move.steps:this.move.direction===t):this._o},isBound:function(){return t.isType("slider")&&"center"!==t.settings.focusAt&&t.settings.bound}};return m(i,"move",{get:function(){return this._m},set:function(t){var e=t.substr(1);this._m={direction:t.substr(0,1),steps:e?f(e)?f(e):e:0}}}),m(i,"length",{get:function(){var n=t.settings,i=e.Html.slides.length;return this.isBound()?i-1-(f(n.perView)-1)+f(n.focusAt):i-1}}),m(i,"offset",{get:function(){return this._o}}),i}},U=function(t){!function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function");t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,writable:!0,configurable:!0}}),e&&o(t,e)}(s,t);var n=a(s);function s(){return e(this,s),n.apply(this,arguments)}return i(s,[{key:"mount",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return u(r(s.prototype),"mount",this).call(this,Object.assign({},Q,t))}}]),s}(w);Drupal.behaviors.iopGlide={attach(){document.querySelectorAll(".glide").forEach((t=>{new U(t,{type:"carousel",focusAt:"center",gap:56,perView:3,breakpoints:{1399:{gap:50},1199:{gap:44},991:{gap:36},767:{gap:16,perView:1}}}).mount({Breakpoints:J,Controls:Y,Keyboard:X,Swipe:G})}))}}}));
 //# sourceMappingURL=glide.min.js.map
diff --git a/web/themes/ventuno/assets/css/glide.core.min.css b/web/themes/ventuno/assets/css/glide.core.min.css
index 4dae0fd6b8..4f611b375f 100644
--- a/web/themes/ventuno/assets/css/glide.core.min.css
+++ b/web/themes/ventuno/assets/css/glide.core.min.css
@@ -1 +1 @@
-.glide{position:relative;width:100%;box-sizing:border-box}.glide *{box-sizing:inherit}.glide__track{overflow:hidden}.glide__slides{position:relative;width:100%;list-style:none;backface-visibility:hidden;transform-style:preserve-3d;touch-action:pan-Y;overflow:hidden;margin:0;padding:0;white-space:nowrap;display:flex;flex-wrap:nowrap;will-change:transform}.glide__slides--dragging{user-select:none}.glide__slide{width:100%;height:100%;flex-shrink:0;white-space:normal;user-select:none;-webkit-touch-callout:none;-webkit-tap-highlight-color:transparent}.glide__slide a{user-select:none;-webkit-user-drag:none;-moz-user-select:none;-ms-user-select:none}.glide__arrows{-webkit-touch-callout:none;user-select:none}.glide__bullets{-webkit-touch-callout:none;user-select:none}.glide--rtl{direction:rtl}.glide__lazy__loaded{-webkit-animation:fadeInFromNone .5s ease-in 0s forwards;animation:fadeInFromNone .5s ease-in 0s forwards}@keyframes fadeInFromNone{0%{visibility:hidden;opacity:0}1%{visibility:visible;opacity:0}100%{visibility:visible;opacity:1}}/*# sourceMappingURL=glide.core.min.css.map */
+.glide{position:relative;width:100%;box-sizing:border-box}.glide *{box-sizing:inherit}.glide__track{overflow:hidden}.glide__slides{position:relative;width:100%;list-style:none;backface-visibility:hidden;transform-style:preserve-3d;touch-action:pan-Y;overflow:hidden;margin:0;padding:0;white-space:nowrap;display:flex;flex-wrap:nowrap;will-change:transform}.glide__slides--dragging{user-select:none}.glide__slide{width:100%;height:100%;flex-shrink:0;white-space:normal;user-select:none;-webkit-touch-callout:none;-webkit-tap-highlight-color:transparent}.glide__slide a{user-select:none;-webkit-user-drag:none;-moz-user-select:none;-ms-user-select:none}.glide__arrows{-webkit-touch-callout:none;user-select:none}.glide__bullets{-webkit-touch-callout:none;user-select:none}.glide--rtl{direction:rtl}/*# sourceMappingURL=glide.core.min.css.map */
diff --git a/web/themes/ventuno/assets/js/carousel.min.js b/web/themes/ventuno/assets/js/carousel.min.js
index 0ca773e3d4..b9aaf7cf3d 100644
--- a/web/themes/ventuno/assets/js/carousel.min.js
+++ b/web/themes/ventuno/assets/js/carousel.min.js
@@ -1,7 +1,7 @@
 !function(t){"function"==typeof define&&define.amd?define(t):t()}((function(){"use strict";
 /*!
    * Glide.js v3.6.0
-   * (c) 2013-2023 Jędrzej Chałubek (https://github.com/jedrzejchalubek/)
+   * (c) 2013-2022 Jędrzej Chałubek (https://github.com/jedrzejchalubek/)
    * Released under the MIT License.
-   */function t(e){return t="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},t(e)}function e(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function n(t,e){for(var n=0;n<e.length;n++){var i=e[n];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(t,i.key,i)}}function i(t,e,i){return e&&n(t.prototype,e),i&&n(t,i),t}function r(t){return r=Object.setPrototypeOf?Object.getPrototypeOf:function(t){return t.__proto__||Object.getPrototypeOf(t)},r(t)}function s(t,e){return s=Object.setPrototypeOf||function(t,e){return t.__proto__=e,t},s(t,e)}function o(t,e){if(e&&("object"==typeof e||"function"==typeof e))return e;if(void 0!==e)throw new TypeError("Derived constructors may only return object or undefined");return function(t){if(void 0===t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return t}(t)}function a(t){var e=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(t){return!1}}();return function(){var n,i=r(t);if(e){var s=r(this).constructor;n=Reflect.construct(i,arguments,s)}else n=i.apply(this,arguments);return o(this,n)}}function u(){return u="undefined"!=typeof Reflect&&Reflect.get?Reflect.get:function(t,e,n){var i=function(t,e){for(;!Object.prototype.hasOwnProperty.call(t,e)&&null!==(t=r(t)););return t}(t,e);if(i){var s=Object.getOwnPropertyDescriptor(i,e);return s.get?s.get.call(arguments.length<3?t:n):s.value}},u.apply(this,arguments)}var c={type:"slider",startAt:0,perView:1,focusAt:0,gap:10,autoplay:!1,hoverpause:!0,keyboard:!0,bound:!1,swipeThreshold:80,dragThreshold:120,perSwipe:"",touchRatio:.5,touchAngle:45,animationDuration:400,rewind:!0,rewindDuration:800,animationTimingFunc:"cubic-bezier(.165, .840, .440, 1)",waitForTransition:!0,throttle:10,direction:"ltr",peek:0,cloningRatio:1,breakpoints:{},lazy:!1,lazyScrollThreshold:1.2,lazyInitialSlidesLoaded:2,classes:{swipeable:"glide--swipeable",dragging:"glide--dragging",direction:{ltr:"glide--ltr",rtl:"glide--rtl"},type:{slider:"glide--slider",carousel:"glide--carousel"},slide:{clone:"glide__slide--clone",active:"glide__slide--active"},arrow:{disabled:"glide__arrow--disabled"},nav:{active:"glide__bullet--active"}}};function l(t){console.error("[Glide warn]: ".concat(t))}function f(t){return parseInt(t)}function d(t){return"string"==typeof t}function h(e){var n=t(e);return"function"===n||"object"===n&&!!e}function v(t){return"function"==typeof t}function p(t){return t.constructor===Array}function g(t,e,n){Object.defineProperty(t,e,n)}function m(t,e){var n=Object.assign({},t,e);return e.hasOwnProperty("classes")&&(n.classes=Object.assign({},t.classes,e.classes),e.classes.hasOwnProperty("direction")&&(n.classes.direction=Object.assign({},t.classes.direction,e.classes.direction)),e.classes.hasOwnProperty("type")&&(n.classes.type=Object.assign({},t.classes.type,e.classes.type)),e.classes.hasOwnProperty("slide")&&(n.classes.slide=Object.assign({},t.classes.slide,e.classes.slide)),e.classes.hasOwnProperty("arrow")&&(n.classes.arrow=Object.assign({},t.classes.arrow,e.classes.arrow)),e.classes.hasOwnProperty("nav")&&(n.classes.nav=Object.assign({},t.classes.nav,e.classes.nav))),e.hasOwnProperty("breakpoints")&&(n.breakpoints=Object.assign({},t.breakpoints,e.breakpoints)),n}var y=function(){function t(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};e(this,t),this.events=n,this.hop=n.hasOwnProperty}return i(t,[{key:"on",value:function(t,e){if(!p(t)){this.hop.call(this.events,t)||(this.events[t]=[]);var n=this.events[t].push(e)-1;return{remove:function(){delete this.events[t][n]}}}for(var i=0;i<t.length;i++)this.on(t[i],e)}},{key:"emit",value:function(t,e){if(p(t))for(var n=0;n<t.length;n++)this.emit(t[n],e);else this.hop.call(this.events,t)&&this.events[t].forEach((function(t){t(e||{})}))}}]),t}(),w=function(){function t(n){var i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};e(this,t),this._c={},this._t=[],this._e=new y,this.disabled=!1,this.selector=n,this.settings=m(c,i),this.index=this.settings.startAt}return i(t,[{key:"mount",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return this._e.emit("mount.before"),h(t)?this._c=function(t,e,n){var i={};for(var r in e)v(e[r])?i[r]=e[r](t,i,n):l("Extension must be a function");for(var s in i)v(i[s].mount)&&i[s].mount();return i}(this,t,this._e):l("You need to provide a object on `mount()`"),this._e.emit("mount.after"),this}},{key:"mutate",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];return p(t)?this._t=t:l("You need to provide a array on `mutate()`"),this}},{key:"update",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return this.settings=m(this.settings,t),t.hasOwnProperty("startAt")&&(this.index=t.startAt),this._e.emit("update"),this}},{key:"go",value:function(t){return this._c.Run.make(t),this}},{key:"move",value:function(t){return this._c.Transition.disable(),this._c.Move.make(t),this}},{key:"destroy",value:function(){return this._e.emit("destroy"),this}},{key:"play",value:function(){var t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];return t&&(this.settings.autoplay=t),this._e.emit("play"),this}},{key:"pause",value:function(){return this._e.emit("pause"),this}},{key:"disable",value:function(){return this.disabled=!0,this}},{key:"enable",value:function(){return this.disabled=!1,this}},{key:"on",value:function(t,e){return this._e.on(t,e),this}},{key:"isType",value:function(t){return this.settings.type===t}},{key:"settings",get:function(){return this._o},set:function(t){h(t)?this._o=t:l("Options must be an `object` instance.")}},{key:"index",get:function(){return this._i},set:function(t){this._i=f(t)}},{key:"type",get:function(){return this.settings.type}},{key:"disabled",get:function(){return this._d},set:function(t){this._d=!!t}}]),t}();function b(){return(new Date).getTime()}function _(t,e,n){var i,r,s,o,a=0;n||(n={});var u=function(){a=!1===n.leading?0:b(),i=null,o=t.apply(r,s),i||(r=s=null)},c=function(){var c=b();a||!1!==n.leading||(a=c);var l=e-(c-a);return r=this,s=arguments,l<=0||l>e?(i&&(clearTimeout(i),i=null),a=c,o=t.apply(r,s),i||(r=s=null)):i||!1===n.trailing||(i=setTimeout(u,l)),o};return c.cancel=function(){clearTimeout(i),a=0,i=r=s=null},c}var S={ltr:["marginLeft","marginRight"],rtl:["marginRight","marginLeft"]};function k(t){if(t&&t.parentNode){for(var e=t.parentNode.firstChild,n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n}return[]}function T(t){return!!(t&&t instanceof window.HTMLElement)}function O(t){return Array.prototype.slice.call(t)}var x='[data-glide-el="track"]';var H=function(){function t(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};e(this,t),this.listeners=n}return i(t,[{key:"on",value:function(t,e,n){var i=arguments.length>3&&void 0!==arguments[3]&&arguments[3];d(t)&&(t=[t]);for(var r=0;r<t.length;r++)this.listeners[t[r]]=n,e.addEventListener(t[r],this.listeners[t[r]],i)}},{key:"off",value:function(t,e){var n=arguments.length>2&&void 0!==arguments[2]&&arguments[2];d(t)&&(t=[t]);for(var i=0;i<t.length;i++)e.removeEventListener(t[i],this.listeners[t[i]],n)}},{key:"destroy",value:function(){delete this.listeners}}]),t}();var z=["ltr","rtl"],A={">":"<","<":">","=":"="};function j(t,e){return{modify:function(t){return e.Direction.is("rtl")?-t:t}}}function L(t,e){return{modify:function(t){var n=Math.floor(t/e.Sizes.slideWidth);return t+e.Gaps.value*n}}}function P(t,e){return{modify:function(t){return t+e.Clones.grow/2}}}function E(t,e){return{modify:function(n){if(t.settings.focusAt>=0){var i=e.Peek.value;return h(i)?n-i.before:n-i}return n}}}function R(t,e){return{modify:function(n){var i=e.Gaps.value,r=e.Sizes.width,s=t.settings.focusAt,o=e.Sizes.slideWidth;return"center"===s?n-(r/2-o/2):n-o*s-i*s}}}var C=!1;try{var M=Object.defineProperty({},"passive",{get:function(){C=!0}});window.addEventListener("testPassive",null,M),window.removeEventListener("testPassive",null,M)}catch(t){}var V=C,D=["touchstart","mousedown"],B=["touchmove","mousemove"],W=["touchend","touchcancel","mouseup","mouseleave"],q=["mousedown","mousemove","mouseup","mouseleave"];function G(t,e,n){var i=new H,r=0,s=0,o=0,a=!1,u=!!V&&{passive:!0},c={mount:function(){this.bindSwipeStart()},start:function(e){if(!a&&!t.disabled){this.disable();var i=this.touches(e);r=null,s=f(i.pageX),o=f(i.pageY),this.bindSwipeMove(),this.bindSwipeEnd(),n.emit("swipe.start")}},move:function(i){if(!t.disabled){var a=t.settings,u=a.touchAngle,c=a.touchRatio,l=a.classes,d=this.touches(i),h=f(d.pageX)-s,v=f(d.pageY)-o,p=Math.abs(h<<2),g=Math.abs(v<<2),m=Math.sqrt(p+g),y=Math.sqrt(g);if(!(180*(r=Math.asin(y/m))/Math.PI<u))return!1;i.stopPropagation(),e.Move.make(h*parseFloat(c)),e.Html.root.classList.add(l.dragging),n.emit("swipe.move")}},end:function(i){if(!t.disabled){var o=t.settings,a=o.perSwipe,u=o.touchAngle,c=o.classes,l=this.touches(i),f=this.threshold(i),d=l.pageX-s,h=180*r/Math.PI;this.enable(),d>f&&h<u?e.Run.make(e.Direction.resolve("".concat(a,"<"))):d<-f&&h<u?e.Run.make(e.Direction.resolve("".concat(a,">"))):e.Move.make(),e.Html.root.classList.remove(c.dragging),this.unbindSwipeMove(),this.unbindSwipeEnd(),n.emit("swipe.end")}},bindSwipeStart:function(){var n=this,r=t.settings,s=r.swipeThreshold,o=r.dragThreshold;s&&i.on(D[0],e.Html.wrapper,(function(t){n.start(t)}),u),o&&i.on(D[1],e.Html.wrapper,(function(t){n.start(t)}),u)},unbindSwipeStart:function(){i.off(D[0],e.Html.wrapper,u),i.off(D[1],e.Html.wrapper,u)},bindSwipeMove:function(){var n=this;i.on(B,e.Html.wrapper,_((function(t){n.move(t)}),t.settings.throttle),u)},unbindSwipeMove:function(){i.off(B,e.Html.wrapper,u)},bindSwipeEnd:function(){var t=this;i.on(W,e.Html.wrapper,(function(e){t.end(e)}))},unbindSwipeEnd:function(){i.off(W,e.Html.wrapper)},touches:function(t){return q.indexOf(t.type)>-1?t:t.touches[0]||t.changedTouches[0]},threshold:function(e){var n=t.settings;return q.indexOf(e.type)>-1?n.dragThreshold:n.swipeThreshold},enable:function(){return a=!1,e.Transition.enable(),this},disable:function(){return a=!0,e.Transition.disable(),this}};return n.on("build.after",(function(){e.Html.root.classList.add(t.settings.classes.swipeable)})),n.on("destroy",(function(){c.unbindSwipeStart(),c.unbindSwipeMove(),c.unbindSwipeEnd(),i.destroy()})),c}var I='[data-glide-el^="controls"]',F="".concat(I,' [data-glide-dir*="<"]'),N="".concat(I,' [data-glide-dir*=">"]');function Y(t,e,n){var i=new H,r=!!V&&{passive:!0},s={mount:function(){this._n=e.Html.root.querySelectorAll('[data-glide-el="controls[nav]"]'),this._c=e.Html.root.querySelectorAll(I),this._arrowControls={previous:e.Html.root.querySelectorAll(F),next:e.Html.root.querySelectorAll(N)},this.addBindings()},setActive:function(){for(var t=0;t<this._n.length;t++)this.addClass(this._n[t].children)},removeActive:function(){for(var t=0;t<this._n.length;t++)this.removeClass(this._n[t].children)},addClass:function(e){var n=t.settings,i=e[t.index];i&&i&&(i.classList.add(n.classes.nav.active),k(i).forEach((function(t){t.classList.remove(n.classes.nav.active)})))},removeClass:function(e){var n=e[t.index];n&&n.classList.remove(t.settings.classes.nav.active)},setArrowState:function(){if(!t.settings.rewind){var n=s._arrowControls.next,i=s._arrowControls.previous;this.resetArrowState(n,i),0===t.index&&this.disableArrow(i),t.index===e.Run.length&&this.disableArrow(n)}},resetArrowState:function(){for(var e=t.settings,n=arguments.length,i=new Array(n),r=0;r<n;r++)i[r]=arguments[r];i.forEach((function(t){O(t).forEach((function(t){t.classList.remove(e.classes.arrow.disabled)}))}))},disableArrow:function(){for(var e=t.settings,n=arguments.length,i=new Array(n),r=0;r<n;r++)i[r]=arguments[r];i.forEach((function(t){O(t).forEach((function(t){t.classList.add(e.classes.arrow.disabled)}))}))},addBindings:function(){for(var t=0;t<this._c.length;t++)this.bind(this._c[t].children)},removeBindings:function(){for(var t=0;t<this._c.length;t++)this.unbind(this._c[t].children)},bind:function(t){for(var e=0;e<t.length;e++)i.on("click",t[e],this.click),i.on("touchstart",t[e],this.click,r)},unbind:function(t){for(var e=0;e<t.length;e++)i.off(["click","touchstart"],t[e])},click:function(t){V||"touchstart"!==t.type||t.preventDefault();var n=t.currentTarget.getAttribute("data-glide-dir");e.Run.make(e.Direction.resolve(n))}};return g(s,"items",{get:function(){return s._c}}),n.on(["mount.after","move.after"],(function(){s.setActive()})),n.on(["mount.after","run"],(function(){s.setArrowState()})),n.on("destroy",(function(){s.removeBindings(),s.removeActive(),i.destroy()})),s}function X(t){return h(t)?(e=t,Object.keys(e).sort().reduce((function(t,n){return t[n]=e[n],t[n],t}),{})):(l("Breakpoints option must be an object"),{});var e}function $(t,e,n){var i=new H,r=t.settings,s=X(r.breakpoints),o=Object.assign({},r),a={match:function(t){if(void 0!==window.matchMedia)for(var e in t)if(t.hasOwnProperty(e)&&window.matchMedia("(max-width: ".concat(e,"px)")).matches)return t[e];return o}};return Object.assign(r,a.match(s)),i.on("resize",window,_((function(){t.settings=m(r,a.match(s))}),t.settings.throttle)),n.on("update",(function(){s=X(s),o=Object.assign({},r)})),n.on("destroy",(function(){i.off("resize",window)})),a}var J={Html:function(t,e,n){var i={mount:function(){this.root=t.selector,this.track=this.root.querySelector(x),this.collectSlides()},collectSlides:function(){this.slides=O(this.wrapper.children).filter((function(e){return!e.classList.contains(t.settings.classes.slide.clone)}))}};return g(i,"root",{get:function(){return i._r},set:function(t){d(t)&&(t=document.querySelector(t)),T(t)?i._r=t:l("Root element must be a existing Html node")}}),g(i,"track",{get:function(){return i._t},set:function(t){T(t)?i._t=t:l("Could not find track element. Please use ".concat(x," attribute."))}}),g(i,"wrapper",{get:function(){return i.track.children[0]}}),n.on("update",(function(){i.collectSlides()})),i},Translate:function(t,e,n){var i={set:function(n){var i=function(t,e,n){var i=[L,P,E,R].concat(t._t,[j]);return{mutate:function(r){for(var s=0;s<i.length;s++){var o=i[s];v(o)&&v(o().modify)?r=o(t,e,n).modify(r):l("Transformer should be a function that returns an object with `modify()` method")}return r}}}(t,e).mutate(n),r="translate3d(".concat(-1*i,"px, 0px, 0px)");e.Html.wrapper.style.mozTransform=r,e.Html.wrapper.style.webkitTransform=r,e.Html.wrapper.style.transform=r},remove:function(){e.Html.wrapper.style.transform=""},getStartIndex:function(){var n=e.Sizes.length,i=t.index,r=t.settings.perView;return e.Run.isOffset(">")||e.Run.isOffset("|>")?n+(i-r):(i+r)%n},getTravelDistance:function(){var n=e.Sizes.slideWidth*t.settings.perView;return e.Run.isOffset(">")||e.Run.isOffset("|>")?-1*n:n}};return n.on("move",(function(r){if(!t.isType("carousel")||!e.Run.isOffset())return i.set(r.movement);e.Transition.after((function(){n.emit("translate.jump"),i.set(e.Sizes.slideWidth*t.index)}));var s=e.Sizes.slideWidth*e.Translate.getStartIndex();return i.set(s-e.Translate.getTravelDistance())})),n.on("destroy",(function(){i.remove()})),i},Transition:function(t,e,n){var i=!1,r={compose:function(e){var n=t.settings;return i?"".concat(e," 0ms ").concat(n.animationTimingFunc):"".concat(e," ").concat(this.duration,"ms ").concat(n.animationTimingFunc)},set:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"transform";e.Html.wrapper.style.transition=this.compose(t)},remove:function(){e.Html.wrapper.style.transition=""},after:function(t){setTimeout((function(){t()}),this.duration)},enable:function(){i=!1,this.set()},disable:function(){i=!0,this.set()}};return g(r,"duration",{get:function(){var n=t.settings;return t.isType("slider")&&e.Run.offset?n.rewindDuration:n.animationDuration}}),n.on("move",(function(){r.set()})),n.on(["build.before","resize","translate.jump"],(function(){r.disable()})),n.on("run",(function(){r.enable()})),n.on("destroy",(function(){r.remove()})),r},Direction:function(t,e,n){var i={mount:function(){this.value=t.settings.direction},resolve:function(t){var e=t.slice(0,1);return this.is("rtl")?t.split(e).join(A[e]):t},is:function(t){return this.value===t},addClass:function(){e.Html.root.classList.add(t.settings.classes.direction[this.value])},removeClass:function(){e.Html.root.classList.remove(t.settings.classes.direction[this.value])}};return g(i,"value",{get:function(){return i._v},set:function(t){z.indexOf(t)>-1?i._v=t:l("Direction value must be `ltr` or `rtl`")}}),n.on(["destroy","update"],(function(){i.removeClass()})),n.on("update",(function(){i.mount()})),n.on(["build.before","update"],(function(){i.addClass()})),i},Peek:function(t,e,n){var i={mount:function(){this.value=t.settings.peek}};return g(i,"value",{get:function(){return i._v},set:function(t){h(t)?(t.before=f(t.before),t.after=f(t.after)):t=f(t),i._v=t}}),g(i,"reductor",{get:function(){var e=i.value,n=t.settings.perView;return h(e)?e.before/n+e.after/n:2*e/n}}),n.on(["resize","update"],(function(){i.mount()})),i},Sizes:function(t,e,n){var i={setupSlides:function(){for(var t="".concat(this.slideWidth,"px"),n=e.Html.slides,i=0;i<n.length;i++)n[i].style.width=t},setupWrapper:function(){e.Html.wrapper.style.width="".concat(this.wrapperSize,"px")},remove:function(){for(var t=e.Html.slides,n=0;n<t.length;n++)t[n].style.width="";e.Html.wrapper.style.width=""}};return g(i,"length",{get:function(){return e.Html.slides.length}}),g(i,"width",{get:function(){return e.Html.track.offsetWidth}}),g(i,"wrapperSize",{get:function(){return i.slideWidth*i.length+e.Gaps.grow+e.Clones.grow}}),g(i,"slideWidth",{get:function(){return i.width/t.settings.perView-e.Peek.reductor-e.Gaps.reductor}}),n.on(["build.before","resize","update"],(function(){i.setupSlides(),i.setupWrapper()})),n.on("destroy",(function(){i.remove()})),i},Gaps:function(t,e,n){var i={apply:function(t){for(var n=0,i=t.length;n<i;n++){var r=t[n].style,s=e.Direction.value;r[S[s][0]]=0!==n?"".concat(this.value/2,"px"):"",n!==t.length-1?r[S[s][1]]="".concat(this.value/2,"px"):r[S[s][1]]=""}},remove:function(t){for(var e=0,n=t.length;e<n;e++){var i=t[e].style;i.marginLeft="",i.marginRight=""}}};return g(i,"value",{get:function(){return f(t.settings.gap)}}),g(i,"grow",{get:function(){return i.value*e.Sizes.length}}),g(i,"reductor",{get:function(){var e=t.settings.perView;return i.value*(e-1)/e}}),n.on(["build.after","update"],_((function(){i.apply(e.Html.wrapper.children)}),30)),n.on("destroy",(function(){i.remove(e.Html.wrapper.children)})),i},Move:function(t,e,n){var i={mount:function(){this._o=0},make:function(){var t=this,i=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0;this.offset=i,n.emit("move",{movement:this.value}),e.Transition.after((function(){n.emit("move.after",{movement:t.value})}))}};return g(i,"offset",{get:function(){return i._o},set:function(t){i._o=function(t){return void 0===t}(t)?0:f(t)}}),g(i,"translate",{get:function(){return e.Sizes.slideWidth*t.index}}),g(i,"value",{get:function(){var t=this.offset,n=this.translate;return e.Direction.is("rtl")?n+t:n-t}}),n.on(["build.before","run"],(function(){i.make()})),i},Clones:function(t,e,n){var i={mount:function(){this.items=[],t.isType("carousel")&&(this.items=this.collect())},collect:function(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],i=e.Html.slides,r=t.settings,s=r.perView,o=r.classes,a=r.cloningRatio;if(0!==i.length)for(var u=s+ +!!t.settings.peek+Math.round(s/2),c=i.slice(0,u).reverse(),l=i.slice(-1*u),f=0;f<Math.max(a,Math.floor(s/i.length));f++){for(var d=0;d<c.length;d++){var h=c[d].cloneNode(!0);h.classList.add(o.slide.clone),n.push(h)}for(var v=0;v<l.length;v++){var p=l[v].cloneNode(!0);p.classList.add(o.slide.clone),n.unshift(p)}}return n},append:function(){for(var t=this.items,n=e.Html,i=n.wrapper,r=n.slides,s=Math.floor(t.length/2),o=t.slice(0,s).reverse(),a=t.slice(-1*s).reverse(),u="".concat(e.Sizes.slideWidth,"px"),c=0;c<a.length;c++)i.appendChild(a[c]);for(var l=0;l<o.length;l++)i.insertBefore(o[l],r[0]);for(var f=0;f<t.length;f++)t[f].style.width=u},remove:function(){for(var t=this.items,n=0;n<t.length;n++)e.Html.wrapper.removeChild(t[n])}};return g(i,"grow",{get:function(){return(e.Sizes.slideWidth+e.Gaps.value)*i.items.length}}),n.on("update",(function(){i.remove(),i.mount(),i.append()})),n.on("build.before",(function(){t.isType("carousel")&&i.append()})),n.on("destroy",(function(){i.remove()})),i},Resize:function(t,e,n){var i=new H,r={mount:function(){this.bind()},bind:function(){i.on("resize",window,_((function(){n.emit("resize")}),t.settings.throttle))},unbind:function(){i.off("resize",window)}};return n.on("destroy",(function(){r.unbind(),i.destroy()})),r},Build:function(t,e,n){var i={mount:function(){n.emit("build.before"),this.typeClass(),this.activeClass(),n.emit("build.after")},typeClass:function(){e.Html.root.classList.add(t.settings.classes.type[t.settings.type])},activeClass:function(){var n=t.settings.classes,i=e.Html.slides[t.index];i&&(i.classList.add(n.slide.active),k(i).forEach((function(t){t.classList.remove(n.slide.active)})))},removeClasses:function(){var n=t.settings.classes,i=n.type,r=n.slide;e.Html.root.classList.remove(i[t.settings.type]),e.Html.slides.forEach((function(t){t.classList.remove(r.active)}))}};return n.on(["destroy","update"],(function(){i.removeClasses()})),n.on(["resize","update"],(function(){i.mount()})),n.on("move.after",(function(){i.activeClass()})),i},Run:function(t,e,n){var i={mount:function(){this._o=!1},make:function(i){var r=this;t.disabled||(!t.settings.waitForTransition||t.disable(),this.move=i,n.emit("run.before",this.move),this.calculate(),n.emit("run",this.move),e.Transition.after((function(){r.isStart()&&n.emit("run.start",r.move),r.isEnd()&&n.emit("run.end",r.move),r.isOffset()&&(r._o=!1,n.emit("run.offset",r.move)),n.emit("run.after",r.move),t.enable()})))},calculate:function(){var e=this.move,n=this.length,r=e.steps,s=e.direction,o=1;if("="===s)return t.settings.bound&&f(r)>n?void(t.index=n):void(t.index=r);if(">"!==s||">"!==r)if("<"!==s||"<"!==r){if("|"===s&&(o=t.settings.perView||1),">"===s||"|"===s&&">"===r){var a=function(e){var n=t.index;if(t.isType("carousel"))return n+e;return n+(e-n%e)}(o);return a>n&&(this._o=!0),void(t.index=function(e,n){var r=i.length;if(e<=r)return e;if(t.isType("carousel"))return e-(r+1);if(t.settings.rewind)return i.isBound()&&!i.isEnd()?r:0;if(i.isBound())return r;return Math.floor(r/n)*n}(a,o))}if("<"===s||"|"===s&&"<"===r){var u=function(e){var n=t.index;if(t.isType("carousel"))return n-e;var i=Math.ceil(n/e);return(i-1)*e}(o);return u<0&&(this._o=!0),void(t.index=function(e,n){var r=i.length;if(e>=0)return e;if(t.isType("carousel"))return e+(r+1);if(t.settings.rewind)return i.isBound()&&i.isStart()?r:Math.floor(r/n)*n;return 0}(u,o))}l("Invalid direction pattern [".concat(s).concat(r,"] has been used"))}else t.index=0;else t.index=n},isStart:function(){return t.index<=0},isEnd:function(){return t.index>=this.length},isOffset:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:void 0;return t?!!this._o&&("|>"===t?"|"===this.move.direction&&">"===this.move.steps:"|<"===t?"|"===this.move.direction&&"<"===this.move.steps:this.move.direction===t):this._o},isBound:function(){return t.isType("slider")&&"center"!==t.settings.focusAt&&t.settings.bound}};return g(i,"move",{get:function(){return this._m},set:function(t){var e=t.substr(1);this._m={direction:t.substr(0,1),steps:e?f(e)?f(e):e:0}}}),g(i,"length",{get:function(){var n=t.settings,i=e.Html.slides.length;return this.isBound()?i-1-(f(n.perView)-1)+f(n.focusAt):i-1}}),g(i,"offset",{get:function(){return this._o}}),i}},K=function(t){!function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function");t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,writable:!0,configurable:!0}}),e&&s(t,e)}(o,t);var n=a(o);function o(){return e(this,o),n.apply(this,arguments)}return i(o,[{key:"mount",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return u(r(o.prototype),"mount",this).call(this,Object.assign({},J,t))}}]),o}(w);const Q="glide__arrow--left",U="glide__arrow--right";function Z(t,e){return{mount(){t.settings.rewind||(t.on(["mount.after","resize"],(()=>{e.Sizes.length<=t.settings.perView?t.disable():t.enable()})),t.on(["mount.after","run","resize"],(()=>{e.Controls.items.forEach((n=>{const i=n.querySelector(`.${Q}`);i&&(0===t.index||e.Sizes.length<=t.settings.perView?i.setAttribute("disabled",""):i.removeAttribute("disabled"));const r=n.querySelector(`.${U}`);if(r){(t.settings.bound?t.index+(t.settings.perView-1):t.index)===e.Sizes.length-1||e.Sizes.length<=t.settings.perView?r.setAttribute("disabled",""):r.removeAttribute("disabled")}i.disabled&&r.disabled?n.classList.add("glide__arrows--disabled"):n.classList.remove("glide__arrows--disabled")}))})))}}}((t,e)=>{t.behaviors.glide={attach(t){e("glide",".carousel .glide",t).forEach((t=>{const e=new K(t,{rewind:!1,bound:!0,dragThreshold:!1,gap:16,perView:4,breakpoints:{9999:{perView:4},1199:{perView:3},767:{perView:2},575:{perView:1}}});let n;const i=t=>{t.settings.perView!==t.previousPerView&&(t.previousPerView=t.settings.perView,t.enable().go("<<").disable())};e.on("resize",(()=>{n&&clearTimeout(n),n=setTimeout(i,50,e)})),e.mount({Controls:Y,Breakpoints:$,Swipe:G,ControlsDisabler:Z}),e.previousPerView=e.settings.perView;const r=t.querySelector(".glide__arrow--right"),s=t.querySelector(".glide__arrow--left");r.addEventListener("click",(()=>{e.go(">")})),s.addEventListener("click",(()=>{e.go("<")})),e.on("run",(()=>{t.classList.add("glide-animating")})).on("run.after",(()=>{t.classList.remove("glide-animating")}))}))}}})(Drupal,once)}));
+   */function t(e){return t="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},t(e)}function e(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function n(t,e){for(var n=0;n<e.length;n++){var i=e[n];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(t,i.key,i)}}function i(t,e,i){return e&&n(t.prototype,e),i&&n(t,i),t}function r(t){return r=Object.setPrototypeOf?Object.getPrototypeOf:function(t){return t.__proto__||Object.getPrototypeOf(t)},r(t)}function s(t,e){return s=Object.setPrototypeOf||function(t,e){return t.__proto__=e,t},s(t,e)}function o(t,e){if(e&&("object"==typeof e||"function"==typeof e))return e;if(void 0!==e)throw new TypeError("Derived constructors may only return object or undefined");return function(t){if(void 0===t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return t}(t)}function a(t){var e=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(t){return!1}}();return function(){var n,i=r(t);if(e){var s=r(this).constructor;n=Reflect.construct(i,arguments,s)}else n=i.apply(this,arguments);return o(this,n)}}function u(){return u="undefined"!=typeof Reflect&&Reflect.get?Reflect.get:function(t,e,n){var i=function(t,e){for(;!Object.prototype.hasOwnProperty.call(t,e)&&null!==(t=r(t)););return t}(t,e);if(i){var s=Object.getOwnPropertyDescriptor(i,e);return s.get?s.get.call(arguments.length<3?t:n):s.value}},u.apply(this,arguments)}var c={type:"slider",startAt:0,perView:1,focusAt:0,gap:10,autoplay:!1,hoverpause:!0,keyboard:!0,bound:!1,swipeThreshold:80,dragThreshold:120,perSwipe:"",touchRatio:.5,touchAngle:45,animationDuration:400,rewind:!0,rewindDuration:800,animationTimingFunc:"cubic-bezier(.165, .840, .440, 1)",waitForTransition:!0,throttle:10,direction:"ltr",peek:0,cloningRatio:1,breakpoints:{},classes:{swipeable:"glide--swipeable",dragging:"glide--dragging",direction:{ltr:"glide--ltr",rtl:"glide--rtl"},type:{slider:"glide--slider",carousel:"glide--carousel"},slide:{clone:"glide__slide--clone",active:"glide__slide--active"},arrow:{disabled:"glide__arrow--disabled"},nav:{active:"glide__bullet--active"}}};function l(t){console.error("[Glide warn]: ".concat(t))}function f(t){return parseInt(t)}function d(t){return"string"==typeof t}function h(e){var n=t(e);return"function"===n||"object"===n&&!!e}function v(t){return"function"==typeof t}function p(t){return t.constructor===Array}function g(t,e,n){Object.defineProperty(t,e,n)}function m(t,e){var n=Object.assign({},t,e);return e.hasOwnProperty("classes")&&(n.classes=Object.assign({},t.classes,e.classes),e.classes.hasOwnProperty("direction")&&(n.classes.direction=Object.assign({},t.classes.direction,e.classes.direction)),e.classes.hasOwnProperty("type")&&(n.classes.type=Object.assign({},t.classes.type,e.classes.type)),e.classes.hasOwnProperty("slide")&&(n.classes.slide=Object.assign({},t.classes.slide,e.classes.slide)),e.classes.hasOwnProperty("arrow")&&(n.classes.arrow=Object.assign({},t.classes.arrow,e.classes.arrow)),e.classes.hasOwnProperty("nav")&&(n.classes.nav=Object.assign({},t.classes.nav,e.classes.nav))),e.hasOwnProperty("breakpoints")&&(n.breakpoints=Object.assign({},t.breakpoints,e.breakpoints)),n}var w=function(){function t(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};e(this,t),this.events=n,this.hop=n.hasOwnProperty}return i(t,[{key:"on",value:function(t,e){if(!p(t)){this.hop.call(this.events,t)||(this.events[t]=[]);var n=this.events[t].push(e)-1;return{remove:function(){delete this.events[t][n]}}}for(var i=0;i<t.length;i++)this.on(t[i],e)}},{key:"emit",value:function(t,e){if(p(t))for(var n=0;n<t.length;n++)this.emit(t[n],e);else this.hop.call(this.events,t)&&this.events[t].forEach((function(t){t(e||{})}))}}]),t}(),y=function(){function t(n){var i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};e(this,t),this._c={},this._t=[],this._e=new w,this.disabled=!1,this.selector=n,this.settings=m(c,i),this.index=this.settings.startAt}return i(t,[{key:"mount",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return this._e.emit("mount.before"),h(t)?this._c=function(t,e,n){var i={};for(var r in e)v(e[r])?i[r]=e[r](t,i,n):l("Extension must be a function");for(var s in i)v(i[s].mount)&&i[s].mount();return i}(this,t,this._e):l("You need to provide a object on `mount()`"),this._e.emit("mount.after"),this}},{key:"mutate",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];return p(t)?this._t=t:l("You need to provide a array on `mutate()`"),this}},{key:"update",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return this.settings=m(this.settings,t),t.hasOwnProperty("startAt")&&(this.index=t.startAt),this._e.emit("update"),this}},{key:"go",value:function(t){return this._c.Run.make(t),this}},{key:"move",value:function(t){return this._c.Transition.disable(),this._c.Move.make(t),this}},{key:"destroy",value:function(){return this._e.emit("destroy"),this}},{key:"play",value:function(){var t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];return t&&(this.settings.autoplay=t),this._e.emit("play"),this}},{key:"pause",value:function(){return this._e.emit("pause"),this}},{key:"disable",value:function(){return this.disabled=!0,this}},{key:"enable",value:function(){return this.disabled=!1,this}},{key:"on",value:function(t,e){return this._e.on(t,e),this}},{key:"isType",value:function(t){return this.settings.type===t}},{key:"settings",get:function(){return this._o},set:function(t){h(t)?this._o=t:l("Options must be an `object` instance.")}},{key:"index",get:function(){return this._i},set:function(t){this._i=f(t)}},{key:"type",get:function(){return this.settings.type}},{key:"disabled",get:function(){return this._d},set:function(t){this._d=!!t}}]),t}();function b(){return(new Date).getTime()}function _(t,e,n){var i,r,s,o,a=0;n||(n={});var u=function(){a=!1===n.leading?0:b(),i=null,o=t.apply(r,s),i||(r=s=null)},c=function(){var c=b();a||!1!==n.leading||(a=c);var l=e-(c-a);return r=this,s=arguments,l<=0||l>e?(i&&(clearTimeout(i),i=null),a=c,o=t.apply(r,s),i||(r=s=null)):i||!1===n.trailing||(i=setTimeout(u,l)),o};return c.cancel=function(){clearTimeout(i),a=0,i=r=s=null},c}var S={ltr:["marginLeft","marginRight"],rtl:["marginRight","marginLeft"]};function k(t){if(t&&t.parentNode){for(var e=t.parentNode.firstChild,n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n}return[]}function O(t){return!!(t&&t instanceof window.HTMLElement)}function T(t){return Array.prototype.slice.call(t)}var x='[data-glide-el="track"]';var H=function(){function t(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};e(this,t),this.listeners=n}return i(t,[{key:"on",value:function(t,e,n){var i=arguments.length>3&&void 0!==arguments[3]&&arguments[3];d(t)&&(t=[t]);for(var r=0;r<t.length;r++)this.listeners[t[r]]=n,e.addEventListener(t[r],this.listeners[t[r]],i)}},{key:"off",value:function(t,e){var n=arguments.length>2&&void 0!==arguments[2]&&arguments[2];d(t)&&(t=[t]);for(var i=0;i<t.length;i++)e.removeEventListener(t[i],this.listeners[t[i]],n)}},{key:"destroy",value:function(){delete this.listeners}}]),t}();var A=["ltr","rtl"],j={">":"<","<":">","=":"="};function z(t,e){return{modify:function(t){return e.Direction.is("rtl")?-t:t}}}function L(t,e){return{modify:function(t){var n=Math.floor(t/e.Sizes.slideWidth);return t+e.Gaps.value*n}}}function P(t,e){return{modify:function(t){return t+e.Clones.grow/2}}}function E(t,e){return{modify:function(n){if(t.settings.focusAt>=0){var i=e.Peek.value;return h(i)?n-i.before:n-i}return n}}}function R(t,e){return{modify:function(n){var i=e.Gaps.value,r=e.Sizes.width,s=t.settings.focusAt,o=e.Sizes.slideWidth;return"center"===s?n-(r/2-o/2):n-o*s-i*s}}}var C=!1;try{var M=Object.defineProperty({},"passive",{get:function(){C=!0}});window.addEventListener("testPassive",null,M),window.removeEventListener("testPassive",null,M)}catch(t){}var V=C,D=["touchstart","mousedown"],B=["touchmove","mousemove"],W=["touchend","touchcancel","mouseup","mouseleave"],q=["mousedown","mousemove","mouseup","mouseleave"];function G(t,e,n){var i=new H,r=0,s=0,o=0,a=!1,u=!!V&&{passive:!0},c={mount:function(){this.bindSwipeStart()},start:function(e){if(!a&&!t.disabled){this.disable();var i=this.touches(e);r=null,s=f(i.pageX),o=f(i.pageY),this.bindSwipeMove(),this.bindSwipeEnd(),n.emit("swipe.start")}},move:function(i){if(!t.disabled){var a=t.settings,u=a.touchAngle,c=a.touchRatio,l=a.classes,d=this.touches(i),h=f(d.pageX)-s,v=f(d.pageY)-o,p=Math.abs(h<<2),g=Math.abs(v<<2),m=Math.sqrt(p+g),w=Math.sqrt(g);if(!(180*(r=Math.asin(w/m))/Math.PI<u))return!1;i.stopPropagation(),e.Move.make(h*parseFloat(c)),e.Html.root.classList.add(l.dragging),n.emit("swipe.move")}},end:function(i){if(!t.disabled){var o=t.settings,a=o.perSwipe,u=o.touchAngle,c=o.classes,l=this.touches(i),f=this.threshold(i),d=l.pageX-s,h=180*r/Math.PI;this.enable(),d>f&&h<u?e.Run.make(e.Direction.resolve("".concat(a,"<"))):d<-f&&h<u?e.Run.make(e.Direction.resolve("".concat(a,">"))):e.Move.make(),e.Html.root.classList.remove(c.dragging),this.unbindSwipeMove(),this.unbindSwipeEnd(),n.emit("swipe.end")}},bindSwipeStart:function(){var n=this,r=t.settings,s=r.swipeThreshold,o=r.dragThreshold;s&&i.on(D[0],e.Html.wrapper,(function(t){n.start(t)}),u),o&&i.on(D[1],e.Html.wrapper,(function(t){n.start(t)}),u)},unbindSwipeStart:function(){i.off(D[0],e.Html.wrapper,u),i.off(D[1],e.Html.wrapper,u)},bindSwipeMove:function(){var n=this;i.on(B,e.Html.wrapper,_((function(t){n.move(t)}),t.settings.throttle),u)},unbindSwipeMove:function(){i.off(B,e.Html.wrapper,u)},bindSwipeEnd:function(){var t=this;i.on(W,e.Html.wrapper,(function(e){t.end(e)}))},unbindSwipeEnd:function(){i.off(W,e.Html.wrapper)},touches:function(t){return q.indexOf(t.type)>-1?t:t.touches[0]||t.changedTouches[0]},threshold:function(e){var n=t.settings;return q.indexOf(e.type)>-1?n.dragThreshold:n.swipeThreshold},enable:function(){return a=!1,e.Transition.enable(),this},disable:function(){return a=!0,e.Transition.disable(),this}};return n.on("build.after",(function(){e.Html.root.classList.add(t.settings.classes.swipeable)})),n.on("destroy",(function(){c.unbindSwipeStart(),c.unbindSwipeMove(),c.unbindSwipeEnd(),i.destroy()})),c}var F='[data-glide-el^="controls"]',I="".concat(F,' [data-glide-dir*="<"]'),N="".concat(F,' [data-glide-dir*=">"]');function Y(t,e,n){var i=new H,r=!!V&&{passive:!0},s={mount:function(){this._n=e.Html.root.querySelectorAll('[data-glide-el="controls[nav]"]'),this._c=e.Html.root.querySelectorAll(F),this._arrowControls={previous:e.Html.root.querySelectorAll(I),next:e.Html.root.querySelectorAll(N)},this.addBindings()},setActive:function(){for(var t=0;t<this._n.length;t++)this.addClass(this._n[t].children)},removeActive:function(){for(var t=0;t<this._n.length;t++)this.removeClass(this._n[t].children)},addClass:function(e){var n=t.settings,i=e[t.index];i&&i&&(i.classList.add(n.classes.nav.active),k(i).forEach((function(t){t.classList.remove(n.classes.nav.active)})))},removeClass:function(e){var n=e[t.index];n&&n.classList.remove(t.settings.classes.nav.active)},setArrowState:function(){if(!t.settings.rewind){var n=s._arrowControls.next,i=s._arrowControls.previous;this.resetArrowState(n,i),0===t.index&&this.disableArrow(i),t.index===e.Run.length&&this.disableArrow(n)}},resetArrowState:function(){for(var e=t.settings,n=arguments.length,i=new Array(n),r=0;r<n;r++)i[r]=arguments[r];i.forEach((function(t){T(t).forEach((function(t){t.classList.remove(e.classes.arrow.disabled)}))}))},disableArrow:function(){for(var e=t.settings,n=arguments.length,i=new Array(n),r=0;r<n;r++)i[r]=arguments[r];i.forEach((function(t){T(t).forEach((function(t){t.classList.add(e.classes.arrow.disabled)}))}))},addBindings:function(){for(var t=0;t<this._c.length;t++)this.bind(this._c[t].children)},removeBindings:function(){for(var t=0;t<this._c.length;t++)this.unbind(this._c[t].children)},bind:function(t){for(var e=0;e<t.length;e++)i.on("click",t[e],this.click),i.on("touchstart",t[e],this.click,r)},unbind:function(t){for(var e=0;e<t.length;e++)i.off(["click","touchstart"],t[e])},click:function(t){V||"touchstart"!==t.type||t.preventDefault();var n=t.currentTarget.getAttribute("data-glide-dir");e.Run.make(e.Direction.resolve(n))}};return g(s,"items",{get:function(){return s._c}}),n.on(["mount.after","move.after"],(function(){s.setActive()})),n.on(["mount.after","run"],(function(){s.setArrowState()})),n.on("destroy",(function(){s.removeBindings(),s.removeActive(),i.destroy()})),s}function X(t){return h(t)?(e=t,Object.keys(e).sort().reduce((function(t,n){return t[n]=e[n],t[n],t}),{})):(l("Breakpoints option must be an object"),{});var e}function $(t,e,n){var i=new H,r=t.settings,s=X(r.breakpoints),o=Object.assign({},r),a={match:function(t){if(void 0!==window.matchMedia)for(var e in t)if(t.hasOwnProperty(e)&&window.matchMedia("(max-width: ".concat(e,"px)")).matches)return t[e];return o}};return Object.assign(r,a.match(s)),i.on("resize",window,_((function(){t.settings=m(r,a.match(s))}),t.settings.throttle)),n.on("update",(function(){s=X(s),o=Object.assign({},r)})),n.on("destroy",(function(){i.off("resize",window)})),a}var J={Html:function(t,e,n){var i={mount:function(){this.root=t.selector,this.track=this.root.querySelector(x),this.collectSlides()},collectSlides:function(){this.slides=T(this.wrapper.children).filter((function(e){return!e.classList.contains(t.settings.classes.slide.clone)}))}};return g(i,"root",{get:function(){return i._r},set:function(t){d(t)&&(t=document.querySelector(t)),O(t)?i._r=t:l("Root element must be a existing Html node")}}),g(i,"track",{get:function(){return i._t},set:function(t){O(t)?i._t=t:l("Could not find track element. Please use ".concat(x," attribute."))}}),g(i,"wrapper",{get:function(){return i.track.children[0]}}),n.on("update",(function(){i.collectSlides()})),i},Translate:function(t,e,n){var i={set:function(n){var i=function(t,e,n){var i=[L,P,E,R].concat(t._t,[z]);return{mutate:function(r){for(var s=0;s<i.length;s++){var o=i[s];v(o)&&v(o().modify)?r=o(t,e,n).modify(r):l("Transformer should be a function that returns an object with `modify()` method")}return r}}}(t,e).mutate(n),r="translate3d(".concat(-1*i,"px, 0px, 0px)");e.Html.wrapper.style.mozTransform=r,e.Html.wrapper.style.webkitTransform=r,e.Html.wrapper.style.transform=r},remove:function(){e.Html.wrapper.style.transform=""},getStartIndex:function(){var n=e.Sizes.length,i=t.index,r=t.settings.perView;return e.Run.isOffset(">")||e.Run.isOffset("|>")?n+(i-r):(i+r)%n},getTravelDistance:function(){var n=e.Sizes.slideWidth*t.settings.perView;return e.Run.isOffset(">")||e.Run.isOffset("|>")?-1*n:n}};return n.on("move",(function(r){if(!t.isType("carousel")||!e.Run.isOffset())return i.set(r.movement);e.Transition.after((function(){n.emit("translate.jump"),i.set(e.Sizes.slideWidth*t.index)}));var s=e.Sizes.slideWidth*e.Translate.getStartIndex();return i.set(s-e.Translate.getTravelDistance())})),n.on("destroy",(function(){i.remove()})),i},Transition:function(t,e,n){var i=!1,r={compose:function(e){var n=t.settings;return i?"".concat(e," 0ms ").concat(n.animationTimingFunc):"".concat(e," ").concat(this.duration,"ms ").concat(n.animationTimingFunc)},set:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"transform";e.Html.wrapper.style.transition=this.compose(t)},remove:function(){e.Html.wrapper.style.transition=""},after:function(t){setTimeout((function(){t()}),this.duration)},enable:function(){i=!1,this.set()},disable:function(){i=!0,this.set()}};return g(r,"duration",{get:function(){var n=t.settings;return t.isType("slider")&&e.Run.offset?n.rewindDuration:n.animationDuration}}),n.on("move",(function(){r.set()})),n.on(["build.before","resize","translate.jump"],(function(){r.disable()})),n.on("run",(function(){r.enable()})),n.on("destroy",(function(){r.remove()})),r},Direction:function(t,e,n){var i={mount:function(){this.value=t.settings.direction},resolve:function(t){var e=t.slice(0,1);return this.is("rtl")?t.split(e).join(j[e]):t},is:function(t){return this.value===t},addClass:function(){e.Html.root.classList.add(t.settings.classes.direction[this.value])},removeClass:function(){e.Html.root.classList.remove(t.settings.classes.direction[this.value])}};return g(i,"value",{get:function(){return i._v},set:function(t){A.indexOf(t)>-1?i._v=t:l("Direction value must be `ltr` or `rtl`")}}),n.on(["destroy","update"],(function(){i.removeClass()})),n.on("update",(function(){i.mount()})),n.on(["build.before","update"],(function(){i.addClass()})),i},Peek:function(t,e,n){var i={mount:function(){this.value=t.settings.peek}};return g(i,"value",{get:function(){return i._v},set:function(t){h(t)?(t.before=f(t.before),t.after=f(t.after)):t=f(t),i._v=t}}),g(i,"reductor",{get:function(){var e=i.value,n=t.settings.perView;return h(e)?e.before/n+e.after/n:2*e/n}}),n.on(["resize","update"],(function(){i.mount()})),i},Sizes:function(t,e,n){var i={setupSlides:function(){for(var t="".concat(this.slideWidth,"px"),n=e.Html.slides,i=0;i<n.length;i++)n[i].style.width=t},setupWrapper:function(){e.Html.wrapper.style.width="".concat(this.wrapperSize,"px")},remove:function(){for(var t=e.Html.slides,n=0;n<t.length;n++)t[n].style.width="";e.Html.wrapper.style.width=""}};return g(i,"length",{get:function(){return e.Html.slides.length}}),g(i,"width",{get:function(){return e.Html.track.offsetWidth}}),g(i,"wrapperSize",{get:function(){return i.slideWidth*i.length+e.Gaps.grow+e.Clones.grow}}),g(i,"slideWidth",{get:function(){return i.width/t.settings.perView-e.Peek.reductor-e.Gaps.reductor}}),n.on(["build.before","resize","update"],(function(){i.setupSlides(),i.setupWrapper()})),n.on("destroy",(function(){i.remove()})),i},Gaps:function(t,e,n){var i={apply:function(t){for(var n=0,i=t.length;n<i;n++){var r=t[n].style,s=e.Direction.value;r[S[s][0]]=0!==n?"".concat(this.value/2,"px"):"",n!==t.length-1?r[S[s][1]]="".concat(this.value/2,"px"):r[S[s][1]]=""}},remove:function(t){for(var e=0,n=t.length;e<n;e++){var i=t[e].style;i.marginLeft="",i.marginRight=""}}};return g(i,"value",{get:function(){return f(t.settings.gap)}}),g(i,"grow",{get:function(){return i.value*e.Sizes.length}}),g(i,"reductor",{get:function(){var e=t.settings.perView;return i.value*(e-1)/e}}),n.on(["build.after","update"],_((function(){i.apply(e.Html.wrapper.children)}),30)),n.on("destroy",(function(){i.remove(e.Html.wrapper.children)})),i},Move:function(t,e,n){var i={mount:function(){this._o=0},make:function(){var t=this,i=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0;this.offset=i,n.emit("move",{movement:this.value}),e.Transition.after((function(){n.emit("move.after",{movement:t.value})}))}};return g(i,"offset",{get:function(){return i._o},set:function(t){i._o=function(t){return void 0===t}(t)?0:f(t)}}),g(i,"translate",{get:function(){return e.Sizes.slideWidth*t.index}}),g(i,"value",{get:function(){var t=this.offset,n=this.translate;return e.Direction.is("rtl")?n+t:n-t}}),n.on(["build.before","run"],(function(){i.make()})),i},Clones:function(t,e,n){var i={mount:function(){this.items=[],t.isType("carousel")&&(this.items=this.collect())},collect:function(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],i=e.Html.slides,r=t.settings,s=r.perView,o=r.classes,a=r.cloningRatio;if(0!==i.length)for(var u=s+ +!!t.settings.peek+Math.round(s/2),c=i.slice(0,u).reverse(),l=i.slice(-1*u),f=0;f<Math.max(a,Math.floor(s/i.length));f++){for(var d=0;d<c.length;d++){var h=c[d].cloneNode(!0);h.classList.add(o.slide.clone),n.push(h)}for(var v=0;v<l.length;v++){var p=l[v].cloneNode(!0);p.classList.add(o.slide.clone),n.unshift(p)}}return n},append:function(){for(var t=this.items,n=e.Html,i=n.wrapper,r=n.slides,s=Math.floor(t.length/2),o=t.slice(0,s).reverse(),a=t.slice(-1*s).reverse(),u="".concat(e.Sizes.slideWidth,"px"),c=0;c<a.length;c++)i.appendChild(a[c]);for(var l=0;l<o.length;l++)i.insertBefore(o[l],r[0]);for(var f=0;f<t.length;f++)t[f].style.width=u},remove:function(){for(var t=this.items,n=0;n<t.length;n++)e.Html.wrapper.removeChild(t[n])}};return g(i,"grow",{get:function(){return(e.Sizes.slideWidth+e.Gaps.value)*i.items.length}}),n.on("update",(function(){i.remove(),i.mount(),i.append()})),n.on("build.before",(function(){t.isType("carousel")&&i.append()})),n.on("destroy",(function(){i.remove()})),i},Resize:function(t,e,n){var i=new H,r={mount:function(){this.bind()},bind:function(){i.on("resize",window,_((function(){n.emit("resize")}),t.settings.throttle))},unbind:function(){i.off("resize",window)}};return n.on("destroy",(function(){r.unbind(),i.destroy()})),r},Build:function(t,e,n){var i={mount:function(){n.emit("build.before"),this.typeClass(),this.activeClass(),n.emit("build.after")},typeClass:function(){e.Html.root.classList.add(t.settings.classes.type[t.settings.type])},activeClass:function(){var n=t.settings.classes,i=e.Html.slides[t.index];i&&(i.classList.add(n.slide.active),k(i).forEach((function(t){t.classList.remove(n.slide.active)})))},removeClasses:function(){var n=t.settings.classes,i=n.type,r=n.slide;e.Html.root.classList.remove(i[t.settings.type]),e.Html.slides.forEach((function(t){t.classList.remove(r.active)}))}};return n.on(["destroy","update"],(function(){i.removeClasses()})),n.on(["resize","update"],(function(){i.mount()})),n.on("move.after",(function(){i.activeClass()})),i},Run:function(t,e,n){var i={mount:function(){this._o=!1},make:function(i){var r=this;t.disabled||(!t.settings.waitForTransition||t.disable(),this.move=i,n.emit("run.before",this.move),this.calculate(),n.emit("run",this.move),e.Transition.after((function(){r.isStart()&&n.emit("run.start",r.move),r.isEnd()&&n.emit("run.end",r.move),r.isOffset()&&(r._o=!1,n.emit("run.offset",r.move)),n.emit("run.after",r.move),t.enable()})))},calculate:function(){var e=this.move,n=this.length,r=e.steps,s=e.direction,o=1;if("="===s)return t.settings.bound&&f(r)>n?void(t.index=n):void(t.index=r);if(">"!==s||">"!==r)if("<"!==s||"<"!==r){if("|"===s&&(o=t.settings.perView||1),">"===s||"|"===s&&">"===r){var a=function(e){var n=t.index;if(t.isType("carousel"))return n+e;return n+(e-n%e)}(o);return a>n&&(this._o=!0),void(t.index=function(e,n){var r=i.length;if(e<=r)return e;if(t.isType("carousel"))return e-(r+1);if(t.settings.rewind)return i.isBound()&&!i.isEnd()?r:0;if(i.isBound())return r;return Math.floor(r/n)*n}(a,o))}if("<"===s||"|"===s&&"<"===r){var u=function(e){var n=t.index;if(t.isType("carousel"))return n-e;var i=Math.ceil(n/e);return(i-1)*e}(o);return u<0&&(this._o=!0),void(t.index=function(e,n){var r=i.length;if(e>=0)return e;if(t.isType("carousel"))return e+(r+1);if(t.settings.rewind)return i.isBound()&&i.isStart()?r:Math.floor(r/n)*n;return 0}(u,o))}l("Invalid direction pattern [".concat(s).concat(r,"] has been used"))}else t.index=0;else t.index=n},isStart:function(){return t.index<=0},isEnd:function(){return t.index>=this.length},isOffset:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:void 0;return t?!!this._o&&("|>"===t?"|"===this.move.direction&&">"===this.move.steps:"|<"===t?"|"===this.move.direction&&"<"===this.move.steps:this.move.direction===t):this._o},isBound:function(){return t.isType("slider")&&"center"!==t.settings.focusAt&&t.settings.bound}};return g(i,"move",{get:function(){return this._m},set:function(t){var e=t.substr(1);this._m={direction:t.substr(0,1),steps:e?f(e)?f(e):e:0}}}),g(i,"length",{get:function(){var n=t.settings,i=e.Html.slides.length;return this.isBound()?i-1-(f(n.perView)-1)+f(n.focusAt):i-1}}),g(i,"offset",{get:function(){return this._o}}),i}},K=function(t){!function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function");t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,writable:!0,configurable:!0}}),e&&s(t,e)}(o,t);var n=a(o);function o(){return e(this,o),n.apply(this,arguments)}return i(o,[{key:"mount",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return u(r(o.prototype),"mount",this).call(this,Object.assign({},J,t))}}]),o}(y);const Q="glide__arrow--left",U="glide__arrow--right";function Z(t,e){return{mount(){t.settings.rewind||(t.on(["mount.after","resize"],(()=>{e.Sizes.length<=t.settings.perView?t.disable():t.enable()})),t.on(["mount.after","run","resize"],(()=>{e.Controls.items.forEach((n=>{const i=n.querySelector(`.${Q}`);i&&(0===t.index||e.Sizes.length<=t.settings.perView?i.setAttribute("disabled",""):i.removeAttribute("disabled"));const r=n.querySelector(`.${U}`);if(r){(t.settings.bound?t.index+(t.settings.perView-1):t.index)===e.Sizes.length-1||e.Sizes.length<=t.settings.perView?r.setAttribute("disabled",""):r.removeAttribute("disabled")}i.disabled&&r.disabled?n.classList.add("glide__arrows--disabled"):n.classList.remove("glide__arrows--disabled")}))})))}}}((t,e)=>{t.behaviors.glide={attach(t){e("glide",".carousel .glide",t).forEach((t=>{const e=new K(t,{rewind:!1,bound:!0,dragThreshold:!1,gap:16,perView:4,breakpoints:{9999:{perView:4},1199:{perView:3},767:{perView:2},575:{perView:1}}});let n;const i=t=>{t.settings.perView!==t.previousPerView&&(t.previousPerView=t.settings.perView,t.enable().go("<<").disable())};e.on("resize",(()=>{n&&clearTimeout(n),n=setTimeout(i,50,e)})),e.mount({Controls:Y,Breakpoints:$,Swipe:G,ControlsDisabler:Z}),e.previousPerView=e.settings.perView;const r=t.querySelector(".glide__arrow--right"),s=t.querySelector(".glide__arrow--left");r.addEventListener("click",(()=>{e.go(">")})),s.addEventListener("click",(()=>{e.go("<")})),e.on("run",(()=>{t.classList.add("glide-animating")})).on("run.after",(()=>{t.classList.remove("glide-animating")}))}))}}})(Drupal,once)}));
 //# sourceMappingURL=carousel.min.js.map
diff --git a/web/themes/ventuno/assets/js/explore-block.min.js b/web/themes/ventuno/assets/js/explore-block.min.js
index 193c2883ed..c8a4e3d47e 100644
--- a/web/themes/ventuno/assets/js/explore-block.min.js
+++ b/web/themes/ventuno/assets/js/explore-block.min.js
@@ -1,7 +1,7 @@
 !function(t){"function"==typeof define&&define.amd?define(t):t()}((function(){"use strict";
 /*!
    * Glide.js v3.6.0
-   * (c) 2013-2023 Jędrzej Chałubek (https://github.com/jedrzejchalubek/)
+   * (c) 2013-2022 Jędrzej Chałubek (https://github.com/jedrzejchalubek/)
    * Released under the MIT License.
-   */function t(e){return t="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},t(e)}function e(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function n(t,e){for(var n=0;n<e.length;n++){var i=e[n];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(t,i.key,i)}}function i(t,e,i){return e&&n(t.prototype,e),i&&n(t,i),t}function r(t){return r=Object.setPrototypeOf?Object.getPrototypeOf:function(t){return t.__proto__||Object.getPrototypeOf(t)},r(t)}function s(t,e){return s=Object.setPrototypeOf||function(t,e){return t.__proto__=e,t},s(t,e)}function o(t,e){if(e&&("object"==typeof e||"function"==typeof e))return e;if(void 0!==e)throw new TypeError("Derived constructors may only return object or undefined");return function(t){if(void 0===t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return t}(t)}function a(t){var e=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(t){return!1}}();return function(){var n,i=r(t);if(e){var s=r(this).constructor;n=Reflect.construct(i,arguments,s)}else n=i.apply(this,arguments);return o(this,n)}}function u(){return u="undefined"!=typeof Reflect&&Reflect.get?Reflect.get:function(t,e,n){var i=function(t,e){for(;!Object.prototype.hasOwnProperty.call(t,e)&&null!==(t=r(t)););return t}(t,e);if(i){var s=Object.getOwnPropertyDescriptor(i,e);return s.get?s.get.call(arguments.length<3?t:n):s.value}},u.apply(this,arguments)}var c={type:"slider",startAt:0,perView:1,focusAt:0,gap:10,autoplay:!1,hoverpause:!0,keyboard:!0,bound:!1,swipeThreshold:80,dragThreshold:120,perSwipe:"",touchRatio:.5,touchAngle:45,animationDuration:400,rewind:!0,rewindDuration:800,animationTimingFunc:"cubic-bezier(.165, .840, .440, 1)",waitForTransition:!0,throttle:10,direction:"ltr",peek:0,cloningRatio:1,breakpoints:{},lazy:!1,lazyScrollThreshold:1.2,lazyInitialSlidesLoaded:2,classes:{swipeable:"glide--swipeable",dragging:"glide--dragging",direction:{ltr:"glide--ltr",rtl:"glide--rtl"},type:{slider:"glide--slider",carousel:"glide--carousel"},slide:{clone:"glide__slide--clone",active:"glide__slide--active"},arrow:{disabled:"glide__arrow--disabled"},nav:{active:"glide__bullet--active"}}};function l(t){console.error("[Glide warn]: ".concat(t))}function f(t){return parseInt(t)}function d(t){return"string"==typeof t}function h(e){var n=t(e);return"function"===n||"object"===n&&!!e}function v(t){return"function"==typeof t}function p(t){return t.constructor===Array}function m(t,e,n){Object.defineProperty(t,e,n)}function g(t,e){var n=Object.assign({},t,e);return e.hasOwnProperty("classes")&&(n.classes=Object.assign({},t.classes,e.classes),e.classes.hasOwnProperty("direction")&&(n.classes.direction=Object.assign({},t.classes.direction,e.classes.direction)),e.classes.hasOwnProperty("type")&&(n.classes.type=Object.assign({},t.classes.type,e.classes.type)),e.classes.hasOwnProperty("slide")&&(n.classes.slide=Object.assign({},t.classes.slide,e.classes.slide)),e.classes.hasOwnProperty("arrow")&&(n.classes.arrow=Object.assign({},t.classes.arrow,e.classes.arrow)),e.classes.hasOwnProperty("nav")&&(n.classes.nav=Object.assign({},t.classes.nav,e.classes.nav))),e.hasOwnProperty("breakpoints")&&(n.breakpoints=Object.assign({},t.breakpoints,e.breakpoints)),n}var y=function(){function t(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};e(this,t),this.events=n,this.hop=n.hasOwnProperty}return i(t,[{key:"on",value:function(t,e){if(!p(t)){this.hop.call(this.events,t)||(this.events[t]=[]);var n=this.events[t].push(e)-1;return{remove:function(){delete this.events[t][n]}}}for(var i=0;i<t.length;i++)this.on(t[i],e)}},{key:"emit",value:function(t,e){if(p(t))for(var n=0;n<t.length;n++)this.emit(t[n],e);else this.hop.call(this.events,t)&&this.events[t].forEach((function(t){t(e||{})}))}}]),t}(),b=function(){function t(n){var i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};e(this,t),this._c={},this._t=[],this._e=new y,this.disabled=!1,this.selector=n,this.settings=g(c,i),this.index=this.settings.startAt}return i(t,[{key:"mount",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return this._e.emit("mount.before"),h(t)?this._c=function(t,e,n){var i={};for(var r in e)v(e[r])?i[r]=e[r](t,i,n):l("Extension must be a function");for(var s in i)v(i[s].mount)&&i[s].mount();return i}(this,t,this._e):l("You need to provide a object on `mount()`"),this._e.emit("mount.after"),this}},{key:"mutate",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];return p(t)?this._t=t:l("You need to provide a array on `mutate()`"),this}},{key:"update",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return this.settings=g(this.settings,t),t.hasOwnProperty("startAt")&&(this.index=t.startAt),this._e.emit("update"),this}},{key:"go",value:function(t){return this._c.Run.make(t),this}},{key:"move",value:function(t){return this._c.Transition.disable(),this._c.Move.make(t),this}},{key:"destroy",value:function(){return this._e.emit("destroy"),this}},{key:"play",value:function(){var t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];return t&&(this.settings.autoplay=t),this._e.emit("play"),this}},{key:"pause",value:function(){return this._e.emit("pause"),this}},{key:"disable",value:function(){return this.disabled=!0,this}},{key:"enable",value:function(){return this.disabled=!1,this}},{key:"on",value:function(t,e){return this._e.on(t,e),this}},{key:"isType",value:function(t){return this.settings.type===t}},{key:"settings",get:function(){return this._o},set:function(t){h(t)?this._o=t:l("Options must be an `object` instance.")}},{key:"index",get:function(){return this._i},set:function(t){this._i=f(t)}},{key:"type",get:function(){return this.settings.type}},{key:"disabled",get:function(){return this._d},set:function(t){this._d=!!t}}]),t}();function w(){return(new Date).getTime()}function _(t,e,n){var i,r,s,o,a=0;n||(n={});var u=function(){a=!1===n.leading?0:w(),i=null,o=t.apply(r,s),i||(r=s=null)},c=function(){var c=w();a||!1!==n.leading||(a=c);var l=e-(c-a);return r=this,s=arguments,l<=0||l>e?(i&&(clearTimeout(i),i=null),a=c,o=t.apply(r,s),i||(r=s=null)):i||!1===n.trailing||(i=setTimeout(u,l)),o};return c.cancel=function(){clearTimeout(i),a=0,i=r=s=null},c}var S={ltr:["marginLeft","marginRight"],rtl:["marginRight","marginLeft"]};function k(t){if(t&&t.parentNode){for(var e=t.parentNode.firstChild,n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n}return[]}function O(t){return!!(t&&t instanceof window.HTMLElement)}function T(t){return Array.prototype.slice.call(t)}var x='[data-glide-el="track"]';var H=function(){function t(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};e(this,t),this.listeners=n}return i(t,[{key:"on",value:function(t,e,n){var i=arguments.length>3&&void 0!==arguments[3]&&arguments[3];d(t)&&(t=[t]);for(var r=0;r<t.length;r++)this.listeners[t[r]]=n,e.addEventListener(t[r],this.listeners[t[r]],i)}},{key:"off",value:function(t,e){var n=arguments.length>2&&void 0!==arguments[2]&&arguments[2];d(t)&&(t=[t]);for(var i=0;i<t.length;i++)e.removeEventListener(t[i],this.listeners[t[i]],n)}},{key:"destroy",value:function(){delete this.listeners}}]),t}();var A=["ltr","rtl"],z={">":"<","<":">","=":"="};function j(t,e){return{modify:function(t){return e.Direction.is("rtl")?-t:t}}}function L(t,e){return{modify:function(t){var n=Math.floor(t/e.Sizes.slideWidth);return t+e.Gaps.value*n}}}function R(t,e){return{modify:function(t){return t+e.Clones.grow/2}}}function C(t,e){return{modify:function(n){if(t.settings.focusAt>=0){var i=e.Peek.value;return h(i)?n-i.before:n-i}return n}}}function E(t,e){return{modify:function(n){var i=e.Gaps.value,r=e.Sizes.width,s=t.settings.focusAt,o=e.Sizes.slideWidth;return"center"===s?n-(r/2-o/2):n-o*s-i*s}}}var P=!1;try{var M=Object.defineProperty({},"passive",{get:function(){P=!0}});window.addEventListener("testPassive",null,M),window.removeEventListener("testPassive",null,M)}catch(t){}var D=P,V=["touchstart","mousedown"],W=["touchmove","mousemove"],B=["touchend","touchcancel","mouseup","mouseleave"],q=["mousedown","mousemove","mouseup","mouseleave"];function G(t,e,n){var i=new H,r=0,s=0,o=0,a=!1,u=!!D&&{passive:!0},c={mount:function(){this.bindSwipeStart()},start:function(e){if(!a&&!t.disabled){this.disable();var i=this.touches(e);r=null,s=f(i.pageX),o=f(i.pageY),this.bindSwipeMove(),this.bindSwipeEnd(),n.emit("swipe.start")}},move:function(i){if(!t.disabled){var a=t.settings,u=a.touchAngle,c=a.touchRatio,l=a.classes,d=this.touches(i),h=f(d.pageX)-s,v=f(d.pageY)-o,p=Math.abs(h<<2),m=Math.abs(v<<2),g=Math.sqrt(p+m),y=Math.sqrt(m);if(!(180*(r=Math.asin(y/g))/Math.PI<u))return!1;i.stopPropagation(),e.Move.make(h*parseFloat(c)),e.Html.root.classList.add(l.dragging),n.emit("swipe.move")}},end:function(i){if(!t.disabled){var o=t.settings,a=o.perSwipe,u=o.touchAngle,c=o.classes,l=this.touches(i),f=this.threshold(i),d=l.pageX-s,h=180*r/Math.PI;this.enable(),d>f&&h<u?e.Run.make(e.Direction.resolve("".concat(a,"<"))):d<-f&&h<u?e.Run.make(e.Direction.resolve("".concat(a,">"))):e.Move.make(),e.Html.root.classList.remove(c.dragging),this.unbindSwipeMove(),this.unbindSwipeEnd(),n.emit("swipe.end")}},bindSwipeStart:function(){var n=this,r=t.settings,s=r.swipeThreshold,o=r.dragThreshold;s&&i.on(V[0],e.Html.wrapper,(function(t){n.start(t)}),u),o&&i.on(V[1],e.Html.wrapper,(function(t){n.start(t)}),u)},unbindSwipeStart:function(){i.off(V[0],e.Html.wrapper,u),i.off(V[1],e.Html.wrapper,u)},bindSwipeMove:function(){var n=this;i.on(W,e.Html.wrapper,_((function(t){n.move(t)}),t.settings.throttle),u)},unbindSwipeMove:function(){i.off(W,e.Html.wrapper,u)},bindSwipeEnd:function(){var t=this;i.on(B,e.Html.wrapper,(function(e){t.end(e)}))},unbindSwipeEnd:function(){i.off(B,e.Html.wrapper)},touches:function(t){return q.indexOf(t.type)>-1?t:t.touches[0]||t.changedTouches[0]},threshold:function(e){var n=t.settings;return q.indexOf(e.type)>-1?n.dragThreshold:n.swipeThreshold},enable:function(){return a=!1,e.Transition.enable(),this},disable:function(){return a=!0,e.Transition.disable(),this}};return n.on("build.after",(function(){e.Html.root.classList.add(t.settings.classes.swipeable)})),n.on("destroy",(function(){c.unbindSwipeStart(),c.unbindSwipeMove(),c.unbindSwipeEnd(),i.destroy()})),c}var I='[data-glide-el^="controls"]',F="".concat(I,' [data-glide-dir*="<"]'),N="".concat(I,' [data-glide-dir*=">"]');function Y(t,e,n){var i=new H,r=!!D&&{passive:!0},s={mount:function(){this._n=e.Html.root.querySelectorAll('[data-glide-el="controls[nav]"]'),this._c=e.Html.root.querySelectorAll(I),this._arrowControls={previous:e.Html.root.querySelectorAll(F),next:e.Html.root.querySelectorAll(N)},this.addBindings()},setActive:function(){for(var t=0;t<this._n.length;t++)this.addClass(this._n[t].children)},removeActive:function(){for(var t=0;t<this._n.length;t++)this.removeClass(this._n[t].children)},addClass:function(e){var n=t.settings,i=e[t.index];i&&i&&(i.classList.add(n.classes.nav.active),k(i).forEach((function(t){t.classList.remove(n.classes.nav.active)})))},removeClass:function(e){var n=e[t.index];n&&n.classList.remove(t.settings.classes.nav.active)},setArrowState:function(){if(!t.settings.rewind){var n=s._arrowControls.next,i=s._arrowControls.previous;this.resetArrowState(n,i),0===t.index&&this.disableArrow(i),t.index===e.Run.length&&this.disableArrow(n)}},resetArrowState:function(){for(var e=t.settings,n=arguments.length,i=new Array(n),r=0;r<n;r++)i[r]=arguments[r];i.forEach((function(t){T(t).forEach((function(t){t.classList.remove(e.classes.arrow.disabled)}))}))},disableArrow:function(){for(var e=t.settings,n=arguments.length,i=new Array(n),r=0;r<n;r++)i[r]=arguments[r];i.forEach((function(t){T(t).forEach((function(t){t.classList.add(e.classes.arrow.disabled)}))}))},addBindings:function(){for(var t=0;t<this._c.length;t++)this.bind(this._c[t].children)},removeBindings:function(){for(var t=0;t<this._c.length;t++)this.unbind(this._c[t].children)},bind:function(t){for(var e=0;e<t.length;e++)i.on("click",t[e],this.click),i.on("touchstart",t[e],this.click,r)},unbind:function(t){for(var e=0;e<t.length;e++)i.off(["click","touchstart"],t[e])},click:function(t){D||"touchstart"!==t.type||t.preventDefault();var n=t.currentTarget.getAttribute("data-glide-dir");e.Run.make(e.Direction.resolve(n))}};return m(s,"items",{get:function(){return s._c}}),n.on(["mount.after","move.after"],(function(){s.setActive()})),n.on(["mount.after","run"],(function(){s.setArrowState()})),n.on("destroy",(function(){s.removeBindings(),s.removeActive(),i.destroy()})),s}function X(t){return h(t)?(e=t,Object.keys(e).sort().reduce((function(t,n){return t[n]=e[n],t[n],t}),{})):(l("Breakpoints option must be an object"),{});var e}function $(t,e,n){var i=new H,r=t.settings,s=X(r.breakpoints),o=Object.assign({},r),a={match:function(t){if(void 0!==window.matchMedia)for(var e in t)if(t.hasOwnProperty(e)&&window.matchMedia("(max-width: ".concat(e,"px)")).matches)return t[e];return o}};return Object.assign(r,a.match(s)),i.on("resize",window,_((function(){t.settings=g(r,a.match(s))}),t.settings.throttle)),n.on("update",(function(){s=X(s),o=Object.assign({},r)})),n.on("destroy",(function(){i.off("resize",window)})),a}var J={Html:function(t,e,n){var i={mount:function(){this.root=t.selector,this.track=this.root.querySelector(x),this.collectSlides()},collectSlides:function(){this.slides=T(this.wrapper.children).filter((function(e){return!e.classList.contains(t.settings.classes.slide.clone)}))}};return m(i,"root",{get:function(){return i._r},set:function(t){d(t)&&(t=document.querySelector(t)),O(t)?i._r=t:l("Root element must be a existing Html node")}}),m(i,"track",{get:function(){return i._t},set:function(t){O(t)?i._t=t:l("Could not find track element. Please use ".concat(x," attribute."))}}),m(i,"wrapper",{get:function(){return i.track.children[0]}}),n.on("update",(function(){i.collectSlides()})),i},Translate:function(t,e,n){var i={set:function(n){var i=function(t,e,n){var i=[L,R,C,E].concat(t._t,[j]);return{mutate:function(r){for(var s=0;s<i.length;s++){var o=i[s];v(o)&&v(o().modify)?r=o(t,e,n).modify(r):l("Transformer should be a function that returns an object with `modify()` method")}return r}}}(t,e).mutate(n),r="translate3d(".concat(-1*i,"px, 0px, 0px)");e.Html.wrapper.style.mozTransform=r,e.Html.wrapper.style.webkitTransform=r,e.Html.wrapper.style.transform=r},remove:function(){e.Html.wrapper.style.transform=""},getStartIndex:function(){var n=e.Sizes.length,i=t.index,r=t.settings.perView;return e.Run.isOffset(">")||e.Run.isOffset("|>")?n+(i-r):(i+r)%n},getTravelDistance:function(){var n=e.Sizes.slideWidth*t.settings.perView;return e.Run.isOffset(">")||e.Run.isOffset("|>")?-1*n:n}};return n.on("move",(function(r){if(!t.isType("carousel")||!e.Run.isOffset())return i.set(r.movement);e.Transition.after((function(){n.emit("translate.jump"),i.set(e.Sizes.slideWidth*t.index)}));var s=e.Sizes.slideWidth*e.Translate.getStartIndex();return i.set(s-e.Translate.getTravelDistance())})),n.on("destroy",(function(){i.remove()})),i},Transition:function(t,e,n){var i=!1,r={compose:function(e){var n=t.settings;return i?"".concat(e," 0ms ").concat(n.animationTimingFunc):"".concat(e," ").concat(this.duration,"ms ").concat(n.animationTimingFunc)},set:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"transform";e.Html.wrapper.style.transition=this.compose(t)},remove:function(){e.Html.wrapper.style.transition=""},after:function(t){setTimeout((function(){t()}),this.duration)},enable:function(){i=!1,this.set()},disable:function(){i=!0,this.set()}};return m(r,"duration",{get:function(){var n=t.settings;return t.isType("slider")&&e.Run.offset?n.rewindDuration:n.animationDuration}}),n.on("move",(function(){r.set()})),n.on(["build.before","resize","translate.jump"],(function(){r.disable()})),n.on("run",(function(){r.enable()})),n.on("destroy",(function(){r.remove()})),r},Direction:function(t,e,n){var i={mount:function(){this.value=t.settings.direction},resolve:function(t){var e=t.slice(0,1);return this.is("rtl")?t.split(e).join(z[e]):t},is:function(t){return this.value===t},addClass:function(){e.Html.root.classList.add(t.settings.classes.direction[this.value])},removeClass:function(){e.Html.root.classList.remove(t.settings.classes.direction[this.value])}};return m(i,"value",{get:function(){return i._v},set:function(t){A.indexOf(t)>-1?i._v=t:l("Direction value must be `ltr` or `rtl`")}}),n.on(["destroy","update"],(function(){i.removeClass()})),n.on("update",(function(){i.mount()})),n.on(["build.before","update"],(function(){i.addClass()})),i},Peek:function(t,e,n){var i={mount:function(){this.value=t.settings.peek}};return m(i,"value",{get:function(){return i._v},set:function(t){h(t)?(t.before=f(t.before),t.after=f(t.after)):t=f(t),i._v=t}}),m(i,"reductor",{get:function(){var e=i.value,n=t.settings.perView;return h(e)?e.before/n+e.after/n:2*e/n}}),n.on(["resize","update"],(function(){i.mount()})),i},Sizes:function(t,e,n){var i={setupSlides:function(){for(var t="".concat(this.slideWidth,"px"),n=e.Html.slides,i=0;i<n.length;i++)n[i].style.width=t},setupWrapper:function(){e.Html.wrapper.style.width="".concat(this.wrapperSize,"px")},remove:function(){for(var t=e.Html.slides,n=0;n<t.length;n++)t[n].style.width="";e.Html.wrapper.style.width=""}};return m(i,"length",{get:function(){return e.Html.slides.length}}),m(i,"width",{get:function(){return e.Html.track.offsetWidth}}),m(i,"wrapperSize",{get:function(){return i.slideWidth*i.length+e.Gaps.grow+e.Clones.grow}}),m(i,"slideWidth",{get:function(){return i.width/t.settings.perView-e.Peek.reductor-e.Gaps.reductor}}),n.on(["build.before","resize","update"],(function(){i.setupSlides(),i.setupWrapper()})),n.on("destroy",(function(){i.remove()})),i},Gaps:function(t,e,n){var i={apply:function(t){for(var n=0,i=t.length;n<i;n++){var r=t[n].style,s=e.Direction.value;r[S[s][0]]=0!==n?"".concat(this.value/2,"px"):"",n!==t.length-1?r[S[s][1]]="".concat(this.value/2,"px"):r[S[s][1]]=""}},remove:function(t){for(var e=0,n=t.length;e<n;e++){var i=t[e].style;i.marginLeft="",i.marginRight=""}}};return m(i,"value",{get:function(){return f(t.settings.gap)}}),m(i,"grow",{get:function(){return i.value*e.Sizes.length}}),m(i,"reductor",{get:function(){var e=t.settings.perView;return i.value*(e-1)/e}}),n.on(["build.after","update"],_((function(){i.apply(e.Html.wrapper.children)}),30)),n.on("destroy",(function(){i.remove(e.Html.wrapper.children)})),i},Move:function(t,e,n){var i={mount:function(){this._o=0},make:function(){var t=this,i=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0;this.offset=i,n.emit("move",{movement:this.value}),e.Transition.after((function(){n.emit("move.after",{movement:t.value})}))}};return m(i,"offset",{get:function(){return i._o},set:function(t){i._o=function(t){return void 0===t}(t)?0:f(t)}}),m(i,"translate",{get:function(){return e.Sizes.slideWidth*t.index}}),m(i,"value",{get:function(){var t=this.offset,n=this.translate;return e.Direction.is("rtl")?n+t:n-t}}),n.on(["build.before","run"],(function(){i.make()})),i},Clones:function(t,e,n){var i={mount:function(){this.items=[],t.isType("carousel")&&(this.items=this.collect())},collect:function(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],i=e.Html.slides,r=t.settings,s=r.perView,o=r.classes,a=r.cloningRatio;if(0!==i.length)for(var u=s+ +!!t.settings.peek+Math.round(s/2),c=i.slice(0,u).reverse(),l=i.slice(-1*u),f=0;f<Math.max(a,Math.floor(s/i.length));f++){for(var d=0;d<c.length;d++){var h=c[d].cloneNode(!0);h.classList.add(o.slide.clone),n.push(h)}for(var v=0;v<l.length;v++){var p=l[v].cloneNode(!0);p.classList.add(o.slide.clone),n.unshift(p)}}return n},append:function(){for(var t=this.items,n=e.Html,i=n.wrapper,r=n.slides,s=Math.floor(t.length/2),o=t.slice(0,s).reverse(),a=t.slice(-1*s).reverse(),u="".concat(e.Sizes.slideWidth,"px"),c=0;c<a.length;c++)i.appendChild(a[c]);for(var l=0;l<o.length;l++)i.insertBefore(o[l],r[0]);for(var f=0;f<t.length;f++)t[f].style.width=u},remove:function(){for(var t=this.items,n=0;n<t.length;n++)e.Html.wrapper.removeChild(t[n])}};return m(i,"grow",{get:function(){return(e.Sizes.slideWidth+e.Gaps.value)*i.items.length}}),n.on("update",(function(){i.remove(),i.mount(),i.append()})),n.on("build.before",(function(){t.isType("carousel")&&i.append()})),n.on("destroy",(function(){i.remove()})),i},Resize:function(t,e,n){var i=new H,r={mount:function(){this.bind()},bind:function(){i.on("resize",window,_((function(){n.emit("resize")}),t.settings.throttle))},unbind:function(){i.off("resize",window)}};return n.on("destroy",(function(){r.unbind(),i.destroy()})),r},Build:function(t,e,n){var i={mount:function(){n.emit("build.before"),this.typeClass(),this.activeClass(),n.emit("build.after")},typeClass:function(){e.Html.root.classList.add(t.settings.classes.type[t.settings.type])},activeClass:function(){var n=t.settings.classes,i=e.Html.slides[t.index];i&&(i.classList.add(n.slide.active),k(i).forEach((function(t){t.classList.remove(n.slide.active)})))},removeClasses:function(){var n=t.settings.classes,i=n.type,r=n.slide;e.Html.root.classList.remove(i[t.settings.type]),e.Html.slides.forEach((function(t){t.classList.remove(r.active)}))}};return n.on(["destroy","update"],(function(){i.removeClasses()})),n.on(["resize","update"],(function(){i.mount()})),n.on("move.after",(function(){i.activeClass()})),i},Run:function(t,e,n){var i={mount:function(){this._o=!1},make:function(i){var r=this;t.disabled||(!t.settings.waitForTransition||t.disable(),this.move=i,n.emit("run.before",this.move),this.calculate(),n.emit("run",this.move),e.Transition.after((function(){r.isStart()&&n.emit("run.start",r.move),r.isEnd()&&n.emit("run.end",r.move),r.isOffset()&&(r._o=!1,n.emit("run.offset",r.move)),n.emit("run.after",r.move),t.enable()})))},calculate:function(){var e=this.move,n=this.length,r=e.steps,s=e.direction,o=1;if("="===s)return t.settings.bound&&f(r)>n?void(t.index=n):void(t.index=r);if(">"!==s||">"!==r)if("<"!==s||"<"!==r){if("|"===s&&(o=t.settings.perView||1),">"===s||"|"===s&&">"===r){var a=function(e){var n=t.index;if(t.isType("carousel"))return n+e;return n+(e-n%e)}(o);return a>n&&(this._o=!0),void(t.index=function(e,n){var r=i.length;if(e<=r)return e;if(t.isType("carousel"))return e-(r+1);if(t.settings.rewind)return i.isBound()&&!i.isEnd()?r:0;if(i.isBound())return r;return Math.floor(r/n)*n}(a,o))}if("<"===s||"|"===s&&"<"===r){var u=function(e){var n=t.index;if(t.isType("carousel"))return n-e;var i=Math.ceil(n/e);return(i-1)*e}(o);return u<0&&(this._o=!0),void(t.index=function(e,n){var r=i.length;if(e>=0)return e;if(t.isType("carousel"))return e+(r+1);if(t.settings.rewind)return i.isBound()&&i.isStart()?r:Math.floor(r/n)*n;return 0}(u,o))}l("Invalid direction pattern [".concat(s).concat(r,"] has been used"))}else t.index=0;else t.index=n},isStart:function(){return t.index<=0},isEnd:function(){return t.index>=this.length},isOffset:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:void 0;return t?!!this._o&&("|>"===t?"|"===this.move.direction&&">"===this.move.steps:"|<"===t?"|"===this.move.direction&&"<"===this.move.steps:this.move.direction===t):this._o},isBound:function(){return t.isType("slider")&&"center"!==t.settings.focusAt&&t.settings.bound}};return m(i,"move",{get:function(){return this._m},set:function(t){var e=t.substr(1);this._m={direction:t.substr(0,1),steps:e?f(e)?f(e):e:0}}}),m(i,"length",{get:function(){var n=t.settings,i=e.Html.slides.length;return this.isBound()?i-1-(f(n.perView)-1)+f(n.focusAt):i-1}}),m(i,"offset",{get:function(){return this._o}}),i}},K=function(t){!function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function");t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,writable:!0,configurable:!0}}),e&&s(t,e)}(o,t);var n=a(o);function o(){return e(this,o),n.apply(this,arguments)}return i(o,[{key:"mount",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return u(r(o.prototype),"mount",this).call(this,Object.assign({},J,t))}}]),o}(b);const Q="glide__arrow--left",U="glide__arrow--right";function Z(t,e){return{mount(){t.settings.rewind||(t.on(["mount.after","resize"],(()=>{e.Sizes.length<=t.settings.perView?t.disable():t.enable()})),t.on(["mount.after","run","resize"],(()=>{e.Controls.items.forEach((n=>{const i=n.querySelector(`.${Q}`);i&&(0===t.index||e.Sizes.length<=t.settings.perView?i.setAttribute("disabled",""):i.removeAttribute("disabled"));const r=n.querySelector(`.${U}`);if(r){(t.settings.bound?t.index+(t.settings.perView-1):t.index)===e.Sizes.length-1||e.Sizes.length<=t.settings.perView?r.setAttribute("disabled",""):r.removeAttribute("disabled")}i.disabled&&r.disabled?n.classList.add("glide__arrows--disabled"):n.classList.remove("glide__arrows--disabled")}))})))}}}Drupal.behaviors.glide={attach(){const t=document.querySelectorAll(".explore-block button.nav-link");function e(){document.querySelectorAll(".tab-pane.active .glide").forEach((t=>{new K(t,{rewind:!1,bound:!0,dragThreshold:!1,gap:24,perView:4,wrapperWidth:300,breakpoints:{1199:{perView:3},991:{perView:2},767:{perView:1}}}).mount({Controls:Y,Breakpoints:$,Swipe:G,ControlsDisabler:Z}).update({wrapperWidth:300})}))}for(let n=0;n<t.length;n++)t[n].addEventListener("click",(()=>{e()}));e()}}}));
+   */function t(e){return t="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},t(e)}function e(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function n(t,e){for(var n=0;n<e.length;n++){var i=e[n];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(t,i.key,i)}}function i(t,e,i){return e&&n(t.prototype,e),i&&n(t,i),t}function r(t){return r=Object.setPrototypeOf?Object.getPrototypeOf:function(t){return t.__proto__||Object.getPrototypeOf(t)},r(t)}function s(t,e){return s=Object.setPrototypeOf||function(t,e){return t.__proto__=e,t},s(t,e)}function o(t,e){if(e&&("object"==typeof e||"function"==typeof e))return e;if(void 0!==e)throw new TypeError("Derived constructors may only return object or undefined");return function(t){if(void 0===t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return t}(t)}function a(t){var e=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(t){return!1}}();return function(){var n,i=r(t);if(e){var s=r(this).constructor;n=Reflect.construct(i,arguments,s)}else n=i.apply(this,arguments);return o(this,n)}}function u(){return u="undefined"!=typeof Reflect&&Reflect.get?Reflect.get:function(t,e,n){var i=function(t,e){for(;!Object.prototype.hasOwnProperty.call(t,e)&&null!==(t=r(t)););return t}(t,e);if(i){var s=Object.getOwnPropertyDescriptor(i,e);return s.get?s.get.call(arguments.length<3?t:n):s.value}},u.apply(this,arguments)}var c={type:"slider",startAt:0,perView:1,focusAt:0,gap:10,autoplay:!1,hoverpause:!0,keyboard:!0,bound:!1,swipeThreshold:80,dragThreshold:120,perSwipe:"",touchRatio:.5,touchAngle:45,animationDuration:400,rewind:!0,rewindDuration:800,animationTimingFunc:"cubic-bezier(.165, .840, .440, 1)",waitForTransition:!0,throttle:10,direction:"ltr",peek:0,cloningRatio:1,breakpoints:{},classes:{swipeable:"glide--swipeable",dragging:"glide--dragging",direction:{ltr:"glide--ltr",rtl:"glide--rtl"},type:{slider:"glide--slider",carousel:"glide--carousel"},slide:{clone:"glide__slide--clone",active:"glide__slide--active"},arrow:{disabled:"glide__arrow--disabled"},nav:{active:"glide__bullet--active"}}};function l(t){console.error("[Glide warn]: ".concat(t))}function f(t){return parseInt(t)}function d(t){return"string"==typeof t}function h(e){var n=t(e);return"function"===n||"object"===n&&!!e}function v(t){return"function"==typeof t}function p(t){return t.constructor===Array}function m(t,e,n){Object.defineProperty(t,e,n)}function g(t,e){var n=Object.assign({},t,e);return e.hasOwnProperty("classes")&&(n.classes=Object.assign({},t.classes,e.classes),e.classes.hasOwnProperty("direction")&&(n.classes.direction=Object.assign({},t.classes.direction,e.classes.direction)),e.classes.hasOwnProperty("type")&&(n.classes.type=Object.assign({},t.classes.type,e.classes.type)),e.classes.hasOwnProperty("slide")&&(n.classes.slide=Object.assign({},t.classes.slide,e.classes.slide)),e.classes.hasOwnProperty("arrow")&&(n.classes.arrow=Object.assign({},t.classes.arrow,e.classes.arrow)),e.classes.hasOwnProperty("nav")&&(n.classes.nav=Object.assign({},t.classes.nav,e.classes.nav))),e.hasOwnProperty("breakpoints")&&(n.breakpoints=Object.assign({},t.breakpoints,e.breakpoints)),n}var y=function(){function t(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};e(this,t),this.events=n,this.hop=n.hasOwnProperty}return i(t,[{key:"on",value:function(t,e){if(!p(t)){this.hop.call(this.events,t)||(this.events[t]=[]);var n=this.events[t].push(e)-1;return{remove:function(){delete this.events[t][n]}}}for(var i=0;i<t.length;i++)this.on(t[i],e)}},{key:"emit",value:function(t,e){if(p(t))for(var n=0;n<t.length;n++)this.emit(t[n],e);else this.hop.call(this.events,t)&&this.events[t].forEach((function(t){t(e||{})}))}}]),t}(),b=function(){function t(n){var i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};e(this,t),this._c={},this._t=[],this._e=new y,this.disabled=!1,this.selector=n,this.settings=g(c,i),this.index=this.settings.startAt}return i(t,[{key:"mount",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return this._e.emit("mount.before"),h(t)?this._c=function(t,e,n){var i={};for(var r in e)v(e[r])?i[r]=e[r](t,i,n):l("Extension must be a function");for(var s in i)v(i[s].mount)&&i[s].mount();return i}(this,t,this._e):l("You need to provide a object on `mount()`"),this._e.emit("mount.after"),this}},{key:"mutate",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];return p(t)?this._t=t:l("You need to provide a array on `mutate()`"),this}},{key:"update",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return this.settings=g(this.settings,t),t.hasOwnProperty("startAt")&&(this.index=t.startAt),this._e.emit("update"),this}},{key:"go",value:function(t){return this._c.Run.make(t),this}},{key:"move",value:function(t){return this._c.Transition.disable(),this._c.Move.make(t),this}},{key:"destroy",value:function(){return this._e.emit("destroy"),this}},{key:"play",value:function(){var t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];return t&&(this.settings.autoplay=t),this._e.emit("play"),this}},{key:"pause",value:function(){return this._e.emit("pause"),this}},{key:"disable",value:function(){return this.disabled=!0,this}},{key:"enable",value:function(){return this.disabled=!1,this}},{key:"on",value:function(t,e){return this._e.on(t,e),this}},{key:"isType",value:function(t){return this.settings.type===t}},{key:"settings",get:function(){return this._o},set:function(t){h(t)?this._o=t:l("Options must be an `object` instance.")}},{key:"index",get:function(){return this._i},set:function(t){this._i=f(t)}},{key:"type",get:function(){return this.settings.type}},{key:"disabled",get:function(){return this._d},set:function(t){this._d=!!t}}]),t}();function w(){return(new Date).getTime()}function _(t,e,n){var i,r,s,o,a=0;n||(n={});var u=function(){a=!1===n.leading?0:w(),i=null,o=t.apply(r,s),i||(r=s=null)},c=function(){var c=w();a||!1!==n.leading||(a=c);var l=e-(c-a);return r=this,s=arguments,l<=0||l>e?(i&&(clearTimeout(i),i=null),a=c,o=t.apply(r,s),i||(r=s=null)):i||!1===n.trailing||(i=setTimeout(u,l)),o};return c.cancel=function(){clearTimeout(i),a=0,i=r=s=null},c}var S={ltr:["marginLeft","marginRight"],rtl:["marginRight","marginLeft"]};function k(t){if(t&&t.parentNode){for(var e=t.parentNode.firstChild,n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n}return[]}function O(t){return!!(t&&t instanceof window.HTMLElement)}function T(t){return Array.prototype.slice.call(t)}var x='[data-glide-el="track"]';var H=function(){function t(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};e(this,t),this.listeners=n}return i(t,[{key:"on",value:function(t,e,n){var i=arguments.length>3&&void 0!==arguments[3]&&arguments[3];d(t)&&(t=[t]);for(var r=0;r<t.length;r++)this.listeners[t[r]]=n,e.addEventListener(t[r],this.listeners[t[r]],i)}},{key:"off",value:function(t,e){var n=arguments.length>2&&void 0!==arguments[2]&&arguments[2];d(t)&&(t=[t]);for(var i=0;i<t.length;i++)e.removeEventListener(t[i],this.listeners[t[i]],n)}},{key:"destroy",value:function(){delete this.listeners}}]),t}();var A=["ltr","rtl"],j={">":"<","<":">","=":"="};function z(t,e){return{modify:function(t){return e.Direction.is("rtl")?-t:t}}}function R(t,e){return{modify:function(t){var n=Math.floor(t/e.Sizes.slideWidth);return t+e.Gaps.value*n}}}function C(t,e){return{modify:function(t){return t+e.Clones.grow/2}}}function E(t,e){return{modify:function(n){if(t.settings.focusAt>=0){var i=e.Peek.value;return h(i)?n-i.before:n-i}return n}}}function L(t,e){return{modify:function(n){var i=e.Gaps.value,r=e.Sizes.width,s=t.settings.focusAt,o=e.Sizes.slideWidth;return"center"===s?n-(r/2-o/2):n-o*s-i*s}}}var P=!1;try{var M=Object.defineProperty({},"passive",{get:function(){P=!0}});window.addEventListener("testPassive",null,M),window.removeEventListener("testPassive",null,M)}catch(t){}var D=P,V=["touchstart","mousedown"],W=["touchmove","mousemove"],B=["touchend","touchcancel","mouseup","mouseleave"],q=["mousedown","mousemove","mouseup","mouseleave"];function G(t,e,n){var i=new H,r=0,s=0,o=0,a=!1,u=!!D&&{passive:!0},c={mount:function(){this.bindSwipeStart()},start:function(e){if(!a&&!t.disabled){this.disable();var i=this.touches(e);r=null,s=f(i.pageX),o=f(i.pageY),this.bindSwipeMove(),this.bindSwipeEnd(),n.emit("swipe.start")}},move:function(i){if(!t.disabled){var a=t.settings,u=a.touchAngle,c=a.touchRatio,l=a.classes,d=this.touches(i),h=f(d.pageX)-s,v=f(d.pageY)-o,p=Math.abs(h<<2),m=Math.abs(v<<2),g=Math.sqrt(p+m),y=Math.sqrt(m);if(!(180*(r=Math.asin(y/g))/Math.PI<u))return!1;i.stopPropagation(),e.Move.make(h*parseFloat(c)),e.Html.root.classList.add(l.dragging),n.emit("swipe.move")}},end:function(i){if(!t.disabled){var o=t.settings,a=o.perSwipe,u=o.touchAngle,c=o.classes,l=this.touches(i),f=this.threshold(i),d=l.pageX-s,h=180*r/Math.PI;this.enable(),d>f&&h<u?e.Run.make(e.Direction.resolve("".concat(a,"<"))):d<-f&&h<u?e.Run.make(e.Direction.resolve("".concat(a,">"))):e.Move.make(),e.Html.root.classList.remove(c.dragging),this.unbindSwipeMove(),this.unbindSwipeEnd(),n.emit("swipe.end")}},bindSwipeStart:function(){var n=this,r=t.settings,s=r.swipeThreshold,o=r.dragThreshold;s&&i.on(V[0],e.Html.wrapper,(function(t){n.start(t)}),u),o&&i.on(V[1],e.Html.wrapper,(function(t){n.start(t)}),u)},unbindSwipeStart:function(){i.off(V[0],e.Html.wrapper,u),i.off(V[1],e.Html.wrapper,u)},bindSwipeMove:function(){var n=this;i.on(W,e.Html.wrapper,_((function(t){n.move(t)}),t.settings.throttle),u)},unbindSwipeMove:function(){i.off(W,e.Html.wrapper,u)},bindSwipeEnd:function(){var t=this;i.on(B,e.Html.wrapper,(function(e){t.end(e)}))},unbindSwipeEnd:function(){i.off(B,e.Html.wrapper)},touches:function(t){return q.indexOf(t.type)>-1?t:t.touches[0]||t.changedTouches[0]},threshold:function(e){var n=t.settings;return q.indexOf(e.type)>-1?n.dragThreshold:n.swipeThreshold},enable:function(){return a=!1,e.Transition.enable(),this},disable:function(){return a=!0,e.Transition.disable(),this}};return n.on("build.after",(function(){e.Html.root.classList.add(t.settings.classes.swipeable)})),n.on("destroy",(function(){c.unbindSwipeStart(),c.unbindSwipeMove(),c.unbindSwipeEnd(),i.destroy()})),c}var F='[data-glide-el^="controls"]',I="".concat(F,' [data-glide-dir*="<"]'),N="".concat(F,' [data-glide-dir*=">"]');function Y(t,e,n){var i=new H,r=!!D&&{passive:!0},s={mount:function(){this._n=e.Html.root.querySelectorAll('[data-glide-el="controls[nav]"]'),this._c=e.Html.root.querySelectorAll(F),this._arrowControls={previous:e.Html.root.querySelectorAll(I),next:e.Html.root.querySelectorAll(N)},this.addBindings()},setActive:function(){for(var t=0;t<this._n.length;t++)this.addClass(this._n[t].children)},removeActive:function(){for(var t=0;t<this._n.length;t++)this.removeClass(this._n[t].children)},addClass:function(e){var n=t.settings,i=e[t.index];i&&i&&(i.classList.add(n.classes.nav.active),k(i).forEach((function(t){t.classList.remove(n.classes.nav.active)})))},removeClass:function(e){var n=e[t.index];n&&n.classList.remove(t.settings.classes.nav.active)},setArrowState:function(){if(!t.settings.rewind){var n=s._arrowControls.next,i=s._arrowControls.previous;this.resetArrowState(n,i),0===t.index&&this.disableArrow(i),t.index===e.Run.length&&this.disableArrow(n)}},resetArrowState:function(){for(var e=t.settings,n=arguments.length,i=new Array(n),r=0;r<n;r++)i[r]=arguments[r];i.forEach((function(t){T(t).forEach((function(t){t.classList.remove(e.classes.arrow.disabled)}))}))},disableArrow:function(){for(var e=t.settings,n=arguments.length,i=new Array(n),r=0;r<n;r++)i[r]=arguments[r];i.forEach((function(t){T(t).forEach((function(t){t.classList.add(e.classes.arrow.disabled)}))}))},addBindings:function(){for(var t=0;t<this._c.length;t++)this.bind(this._c[t].children)},removeBindings:function(){for(var t=0;t<this._c.length;t++)this.unbind(this._c[t].children)},bind:function(t){for(var e=0;e<t.length;e++)i.on("click",t[e],this.click),i.on("touchstart",t[e],this.click,r)},unbind:function(t){for(var e=0;e<t.length;e++)i.off(["click","touchstart"],t[e])},click:function(t){D||"touchstart"!==t.type||t.preventDefault();var n=t.currentTarget.getAttribute("data-glide-dir");e.Run.make(e.Direction.resolve(n))}};return m(s,"items",{get:function(){return s._c}}),n.on(["mount.after","move.after"],(function(){s.setActive()})),n.on(["mount.after","run"],(function(){s.setArrowState()})),n.on("destroy",(function(){s.removeBindings(),s.removeActive(),i.destroy()})),s}function X(t){return h(t)?(e=t,Object.keys(e).sort().reduce((function(t,n){return t[n]=e[n],t[n],t}),{})):(l("Breakpoints option must be an object"),{});var e}function $(t,e,n){var i=new H,r=t.settings,s=X(r.breakpoints),o=Object.assign({},r),a={match:function(t){if(void 0!==window.matchMedia)for(var e in t)if(t.hasOwnProperty(e)&&window.matchMedia("(max-width: ".concat(e,"px)")).matches)return t[e];return o}};return Object.assign(r,a.match(s)),i.on("resize",window,_((function(){t.settings=g(r,a.match(s))}),t.settings.throttle)),n.on("update",(function(){s=X(s),o=Object.assign({},r)})),n.on("destroy",(function(){i.off("resize",window)})),a}var J={Html:function(t,e,n){var i={mount:function(){this.root=t.selector,this.track=this.root.querySelector(x),this.collectSlides()},collectSlides:function(){this.slides=T(this.wrapper.children).filter((function(e){return!e.classList.contains(t.settings.classes.slide.clone)}))}};return m(i,"root",{get:function(){return i._r},set:function(t){d(t)&&(t=document.querySelector(t)),O(t)?i._r=t:l("Root element must be a existing Html node")}}),m(i,"track",{get:function(){return i._t},set:function(t){O(t)?i._t=t:l("Could not find track element. Please use ".concat(x," attribute."))}}),m(i,"wrapper",{get:function(){return i.track.children[0]}}),n.on("update",(function(){i.collectSlides()})),i},Translate:function(t,e,n){var i={set:function(n){var i=function(t,e,n){var i=[R,C,E,L].concat(t._t,[z]);return{mutate:function(r){for(var s=0;s<i.length;s++){var o=i[s];v(o)&&v(o().modify)?r=o(t,e,n).modify(r):l("Transformer should be a function that returns an object with `modify()` method")}return r}}}(t,e).mutate(n),r="translate3d(".concat(-1*i,"px, 0px, 0px)");e.Html.wrapper.style.mozTransform=r,e.Html.wrapper.style.webkitTransform=r,e.Html.wrapper.style.transform=r},remove:function(){e.Html.wrapper.style.transform=""},getStartIndex:function(){var n=e.Sizes.length,i=t.index,r=t.settings.perView;return e.Run.isOffset(">")||e.Run.isOffset("|>")?n+(i-r):(i+r)%n},getTravelDistance:function(){var n=e.Sizes.slideWidth*t.settings.perView;return e.Run.isOffset(">")||e.Run.isOffset("|>")?-1*n:n}};return n.on("move",(function(r){if(!t.isType("carousel")||!e.Run.isOffset())return i.set(r.movement);e.Transition.after((function(){n.emit("translate.jump"),i.set(e.Sizes.slideWidth*t.index)}));var s=e.Sizes.slideWidth*e.Translate.getStartIndex();return i.set(s-e.Translate.getTravelDistance())})),n.on("destroy",(function(){i.remove()})),i},Transition:function(t,e,n){var i=!1,r={compose:function(e){var n=t.settings;return i?"".concat(e," 0ms ").concat(n.animationTimingFunc):"".concat(e," ").concat(this.duration,"ms ").concat(n.animationTimingFunc)},set:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"transform";e.Html.wrapper.style.transition=this.compose(t)},remove:function(){e.Html.wrapper.style.transition=""},after:function(t){setTimeout((function(){t()}),this.duration)},enable:function(){i=!1,this.set()},disable:function(){i=!0,this.set()}};return m(r,"duration",{get:function(){var n=t.settings;return t.isType("slider")&&e.Run.offset?n.rewindDuration:n.animationDuration}}),n.on("move",(function(){r.set()})),n.on(["build.before","resize","translate.jump"],(function(){r.disable()})),n.on("run",(function(){r.enable()})),n.on("destroy",(function(){r.remove()})),r},Direction:function(t,e,n){var i={mount:function(){this.value=t.settings.direction},resolve:function(t){var e=t.slice(0,1);return this.is("rtl")?t.split(e).join(j[e]):t},is:function(t){return this.value===t},addClass:function(){e.Html.root.classList.add(t.settings.classes.direction[this.value])},removeClass:function(){e.Html.root.classList.remove(t.settings.classes.direction[this.value])}};return m(i,"value",{get:function(){return i._v},set:function(t){A.indexOf(t)>-1?i._v=t:l("Direction value must be `ltr` or `rtl`")}}),n.on(["destroy","update"],(function(){i.removeClass()})),n.on("update",(function(){i.mount()})),n.on(["build.before","update"],(function(){i.addClass()})),i},Peek:function(t,e,n){var i={mount:function(){this.value=t.settings.peek}};return m(i,"value",{get:function(){return i._v},set:function(t){h(t)?(t.before=f(t.before),t.after=f(t.after)):t=f(t),i._v=t}}),m(i,"reductor",{get:function(){var e=i.value,n=t.settings.perView;return h(e)?e.before/n+e.after/n:2*e/n}}),n.on(["resize","update"],(function(){i.mount()})),i},Sizes:function(t,e,n){var i={setupSlides:function(){for(var t="".concat(this.slideWidth,"px"),n=e.Html.slides,i=0;i<n.length;i++)n[i].style.width=t},setupWrapper:function(){e.Html.wrapper.style.width="".concat(this.wrapperSize,"px")},remove:function(){for(var t=e.Html.slides,n=0;n<t.length;n++)t[n].style.width="";e.Html.wrapper.style.width=""}};return m(i,"length",{get:function(){return e.Html.slides.length}}),m(i,"width",{get:function(){return e.Html.track.offsetWidth}}),m(i,"wrapperSize",{get:function(){return i.slideWidth*i.length+e.Gaps.grow+e.Clones.grow}}),m(i,"slideWidth",{get:function(){return i.width/t.settings.perView-e.Peek.reductor-e.Gaps.reductor}}),n.on(["build.before","resize","update"],(function(){i.setupSlides(),i.setupWrapper()})),n.on("destroy",(function(){i.remove()})),i},Gaps:function(t,e,n){var i={apply:function(t){for(var n=0,i=t.length;n<i;n++){var r=t[n].style,s=e.Direction.value;r[S[s][0]]=0!==n?"".concat(this.value/2,"px"):"",n!==t.length-1?r[S[s][1]]="".concat(this.value/2,"px"):r[S[s][1]]=""}},remove:function(t){for(var e=0,n=t.length;e<n;e++){var i=t[e].style;i.marginLeft="",i.marginRight=""}}};return m(i,"value",{get:function(){return f(t.settings.gap)}}),m(i,"grow",{get:function(){return i.value*e.Sizes.length}}),m(i,"reductor",{get:function(){var e=t.settings.perView;return i.value*(e-1)/e}}),n.on(["build.after","update"],_((function(){i.apply(e.Html.wrapper.children)}),30)),n.on("destroy",(function(){i.remove(e.Html.wrapper.children)})),i},Move:function(t,e,n){var i={mount:function(){this._o=0},make:function(){var t=this,i=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0;this.offset=i,n.emit("move",{movement:this.value}),e.Transition.after((function(){n.emit("move.after",{movement:t.value})}))}};return m(i,"offset",{get:function(){return i._o},set:function(t){i._o=function(t){return void 0===t}(t)?0:f(t)}}),m(i,"translate",{get:function(){return e.Sizes.slideWidth*t.index}}),m(i,"value",{get:function(){var t=this.offset,n=this.translate;return e.Direction.is("rtl")?n+t:n-t}}),n.on(["build.before","run"],(function(){i.make()})),i},Clones:function(t,e,n){var i={mount:function(){this.items=[],t.isType("carousel")&&(this.items=this.collect())},collect:function(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],i=e.Html.slides,r=t.settings,s=r.perView,o=r.classes,a=r.cloningRatio;if(0!==i.length)for(var u=s+ +!!t.settings.peek+Math.round(s/2),c=i.slice(0,u).reverse(),l=i.slice(-1*u),f=0;f<Math.max(a,Math.floor(s/i.length));f++){for(var d=0;d<c.length;d++){var h=c[d].cloneNode(!0);h.classList.add(o.slide.clone),n.push(h)}for(var v=0;v<l.length;v++){var p=l[v].cloneNode(!0);p.classList.add(o.slide.clone),n.unshift(p)}}return n},append:function(){for(var t=this.items,n=e.Html,i=n.wrapper,r=n.slides,s=Math.floor(t.length/2),o=t.slice(0,s).reverse(),a=t.slice(-1*s).reverse(),u="".concat(e.Sizes.slideWidth,"px"),c=0;c<a.length;c++)i.appendChild(a[c]);for(var l=0;l<o.length;l++)i.insertBefore(o[l],r[0]);for(var f=0;f<t.length;f++)t[f].style.width=u},remove:function(){for(var t=this.items,n=0;n<t.length;n++)e.Html.wrapper.removeChild(t[n])}};return m(i,"grow",{get:function(){return(e.Sizes.slideWidth+e.Gaps.value)*i.items.length}}),n.on("update",(function(){i.remove(),i.mount(),i.append()})),n.on("build.before",(function(){t.isType("carousel")&&i.append()})),n.on("destroy",(function(){i.remove()})),i},Resize:function(t,e,n){var i=new H,r={mount:function(){this.bind()},bind:function(){i.on("resize",window,_((function(){n.emit("resize")}),t.settings.throttle))},unbind:function(){i.off("resize",window)}};return n.on("destroy",(function(){r.unbind(),i.destroy()})),r},Build:function(t,e,n){var i={mount:function(){n.emit("build.before"),this.typeClass(),this.activeClass(),n.emit("build.after")},typeClass:function(){e.Html.root.classList.add(t.settings.classes.type[t.settings.type])},activeClass:function(){var n=t.settings.classes,i=e.Html.slides[t.index];i&&(i.classList.add(n.slide.active),k(i).forEach((function(t){t.classList.remove(n.slide.active)})))},removeClasses:function(){var n=t.settings.classes,i=n.type,r=n.slide;e.Html.root.classList.remove(i[t.settings.type]),e.Html.slides.forEach((function(t){t.classList.remove(r.active)}))}};return n.on(["destroy","update"],(function(){i.removeClasses()})),n.on(["resize","update"],(function(){i.mount()})),n.on("move.after",(function(){i.activeClass()})),i},Run:function(t,e,n){var i={mount:function(){this._o=!1},make:function(i){var r=this;t.disabled||(!t.settings.waitForTransition||t.disable(),this.move=i,n.emit("run.before",this.move),this.calculate(),n.emit("run",this.move),e.Transition.after((function(){r.isStart()&&n.emit("run.start",r.move),r.isEnd()&&n.emit("run.end",r.move),r.isOffset()&&(r._o=!1,n.emit("run.offset",r.move)),n.emit("run.after",r.move),t.enable()})))},calculate:function(){var e=this.move,n=this.length,r=e.steps,s=e.direction,o=1;if("="===s)return t.settings.bound&&f(r)>n?void(t.index=n):void(t.index=r);if(">"!==s||">"!==r)if("<"!==s||"<"!==r){if("|"===s&&(o=t.settings.perView||1),">"===s||"|"===s&&">"===r){var a=function(e){var n=t.index;if(t.isType("carousel"))return n+e;return n+(e-n%e)}(o);return a>n&&(this._o=!0),void(t.index=function(e,n){var r=i.length;if(e<=r)return e;if(t.isType("carousel"))return e-(r+1);if(t.settings.rewind)return i.isBound()&&!i.isEnd()?r:0;if(i.isBound())return r;return Math.floor(r/n)*n}(a,o))}if("<"===s||"|"===s&&"<"===r){var u=function(e){var n=t.index;if(t.isType("carousel"))return n-e;var i=Math.ceil(n/e);return(i-1)*e}(o);return u<0&&(this._o=!0),void(t.index=function(e,n){var r=i.length;if(e>=0)return e;if(t.isType("carousel"))return e+(r+1);if(t.settings.rewind)return i.isBound()&&i.isStart()?r:Math.floor(r/n)*n;return 0}(u,o))}l("Invalid direction pattern [".concat(s).concat(r,"] has been used"))}else t.index=0;else t.index=n},isStart:function(){return t.index<=0},isEnd:function(){return t.index>=this.length},isOffset:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:void 0;return t?!!this._o&&("|>"===t?"|"===this.move.direction&&">"===this.move.steps:"|<"===t?"|"===this.move.direction&&"<"===this.move.steps:this.move.direction===t):this._o},isBound:function(){return t.isType("slider")&&"center"!==t.settings.focusAt&&t.settings.bound}};return m(i,"move",{get:function(){return this._m},set:function(t){var e=t.substr(1);this._m={direction:t.substr(0,1),steps:e?f(e)?f(e):e:0}}}),m(i,"length",{get:function(){var n=t.settings,i=e.Html.slides.length;return this.isBound()?i-1-(f(n.perView)-1)+f(n.focusAt):i-1}}),m(i,"offset",{get:function(){return this._o}}),i}},K=function(t){!function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function");t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,writable:!0,configurable:!0}}),e&&s(t,e)}(o,t);var n=a(o);function o(){return e(this,o),n.apply(this,arguments)}return i(o,[{key:"mount",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return u(r(o.prototype),"mount",this).call(this,Object.assign({},J,t))}}]),o}(b);const Q="glide__arrow--left",U="glide__arrow--right";function Z(t,e){return{mount(){t.settings.rewind||(t.on(["mount.after","resize"],(()=>{e.Sizes.length<=t.settings.perView?t.disable():t.enable()})),t.on(["mount.after","run","resize"],(()=>{e.Controls.items.forEach((n=>{const i=n.querySelector(`.${Q}`);i&&(0===t.index||e.Sizes.length<=t.settings.perView?i.setAttribute("disabled",""):i.removeAttribute("disabled"));const r=n.querySelector(`.${U}`);if(r){(t.settings.bound?t.index+(t.settings.perView-1):t.index)===e.Sizes.length-1||e.Sizes.length<=t.settings.perView?r.setAttribute("disabled",""):r.removeAttribute("disabled")}i.disabled&&r.disabled?n.classList.add("glide__arrows--disabled"):n.classList.remove("glide__arrows--disabled")}))})))}}}Drupal.behaviors.glide={attach(){const t=document.querySelectorAll(".explore-block button.nav-link");function e(){document.querySelectorAll(".tab-pane.active .glide").forEach((t=>{new K(t,{rewind:!1,bound:!0,dragThreshold:!1,gap:24,perView:4,wrapperWidth:300,breakpoints:{1199:{perView:3},991:{perView:2},767:{perView:1}}}).mount({Controls:Y,Breakpoints:$,Swipe:G,ControlsDisabler:Z}).update({wrapperWidth:300})}))}for(let n=0;n<t.length;n++)t[n].addEventListener("click",(()=>{e()}));e()}}}));
 //# sourceMappingURL=explore-block.min.js.map
-- 
GitLab


From 4e3d52e0a491f172e1d1ac7fe513089c943a1121 Mon Sep 17 00:00:00 2001
From: gingapa <mail@paulogingao.com>
Date: Mon, 9 Dec 2024 10:03:26 +0000
Subject: [PATCH 132/137] ISAICP-9255: Remove table head stickiness when inside
 responsive tables.

---
 web/themes/ventuno/assets/css/tables.min.css       | 2 +-
 web/themes/ventuno/src/scss/components/tables.scss | 5 +++++
 2 files changed, 6 insertions(+), 1 deletion(-)

diff --git a/web/themes/ventuno/assets/css/tables.min.css b/web/themes/ventuno/assets/css/tables.min.css
index 5136674083..589b319513 100644
--- a/web/themes/ventuno/assets/css/tables.min.css
+++ b/web/themes/ventuno/assets/css/tables.min.css
@@ -1,2 +1,2 @@
-.table{--bs-table-color:var(--bs-body-color);--bs-table-bg:transparent;--bs-table-border-color:var(--bs-border-color);--bs-table-accent-bg:transparent;--bs-table-striped-color:var(--bs-body-color);--bs-table-striped-bg:rgba(0,0,0,.05);--bs-table-active-color:var(--bs-body-color);--bs-table-active-bg:rgba(0,0,0,.1);--bs-table-hover-color:var(--bs-body-color);--bs-table-hover-bg:rgba(0,0,0,.1);border-color:var(--bs-table-border-color);color:var(--bs-table-color);margin-bottom:1rem;vertical-align:top;width:100%}.table>:not(caption)>*>*{background-color:var(--bs-table-bg);border-bottom-width:1px;box-shadow:inset 0 0 0 9999px var(--bs-table-accent-bg);padding:.5rem}.table>tbody{vertical-align:inherit}.table>thead{vertical-align:bottom}.table-group-divider{border-top:2px solid}.caption-top{caption-side:top}.table-sm>:not(caption)>*>*{padding:.25rem}.table-bordered>:not(caption)>*{border-width:1px 0}.table-bordered>:not(caption)>*>*{border-width:0 1px}.table-borderless>:not(caption)>*>*{border-bottom-width:0}.table-borderless>:not(:first-child){border-top-width:0}.table-striped-columns>:not(caption)>tr>:nth-child(2n),.table-striped>tbody>tr:nth-of-type(2n)>*{--bs-table-accent-bg:var(--bs-table-striped-bg);color:var(--bs-table-striped-color)}.table-active{--bs-table-accent-bg:var(--bs-table-active-bg);color:var(--bs-table-active-color)}.table-hover>tbody>tr:hover>*{--bs-table-accent-bg:var(--bs-table-hover-bg);color:var(--bs-table-hover-color)}.table-primary{--bs-table-color:#000;--bs-table-bg:#d0d8e4;--bs-table-border-color:#bbc2cd;--bs-table-striped-bg:#c6cdd9;--bs-table-striped-color:#000;--bs-table-active-bg:#bbc2cd;--bs-table-active-color:#000;--bs-table-hover-bg:#bbc2cd;--bs-table-hover-color:#000}.table-primary,.table-secondary{border-color:var(--bs-table-border-color);color:var(--bs-table-color)}.table-secondary{--bs-table-color:#000;--bs-table-bg:#fafcfe;--bs-table-border-color:#e1e3e5;--bs-table-striped-bg:#eeeff1;--bs-table-striped-color:#000;--bs-table-active-bg:#e1e3e5;--bs-table-active-color:#000;--bs-table-hover-bg:#e1e3e5;--bs-table-hover-color:#000}.table-success{--bs-table-color:#000;--bs-table-bg:#d1f2e6;--bs-table-border-color:#bcdacf;--bs-table-striped-bg:#c7e6db;--bs-table-striped-color:#000;--bs-table-active-bg:#bcdacf;--bs-table-active-color:#000;--bs-table-hover-bg:#bcdacf;--bs-table-hover-color:#000}.table-info,.table-success{border-color:var(--bs-table-border-color);color:var(--bs-table-color)}.table-info{--bs-table-color:#000;--bs-table-bg:#cfe4e8;--bs-table-border-color:#bacdd1;--bs-table-striped-bg:#c5d9dc;--bs-table-striped-color:#000;--bs-table-active-bg:#bacdd1;--bs-table-active-color:#000;--bs-table-hover-bg:#bacdd1;--bs-table-hover-color:#000}.table-warning{--bs-table-color:#000;--bs-table-bg:#fbeed9;--bs-table-border-color:#e2d6c3;--bs-table-striped-bg:#eee2ce;--bs-table-striped-color:#000;--bs-table-active-bg:#e2d6c3;--bs-table-active-color:#000;--bs-table-hover-bg:#e2d6c3;--bs-table-hover-color:#000}.table-danger,.table-warning{border-color:var(--bs-table-border-color);color:var(--bs-table-color)}.table-danger{--bs-table-color:#000;--bs-table-bg:#fbd6d6;--bs-table-border-color:#e2c1c1;--bs-table-striped-bg:#eecbcb;--bs-table-striped-color:#000;--bs-table-active-bg:#e2c1c1;--bs-table-active-color:#000;--bs-table-hover-bg:#e2c1c1;--bs-table-hover-color:#000}.table-light{--bs-table-color:#000;--bs-table-bg:#f8f9fa;--bs-table-border-color:#dfe0e1;--bs-table-striped-bg:#ecedee;--bs-table-striped-color:#000;--bs-table-active-bg:#dfe0e1;--bs-table-active-color:#000;--bs-table-hover-bg:#dfe0e1;--bs-table-hover-color:#000}.table-dark,.table-light{border-color:var(--bs-table-border-color);color:var(--bs-table-color)}.table-dark{--bs-table-color:#fff;--bs-table-bg:#212529;--bs-table-border-color:#373b3e;--bs-table-striped-bg:#2c3034;--bs-table-striped-color:#fff;--bs-table-active-bg:#373b3e;--bs-table-active-color:#fff;--bs-table-hover-bg:#373b3e;--bs-table-hover-color:#fff}.table-responsive{overflow-x:auto;-webkit-overflow-scrolling:touch}@media (max-width:575.98px){.table-responsive-sm{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:767.98px){.table-responsive-md{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:991.98px){.table-responsive-lg{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:1199.98px){.table-responsive-xl{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:1399.98px){.table-responsive-xxl{overflow-x:auto;-webkit-overflow-scrolling:touch}}.table{caption-side:top}.table>:not(caption)>*>*{border-bottom-width:0}.table:not(.licence-comparer)>tbody>tr:nth-of-type(2n)>*{--bs-table-accent-bg:var(--bs-table-striped-bg);color:var(--bs-table-striped-color)}.table--columns-equal{table-layout:fixed}
+.table{--bs-table-color:var(--bs-body-color);--bs-table-bg:transparent;--bs-table-border-color:var(--bs-border-color);--bs-table-accent-bg:transparent;--bs-table-striped-color:var(--bs-body-color);--bs-table-striped-bg:rgba(0,0,0,.05);--bs-table-active-color:var(--bs-body-color);--bs-table-active-bg:rgba(0,0,0,.1);--bs-table-hover-color:var(--bs-body-color);--bs-table-hover-bg:rgba(0,0,0,.1);border-color:var(--bs-table-border-color);color:var(--bs-table-color);margin-bottom:1rem;vertical-align:top;width:100%}.table>:not(caption)>*>*{background-color:var(--bs-table-bg);border-bottom-width:1px;box-shadow:inset 0 0 0 9999px var(--bs-table-accent-bg);padding:.5rem}.table>tbody{vertical-align:inherit}.table>thead{vertical-align:bottom}.table-group-divider{border-top:2px solid}.caption-top{caption-side:top}.table-sm>:not(caption)>*>*{padding:.25rem}.table-bordered>:not(caption)>*{border-width:1px 0}.table-bordered>:not(caption)>*>*{border-width:0 1px}.table-borderless>:not(caption)>*>*{border-bottom-width:0}.table-borderless>:not(:first-child){border-top-width:0}.table-striped-columns>:not(caption)>tr>:nth-child(2n),.table-striped>tbody>tr:nth-of-type(2n)>*{--bs-table-accent-bg:var(--bs-table-striped-bg);color:var(--bs-table-striped-color)}.table-active{--bs-table-accent-bg:var(--bs-table-active-bg);color:var(--bs-table-active-color)}.table-hover>tbody>tr:hover>*{--bs-table-accent-bg:var(--bs-table-hover-bg);color:var(--bs-table-hover-color)}.table-primary{--bs-table-color:#000;--bs-table-bg:#d0d8e4;--bs-table-border-color:#bbc2cd;--bs-table-striped-bg:#c6cdd9;--bs-table-striped-color:#000;--bs-table-active-bg:#bbc2cd;--bs-table-active-color:#000;--bs-table-hover-bg:#bbc2cd;--bs-table-hover-color:#000}.table-primary,.table-secondary{border-color:var(--bs-table-border-color);color:var(--bs-table-color)}.table-secondary{--bs-table-color:#000;--bs-table-bg:#fafcfe;--bs-table-border-color:#e1e3e5;--bs-table-striped-bg:#eeeff1;--bs-table-striped-color:#000;--bs-table-active-bg:#e1e3e5;--bs-table-active-color:#000;--bs-table-hover-bg:#e1e3e5;--bs-table-hover-color:#000}.table-success{--bs-table-color:#000;--bs-table-bg:#d1f2e6;--bs-table-border-color:#bcdacf;--bs-table-striped-bg:#c7e6db;--bs-table-striped-color:#000;--bs-table-active-bg:#bcdacf;--bs-table-active-color:#000;--bs-table-hover-bg:#bcdacf;--bs-table-hover-color:#000}.table-info,.table-success{border-color:var(--bs-table-border-color);color:var(--bs-table-color)}.table-info{--bs-table-color:#000;--bs-table-bg:#cfe4e8;--bs-table-border-color:#bacdd1;--bs-table-striped-bg:#c5d9dc;--bs-table-striped-color:#000;--bs-table-active-bg:#bacdd1;--bs-table-active-color:#000;--bs-table-hover-bg:#bacdd1;--bs-table-hover-color:#000}.table-warning{--bs-table-color:#000;--bs-table-bg:#fbeed9;--bs-table-border-color:#e2d6c3;--bs-table-striped-bg:#eee2ce;--bs-table-striped-color:#000;--bs-table-active-bg:#e2d6c3;--bs-table-active-color:#000;--bs-table-hover-bg:#e2d6c3;--bs-table-hover-color:#000}.table-danger,.table-warning{border-color:var(--bs-table-border-color);color:var(--bs-table-color)}.table-danger{--bs-table-color:#000;--bs-table-bg:#fbd6d6;--bs-table-border-color:#e2c1c1;--bs-table-striped-bg:#eecbcb;--bs-table-striped-color:#000;--bs-table-active-bg:#e2c1c1;--bs-table-active-color:#000;--bs-table-hover-bg:#e2c1c1;--bs-table-hover-color:#000}.table-light{--bs-table-color:#000;--bs-table-bg:#f8f9fa;--bs-table-border-color:#dfe0e1;--bs-table-striped-bg:#ecedee;--bs-table-striped-color:#000;--bs-table-active-bg:#dfe0e1;--bs-table-active-color:#000;--bs-table-hover-bg:#dfe0e1;--bs-table-hover-color:#000}.table-dark,.table-light{border-color:var(--bs-table-border-color);color:var(--bs-table-color)}.table-dark{--bs-table-color:#fff;--bs-table-bg:#212529;--bs-table-border-color:#373b3e;--bs-table-striped-bg:#2c3034;--bs-table-striped-color:#fff;--bs-table-active-bg:#373b3e;--bs-table-active-color:#fff;--bs-table-hover-bg:#373b3e;--bs-table-hover-color:#fff}.table-responsive{overflow-x:auto;-webkit-overflow-scrolling:touch}@media (max-width:575.98px){.table-responsive-sm{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:767.98px){.table-responsive-md{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:991.98px){.table-responsive-lg{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:1199.98px){.table-responsive-xl{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:1399.98px){.table-responsive-xxl{overflow-x:auto;-webkit-overflow-scrolling:touch}}.table{caption-side:top}.table>:not(caption)>*>*{border-bottom-width:0}.table:not(.licence-comparer)>tbody>tr:nth-of-type(2n)>*{--bs-table-accent-bg:var(--bs-table-striped-bg);color:var(--bs-table-striped-color)}.table--columns-equal{table-layout:fixed}.table.sticky-header.responsive-enabled thead{position:static}
 /*# sourceMappingURL=tables.min.css.map */
\ No newline at end of file
diff --git a/web/themes/ventuno/src/scss/components/tables.scss b/web/themes/ventuno/src/scss/components/tables.scss
index eb4bf8ff8e..c0b5f4106c 100644
--- a/web/themes/ventuno/src/scss/components/tables.scss
+++ b/web/themes/ventuno/src/scss/components/tables.scss
@@ -18,3 +18,8 @@
     table-layout: fixed;
   }
 }
+
+// #ISAICP-9255 Sticky haders do not work inside responsive tables.
+.table.sticky-header.responsive-enabled thead {
+  position: static;
+}
-- 
GitLab


From 7f2a85778342314b0adbb4172b42ea931262b3c0 Mon Sep 17 00:00:00 2001
From: Alexandre Dias <alex.jm.dias@gmail.com>
Date: Mon, 16 Dec 2024 13:49:02 +0000
Subject: [PATCH 133/137] ISAICP-9192: Add anonymous user to check the problem.

---
 .../interoperable_europe/interoperable_europe.feature           | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/tests/features/communities/interoperable_europe/interoperable_europe.feature b/tests/features/communities/interoperable_europe/interoperable_europe.feature
index cfe2cc8f94..bc5b2ec8d8 100644
--- a/tests/features/communities/interoperable_europe/interoperable_europe.feature
+++ b/tests/features/communities/interoperable_europe/interoperable_europe.feature
@@ -98,7 +98,7 @@ Feature:
       | title      | collection           |
       | IOP <type> | Interoperable Europe |
 
-    When I am logged in as a user with the authenticated role
+    When I am an anonymous user
     And I go to the "IOP <type>" <type>
     Then I should not see the link "Report abusive content"
     And I should not see the button "Translate"
-- 
GitLab


From ed73add327deebc20b04f6a5dd6e765a33c3a731 Mon Sep 17 00:00:00 2001
From: Alexandre Dias <alex.jm.dias@gmail.com>
Date: Fri, 3 Jan 2025 09:25:11 +0000
Subject: [PATCH 134/137] ISAICP-9192: Add translate button.

---
 config/sync/block.block.openeuropawebtoolsetrans.yml        | 2 +-
 .../interoperable_europe/interoperable_europe.feature       | 2 +-
 web/themes/iop/iop.theme                                    | 6 ++----
 3 files changed, 4 insertions(+), 6 deletions(-)

diff --git a/config/sync/block.block.openeuropawebtoolsetrans.yml b/config/sync/block.block.openeuropawebtoolsetrans.yml
index a0b14ff018..be00fad6e3 100644
--- a/config/sync/block.block.openeuropawebtoolsetrans.yml
+++ b/config/sync/block.block.openeuropawebtoolsetrans.yml
@@ -37,4 +37,4 @@ visibility:
   request_path:
     id: request_path
     negate: false
-    pages: "/interoperable-europe/news/*\r\n/interoperable-europe/event/*\r\n"
+    pages: "/interoperable-europe/news/*\r\n/interoperable-europe/event/*\r\n/interoperable-europe/document/*\r\n/interoperable-europe/discussion/*"
diff --git a/tests/features/communities/interoperable_europe/interoperable_europe.feature b/tests/features/communities/interoperable_europe/interoperable_europe.feature
index bc5b2ec8d8..789fc90d49 100644
--- a/tests/features/communities/interoperable_europe/interoperable_europe.feature
+++ b/tests/features/communities/interoperable_europe/interoperable_europe.feature
@@ -101,7 +101,7 @@ Feature:
     When I am an anonymous user
     And I go to the "IOP <type>" <type>
     Then I should not see the link "Report abusive content"
-    And I should not see the button "Translate"
+    And I should see the button "Translate"
 
     Examples:
       | type       |
diff --git a/web/themes/iop/iop.theme b/web/themes/iop/iop.theme
index c41c03cde9..cb03ec2679 100644
--- a/web/themes/iop/iop.theme
+++ b/web/themes/iop/iop.theme
@@ -121,11 +121,9 @@ function iop_preprocess_node(array &$variables): void {
     ]);
   }
 
-  // Disables the "Report" link for IOP except news and events.
+  // Disables the "Report" link for IOP.
   $node = \Drupal::routeMatch()->getParameter('node');
-  if (!$node instanceof NodeInterface ||
-    !in_array($node->bundle(), ['news', 'event']) &&
-    isset($variables['content']['report'])) {
+  if (!$node instanceof NodeInterface || isset($variables['content']['report'])) {
     $variables['content']['report']['#access'] = FALSE;
   }
 
-- 
GitLab


From d5bf58a08898bfdaf48418ee9f3685f7af446d55 Mon Sep 17 00:00:00 2001
From: Alexandre Dias <alex.jm.dias@gmail.com>
Date: Fri, 3 Jan 2025 13:32:13 +0000
Subject: [PATCH 135/137] ISAICP-9192: Fix test.

---
 .../interoperable_europe/interoperable_europe.feature         | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/tests/features/communities/interoperable_europe/interoperable_europe.feature b/tests/features/communities/interoperable_europe/interoperable_europe.feature
index 789fc90d49..bec750b3c6 100644
--- a/tests/features/communities/interoperable_europe/interoperable_europe.feature
+++ b/tests/features/communities/interoperable_europe/interoperable_europe.feature
@@ -25,7 +25,7 @@ Feature:
     And I should see the text "Event"
     And I should not see the heading "Event"
     And I should see the link "more events"
-    And I should see the link "Report abusive content"
+    And I should not see the link "Report abusive content"
     And I should see the text "Published on: 19/11/2021"
     And I should see the heading "Join our community!"
     When I click "more events"
@@ -37,7 +37,7 @@ Feature:
     And I should see the text "News"
     And I should not see the heading "News"
     And I should see the link "more news"
-    And I should see the link "Report abusive content"
+    And I should not see the link "Report abusive content"
     And I should see the text "Published on: 19/11/2021"
     And I should see the heading "Join our community!"
     When I click "more news"
-- 
GitLab


From 1bf2ab5ade88ae965100116e1f587c4333589195 Mon Sep 17 00:00:00 2001
From: Alexandre Dias <alex.jm.dias@gmail.com>
Date: Tue, 7 Jan 2025 13:34:07 +0000
Subject: [PATCH 136/137] ISAICP-9192: Use bundles and remove extra tests.

---
 .../block.block.openeuropawebtoolsetrans.yml  | 13 +++++++-
 .../interoperable_europe.feature              | 30 +++++--------------
 web/themes/iop/iop.theme                      |  3 +-
 3 files changed, 21 insertions(+), 25 deletions(-)

diff --git a/config/sync/block.block.openeuropawebtoolsetrans.yml b/config/sync/block.block.openeuropawebtoolsetrans.yml
index be00fad6e3..03daa05ccf 100644
--- a/config/sync/block.block.openeuropawebtoolsetrans.yml
+++ b/config/sync/block.block.openeuropawebtoolsetrans.yml
@@ -4,6 +4,7 @@ status: true
 dependencies:
   module:
     - joinup_core
+    - node
     - oe_webtools_etrans
     - system
   theme:
@@ -36,5 +37,15 @@ visibility:
       - entity.taxonomy_term.delete_form
   request_path:
     id: request_path
+    negate: true
+    pages: ''
+  'entity_bundle:node':
+    id: 'entity_bundle:node'
     negate: false
-    pages: "/interoperable-europe/news/*\r\n/interoperable-europe/event/*\r\n/interoperable-europe/document/*\r\n/interoperable-europe/discussion/*"
+    context_mapping: {  }
+    bundles:
+      custom_page: custom_page
+      discussion: discussion
+      document: document
+      event: event
+      news: news
diff --git a/tests/features/communities/interoperable_europe/interoperable_europe.feature b/tests/features/communities/interoperable_europe/interoperable_europe.feature
index bec750b3c6..d1e1afeb22 100644
--- a/tests/features/communities/interoperable_europe/interoperable_europe.feature
+++ b/tests/features/communities/interoperable_europe/interoperable_europe.feature
@@ -9,15 +9,13 @@ Feature:
     When I click "Discover more"
     Then I should see the heading "Joinup is becoming Interoperable Europe Portal"
     And the page should be rendered using the "Interoperable Europe" theme
-    # Uncomment this in ISAICP-9192.
-    # And I should not see the link "Report abusive content"
+    And I should not see the link "Report abusive content"
 
     # Test other pages.
     When I visit "/interoperable-europe/initiatives"
     Then the page should be rendered using the "Interoperable Europe" theme
     And I should see the heading "Initiatives"
     And I should see the heading "Join our community!"
-    And I should not see the link "Report abusive content"
 
     # Event.
     When I visit "/interoperable-europe/event/save-date-semic-coming-back-8-december-2021"
@@ -25,7 +23,6 @@ Feature:
     And I should see the text "Event"
     And I should not see the heading "Event"
     And I should see the link "more events"
-    And I should not see the link "Report abusive content"
     And I should see the text "Published on: 19/11/2021"
     And I should see the heading "Join our community!"
     When I click "more events"
@@ -37,7 +34,6 @@ Feature:
     And I should see the text "News"
     And I should not see the heading "News"
     And I should see the link "more news"
-    And I should not see the link "Report abusive content"
     And I should see the text "Published on: 19/11/2021"
     And I should see the heading "Join our community!"
     When I click "more news"
@@ -82,18 +78,7 @@ Feature:
     Then I should see the error message "Title field is required."
 
   @javascript
-  Scenario: Report link and eTranslate button are not available in IOP custom pages.
-    Given custom_page content:
-      | title    | collection           |
-      | IOP page | Interoperable Europe |
-
-    When I am logged in as a user with the authenticated role
-    And I go to the "IOP page" custom page
-    Then I should not see the link "Report abusive content"
-    And I should not see the button "Translate"
-
-  @javascript
-  Scenario Outline: Report link and eTranslate button are not available in IOP.
+  Scenario Outline: Visibility of Report link and eTranslate button.
     Given <type> content:
       | title      | collection           |
       | IOP <type> | Interoperable Europe |
@@ -104,11 +89,12 @@ Feature:
     And I should see the button "Translate"
 
     Examples:
-      | type       |
-      | news       |
-      | event      |
-      | discussion |
-      | document   |
+      | type        |
+      | news        |
+      | event       |
+      | discussion  |
+      | document    |
+      | custom_page |
 
   @javascript
   Scenario: Regression test that ensures that search bar works fine.
diff --git a/web/themes/iop/iop.theme b/web/themes/iop/iop.theme
index cb03ec2679..48d2113803 100644
--- a/web/themes/iop/iop.theme
+++ b/web/themes/iop/iop.theme
@@ -122,8 +122,7 @@ function iop_preprocess_node(array &$variables): void {
   }
 
   // Disables the "Report" link for IOP.
-  $node = \Drupal::routeMatch()->getParameter('node');
-  if (!$node instanceof NodeInterface || isset($variables['content']['report'])) {
+  if (isset($variables['content']['report'])) {
     $variables['content']['report']['#access'] = FALSE;
   }
 
-- 
GitLab


From 364d090e17797c9992ada2d247e20b2d188e5543 Mon Sep 17 00:00:00 2001
From: Alexandre Dias <alex.jm.dias@gmail.com>
Date: Tue, 7 Jan 2025 22:31:51 +0000
Subject: [PATCH 137/137] ISAICP-9307: Allow all pages.

---
 .../sync/block.block.openeuropawebtoolsetrans.yml   | 13 +------------
 1 file changed, 1 insertion(+), 12 deletions(-)

diff --git a/config/sync/block.block.openeuropawebtoolsetrans.yml b/config/sync/block.block.openeuropawebtoolsetrans.yml
index 03daa05ccf..2be5f650ff 100644
--- a/config/sync/block.block.openeuropawebtoolsetrans.yml
+++ b/config/sync/block.block.openeuropawebtoolsetrans.yml
@@ -4,7 +4,6 @@ status: true
 dependencies:
   module:
     - joinup_core
-    - node
     - oe_webtools_etrans
     - system
   theme:
@@ -38,14 +37,4 @@ visibility:
   request_path:
     id: request_path
     negate: true
-    pages: ''
-  'entity_bundle:node':
-    id: 'entity_bundle:node'
-    negate: false
-    context_mapping: {  }
-    bundles:
-      custom_page: custom_page
-      discussion: discussion
-      document: document
-      event: event
-      news: news
+    pages: /interoperable-europe
-- 
GitLab