From bb5057c063f8d2b3b12a4e9aaec0f026dd289d03 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Thu, 10 Apr 2025 16:48:02 -0400 Subject: [PATCH] Closes #14591: Saved table configurations (#19101) * Add SavedTableConfig * Update table configuration logic to support TableConfigs * Update table config link when updating table * Correct docstring * Misc cleanup * Use multi-select widgets for column selection * Return null config params for tables with no model * Fix auto-selection of selected columns * Update migration * Clean up template * Enforce enabled/shared flags * Search/filter by table name * Misc cleanup * Fix population of selected columns * Ordering field should not be required * Enable cloning for TableConfig * Misc cleanup * Add model documentation for TableConfig * Drop slug field from TableConfig * Improve TableConfig validation * Remove add button from TableConfig list view * Fix ordering validation to account for leading hyphens --- docs/models/extras/tableconfig.md | 43 ++++++ mkdocs.yml | 1 + netbox/extras/api/serializers.py | 1 + .../extras/api/serializers_/tableconfigs.py | 22 +++ netbox/extras/api/urls.py | 1 + netbox/extras/api/views.py | 11 ++ netbox/extras/filtersets.py | 54 ++++++++ netbox/extras/forms/bulk_edit.py | 29 ++++ netbox/extras/forms/filtersets.py | 31 +++++ netbox/extras/forms/model_forms.py | 62 +++++++++ netbox/extras/graphql/filters.py | 14 ++ netbox/extras/graphql/schema.py | 3 + netbox/extras/graphql/types.py | 11 ++ netbox/extras/migrations/0127_tableconfig.py | 56 ++++++++ netbox/extras/models/models.py | 117 ++++++++++++++++ netbox/extras/tables/tables.py | 31 +++++ netbox/extras/urls.py | 3 + netbox/extras/utils.py | 18 +++ netbox/extras/views.py | 93 +++++++++---- netbox/netbox/navigation/menu.py | 1 + netbox/netbox/tables/tables.py | 129 +++++++++++------- netbox/netbox/views/generic/bulk_views.py | 22 ++- netbox/project-static/dist/netbox.js | 8 +- netbox/project-static/dist/netbox.js.map | 4 +- netbox/project-static/src/forms/elements.ts | 6 + netbox/project-static/src/tableConfig.ts | 13 -- netbox/templates/extras/tableconfig.html | 88 ++++++++++++ netbox/templates/extras/tableconfig_edit.html | 48 +++++++ netbox/templates/htmx/table.html | 5 + netbox/templates/inc/table_controls_htmx.html | 20 ++- netbox/utilities/forms/forms.py | 2 +- netbox/utilities/tables.py | 11 ++ 32 files changed, 856 insertions(+), 102 deletions(-) create mode 100644 docs/models/extras/tableconfig.md create mode 100644 netbox/extras/api/serializers_/tableconfigs.py create mode 100644 netbox/extras/migrations/0127_tableconfig.py create mode 100644 netbox/templates/extras/tableconfig.html create mode 100644 netbox/templates/extras/tableconfig_edit.html diff --git a/docs/models/extras/tableconfig.md b/docs/models/extras/tableconfig.md new file mode 100644 index 000000000..e5484ec64 --- /dev/null +++ b/docs/models/extras/tableconfig.md @@ -0,0 +1,43 @@ +# Table Configs + +This object represents the saved configuration of an object table in NetBox. Table configs can be crafted, saved, and shared among users to apply specific views within object lists. Each table config can specify which table columns to display, the order in which to display them, and which columns are used for sorting. + +For example, you might wish to create a table config for the devices list to assist in inventory tasks. This view might show the device name, location, serial number, and asset tag, but omit operational details like IP addresses. Once applied, this table config can be saved for reuse in future audits. + +## Fields + +### Name + +A human-friendly name for the table config. + +### User + +The user to which this filter belongs. The current user will be assigned automatically when saving a table config via the UI, and cannot be changed. + +### Object Type + +The type of NetBox object to which the table config pertains. + +### Table + +The name of the specific table to which the table config pertains. (Some NetBox object use multiple tables.) + +### Weight + +A numeric weight used to influence the order in which table configs are listed. Table configs with a lower weight will be listed before those with a higher weight. Table configs having the same weight will be ordered alphabetically. + +### Enabled + +Determines whether this table config can be used. Disabled table configs will not appear as options in the UI, however they will be included in API results. + +### Shared + +Determines whether this table config is intended for use by all users or only its owner. Note that deselecting this option does **not** hide the table config from other users; it is merely excluded from the list of available table configs in UI object list views. + +### Ordering + +A list of column names by which the table is to be ordered. If left blank, the table's default ordering will be used. + +### Columns + +A list of columns to be displayed in the table. The table will render these columns in the order they appear in the list. At least one column must be selected. diff --git a/mkdocs.yml b/mkdocs.yml index f0bd9af7a..5cab74326 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -233,6 +233,7 @@ nav: - NotificationGroup: 'models/extras/notificationgroup.md' - SavedFilter: 'models/extras/savedfilter.md' - Subscription: 'models/extras/subscription.md' + - TableConfig: 'models/extras/tableconfig.md' - Tag: 'models/extras/tag.md' - Webhook: 'models/extras/webhook.md' - IPAM: diff --git a/netbox/extras/api/serializers.py b/netbox/extras/api/serializers.py index 5e799b504..07540c50d 100644 --- a/netbox/extras/api/serializers.py +++ b/netbox/extras/api/serializers.py @@ -12,4 +12,5 @@ from .serializers_.configcontexts import * from .serializers_.configtemplates import * from .serializers_.savedfilters import * from .serializers_.scripts import * +from .serializers_.tableconfigs import * from .serializers_.tags import * diff --git a/netbox/extras/api/serializers_/tableconfigs.py b/netbox/extras/api/serializers_/tableconfigs.py new file mode 100644 index 000000000..7a4fb7b2a --- /dev/null +++ b/netbox/extras/api/serializers_/tableconfigs.py @@ -0,0 +1,22 @@ +from core.models import ObjectType +from extras.models import TableConfig +from netbox.api.fields import ContentTypeField +from netbox.api.serializers import ValidatedModelSerializer + +__all__ = ( + 'TableConfigSerializer', +) + + +class TableConfigSerializer(ValidatedModelSerializer): + object_type = ContentTypeField( + queryset=ObjectType.objects.all() + ) + + class Meta: + model = TableConfig + fields = [ + 'id', 'url', 'display_url', 'display', 'object_type', 'table', 'name', 'description', 'user', 'weight', + 'enabled', 'shared', 'columns', 'ordering', 'created', 'last_updated', + ] + brief_fields = ('id', 'url', 'display', 'name', 'description', 'object_type', 'table') diff --git a/netbox/extras/api/urls.py b/netbox/extras/api/urls.py index 88121b640..101808753 100644 --- a/netbox/extras/api/urls.py +++ b/netbox/extras/api/urls.py @@ -14,6 +14,7 @@ router.register('custom-field-choice-sets', views.CustomFieldChoiceSetViewSet) router.register('custom-links', views.CustomLinkViewSet) router.register('export-templates', views.ExportTemplateViewSet) router.register('saved-filters', views.SavedFilterViewSet) +router.register('table-configs', views.TableConfigViewSet) router.register('bookmarks', views.BookmarkViewSet) router.register('notifications', views.NotificationViewSet) router.register('notification-groups', views.NotificationGroupViewSet) diff --git a/netbox/extras/api/views.py b/netbox/extras/api/views.py index 49a44f5f1..6e9225f73 100644 --- a/netbox/extras/api/views.py +++ b/netbox/extras/api/views.py @@ -131,6 +131,17 @@ class SavedFilterViewSet(NetBoxModelViewSet): filterset_class = filtersets.SavedFilterFilterSet +# +# Table Configs +# + +class TableConfigViewSet(NetBoxModelViewSet): + metadata_class = ContentTypeMetadata + queryset = TableConfig.objects.all() + serializer_class = serializers.TableConfigSerializer + filterset_class = filtersets.TableConfigFilterSet + + # # Bookmarks # diff --git a/netbox/extras/filtersets.py b/netbox/extras/filtersets.py index 89dd4c9f1..f03359fcf 100644 --- a/netbox/extras/filtersets.py +++ b/netbox/extras/filtersets.py @@ -32,6 +32,7 @@ __all__ = ( 'ObjectTypeFilterSet', 'SavedFilterFilterSet', 'ScriptFilterSet', + 'TableConfigFilterSet', 'TagFilterSet', 'TaggedItemFilterSet', 'WebhookFilterSet', @@ -326,6 +327,59 @@ class SavedFilterFilterSet(ChangeLoggedModelFilterSet): return queryset.filter(Q(enabled=False) | Q(Q(shared=False) & ~Q(user=user))) +class TableConfigFilterSet(ChangeLoggedModelFilterSet): + q = django_filters.CharFilter( + method='search', + label=_('Search'), + ) + object_type_id = django_filters.ModelMultipleChoiceFilter( + queryset=ObjectType.objects.all(), + field_name='object_type' + ) + object_type = ContentTypeFilter( + field_name='object_type' + ) + user_id = django_filters.ModelMultipleChoiceFilter( + queryset=User.objects.all(), + label=_('User (ID)'), + ) + user = django_filters.ModelMultipleChoiceFilter( + field_name='user__username', + queryset=User.objects.all(), + to_field_name='username', + label=_('User (name)'), + ) + usable = django_filters.BooleanFilter( + method='_usable' + ) + + class Meta: + model = TableConfig + fields = ('id', 'name', 'description', 'table', 'enabled', 'shared', 'weight') + + def search(self, queryset, name, value): + if not value.strip(): + return queryset + return queryset.filter( + Q(name__icontains=value) | + Q(description__icontains=value) | + Q(table__icontains=value) + ) + + def _usable(self, queryset, name, value): + """ + Return only TableConfigs that are both enabled and are shared (or belong to the current user). + """ + user = self.request.user if self.request else None + if not user or user.is_anonymous: + if value: + return queryset.filter(enabled=True, shared=True) + return queryset.filter(Q(enabled=False) | Q(shared=False)) + if value: + return queryset.filter(enabled=True).filter(Q(shared=True) | Q(user=user)) + return queryset.filter(Q(enabled=False) | Q(Q(shared=False) & ~Q(user=user))) + + class BookmarkFilterSet(BaseFilterSet): created = django_filters.DateTimeFilter() object_type_id = MultiValueNumberFilter() diff --git a/netbox/extras/forms/bulk_edit.py b/netbox/extras/forms/bulk_edit.py index 7a78dba8b..c854a6c81 100644 --- a/netbox/extras/forms/bulk_edit.py +++ b/netbox/extras/forms/bulk_edit.py @@ -21,6 +21,7 @@ __all__ = ( 'JournalEntryBulkEditForm', 'NotificationGroupBulkEditForm', 'SavedFilterBulkEditForm', + 'TableConfigBulkEditForm', 'TagBulkEditForm', 'WebhookBulkEditForm', ) @@ -201,6 +202,34 @@ class SavedFilterBulkEditForm(BulkEditForm): nullable_fields = ('description',) +class TableConfigBulkEditForm(BulkEditForm): + pk = forms.ModelMultipleChoiceField( + queryset=TableConfig.objects.all(), + widget=forms.MultipleHiddenInput + ) + description = forms.CharField( + label=_('Description'), + max_length=200, + required=False + ) + weight = forms.IntegerField( + label=_('Weight'), + required=False + ) + enabled = forms.NullBooleanField( + label=_('Enabled'), + required=False, + widget=BulkEditNullBooleanSelect() + ) + shared = forms.NullBooleanField( + label=_('Shared'), + required=False, + widget=BulkEditNullBooleanSelect() + ) + + nullable_fields = ('description',) + + class WebhookBulkEditForm(NetBoxModelBulkEditForm): model = Webhook diff --git a/netbox/extras/forms/filtersets.py b/netbox/extras/forms/filtersets.py index 056ca62a5..9ea5c3a98 100644 --- a/netbox/extras/forms/filtersets.py +++ b/netbox/extras/forms/filtersets.py @@ -31,6 +31,7 @@ __all__ = ( 'LocalConfigContextFilterForm', 'NotificationGroupFilterForm', 'SavedFilterFilterForm', + 'TableConfigFilterForm', 'TagFilterForm', 'WebhookFilterForm', ) @@ -249,6 +250,36 @@ class SavedFilterFilterForm(SavedFiltersMixin, FilterForm): ) +class TableConfigFilterForm(SavedFiltersMixin, FilterForm): + fieldsets = ( + FieldSet('q', 'filter_id'), + FieldSet('object_type_id', 'enabled', 'shared', 'weight', name=_('Attributes')), + ) + object_type_id = ContentTypeMultipleChoiceField( + label=_('Object types'), + queryset=ObjectType.objects.public(), + required=False + ) + enabled = forms.NullBooleanField( + label=_('Enabled'), + required=False, + widget=forms.Select( + choices=BOOLEAN_WITH_BLANK_CHOICES + ) + ) + shared = forms.NullBooleanField( + label=_('Shared'), + required=False, + widget=forms.Select( + choices=BOOLEAN_WITH_BLANK_CHOICES + ) + ) + weight = forms.IntegerField( + label=_('Weight'), + required=False + ) + + class WebhookFilterForm(NetBoxModelFilterSetForm): model = Webhook fieldsets = ( diff --git a/netbox/extras/forms/model_forms.py b/netbox/extras/forms/model_forms.py index 594b7d9d0..418aa6aae 100644 --- a/netbox/extras/forms/model_forms.py +++ b/netbox/extras/forms/model_forms.py @@ -2,6 +2,7 @@ import json import re from django import forms +from django.contrib.postgres.forms import SimpleArrayField from django.utils.safestring import mark_safe from django.utils.translation import gettext_lazy as _ @@ -21,6 +22,7 @@ from utilities.forms.fields import ( ) from utilities.forms.rendering import FieldSet, ObjectAttribute from utilities.forms.widgets import ChoicesWidget, HTMXSelect +from utilities.tables import get_table_for_model from virtualization.models import Cluster, ClusterGroup, ClusterType __all__ = ( @@ -37,6 +39,7 @@ __all__ = ( 'NotificationGroupForm', 'SavedFilterForm', 'SubscriptionForm', + 'TableConfigForm', 'TagForm', 'WebhookForm', ) @@ -301,6 +304,65 @@ class SavedFilterForm(forms.ModelForm): super().__init__(*args, initial=initial, **kwargs) +class TableConfigForm(forms.ModelForm): + object_type = ContentTypeChoiceField( + label=_('Object type'), + queryset=ObjectType.objects.all() + ) + ordering = SimpleArrayField( + base_field=forms.CharField(), + required=False, + label=_('Ordering'), + help_text=_( + "Enter a comma-separated list of column names. Prepend a name with a hyphen to reverse the order." + ) + ) + available_columns = SimpleArrayField( + base_field=forms.CharField(), + required=False, + widget=forms.SelectMultiple( + attrs={'size': 10, 'class': 'form-select'} + ), + label=_('Available Columns') + ) + columns = SimpleArrayField( + base_field=forms.CharField(), + widget=forms.SelectMultiple( + attrs={'size': 10, 'class': 'form-select select-all'} + ), + label=_('Selected Columns') + ) + + class Meta: + model = TableConfig + exclude = ('user',) + + def __init__(self, data=None, *args, **kwargs): + super().__init__(data, *args, **kwargs) + + object_type = ObjectType.objects.get(pk=get_field_value(self, 'object_type')) + model = object_type.model_class() + table_name = get_field_value(self, 'table') + table_class = get_table_for_model(model, table_name) + table = table_class([]) + + if columns := self._get_columns(): + table._set_columns(columns) + + # Initialize columns field based on table attributes + self.fields['available_columns'].widget.choices = table.available_columns + self.fields['columns'].widget.choices = table.selected_columns + + def _get_columns(self): + if self.is_bound and (columns := self.data.getlist('columns')): + return columns + if 'columns' in self.initial: + columns = self.get_initial_for_field(self.fields['columns'], 'columns') + return columns.split(',') if type(columns) is str else columns + if self.instance is not None: + return self.instance.columns + + class BookmarkForm(forms.ModelForm): object_type = ContentTypeChoiceField( label=_('Object type'), diff --git a/netbox/extras/graphql/filters.py b/netbox/extras/graphql/filters.py index b8db143e4..2798c4896 100644 --- a/netbox/extras/graphql/filters.py +++ b/netbox/extras/graphql/filters.py @@ -34,6 +34,7 @@ __all__ = ( 'JournalEntryFilter', 'NotificationGroupFilter', 'SavedFilterFilter', + 'TableConfigFilter', 'TagFilter', 'WebhookFilter', ) @@ -262,6 +263,19 @@ class SavedFilterFilter(BaseObjectTypeFilterMixin, ChangeLogFilterMixin): ) +@strawberry_django.filter(models.TableConfig, lookups=True) +class TableConfigFilter(BaseObjectTypeFilterMixin, ChangeLogFilterMixin): + name: FilterLookup[str] | None = strawberry_django.filter_field() + description: FilterLookup[str] | None = strawberry_django.filter_field() + user: Annotated['UserFilter', strawberry.lazy('users.graphql.filters')] | None = strawberry_django.filter_field() + user_id: ID | None = strawberry_django.filter_field() + weight: Annotated['IntegerLookup', strawberry.lazy('netbox.graphql.filter_lookups')] | None = ( + strawberry_django.filter_field() + ) + enabled: FilterLookup[bool] | None = strawberry_django.filter_field() + shared: FilterLookup[bool] | None = strawberry_django.filter_field() + + @strawberry_django.filter(models.Tag, lookups=True) class TagFilter(BaseObjectTypeFilterMixin, ChangeLogFilterMixin, TagBaseFilterMixin): color: Annotated['ColorEnum', strawberry.lazy('netbox.graphql.enums')] | None = strawberry_django.filter_field() diff --git a/netbox/extras/graphql/schema.py b/netbox/extras/graphql/schema.py index 7d2d11bf1..947ff0b00 100644 --- a/netbox/extras/graphql/schema.py +++ b/netbox/extras/graphql/schema.py @@ -32,6 +32,9 @@ class ExtrasQuery: saved_filter: SavedFilterType = strawberry_django.field() saved_filter_list: List[SavedFilterType] = strawberry_django.field() + table_config: TableConfigType = strawberry_django.field() + table_config_list: List[TableConfigType] = strawberry_django.field() + journal_entry: JournalEntryType = strawberry_django.field() journal_entry_list: List[JournalEntryType] = strawberry_django.field() diff --git a/netbox/extras/graphql/types.py b/netbox/extras/graphql/types.py index f4a1a397f..4bd836f6b 100644 --- a/netbox/extras/graphql/types.py +++ b/netbox/extras/graphql/types.py @@ -38,6 +38,7 @@ __all__ = ( 'NotificationType', 'SavedFilterType', 'SubscriptionType', + 'TableConfigType', 'TagType', 'WebhookType', ) @@ -186,6 +187,16 @@ class SubscriptionType(ObjectType): user: Annotated["UserType", strawberry.lazy('users.graphql.types')] | None +@strawberry_django.type( + models.TableConfig, + fields='__all__', + filters=TableConfigFilter, + pagination=True +) +class TableConfigType(ObjectType): + user: Annotated["UserType", strawberry.lazy('users.graphql.types')] | None + + @strawberry_django.type( models.Tag, exclude=['extras_taggeditem_items', ], diff --git a/netbox/extras/migrations/0127_tableconfig.py b/netbox/extras/migrations/0127_tableconfig.py new file mode 100644 index 000000000..e4cc30b70 --- /dev/null +++ b/netbox/extras/migrations/0127_tableconfig.py @@ -0,0 +1,56 @@ +import django.contrib.postgres.fields +import django.db.models.deletion +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + dependencies = [ + ('core', '0014_remove_redundant_indexes'), + ('extras', '0126_configtemplate_as_attachment_and_more'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.CreateModel( + name='TableConfig', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False)), + ('created', models.DateTimeField(auto_now_add=True, null=True)), + ('last_updated', models.DateTimeField(auto_now=True, null=True)), + ('table', models.CharField(max_length=100)), + ('name', models.CharField(max_length=100)), + ('description', models.CharField(blank=True, max_length=200)), + ('weight', models.PositiveSmallIntegerField(default=100)), + ('enabled', models.BooleanField(default=True)), + ('shared', models.BooleanField(default=True)), + ( + 'columns', + django.contrib.postgres.fields.ArrayField(base_field=models.CharField(max_length=100), size=None), + ), + ( + 'ordering', + django.contrib.postgres.fields.ArrayField( + base_field=models.CharField(max_length=100), blank=True, null=True, size=None + ), + ), + ( + 'object_type', + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, related_name='table_configs', to='core.objecttype' + ), + ), + ( + 'user', + models.ForeignKey( + blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL + ), + ), + ], + options={ + 'verbose_name': 'table config', + 'verbose_name_plural': 'table configs', + 'ordering': ('weight', 'name'), + }, + ), + ] diff --git a/netbox/extras/models/models.py b/netbox/extras/models/models.py index 76fad1082..d0bb5af6e 100644 --- a/netbox/extras/models/models.py +++ b/netbox/extras/models/models.py @@ -27,6 +27,7 @@ from utilities.html import clean_html from utilities.jinja2 import render_jinja2 from utilities.querydict import dict_to_querydict from utilities.querysets import RestrictedQuerySet +from utilities.tables import get_table_for_model __all__ = ( 'Bookmark', @@ -36,6 +37,7 @@ __all__ = ( 'ImageAttachment', 'JournalEntry', 'SavedFilter', + 'TableConfig', 'Webhook', ) @@ -524,6 +526,121 @@ class SavedFilter(CloningMixin, ExportTemplatesMixin, ChangeLoggedModel): return qd.urlencode() +class TableConfig(CloningMixin, ChangeLoggedModel): + """ + A saved configuration of columns and ordering which applies to a specific table. + """ + object_type = models.ForeignKey( + to='core.ObjectType', + on_delete=models.CASCADE, + related_name='table_configs', + help_text=_("The table's object type"), + ) + table = models.CharField( + verbose_name=_('table'), + max_length=100, + ) + name = models.CharField( + verbose_name=_('name'), + max_length=100, + ) + description = models.CharField( + verbose_name=_('description'), + max_length=200, + blank=True, + ) + user = models.ForeignKey( + to=settings.AUTH_USER_MODEL, + on_delete=models.SET_NULL, + blank=True, + null=True, + ) + weight = models.PositiveSmallIntegerField( + verbose_name=_('weight'), + default=100 + ) + enabled = models.BooleanField( + verbose_name=_('enabled'), + default=True + ) + shared = models.BooleanField( + verbose_name=_('shared'), + default=True + ) + columns = ArrayField( + base_field=models.CharField(max_length=100), + ) + ordering = ArrayField( + base_field=models.CharField(max_length=100), + blank=True, + null=True, + ) + + clone_fields = ('object_type', 'table', 'enabled', 'shared', 'columns', 'ordering') + + class Meta: + ordering = ('weight', 'name') + verbose_name = _('table config') + verbose_name_plural = _('table configs') + + def __str__(self): + return self.name + + def get_absolute_url(self): + return reverse('extras:tableconfig', args=[self.pk]) + + @property + def docs_url(self): + return f'{settings.STATIC_URL}docs/models/extras/tableconfig/' + + @property + def table_class(self): + return get_table_for_model(self.object_type.model_class(), name=self.table) + + @property + def ordering_items(self): + """ + Return a list of two-tuples indicating the column(s) by which the table is to be ordered and a boolean for each + column indicating whether its ordering is ascending. + """ + items = [] + for col in self.ordering or []: + if col.startswith('-'): + ascending = False + col = col[1:] + else: + ascending = True + items.append((col, ascending)) + return items + + def clean(self): + super().clean() + + # Validate table + if self.table_class is None: + raise ValidationError({ + 'table': _("Unknown table: {name}").format(name=self.table) + }) + + table = self.table_class([]) + + # Validate ordering columns + for name in self.ordering: + if name.startswith('-'): + name = name[1:] # Strip leading hyphen + if name not in table.columns: + raise ValidationError({ + 'ordering': _('Unknown column: {name}').format(name=name) + }) + + # Validate selected columns + for name in self.columns: + if name not in table.columns: + raise ValidationError({ + 'columns': _('Unknown column: {name}').format(name=name) + }) + + class ImageAttachment(ChangeLoggedModel): """ An uploaded image which is associated with an object. diff --git a/netbox/extras/tables/tables.py b/netbox/extras/tables/tables.py index 60b207058..54e3e761a 100644 --- a/netbox/extras/tables/tables.py +++ b/netbox/extras/tables/tables.py @@ -27,6 +27,7 @@ __all__ = ( 'ReportResultsTable', 'ScriptResultsTable', 'SubscriptionTable', + 'TableConfigTable', 'TaggedItemTable', 'TagTable', 'WebhookTable', @@ -281,6 +282,36 @@ class SavedFilterTable(NetBoxTable): ) +class TableConfigTable(NetBoxTable): + name = tables.Column( + verbose_name=_('Name'), + linkify=True + ) + object_type = columns.ContentTypeColumn( + verbose_name=_('Object Type'), + ) + table = tables.Column( + verbose_name=_('Table Name') + ) + enabled = columns.BooleanColumn( + verbose_name=_('Enabled'), + ) + shared = columns.BooleanColumn( + verbose_name=_('Shared'), + false_mark=None + ) + + class Meta(NetBoxTable.Meta): + model = TableConfig + fields = ( + 'pk', 'id', 'name', 'object_type', 'table', 'description', 'user', 'weight', 'enabled', 'shared', 'created', + 'last_updated', + ) + default_columns = ( + 'pk', 'name', 'object_type', 'table', 'user', 'description', 'enabled', 'shared', + ) + + class BookmarkTable(NetBoxTable): object_type = columns.ContentTypeColumn( verbose_name=_('Object Types'), diff --git a/netbox/extras/urls.py b/netbox/extras/urls.py index 32633493f..cceb3c5a5 100644 --- a/netbox/extras/urls.py +++ b/netbox/extras/urls.py @@ -19,6 +19,9 @@ urlpatterns = [ path('export-templates/', include(get_model_urls('extras', 'exporttemplate', detail=False))), path('export-templates//', include(get_model_urls('extras', 'exporttemplate'))), + path('table-configs/', include(get_model_urls('extras', 'tableconfig', detail=False))), + path('table-configs//', include(get_model_urls('extras', 'tableconfig'))), + path('saved-filters/', include(get_model_urls('extras', 'savedfilter', detail=False))), path('saved-filters//', include(get_model_urls('extras', 'savedfilter'))), diff --git a/netbox/extras/utils.py b/netbox/extras/utils.py index 155597c30..c9f554d22 100644 --- a/netbox/extras/utils.py +++ b/netbox/extras/utils.py @@ -2,12 +2,14 @@ import importlib from django.core.exceptions import ImproperlyConfigured from django.db import models +from django.db.models import Q from taggit.managers import _TaggableManager from netbox.context import current_request from .validators import CustomValidator __all__ = ( + 'SharedObjectViewMixin', 'image_upload', 'is_report', 'is_script', @@ -16,6 +18,22 @@ __all__ = ( ) +class SharedObjectViewMixin: + + def get_queryset(self, request): + """ + Return only shared objects, or those owned by the current user, unless this is a superuser. + """ + queryset = super().get_queryset(request) + if request.user.is_superuser: + return queryset + if request.user.is_anonymous: + return queryset.filter(shared=True) + return queryset.filter( + Q(shared=True) | Q(user=request.user) + ) + + def filename_from_model(model: models.Model) -> str: """Standardises how we generate filenames from model class for exports""" base = model._meta.verbose_name_plural.lower().replace(' ', '_') diff --git a/netbox/extras/views.py b/netbox/extras/views.py index 2833cec0d..64e3c4895 100644 --- a/netbox/extras/views.py +++ b/netbox/extras/views.py @@ -18,6 +18,7 @@ from dcim.models import Device, DeviceRole, Platform from extras.choices import LogLevelChoices from extras.dashboard.forms import DashboardWidgetAddForm, DashboardWidgetForm from extras.dashboard.utils import get_widget_class +from extras.utils import SharedObjectViewMixin from netbox.constants import DEFAULT_ACTION_PERMISSIONS from netbox.views import generic from netbox.views.generic.mixins import TableMixin @@ -285,39 +286,22 @@ class ExportTemplateBulkSyncDataView(generic.BulkSyncDataView): # Saved filters # -class SavedFilterMixin: - - def get_queryset(self, request): - """ - Return only shared SavedFilters, or those owned by the current user, unless - this is a superuser. - """ - queryset = SavedFilter.objects.all() - user = request.user - if user.is_superuser: - return queryset - if user.is_anonymous: - return queryset.filter(shared=True) - return queryset.filter( - Q(shared=True) | Q(user=user) - ) - - @register_model_view(SavedFilter, 'list', path='', detail=False) -class SavedFilterListView(SavedFilterMixin, generic.ObjectListView): +class SavedFilterListView(SharedObjectViewMixin, generic.ObjectListView): + queryset = SavedFilter.objects.all() filterset = filtersets.SavedFilterFilterSet filterset_form = forms.SavedFilterFilterForm table = tables.SavedFilterTable @register_model_view(SavedFilter) -class SavedFilterView(SavedFilterMixin, generic.ObjectView): +class SavedFilterView(SharedObjectViewMixin, generic.ObjectView): queryset = SavedFilter.objects.all() @register_model_view(SavedFilter, 'add', detail=False) @register_model_view(SavedFilter, 'edit') -class SavedFilterEditView(SavedFilterMixin, generic.ObjectEditView): +class SavedFilterEditView(SharedObjectViewMixin, generic.ObjectEditView): queryset = SavedFilter.objects.all() form = forms.SavedFilterForm @@ -328,18 +312,18 @@ class SavedFilterEditView(SavedFilterMixin, generic.ObjectEditView): @register_model_view(SavedFilter, 'delete') -class SavedFilterDeleteView(SavedFilterMixin, generic.ObjectDeleteView): +class SavedFilterDeleteView(SharedObjectViewMixin, generic.ObjectDeleteView): queryset = SavedFilter.objects.all() @register_model_view(SavedFilter, 'bulk_import', detail=False) -class SavedFilterBulkImportView(SavedFilterMixin, generic.BulkImportView): +class SavedFilterBulkImportView(SharedObjectViewMixin, generic.BulkImportView): queryset = SavedFilter.objects.all() model_form = forms.SavedFilterImportForm @register_model_view(SavedFilter, 'bulk_edit', path='edit', detail=False) -class SavedFilterBulkEditView(SavedFilterMixin, generic.BulkEditView): +class SavedFilterBulkEditView(SharedObjectViewMixin, generic.BulkEditView): queryset = SavedFilter.objects.all() filterset = filtersets.SavedFilterFilterSet table = tables.SavedFilterTable @@ -347,12 +331,71 @@ class SavedFilterBulkEditView(SavedFilterMixin, generic.BulkEditView): @register_model_view(SavedFilter, 'bulk_delete', path='delete', detail=False) -class SavedFilterBulkDeleteView(SavedFilterMixin, generic.BulkDeleteView): +class SavedFilterBulkDeleteView(SharedObjectViewMixin, generic.BulkDeleteView): queryset = SavedFilter.objects.all() filterset = filtersets.SavedFilterFilterSet table = tables.SavedFilterTable +# +# Table configs +# + +@register_model_view(TableConfig, 'list', path='', detail=False) +class TableConfigListView(SharedObjectViewMixin, generic.ObjectListView): + queryset = TableConfig.objects.all() + filterset = filtersets.TableConfigFilterSet + filterset_form = forms.TableConfigFilterForm + table = tables.TableConfigTable + actions = { + 'export': {'view'}, + } + + +@register_model_view(TableConfig) +class TableConfigView(SharedObjectViewMixin, generic.ObjectView): + queryset = TableConfig.objects.all() + + def get_extra_context(self, request, instance): + table = instance.table_class([]) + return { + 'columns': dict(table.columns.items()), + } + + +@register_model_view(TableConfig, 'add', detail=False) +@register_model_view(TableConfig, 'edit') +class TableConfigEditView(SharedObjectViewMixin, generic.ObjectEditView): + queryset = TableConfig.objects.all() + form = forms.TableConfigForm + template_name = 'extras/tableconfig_edit.html' + + def alter_object(self, obj, request, url_args, url_kwargs): + if not obj.pk: + obj.user = request.user + return obj + + +@register_model_view(TableConfig, 'delete') +class TableConfigDeleteView(SharedObjectViewMixin, generic.ObjectDeleteView): + queryset = TableConfig.objects.all() + + +@register_model_view(TableConfig, 'bulk_edit', path='edit', detail=False) +class TableConfigBulkEditView(SharedObjectViewMixin, generic.BulkEditView): + queryset = TableConfig.objects.all() + filterset = filtersets.TableConfigFilterSet + table = tables.TableConfigTable + form = forms.TableConfigBulkEditForm + + +@register_model_view(TableConfig, 'bulk_delete', path='delete', detail=False) +class TableConfigBulkDeleteView(SharedObjectViewMixin, generic.BulkDeleteView): + queryset = TableConfig.objects.all() + filterset = filtersets.TableConfigFilterSet + table = tables.TableConfigTable + + # # Bookmarks # diff --git a/netbox/netbox/navigation/menu.py b/netbox/netbox/navigation/menu.py index 778f0d67c..90a6a9910 100644 --- a/netbox/netbox/navigation/menu.py +++ b/netbox/netbox/navigation/menu.py @@ -349,6 +349,7 @@ CUSTOMIZATION_MENU = Menu( get_model_item('extras', 'customlink', _('Custom Links')), get_model_item('extras', 'exporttemplate', _('Export Templates')), get_model_item('extras', 'savedfilter', _('Saved Filters')), + get_model_item('extras', 'tableconfig', _('Table Configs'), actions=()), get_model_item('extras', 'tag', 'Tags'), get_model_item('extras', 'imageattachment', _('Image Attachments'), actions=()), ), diff --git a/netbox/netbox/tables/tables.py b/netbox/netbox/tables/tables.py index 2d2c430aa..37540a92b 100644 --- a/netbox/netbox/tables/tables.py +++ b/netbox/netbox/tables/tables.py @@ -1,9 +1,9 @@ from copy import deepcopy from functools import cached_property +from urllib.parse import urlencode import django_tables2 as tables from django.conf import settings -from django.contrib.auth.models import AnonymousUser from django.contrib.contenttypes.fields import GenericForeignKey from django.core.exceptions import FieldDoesNotExist from django.db.models.fields.related import RelatedField @@ -20,8 +20,8 @@ from extras.models import CustomField, CustomLink from netbox.constants import EMPTY_TABLE_TEXT from netbox.registry import registry from netbox.tables import columns -from utilities.paginator import EnhancedPaginator, get_paginate_count from utilities.html import highlight +from utilities.paginator import EnhancedPaginator, get_paginate_count from utilities.string import title from utilities.views import get_viewname from .template_code import * @@ -58,40 +58,6 @@ class BaseTable(tables.Table): if self.empty_text is None: self.empty_text = _("No {model_name} found").format(model_name=self._meta.model._meta.verbose_name_plural) - # Determine the table columns to display by checking the following: - # 1. User's configuration for the table - # 2. Meta.default_columns - # 3. Meta.fields - selected_columns = None - if user is not None and not isinstance(user, AnonymousUser): - selected_columns = user.config.get(f"tables.{self.name}.columns") - elif isinstance(user, AnonymousUser) and hasattr(settings, 'DEFAULT_USER_PREFERENCES'): - selected_columns = settings.DEFAULT_USER_PREFERENCES.get('tables', {}).get(self.name, {}).get('columns') - if not selected_columns: - selected_columns = getattr(self.Meta, 'default_columns', self.Meta.fields) - - # Hide non-selected columns which are not exempt - for column in self.columns: - if column.name not in [*selected_columns, *self.exempt_columns]: - self.columns.hide(column.name) - - # Rearrange the sequence to list selected columns first, followed by all remaining columns - # TODO: There's probably a more clever way to accomplish this - self.sequence = [ - *[c for c in selected_columns if c in self.columns.names()], - *[c for c in self.columns.names() if c not in selected_columns] - ] - - # PK column should always come first - if 'pk' in self.sequence: - self.sequence.remove('pk') - self.sequence.insert(0, 'pk') - - # Actions column should always come last - if 'actions' in self.sequence: - self.sequence.remove('actions') - self.sequence.append('actions') - # Dynamically update the table's QuerySet to ensure related fields are pre-fetched if isinstance(self.data, TableQuerysetData): @@ -147,25 +113,67 @@ class BaseTable(tables.Table): self._objects_count = sum(1 for obj in self.data if hasattr(obj, 'pk')) return self._objects_count + def _set_columns(self, selected_columns): + """ + Update the table sequence to display only the named columns and any exempt columns. + """ + # Hide non-selected columns which are not exempt + for column in self.columns: + if column.name not in [*selected_columns, *self.exempt_columns]: + self.columns.hide(column.name) + + # Rearrange the sequence to list selected columns first, followed by all remaining columns + # TODO: There's probably a more clever way to accomplish this + self.sequence = [ + *[c for c in selected_columns if c in self.columns.names()], + *[c for c in self.columns.names() if c not in selected_columns] + ] + + # PK column should always come first + if 'pk' in self.sequence: + self.sequence.remove('pk') + self.sequence.insert(0, 'pk') + + # Actions column should always come last + if 'actions' in self.sequence: + self.sequence.remove('actions') + self.sequence.append('actions') + def configure(self, request): """ Configure the table for a specific request context. This performs pagination and records - the user's preferred ordering logic. + the user's preferred columns & ordering logic. """ - # Save ordering preference - if request.user.is_authenticated: - if self.prefixed_order_by_field in request.GET: - if request.GET[self.prefixed_order_by_field]: - # If an ordering has been specified as a query parameter, save it as the - # user's preferred ordering for this table. - ordering = request.GET.getlist(self.prefixed_order_by_field) - request.user.config.set(f'tables.{self.name}.ordering', ordering, commit=True) - else: - # If the ordering has been set to none (empty), clear any existing preference. - request.user.config.clear(f'tables.{self.name}.ordering', commit=True) - elif ordering := request.user.config.get(f'tables.{self.name}.ordering'): - # If no ordering has been specified, set the preferred ordering (if any). - self.order_by = ordering + columns = None + ordering = None + + if self.prefixed_order_by_field in request.GET: + if request.GET[self.prefixed_order_by_field]: + # If an ordering has been specified as a query parameter, save it as the + # user's preferred ordering for this table. + ordering = request.GET.getlist(self.prefixed_order_by_field) + request.user.config.set(f'tables.{self.name}.ordering', ordering, commit=True) + else: + # If the ordering has been set to none (empty), clear any existing preference. + request.user.config.clear(f'tables.{self.name}.ordering', commit=True) + + # If the user has a saved preference, apply it + if request.user.is_authenticated and (userconfig := request.user.config): + if columns is None: + columns = userconfig.get(f"tables.{self.name}.columns") + if ordering is None: + ordering = userconfig.get(f"tables.{self.name}.ordering") + + # Fall back to the default columns & ordering + if columns is None: + if hasattr(settings, 'DEFAULT_USER_PREFERENCES'): + columns = settings.DEFAULT_USER_PREFERENCES.get('tables', {}).get(self.name, {}).get('columns') + else: + columns = getattr(self.Meta, 'default_columns', self.Meta.fields) + + self._set_columns(columns) + if ordering is not None: + self.order_by = ordering # Paginate the table results paginate = { @@ -174,6 +182,25 @@ class BaseTable(tables.Table): } tables.RequestConfig(request, paginate).configure(self) + @property + def configuration(self): + config = { + 'columns': ','.join([c[0] for c in self.selected_columns]), + } + if self.order_by: + config['ordering'] = self.order_by + return config + + @property + def config_params(self): + if not (model := getattr(self.Meta, 'model', None)): + return None + return urlencode({ + 'object_type': ObjectType.objects.get_for_model(model).pk, + 'table': self.name, + **self.configuration, + }) + class NetBoxTable(BaseTable): """ diff --git a/netbox/netbox/views/generic/bulk_views.py b/netbox/netbox/views/generic/bulk_views.py index 447e2a6c5..8df9f945f 100644 --- a/netbox/netbox/views/generic/bulk_views.py +++ b/netbox/netbox/views/generic/bulk_views.py @@ -7,7 +7,7 @@ from django.contrib.contenttypes.fields import GenericForeignKey, GenericRel from django.contrib.contenttypes.models import ContentType from django.core.exceptions import FieldDoesNotExist, ObjectDoesNotExist, ValidationError from django.db import transaction, IntegrityError -from django.db.models import ManyToManyField, ProtectedError, RestrictedError +from django.db.models import ManyToManyField, ProtectedError, Q, RestrictedError from django.db.models.fields.reverse_related import ManyToManyRel from django.forms import ModelMultipleChoiceField, MultipleHiddenInput from django.http import HttpResponse @@ -21,7 +21,7 @@ from mptt.models import MPTTModel from core.models import ObjectType from core.signals import clear_events from extras.choices import CustomFieldUIEditableChoices -from extras.models import CustomField, ExportTemplate +from extras.models import CustomField, ExportTemplate, TableConfig from utilities.error_handlers import handle_protectederror from utilities.exceptions import AbortRequest, AbortTransaction, PermissionsViolation from utilities.forms import BulkRenameForm, ConfirmationForm, restrict_form_fields @@ -135,6 +135,15 @@ class ObjectListView(BaseMultiObjectView, ActionsMixin, TableMixin): model = self.queryset.model object_type = ObjectType.objects.get_for_model(model) + # If a TableConfig has been specified, apply it & update the user's saved preference + if tableconfig_id := request.GET.get('tableconfig_id'): + tableconfig = get_object_or_404(TableConfig, pk=tableconfig_id) + if request.user.is_authenticated: + table = self.table.__name__ + request.user.config.set(f'tables.{table}.columns', tableconfig.columns) + request.user.config.set(f'tables.{table}.ordering', tableconfig.ordering, commit=True) + return redirect(request.path) + if self.filterset: self.queryset = self.filterset(request.GET, self.queryset, request=request).qs @@ -170,6 +179,14 @@ class ObjectListView(BaseMultiObjectView, ActionsMixin, TableMixin): # Render the objects table table = self.get_table(self.queryset, request, has_bulk_actions) + # Retrieve available configurations for the table + table_configs = TableConfig.objects.filter( + Q(shared=True) | Q(user=request.user if request.user.is_authenticated else None), + object_type=object_type, + table=table.name, + enabled=True, + ) + # If this is an HTMX request, return only the rendered table HTML if htmx_partial(request): if request.GET.get('embedded', False): @@ -186,6 +203,7 @@ class ObjectListView(BaseMultiObjectView, ActionsMixin, TableMixin): context = { 'model': model, 'table': table, + 'table_configs': table_configs, 'actions': actions, 'filter_form': self.filterset_form(request.GET) if self.filterset_form else None, 'prerequisite_model': get_prerequisite_model(self.queryset), diff --git a/netbox/project-static/dist/netbox.js b/netbox/project-static/dist/netbox.js index c93cdc4c4..b022e518d 100644 --- a/netbox/project-static/dist/netbox.js +++ b/netbox/project-static/dist/netbox.js @@ -1,11 +1,11 @@ -"use strict";(()=>{var eu=Object.create;var Mi=Object.defineProperty,tu=Object.defineProperties,nu=Object.getOwnPropertyDescriptor,iu=Object.getOwnPropertyDescriptors,ru=Object.getOwnPropertyNames,fs=Object.getOwnPropertySymbols,ou=Object.getPrototypeOf,hs=Object.prototype.hasOwnProperty,su=Object.prototype.propertyIsEnumerable;var Wr=(n,e,t)=>e in n?Mi(n,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):n[e]=t,O=(n,e)=>{for(var t in e||(e={}))hs.call(e,t)&&Wr(n,t,e[t]);if(fs)for(var t of fs(e))su.call(e,t)&&Wr(n,t,e[t]);return n},ae=(n,e)=>tu(n,iu(e));var au=(n,e)=>()=>(e||n((e={exports:{}}).exports,e),e.exports),ps=(n,e)=>{for(var t in e)Mi(n,t,{get:e[t],enumerable:!0})},lu=(n,e,t,i)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of ru(e))!hs.call(n,r)&&r!==t&&Mi(n,r,{get:()=>e[r],enumerable:!(i=nu(e,r))||i.enumerable});return n};var cu=(n,e,t)=>(t=n!=null?eu(ou(n)):{},lu(e||!n||!n.__esModule?Mi(t,"default",{value:n,enumerable:!0}):t,n));var ee=(n,e,t)=>Wr(n,typeof e!="symbol"?e+"":e,t);var lt=(n,e,t)=>new Promise((i,r)=>{var o=l=>{try{a(t.next(l))}catch(c){r(c)}},s=l=>{try{a(t.throw(l))}catch(c){r(c)}},a=l=>l.done?i(l.value):Promise.resolve(l.value).then(o,s);a((t=t.apply(n,e)).next())});var mc=au((vi,Zo)=>{(function(e,t){typeof vi=="object"&&typeof Zo=="object"?Zo.exports=t():typeof define=="function"&&define.amd?define([],t):typeof vi=="object"?vi.ClipboardJS=t():e.ClipboardJS=t()})(vi,function(){return function(){var n={686:function(i,r,o){"use strict";o.d(r,{default:function(){return He}});var s=o(279),a=o.n(s),l=o(370),c=o.n(l),u=o(817),d=o.n(u);function p(W){try{return document.execCommand(W)}catch(k){return!1}}var v=function(k){var A=d()(k);return p("cut"),A},g=v;function y(W){var k=document.documentElement.getAttribute("dir")==="rtl",A=document.createElement("textarea");A.style.fontSize="12pt",A.style.border="0",A.style.padding="0",A.style.margin="0",A.style.position="absolute",A.style[k?"right":"left"]="-9999px";var V=window.pageYOffset||document.documentElement.scrollTop;return A.style.top="".concat(V,"px"),A.setAttribute("readonly",""),A.value=W,A}var _=function(k,A){var V=y(k);A.container.appendChild(V);var z=d()(V);return p("copy"),V.remove(),z},T=function(k){var A=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{container:document.body},V="";return typeof k=="string"?V=_(k,A):k instanceof HTMLInputElement&&!["text","search","url","tel","password"].includes(k==null?void 0:k.type)?V=_(k.value,A):(V=d()(k),p("copy")),V},w=T;function S(W){"@babel/helpers - typeof";return typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?S=function(A){return typeof A}:S=function(A){return A&&typeof Symbol=="function"&&A.constructor===Symbol&&A!==Symbol.prototype?"symbol":typeof A},S(W)}var M=function(){var k=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},A=k.action,V=A===void 0?"copy":A,z=k.container,q=k.target,U=k.text;if(V!=="copy"&&V!=="cut")throw new Error('Invalid "action" value, use either "copy" or "cut"');if(q!==void 0)if(q&&S(q)==="object"&&q.nodeType===1){if(V==="copy"&&q.hasAttribute("disabled"))throw new Error('Invalid "target" attribute. Please use "readonly" instead of "disabled" attribute');if(V==="cut"&&(q.hasAttribute("readonly")||q.hasAttribute("disabled")))throw new Error(`Invalid "target" attribute. You can't cut text from elements with "readonly" or "disabled" attributes`)}else throw new Error('Invalid "target" value, use a valid Element');if(U)return w(U,{container:z});if(q)return V==="cut"?g(q):w(q,{container:z})},G=M;function F(W){"@babel/helpers - typeof";return typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?F=function(A){return typeof A}:F=function(A){return A&&typeof Symbol=="function"&&A.constructor===Symbol&&A!==Symbol.prototype?"symbol":typeof A},F(W)}function D(W,k){if(!(W instanceof k))throw new TypeError("Cannot call a class as a function")}function L(W,k){for(var A=0;A0&&arguments[0]!==void 0?arguments[0]:{};this.action=typeof z.action=="function"?z.action:this.defaultAction,this.target=typeof z.target=="function"?z.target:this.defaultTarget,this.text=typeof z.text=="function"?z.text:this.defaultText,this.container=F(z.container)==="object"?z.container:document.body}},{key:"listenClick",value:function(z){var q=this;this.listener=c()(z,"click",function(U){return q.onClick(U)})}},{key:"onClick",value:function(z){var q=z.delegateTarget||z.currentTarget,U=this.action(q)||"copy",Z=G({action:U,container:this.container,target:this.target(q),text:this.text(q)});this.emit(Z?"success":"error",{action:U,text:Z,trigger:q,clearSelection:function(){q&&q.focus(),window.getSelection().removeAllRanges()}})}},{key:"defaultAction",value:function(z){return ne("action",z)}},{key:"defaultTarget",value:function(z){var q=ne("target",z);if(q)return document.querySelector(q)}},{key:"defaultText",value:function(z){return ne("text",z)}},{key:"destroy",value:function(){this.listener.destroy()}}],[{key:"copy",value:function(z){var q=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{container:document.body};return w(z,q)}},{key:"cut",value:function(z){return g(z)}},{key:"isSupported",value:function(){var z=arguments.length>0&&arguments[0]!==void 0?arguments[0]:["copy","cut"],q=typeof z=="string"?[z]:z,U=!!document.queryCommandSupported;return q.forEach(function(Z){U=U&&!!document.queryCommandSupported(Z)}),U}}]),A}(a()),He=qe},828:function(i){var r=9;if(typeof Element!="undefined"&&!Element.prototype.matches){var o=Element.prototype;o.matches=o.matchesSelector||o.mozMatchesSelector||o.msMatchesSelector||o.oMatchesSelector||o.webkitMatchesSelector}function s(a,l){for(;a&&a.nodeType!==r;){if(typeof a.matches=="function"&&a.matches(l))return a;a=a.parentNode}}i.exports=s},438:function(i,r,o){var s=o(828);function a(u,d,p,v,g){var y=c.apply(this,arguments);return u.addEventListener(p,y,g),{destroy:function(){u.removeEventListener(p,y,g)}}}function l(u,d,p,v,g){return typeof u.addEventListener=="function"?a.apply(null,arguments):typeof p=="function"?a.bind(null,document).apply(null,arguments):(typeof u=="string"&&(u=document.querySelectorAll(u)),Array.prototype.map.call(u,function(y){return a(y,d,p,v,g)}))}function c(u,d,p,v){return function(g){g.delegateTarget=s(g.target,d),g.delegateTarget&&v.call(u,g)}}i.exports=l},879:function(i,r){r.node=function(o){return o!==void 0&&o instanceof HTMLElement&&o.nodeType===1},r.nodeList=function(o){var s=Object.prototype.toString.call(o);return o!==void 0&&(s==="[object NodeList]"||s==="[object HTMLCollection]")&&"length"in o&&(o.length===0||r.node(o[0]))},r.string=function(o){return typeof o=="string"||o instanceof String},r.fn=function(o){var s=Object.prototype.toString.call(o);return s==="[object Function]"}},370:function(i,r,o){var s=o(879),a=o(438);function l(p,v,g){if(!p&&!v&&!g)throw new Error("Missing required arguments");if(!s.string(v))throw new TypeError("Second argument must be a String");if(!s.fn(g))throw new TypeError("Third argument must be a Function");if(s.node(p))return c(p,v,g);if(s.nodeList(p))return u(p,v,g);if(s.string(p))return d(p,v,g);throw new TypeError("First argument must be a String, HTMLElement, HTMLCollection, or NodeList")}function c(p,v,g){return p.addEventListener(v,g),{destroy:function(){p.removeEventListener(v,g)}}}function u(p,v,g){return Array.prototype.forEach.call(p,function(y){y.addEventListener(v,g)}),{destroy:function(){Array.prototype.forEach.call(p,function(y){y.removeEventListener(v,g)})}}}function d(p,v,g){return a(document.body,p,v,g)}i.exports=l},817:function(i){function r(o){var s;if(o.nodeName==="SELECT")o.focus(),s=o.value;else if(o.nodeName==="INPUT"||o.nodeName==="TEXTAREA"){var a=o.hasAttribute("readonly");a||o.setAttribute("readonly",""),o.select(),o.setSelectionRange(0,o.value.length),a||o.removeAttribute("readonly"),s=o.value}else{o.hasAttribute("contenteditable")&&o.focus();var l=window.getSelection(),c=document.createRange();c.selectNodeContents(o),l.removeAllRanges(),l.addRange(c),s=l.toString()}return s}i.exports=r},279:function(i){function r(){}r.prototype={on:function(o,s,a){var l=this.e||(this.e={});return(l[o]||(l[o]=[])).push({fn:s,ctx:a}),this},once:function(o,s,a){var l=this;function c(){l.off(o,c),s.apply(a,arguments)}return c._=s,this.on(o,c,a)},emit:function(o){var s=[].slice.call(arguments,1),a=((this.e||(this.e={}))[o]||[]).slice(),l=0,c=a.length;for(l;lbs,afterRead:()=>vs,afterWrite:()=>xs,applyStyles:()=>pn,arrow:()=>Ni,auto:()=>jn,basePlacements:()=>ct,beforeMain:()=>ys,beforeRead:()=>ms,beforeWrite:()=>_s,bottom:()=>ge,clippingParents:()=>qr,computeStyles:()=>gn,createPopper:()=>Jn,createPopperBase:()=>ks,createPopperLite:()=>Ns,detectOverflow:()=>ke,end:()=>_t,eventListeners:()=>vn,flip:()=>Pi,hide:()=>Fi,left:()=>he,main:()=>Es,modifierPhases:()=>Yr,offset:()=>$i,placements:()=>qn,popper:()=>Bt,popperGenerator:()=>Gt,popperOffsets:()=>bn,preventOverflow:()=>Bi,read:()=>gs,reference:()=>Ur,right:()=>me,start:()=>ot,top:()=>de,variationPlacements:()=>ki,viewport:()=>Wn,write:()=>ws});var de="top",ge="bottom",me="right",he="left",jn="auto",ct=[de,ge,me,he],ot="start",_t="end",qr="clippingParents",Wn="viewport",Bt="popper",Ur="reference",ki=ct.reduce(function(n,e){return n.concat([e+"-"+ot,e+"-"+_t])},[]),qn=[].concat(ct,[jn]).reduce(function(n,e){return n.concat([e,e+"-"+ot,e+"-"+_t])},[]),ms="beforeRead",gs="read",vs="afterRead",ys="beforeMain",Es="main",bs="afterMain",_s="beforeWrite",ws="write",xs="afterWrite",Yr=[ms,gs,vs,ys,Es,bs,_s,ws,xs];function we(n){return n?(n.nodeName||"").toLowerCase():null}function ce(n){if(n==null)return window;if(n.toString()!=="[object Window]"){var e=n.ownerDocument;return e&&e.defaultView||window}return n}function Ue(n){var e=ce(n).Element;return n instanceof e||n instanceof Element}function be(n){var e=ce(n).HTMLElement;return n instanceof e||n instanceof HTMLElement}function hn(n){if(typeof ShadowRoot=="undefined")return!1;var e=ce(n).ShadowRoot;return n instanceof e||n instanceof ShadowRoot}function uu(n){var e=n.state;Object.keys(e.elements).forEach(function(t){var i=e.styles[t]||{},r=e.attributes[t]||{},o=e.elements[t];!be(o)||!we(o)||(Object.assign(o.style,i),Object.keys(r).forEach(function(s){var a=r[s];a===!1?o.removeAttribute(s):o.setAttribute(s,a===!0?"":a)}))})}function du(n){var e=n.state,t={popper:{position:e.options.strategy,left:"0",top:"0",margin:"0"},arrow:{position:"absolute"},reference:{}};return Object.assign(e.elements.popper.style,t.popper),e.styles=t,e.elements.arrow&&Object.assign(e.elements.arrow.style,t.arrow),function(){Object.keys(e.elements).forEach(function(i){var r=e.elements[i],o=e.attributes[i]||{},s=Object.keys(e.styles.hasOwnProperty(i)?e.styles[i]:t[i]),a=s.reduce(function(l,c){return l[c]="",l},{});!be(r)||!we(r)||(Object.assign(r.style,a),Object.keys(o).forEach(function(l){r.removeAttribute(l)}))})}}var pn={name:"applyStyles",enabled:!0,phase:"write",fn:uu,effect:du,requires:["computeStyles"]};function xe(n){return n.split("-")[0]}var et=Math.max,Vt=Math.min,ut=Math.round;function mn(){var n=navigator.userAgentData;return n!=null&&n.brands&&Array.isArray(n.brands)?n.brands.map(function(e){return e.brand+"/"+e.version}).join(" "):navigator.userAgent}function Un(){return!/^((?!chrome|android).)*safari/i.test(mn())}function Ye(n,e,t){e===void 0&&(e=!1),t===void 0&&(t=!1);var i=n.getBoundingClientRect(),r=1,o=1;e&&be(n)&&(r=n.offsetWidth>0&&ut(i.width)/n.offsetWidth||1,o=n.offsetHeight>0&&ut(i.height)/n.offsetHeight||1);var s=Ue(n)?ce(n):window,a=s.visualViewport,l=!Un()&&t,c=(i.left+(l&&a?a.offsetLeft:0))/r,u=(i.top+(l&&a?a.offsetTop:0))/o,d=i.width/r,p=i.height/o;return{width:d,height:p,top:u,right:c+d,bottom:u+p,left:c,x:c,y:u}}function zt(n){var e=Ye(n),t=n.offsetWidth,i=n.offsetHeight;return Math.abs(e.width-t)<=1&&(t=e.width),Math.abs(e.height-i)<=1&&(i=e.height),{x:n.offsetLeft,y:n.offsetTop,width:t,height:i}}function Yn(n,e){var t=e.getRootNode&&e.getRootNode();if(n.contains(e))return!0;if(t&&hn(t)){var i=e;do{if(i&&n.isSameNode(i))return!0;i=i.parentNode||i.host}while(i)}return!1}function Me(n){return ce(n).getComputedStyle(n)}function Gr(n){return["table","td","th"].indexOf(we(n))>=0}function Se(n){return((Ue(n)?n.ownerDocument:n.document)||window.document).documentElement}function dt(n){return we(n)==="html"?n:n.assignedSlot||n.parentNode||(hn(n)?n.host:null)||Se(n)}function Ts(n){return!be(n)||Me(n).position==="fixed"?null:n.offsetParent}function fu(n){var e=/firefox/i.test(mn()),t=/Trident/i.test(mn());if(t&&be(n)){var i=Me(n);if(i.position==="fixed")return null}var r=dt(n);for(hn(r)&&(r=r.host);be(r)&&["html","body"].indexOf(we(r))<0;){var o=Me(r);if(o.transform!=="none"||o.perspective!=="none"||o.contain==="paint"||["transform","perspective"].indexOf(o.willChange)!==-1||e&&o.willChange==="filter"||e&&o.filter&&o.filter!=="none")return r;r=r.parentNode}return null}function tt(n){for(var e=ce(n),t=Ts(n);t&&Gr(t)&&Me(t).position==="static";)t=Ts(t);return t&&(we(t)==="html"||we(t)==="body"&&Me(t).position==="static")?e:t||fu(n)||e}function jt(n){return["top","bottom"].indexOf(n)>=0?"x":"y"}function Wt(n,e,t){return et(n,Vt(e,t))}function Cs(n,e,t){var i=Wt(n,e,t);return i>t?t:i}function Gn(){return{top:0,right:0,bottom:0,left:0}}function Kn(n){return Object.assign({},Gn(),n)}function Xn(n,e){return e.reduce(function(t,i){return t[i]=n,t},{})}var hu=function(e,t){return e=typeof e=="function"?e(Object.assign({},t.rects,{placement:t.placement})):e,Kn(typeof e!="number"?e:Xn(e,ct))};function pu(n){var e,t=n.state,i=n.name,r=n.options,o=t.elements.arrow,s=t.modifiersData.popperOffsets,a=xe(t.placement),l=jt(a),c=[he,me].indexOf(a)>=0,u=c?"height":"width";if(!(!o||!s)){var d=hu(r.padding,t),p=zt(o),v=l==="y"?de:he,g=l==="y"?ge:me,y=t.rects.reference[u]+t.rects.reference[l]-s[l]-t.rects.popper[u],_=s[l]-t.rects.reference[l],T=tt(o),w=T?l==="y"?T.clientHeight||0:T.clientWidth||0:0,S=y/2-_/2,M=d[v],G=w-p[u]-d[g],F=w/2-p[u]/2+S,D=Wt(M,F,G),L=l;t.modifiersData[i]=(e={},e[L]=D,e.centerOffset=D-F,e)}}function mu(n){var e=n.state,t=n.options,i=t.element,r=i===void 0?"[data-popper-arrow]":i;r!=null&&(typeof r=="string"&&(r=e.elements.popper.querySelector(r),!r)||Yn(e.elements.popper,r)&&(e.elements.arrow=r))}var Ni={name:"arrow",enabled:!0,phase:"main",fn:pu,effect:mu,requires:["popperOffsets"],requiresIfExists:["preventOverflow"]};function Ge(n){return n.split("-")[1]}var gu={top:"auto",right:"auto",bottom:"auto",left:"auto"};function vu(n,e){var t=n.x,i=n.y,r=e.devicePixelRatio||1;return{x:ut(t*r)/r||0,y:ut(i*r)/r||0}}function Ss(n){var e,t=n.popper,i=n.popperRect,r=n.placement,o=n.variation,s=n.offsets,a=n.position,l=n.gpuAcceleration,c=n.adaptive,u=n.roundOffsets,d=n.isFixed,p=s.x,v=p===void 0?0:p,g=s.y,y=g===void 0?0:g,_=typeof u=="function"?u({x:v,y}):{x:v,y};v=_.x,y=_.y;var T=s.hasOwnProperty("x"),w=s.hasOwnProperty("y"),S=he,M=de,G=window;if(c){var F=tt(t),D="clientHeight",L="clientWidth";if(F===ce(t)&&(F=Se(t),Me(F).position!=="static"&&a==="absolute"&&(D="scrollHeight",L="scrollWidth")),F=F,r===de||(r===he||r===me)&&o===_t){M=ge;var N=d&&F===G&&G.visualViewport?G.visualViewport.height:F[D];y-=N-i.height,y*=l?1:-1}if(r===he||(r===de||r===ge)&&o===_t){S=me;var Y=d&&F===G&&G.visualViewport?G.visualViewport.width:F[L];v-=Y-i.width,v*=l?1:-1}}var B=Object.assign({position:a},c&&gu),ie=u===!0?vu({x:v,y},ce(t)):{x:v,y};if(v=ie.x,y=ie.y,l){var J;return Object.assign({},B,(J={},J[M]=w?"0":"",J[S]=T?"0":"",J.transform=(G.devicePixelRatio||1)<=1?"translate("+v+"px, "+y+"px)":"translate3d("+v+"px, "+y+"px, 0)",J))}return Object.assign({},B,(e={},e[M]=w?y+"px":"",e[S]=T?v+"px":"",e.transform="",e))}function yu(n){var e=n.state,t=n.options,i=t.gpuAcceleration,r=i===void 0?!0:i,o=t.adaptive,s=o===void 0?!0:o,a=t.roundOffsets,l=a===void 0?!0:a,c={placement:xe(e.placement),variation:Ge(e.placement),popper:e.elements.popper,popperRect:e.rects.popper,gpuAcceleration:r,isFixed:e.options.strategy==="fixed"};e.modifiersData.popperOffsets!=null&&(e.styles.popper=Object.assign({},e.styles.popper,Ss(Object.assign({},c,{offsets:e.modifiersData.popperOffsets,position:e.options.strategy,adaptive:s,roundOffsets:l})))),e.modifiersData.arrow!=null&&(e.styles.arrow=Object.assign({},e.styles.arrow,Ss(Object.assign({},c,{offsets:e.modifiersData.arrow,position:"absolute",adaptive:!1,roundOffsets:l})))),e.attributes.popper=Object.assign({},e.attributes.popper,{"data-popper-placement":e.placement})}var gn={name:"computeStyles",enabled:!0,phase:"beforeWrite",fn:yu,data:{}};var Ri={passive:!0};function Eu(n){var e=n.state,t=n.instance,i=n.options,r=i.scroll,o=r===void 0?!0:r,s=i.resize,a=s===void 0?!0:s,l=ce(e.elements.popper),c=[].concat(e.scrollParents.reference,e.scrollParents.popper);return o&&c.forEach(function(u){u.addEventListener("scroll",t.update,Ri)}),a&&l.addEventListener("resize",t.update,Ri),function(){o&&c.forEach(function(u){u.removeEventListener("scroll",t.update,Ri)}),a&&l.removeEventListener("resize",t.update,Ri)}}var vn={name:"eventListeners",enabled:!0,phase:"write",fn:function(){},effect:Eu,data:{}};var bu={left:"right",right:"left",bottom:"top",top:"bottom"};function yn(n){return n.replace(/left|right|bottom|top/g,function(e){return bu[e]})}var _u={start:"end",end:"start"};function Hi(n){return n.replace(/start|end/g,function(e){return _u[e]})}function qt(n){var e=ce(n),t=e.pageXOffset,i=e.pageYOffset;return{scrollLeft:t,scrollTop:i}}function Ut(n){return Ye(Se(n)).left+qt(n).scrollLeft}function Kr(n,e){var t=ce(n),i=Se(n),r=t.visualViewport,o=i.clientWidth,s=i.clientHeight,a=0,l=0;if(r){o=r.width,s=r.height;var c=Un();(c||!c&&e==="fixed")&&(a=r.offsetLeft,l=r.offsetTop)}return{width:o,height:s,x:a+Ut(n),y:l}}function Xr(n){var e,t=Se(n),i=qt(n),r=(e=n.ownerDocument)==null?void 0:e.body,o=et(t.scrollWidth,t.clientWidth,r?r.scrollWidth:0,r?r.clientWidth:0),s=et(t.scrollHeight,t.clientHeight,r?r.scrollHeight:0,r?r.clientHeight:0),a=-i.scrollLeft+Ut(n),l=-i.scrollTop;return Me(r||t).direction==="rtl"&&(a+=et(t.clientWidth,r?r.clientWidth:0)-o),{width:o,height:s,x:a,y:l}}function Yt(n){var e=Me(n),t=e.overflow,i=e.overflowX,r=e.overflowY;return/auto|scroll|overlay|hidden/.test(t+r+i)}function Ii(n){return["html","body","#document"].indexOf(we(n))>=0?n.ownerDocument.body:be(n)&&Yt(n)?n:Ii(dt(n))}function wt(n,e){var t;e===void 0&&(e=[]);var i=Ii(n),r=i===((t=n.ownerDocument)==null?void 0:t.body),o=ce(i),s=r?[o].concat(o.visualViewport||[],Yt(i)?i:[]):i,a=e.concat(s);return r?a:a.concat(wt(dt(s)))}function En(n){return Object.assign({},n,{left:n.x,top:n.y,right:n.x+n.width,bottom:n.y+n.height})}function wu(n,e){var t=Ye(n,!1,e==="fixed");return t.top=t.top+n.clientTop,t.left=t.left+n.clientLeft,t.bottom=t.top+n.clientHeight,t.right=t.left+n.clientWidth,t.width=n.clientWidth,t.height=n.clientHeight,t.x=t.left,t.y=t.top,t}function As(n,e,t){return e===Wn?En(Kr(n,t)):Ue(e)?wu(e,t):En(Xr(Se(n)))}function xu(n){var e=wt(dt(n)),t=["absolute","fixed"].indexOf(Me(n).position)>=0,i=t&&be(n)?tt(n):n;return Ue(i)?e.filter(function(r){return Ue(r)&&Yn(r,i)&&we(r)!=="body"}):[]}function Qr(n,e,t,i){var r=e==="clippingParents"?xu(n):[].concat(e),o=[].concat(r,[t]),s=o[0],a=o.reduce(function(l,c){var u=As(n,c,i);return l.top=et(u.top,l.top),l.right=Vt(u.right,l.right),l.bottom=Vt(u.bottom,l.bottom),l.left=et(u.left,l.left),l},As(n,s,i));return a.width=a.right-a.left,a.height=a.bottom-a.top,a.x=a.left,a.y=a.top,a}function Qn(n){var e=n.reference,t=n.element,i=n.placement,r=i?xe(i):null,o=i?Ge(i):null,s=e.x+e.width/2-t.width/2,a=e.y+e.height/2-t.height/2,l;switch(r){case de:l={x:s,y:e.y-t.height};break;case ge:l={x:s,y:e.y+e.height};break;case me:l={x:e.x+e.width,y:a};break;case he:l={x:e.x-t.width,y:a};break;default:l={x:e.x,y:e.y}}var c=r?jt(r):null;if(c!=null){var u=c==="y"?"height":"width";switch(o){case ot:l[c]=l[c]-(e[u]/2-t[u]/2);break;case _t:l[c]=l[c]+(e[u]/2-t[u]/2);break;default:}}return l}function ke(n,e){e===void 0&&(e={});var t=e,i=t.placement,r=i===void 0?n.placement:i,o=t.strategy,s=o===void 0?n.strategy:o,a=t.boundary,l=a===void 0?qr:a,c=t.rootBoundary,u=c===void 0?Wn:c,d=t.elementContext,p=d===void 0?Bt:d,v=t.altBoundary,g=v===void 0?!1:v,y=t.padding,_=y===void 0?0:y,T=Kn(typeof _!="number"?_:Xn(_,ct)),w=p===Bt?Ur:Bt,S=n.rects.popper,M=n.elements[g?w:p],G=Qr(Ue(M)?M:M.contextElement||Se(n.elements.popper),l,u,s),F=Ye(n.elements.reference),D=Qn({reference:F,element:S,strategy:"absolute",placement:r}),L=En(Object.assign({},S,D)),N=p===Bt?L:F,Y={top:G.top-N.top+T.top,bottom:N.bottom-G.bottom+T.bottom,left:G.left-N.left+T.left,right:N.right-G.right+T.right},B=n.modifiersData.offset;if(p===Bt&&B){var ie=B[r];Object.keys(Y).forEach(function(J){var Te=[me,ge].indexOf(J)>=0?1:-1,Ce=[de,ge].indexOf(J)>=0?"y":"x";Y[J]+=ie[Ce]*Te})}return Y}function Jr(n,e){e===void 0&&(e={});var t=e,i=t.placement,r=t.boundary,o=t.rootBoundary,s=t.padding,a=t.flipVariations,l=t.allowedAutoPlacements,c=l===void 0?qn:l,u=Ge(i),d=u?a?ki:ki.filter(function(g){return Ge(g)===u}):ct,p=d.filter(function(g){return c.indexOf(g)>=0});p.length===0&&(p=d);var v=p.reduce(function(g,y){return g[y]=ke(n,{placement:y,boundary:r,rootBoundary:o,padding:s})[xe(y)],g},{});return Object.keys(v).sort(function(g,y){return v[g]-v[y]})}function Tu(n){if(xe(n)===jn)return[];var e=yn(n);return[Hi(n),e,Hi(e)]}function Cu(n){var e=n.state,t=n.options,i=n.name;if(!e.modifiersData[i]._skip){for(var r=t.mainAxis,o=r===void 0?!0:r,s=t.altAxis,a=s===void 0?!0:s,l=t.fallbackPlacements,c=t.padding,u=t.boundary,d=t.rootBoundary,p=t.altBoundary,v=t.flipVariations,g=v===void 0?!0:v,y=t.allowedAutoPlacements,_=e.options.placement,T=xe(_),w=T===_,S=l||(w||!g?[yn(_)]:Tu(_)),M=[_].concat(S).reduce(function(z,q){return z.concat(xe(q)===jn?Jr(e,{placement:q,boundary:u,rootBoundary:d,padding:c,flipVariations:g,allowedAutoPlacements:y}):q)},[]),G=e.rects.reference,F=e.rects.popper,D=new Map,L=!0,N=M[0],Y=0;Y=0,Ce=Te?"width":"height",se=ke(e,{placement:B,boundary:u,rootBoundary:d,altBoundary:p,padding:c}),ne=Te?J?me:he:J?ge:de;G[Ce]>F[Ce]&&(ne=yn(ne));var qe=yn(ne),He=[];if(o&&He.push(se[ie]<=0),a&&He.push(se[ne]<=0,se[qe]<=0),He.every(function(z){return z})){N=B,L=!1;break}D.set(B,He)}if(L)for(var W=g?3:1,k=function(q){var U=M.find(function(Z){var oe=D.get(Z);if(oe)return oe.slice(0,q).every(function(bt){return bt})});if(U)return N=U,"break"},A=W;A>0;A--){var V=k(A);if(V==="break")break}e.placement!==N&&(e.modifiersData[i]._skip=!0,e.placement=N,e.reset=!0)}}var Pi={name:"flip",enabled:!0,phase:"main",fn:Cu,requiresIfExists:["offset"],data:{_skip:!1}};function Ds(n,e,t){return t===void 0&&(t={x:0,y:0}),{top:n.top-e.height-t.y,right:n.right-e.width+t.x,bottom:n.bottom-e.height+t.y,left:n.left-e.width-t.x}}function Os(n){return[de,me,ge,he].some(function(e){return n[e]>=0})}function Su(n){var e=n.state,t=n.name,i=e.rects.reference,r=e.rects.popper,o=e.modifiersData.preventOverflow,s=ke(e,{elementContext:"reference"}),a=ke(e,{altBoundary:!0}),l=Ds(s,i),c=Ds(a,r,o),u=Os(l),d=Os(c);e.modifiersData[t]={referenceClippingOffsets:l,popperEscapeOffsets:c,isReferenceHidden:u,hasPopperEscaped:d},e.attributes.popper=Object.assign({},e.attributes.popper,{"data-popper-reference-hidden":u,"data-popper-escaped":d})}var Fi={name:"hide",enabled:!0,phase:"main",requiresIfExists:["preventOverflow"],fn:Su};function Au(n,e,t){var i=xe(n),r=[he,de].indexOf(i)>=0?-1:1,o=typeof t=="function"?t(Object.assign({},e,{placement:n})):t,s=o[0],a=o[1];return s=s||0,a=(a||0)*r,[he,me].indexOf(i)>=0?{x:a,y:s}:{x:s,y:a}}function Du(n){var e=n.state,t=n.options,i=n.name,r=t.offset,o=r===void 0?[0,0]:r,s=qn.reduce(function(u,d){return u[d]=Au(d,e.rects,o),u},{}),a=s[e.placement],l=a.x,c=a.y;e.modifiersData.popperOffsets!=null&&(e.modifiersData.popperOffsets.x+=l,e.modifiersData.popperOffsets.y+=c),e.modifiersData[i]=s}var $i={name:"offset",enabled:!0,phase:"main",requires:["popperOffsets"],fn:Du};function Ou(n){var e=n.state,t=n.name;e.modifiersData[t]=Qn({reference:e.rects.reference,element:e.rects.popper,strategy:"absolute",placement:e.placement})}var bn={name:"popperOffsets",enabled:!0,phase:"read",fn:Ou,data:{}};function Zr(n){return n==="x"?"y":"x"}function Lu(n){var e=n.state,t=n.options,i=n.name,r=t.mainAxis,o=r===void 0?!0:r,s=t.altAxis,a=s===void 0?!1:s,l=t.boundary,c=t.rootBoundary,u=t.altBoundary,d=t.padding,p=t.tether,v=p===void 0?!0:p,g=t.tetherOffset,y=g===void 0?0:g,_=ke(e,{boundary:l,rootBoundary:c,padding:d,altBoundary:u}),T=xe(e.placement),w=Ge(e.placement),S=!w,M=jt(T),G=Zr(M),F=e.modifiersData.popperOffsets,D=e.rects.reference,L=e.rects.popper,N=typeof y=="function"?y(Object.assign({},e.rects,{placement:e.placement})):y,Y=typeof N=="number"?{mainAxis:N,altAxis:N}:Object.assign({mainAxis:0,altAxis:0},N),B=e.modifiersData.offset?e.modifiersData.offset[e.placement]:null,ie={x:0,y:0};if(F){if(o){var J,Te=M==="y"?de:he,Ce=M==="y"?ge:me,se=M==="y"?"height":"width",ne=F[M],qe=ne+_[Te],He=ne-_[Ce],W=v?-L[se]/2:0,k=w===ot?D[se]:L[se],A=w===ot?-L[se]:-D[se],V=e.elements.arrow,z=v&&V?zt(V):{width:0,height:0},q=e.modifiersData["arrow#persistent"]?e.modifiersData["arrow#persistent"].padding:Gn(),U=q[Te],Z=q[Ce],oe=Wt(0,D[se],z[se]),bt=S?D[se]/2-W-oe-U-Y.mainAxis:k-oe-U-Y.mainAxis,Fr=S?-D[se]/2+W+oe+Z+Y.mainAxis:A+oe+Z+Y.mainAxis,sn=e.elements.arrow&&tt(e.elements.arrow),an=sn?M==="y"?sn.clientTop||0:sn.clientLeft||0:0,Ti=(J=B==null?void 0:B[M])!=null?J:0,$r=ne+bt-Ti-an,Ci=ne+Fr-Ti,Si=Wt(v?Vt(qe,$r):qe,ne,v?et(He,Ci):He);F[M]=Si,ie[M]=Si-ne}if(a){var $n,Ai=M==="x"?de:he,ln=M==="x"?ge:me,st=F[G],cn=G==="y"?"height":"width",Bn=st+_[Ai],un=st-_[ln],dn=[de,he].indexOf(T)!==-1,$t=($n=B==null?void 0:B[G])!=null?$n:0,Di=dn?Bn:st-D[cn]-L[cn]-$t+Y.altAxis,Vn=dn?st+D[cn]+L[cn]-$t-Y.altAxis:un,Oi=v&&dn?Cs(Di,st,Vn):Wt(v?Di:Bn,st,v?Vn:un);F[G]=Oi,ie[G]=Oi-st}e.modifiersData[i]=ie}}var Bi={name:"preventOverflow",enabled:!0,phase:"main",fn:Lu,requiresIfExists:["offset"]};function eo(n){return{scrollLeft:n.scrollLeft,scrollTop:n.scrollTop}}function to(n){return n===ce(n)||!be(n)?qt(n):eo(n)}function Mu(n){var e=n.getBoundingClientRect(),t=ut(e.width)/n.offsetWidth||1,i=ut(e.height)/n.offsetHeight||1;return t!==1||i!==1}function no(n,e,t){t===void 0&&(t=!1);var i=be(e),r=be(e)&&Mu(e),o=Se(e),s=Ye(n,r,t),a={scrollLeft:0,scrollTop:0},l={x:0,y:0};return(i||!i&&!t)&&((we(e)!=="body"||Yt(o))&&(a=to(e)),be(e)?(l=Ye(e,!0),l.x+=e.clientLeft,l.y+=e.clientTop):o&&(l.x=Ut(o))),{x:s.left+a.scrollLeft-l.x,y:s.top+a.scrollTop-l.y,width:s.width,height:s.height}}function ku(n){var e=new Map,t=new Set,i=[];n.forEach(function(o){e.set(o.name,o)});function r(o){t.add(o.name);var s=[].concat(o.requires||[],o.requiresIfExists||[]);s.forEach(function(a){if(!t.has(a)){var l=e.get(a);l&&r(l)}}),i.push(o)}return n.forEach(function(o){t.has(o.name)||r(o)}),i}function io(n){var e=ku(n);return Yr.reduce(function(t,i){return t.concat(e.filter(function(r){return r.phase===i}))},[])}function ro(n){var e;return function(){return e||(e=new Promise(function(t){Promise.resolve().then(function(){e=void 0,t(n())})})),e}}function oo(n){var e=n.reduce(function(t,i){var r=t[i.name];return t[i.name]=r?Object.assign({},r,i,{options:Object.assign({},r.options,i.options),data:Object.assign({},r.data,i.data)}):i,t},{});return Object.keys(e).map(function(t){return e[t]})}var Ls={placement:"bottom",modifiers:[],strategy:"absolute"};function Ms(){for(var n=arguments.length,e=new Array(n),t=0;t(n&&window.CSS&&window.CSS.escape&&(n=n.replace(/#([^\s"#']+)/g,(e,t)=>`#${CSS.escape(t)}`)),n),Pu=n=>n==null?`${n}`:Object.prototype.toString.call(n).match(/\s([a-z]+)/i)[1].toLowerCase(),Fu=n=>{do n+=Math.floor(Math.random()*Hu);while(document.getElementById(n));return n},$u=n=>{if(!n)return 0;let{transitionDuration:e,transitionDelay:t}=window.getComputedStyle(n),i=Number.parseFloat(e),r=Number.parseFloat(t);return!i&&!r?0:(e=e.split(",")[0],t=t.split(",")[0],(Number.parseFloat(e)+Number.parseFloat(t))*Iu)},ca=n=>{n.dispatchEvent(new Event(wo))},ft=n=>!n||typeof n!="object"?!1:(typeof n.jquery!="undefined"&&(n=n[0]),typeof n.nodeType!="undefined"),Tt=n=>ft(n)?n.jquery?n[0]:n:typeof n=="string"&&n.length>0?document.querySelector(la(n)):null,An=n=>{if(!ft(n)||n.getClientRects().length===0)return!1;let e=getComputedStyle(n).getPropertyValue("visibility")==="visible",t=n.closest("details:not([open])");if(!t)return e;if(t!==n){let i=n.closest("summary");if(i&&i.parentNode!==t||i===null)return!1}return e},Ct=n=>!n||n.nodeType!==Node.ELEMENT_NODE||n.classList.contains("disabled")?!0:typeof n.disabled!="undefined"?n.disabled:n.hasAttribute("disabled")&&n.getAttribute("disabled")!=="false",ua=n=>{if(!document.documentElement.attachShadow)return null;if(typeof n.getRootNode=="function"){let e=n.getRootNode();return e instanceof ShadowRoot?e:null}return n instanceof ShadowRoot?n:n.parentNode?ua(n.parentNode):null},Xi=()=>{},ii=n=>{n.offsetHeight},da=()=>window.jQuery&&!document.body.hasAttribute("data-bs-no-jquery")?window.jQuery:null,ao=[],Bu=n=>{document.readyState==="loading"?(ao.length||document.addEventListener("DOMContentLoaded",()=>{for(let e of ao)e()}),ao.push(n)):n()},Ke=()=>document.documentElement.dir==="rtl",Qe=n=>{Bu(()=>{let e=da();if(e){let t=n.NAME,i=e.fn[t];e.fn[t]=n.jQueryInterface,e.fn[t].Constructor=n,e.fn[t].noConflict=()=>(e.fn[t]=i,n.jQueryInterface)}})},Ie=(n,e=[],t=n)=>typeof n=="function"?n(...e):t,fa=(n,e,t=!0)=>{if(!t){Ie(n);return}let r=$u(e)+5,o=!1,s=({target:a})=>{a===e&&(o=!0,e.removeEventListener(wo,s),Ie(n))};e.addEventListener(wo,s),setTimeout(()=>{o||ca(e)},r)},So=(n,e,t,i)=>{let r=n.length,o=n.indexOf(e);return o===-1?!t&&i?n[r-1]:n[0]:(o+=t?1:-1,i&&(o=(o+r)%r),n[Math.max(0,Math.min(o,r-1))])},Vu=/[^.]*(?=\..*)\.|.*/,zu=/\..*/,ju=/::\d+$/,lo={},Rs=1,ha={mouseenter:"mouseover",mouseleave:"mouseout"},Wu=new Set(["click","dblclick","mouseup","mousedown","contextmenu","mousewheel","DOMMouseScroll","mouseover","mouseout","mousemove","selectstart","selectend","keydown","keypress","keyup","orientationchange","touchstart","touchmove","touchend","touchcancel","pointerdown","pointermove","pointerup","pointerleave","pointercancel","gesturestart","gesturechange","gestureend","focus","blur","change","reset","select","submit","focusin","focusout","load","unload","beforeunload","resize","move","DOMContentLoaded","readystatechange","error","abort","scroll"]);function pa(n,e){return e&&`${e}::${Rs++}`||n.uidEvent||Rs++}function ma(n){let e=pa(n);return n.uidEvent=e,lo[e]=lo[e]||{},lo[e]}function qu(n,e){return function t(i){return Ao(i,{delegateTarget:n}),t.oneOff&&x.off(n,i.type,e),e.apply(n,[i])}}function Uu(n,e,t){return function i(r){let o=n.querySelectorAll(e);for(let{target:s}=r;s&&s!==this;s=s.parentNode)for(let a of o)if(a===s)return Ao(r,{delegateTarget:s}),i.oneOff&&x.off(n,r.type,e,t),t.apply(s,[r])}}function ga(n,e,t=null){return Object.values(n).find(i=>i.callable===e&&i.delegationSelector===t)}function va(n,e,t){let i=typeof e=="string",r=i?t:e||t,o=ya(n);return Wu.has(o)||(o=n),[i,r,o]}function Hs(n,e,t,i,r){if(typeof e!="string"||!n)return;let[o,s,a]=va(e,t,i);e in ha&&(s=(g=>function(y){if(!y.relatedTarget||y.relatedTarget!==y.delegateTarget&&!y.delegateTarget.contains(y.relatedTarget))return g.call(this,y)})(s));let l=ma(n),c=l[a]||(l[a]={}),u=ga(c,s,o?t:null);if(u){u.oneOff=u.oneOff&&r;return}let d=pa(s,e.replace(Vu,"")),p=o?Uu(n,t,s):qu(n,s);p.delegationSelector=o?t:null,p.callable=s,p.oneOff=r,p.uidEvent=d,c[d]=p,n.addEventListener(a,p,o)}function xo(n,e,t,i,r){let o=ga(e[t],i,r);o&&(n.removeEventListener(t,o,!!r),delete e[t][o.uidEvent])}function Yu(n,e,t,i){let r=e[t]||{};for(let[o,s]of Object.entries(r))o.includes(i)&&xo(n,e,t,s.callable,s.delegationSelector)}function ya(n){return n=n.replace(zu,""),ha[n]||n}var x={on(n,e,t,i){Hs(n,e,t,i,!1)},one(n,e,t,i){Hs(n,e,t,i,!0)},off(n,e,t,i){if(typeof e!="string"||!n)return;let[r,o,s]=va(e,t,i),a=s!==e,l=ma(n),c=l[s]||{},u=e.startsWith(".");if(typeof o!="undefined"){if(!Object.keys(c).length)return;xo(n,l,s,o,r?t:null);return}if(u)for(let d of Object.keys(l))Yu(n,l,d,e.slice(1));for(let[d,p]of Object.entries(c)){let v=d.replace(ju,"");(!a||e.includes(v))&&xo(n,l,s,p.callable,p.delegationSelector)}},trigger(n,e,t){if(typeof e!="string"||!n)return null;let i=da(),r=ya(e),o=e!==r,s=null,a=!0,l=!0,c=!1;o&&i&&(s=i.Event(e,t),i(n).trigger(s),a=!s.isPropagationStopped(),l=!s.isImmediatePropagationStopped(),c=s.isDefaultPrevented());let u=Ao(new Event(e,{bubbles:a,cancelable:!0}),t);return c&&u.preventDefault(),l&&n.dispatchEvent(u),u.defaultPrevented&&s&&s.preventDefault(),u}};function Ao(n,e={}){for(let[t,i]of Object.entries(e))try{n[t]=i}catch(r){Object.defineProperty(n,t,{configurable:!0,get(){return i}})}return n}function Is(n){if(n==="true")return!0;if(n==="false")return!1;if(n===Number(n).toString())return Number(n);if(n===""||n==="null")return null;if(typeof n!="string")return n;try{return JSON.parse(decodeURIComponent(n))}catch(e){return n}}function co(n){return n.replace(/[A-Z]/g,e=>`-${e.toLowerCase()}`)}var ht={setDataAttribute(n,e,t){n.setAttribute(`data-bs-${co(e)}`,t)},removeDataAttribute(n,e){n.removeAttribute(`data-bs-${co(e)}`)},getDataAttributes(n){if(!n)return{};let e={},t=Object.keys(n.dataset).filter(i=>i.startsWith("bs")&&!i.startsWith("bsConfig"));for(let i of t){let r=i.replace(/^bs/,"");r=r.charAt(0).toLowerCase()+r.slice(1,r.length),e[r]=Is(n.dataset[i])}return e},getDataAttribute(n,e){return Is(n.getAttribute(`data-bs-${co(e)}`))}},Qt=class{static get Default(){return{}}static get DefaultType(){return{}}static get NAME(){throw new Error('You have to implement the static method "NAME", for each component!')}_getConfig(e){return e=this._mergeConfigObj(e),e=this._configAfterMerge(e),this._typeCheckConfig(e),e}_configAfterMerge(e){return e}_mergeConfigObj(e,t){let i=ft(t)?ht.getDataAttribute(t,"config"):{};return O(O(O(O({},this.constructor.Default),typeof i=="object"?i:{}),ft(t)?ht.getDataAttributes(t):{}),typeof e=="object"?e:{})}_typeCheckConfig(e,t=this.constructor.DefaultType){for(let[i,r]of Object.entries(t)){let o=e[i],s=ft(o)?"element":Pu(o);if(!new RegExp(r).test(s))throw new TypeError(`${this.constructor.NAME.toUpperCase()}: Option "${i}" provided type "${s}" but expected type "${r}".`)}}},Gu="5.3.3",je=class extends Qt{constructor(e,t){super(),e=Tt(e),e&&(this._element=e,this._config=this._getConfig(t),so.set(this._element,this.constructor.DATA_KEY,this))}dispose(){so.remove(this._element,this.constructor.DATA_KEY),x.off(this._element,this.constructor.EVENT_KEY);for(let e of Object.getOwnPropertyNames(this))this[e]=null}_queueCallback(e,t,i=!0){fa(e,t,i)}_getConfig(e){return e=this._mergeConfigObj(e,this._element),e=this._configAfterMerge(e),this._typeCheckConfig(e),e}static getInstance(e){return so.get(Tt(e),this.DATA_KEY)}static getOrCreateInstance(e,t={}){return this.getInstance(e)||new this(e,typeof t=="object"?t:null)}static get VERSION(){return Gu}static get DATA_KEY(){return`bs.${this.NAME}`}static get EVENT_KEY(){return`.${this.DATA_KEY}`}static eventName(e){return`${e}${this.EVENT_KEY}`}},uo=n=>{let e=n.getAttribute("data-bs-target");if(!e||e==="#"){let t=n.getAttribute("href");if(!t||!t.includes("#")&&!t.startsWith("."))return null;t.includes("#")&&!t.startsWith("#")&&(t=`#${t.split("#")[1]}`),e=t&&t!=="#"?t.trim():null}return e?e.split(",").map(t=>la(t)).join(","):null},j={find(n,e=document.documentElement){return[].concat(...Element.prototype.querySelectorAll.call(e,n))},findOne(n,e=document.documentElement){return Element.prototype.querySelector.call(e,n)},children(n,e){return[].concat(...n.children).filter(t=>t.matches(e))},parents(n,e){let t=[],i=n.parentNode.closest(e);for(;i;)t.push(i),i=i.parentNode.closest(e);return t},prev(n,e){let t=n.previousElementSibling;for(;t;){if(t.matches(e))return[t];t=t.previousElementSibling}return[]},next(n,e){let t=n.nextElementSibling;for(;t;){if(t.matches(e))return[t];t=t.nextElementSibling}return[]},focusableChildren(n){let e=["a","button","input","textarea","select","details","[tabindex]",'[contenteditable="true"]'].map(t=>`${t}:not([tabindex^="-"])`).join(",");return this.find(e,n).filter(t=>!Ct(t)&&An(t))},getSelectorFromElement(n){let e=uo(n);return e&&j.findOne(e)?e:null},getElementFromSelector(n){let e=uo(n);return e?j.findOne(e):null},getMultipleElementsFromSelector(n){let e=uo(n);return e?j.find(e):[]}},rr=(n,e="hide")=>{let t=`click.dismiss${n.EVENT_KEY}`,i=n.NAME;x.on(document,t,`[data-bs-dismiss="${i}"]`,function(r){if(["A","AREA"].includes(this.tagName)&&r.preventDefault(),Ct(this))return;let o=j.getElementFromSelector(this)||this.closest(`.${i}`);n.getOrCreateInstance(o)[e]()})},Ku="alert",Xu="bs.alert",Ea=`.${Xu}`,Qu=`close${Ea}`,Ju=`closed${Ea}`,Zu="fade",ed="show",Qi=class n extends je{static get NAME(){return Ku}close(){if(x.trigger(this._element,Qu).defaultPrevented)return;this._element.classList.remove(ed);let t=this._element.classList.contains(Zu);this._queueCallback(()=>this._destroyElement(),this._element,t)}_destroyElement(){this._element.remove(),x.trigger(this._element,Ju),this.dispose()}static jQueryInterface(e){return this.each(function(){let t=n.getOrCreateInstance(this);if(typeof e=="string"){if(t[e]===void 0||e.startsWith("_")||e==="constructor")throw new TypeError(`No method named "${e}"`);t[e](this)}})}};rr(Qi,"close");Qe(Qi);var td="button",nd="bs.button",id=`.${nd}`,rd=".data-api",od="active",Ps='[data-bs-toggle="button"]',sd=`click${id}${rd}`,Ji=class n extends je{static get NAME(){return td}toggle(){this._element.setAttribute("aria-pressed",this._element.classList.toggle(od))}static jQueryInterface(e){return this.each(function(){let t=n.getOrCreateInstance(this);e==="toggle"&&t[e]()})}};x.on(document,sd,Ps,n=>{n.preventDefault();let e=n.target.closest(Ps);Ji.getOrCreateInstance(e).toggle()});Qe(Ji);var ad="swipe",Dn=".bs.swipe",ld=`touchstart${Dn}`,cd=`touchmove${Dn}`,ud=`touchend${Dn}`,dd=`pointerdown${Dn}`,fd=`pointerup${Dn}`,hd="touch",pd="pen",md="pointer-event",gd=40,vd={endCallback:null,leftCallback:null,rightCallback:null},yd={endCallback:"(function|null)",leftCallback:"(function|null)",rightCallback:"(function|null)"},Zi=class n extends Qt{constructor(e,t){super(),this._element=e,!(!e||!n.isSupported())&&(this._config=this._getConfig(t),this._deltaX=0,this._supportPointerEvents=!!window.PointerEvent,this._initEvents())}static get Default(){return vd}static get DefaultType(){return yd}static get NAME(){return ad}dispose(){x.off(this._element,Dn)}_start(e){if(!this._supportPointerEvents){this._deltaX=e.touches[0].clientX;return}this._eventIsPointerPenTouch(e)&&(this._deltaX=e.clientX)}_end(e){this._eventIsPointerPenTouch(e)&&(this._deltaX=e.clientX-this._deltaX),this._handleSwipe(),Ie(this._config.endCallback)}_move(e){this._deltaX=e.touches&&e.touches.length>1?0:e.touches[0].clientX-this._deltaX}_handleSwipe(){let e=Math.abs(this._deltaX);if(e<=gd)return;let t=e/this._deltaX;this._deltaX=0,t&&Ie(t>0?this._config.rightCallback:this._config.leftCallback)}_initEvents(){this._supportPointerEvents?(x.on(this._element,dd,e=>this._start(e)),x.on(this._element,fd,e=>this._end(e)),this._element.classList.add(md)):(x.on(this._element,ld,e=>this._start(e)),x.on(this._element,cd,e=>this._move(e)),x.on(this._element,ud,e=>this._end(e)))}_eventIsPointerPenTouch(e){return this._supportPointerEvents&&(e.pointerType===pd||e.pointerType===hd)}static isSupported(){return"ontouchstart"in document.documentElement||navigator.maxTouchPoints>0}},Ed="carousel",bd="bs.carousel",Ot=`.${bd}`,ba=".data-api",_d="ArrowLeft",wd="ArrowRight",xd=500,Zn="next",_n="prev",xn="left",Gi="right",Td=`slide${Ot}`,fo=`slid${Ot}`,Cd=`keydown${Ot}`,Sd=`mouseenter${Ot}`,Ad=`mouseleave${Ot}`,Dd=`dragstart${Ot}`,Od=`load${Ot}${ba}`,Ld=`click${Ot}${ba}`,_a="carousel",zi="active",Md="slide",kd="carousel-item-end",Nd="carousel-item-start",Rd="carousel-item-next",Hd="carousel-item-prev",wa=".active",xa=".carousel-item",Id=wa+xa,Pd=".carousel-item img",Fd=".carousel-indicators",$d="[data-bs-slide], [data-bs-slide-to]",Bd='[data-bs-ride="carousel"]',Vd={[_d]:Gi,[wd]:xn},zd={interval:5e3,keyboard:!0,pause:"hover",ride:!1,touch:!0,wrap:!0},jd={interval:"(number|boolean)",keyboard:"boolean",pause:"(string|boolean)",ride:"(boolean|string)",touch:"boolean",wrap:"boolean"},ti=class n extends je{constructor(e,t){super(e,t),this._interval=null,this._activeElement=null,this._isSliding=!1,this.touchTimeout=null,this._swipeHelper=null,this._indicatorsElement=j.findOne(Fd,this._element),this._addEventListeners(),this._config.ride===_a&&this.cycle()}static get Default(){return zd}static get DefaultType(){return jd}static get NAME(){return Ed}next(){this._slide(Zn)}nextWhenVisible(){!document.hidden&&An(this._element)&&this.next()}prev(){this._slide(_n)}pause(){this._isSliding&&ca(this._element),this._clearInterval()}cycle(){this._clearInterval(),this._updateInterval(),this._interval=setInterval(()=>this.nextWhenVisible(),this._config.interval)}_maybeEnableCycle(){if(this._config.ride){if(this._isSliding){x.one(this._element,fo,()=>this.cycle());return}this.cycle()}}to(e){let t=this._getItems();if(e>t.length-1||e<0)return;if(this._isSliding){x.one(this._element,fo,()=>this.to(e));return}let i=this._getItemIndex(this._getActive());if(i===e)return;let r=e>i?Zn:_n;this._slide(r,t[e])}dispose(){this._swipeHelper&&this._swipeHelper.dispose(),super.dispose()}_configAfterMerge(e){return e.defaultInterval=e.interval,e}_addEventListeners(){this._config.keyboard&&x.on(this._element,Cd,e=>this._keydown(e)),this._config.pause==="hover"&&(x.on(this._element,Sd,()=>this.pause()),x.on(this._element,Ad,()=>this._maybeEnableCycle())),this._config.touch&&Zi.isSupported()&&this._addTouchEventListeners()}_addTouchEventListeners(){for(let i of j.find(Pd,this._element))x.on(i,Dd,r=>r.preventDefault());let t={leftCallback:()=>this._slide(this._directionToOrder(xn)),rightCallback:()=>this._slide(this._directionToOrder(Gi)),endCallback:()=>{this._config.pause==="hover"&&(this.pause(),this.touchTimeout&&clearTimeout(this.touchTimeout),this.touchTimeout=setTimeout(()=>this._maybeEnableCycle(),xd+this._config.interval))}};this._swipeHelper=new Zi(this._element,t)}_keydown(e){if(/input|textarea/i.test(e.target.tagName))return;let t=Vd[e.key];t&&(e.preventDefault(),this._slide(this._directionToOrder(t)))}_getItemIndex(e){return this._getItems().indexOf(e)}_setActiveIndicatorElement(e){if(!this._indicatorsElement)return;let t=j.findOne(wa,this._indicatorsElement);t.classList.remove(zi),t.removeAttribute("aria-current");let i=j.findOne(`[data-bs-slide-to="${e}"]`,this._indicatorsElement);i&&(i.classList.add(zi),i.setAttribute("aria-current","true"))}_updateInterval(){let e=this._activeElement||this._getActive();if(!e)return;let t=Number.parseInt(e.getAttribute("data-bs-interval"),10);this._config.interval=t||this._config.defaultInterval}_slide(e,t=null){if(this._isSliding)return;let i=this._getActive(),r=e===Zn,o=t||So(this._getItems(),i,r,this._config.wrap);if(o===i)return;let s=this._getItemIndex(o),a=v=>x.trigger(this._element,v,{relatedTarget:o,direction:this._orderToDirection(e),from:this._getItemIndex(i),to:s});if(a(Td).defaultPrevented||!i||!o)return;let c=!!this._interval;this.pause(),this._isSliding=!0,this._setActiveIndicatorElement(s),this._activeElement=o;let u=r?Nd:kd,d=r?Rd:Hd;o.classList.add(d),ii(o),i.classList.add(u),o.classList.add(u);let p=()=>{o.classList.remove(u,d),o.classList.add(zi),i.classList.remove(zi,d,u),this._isSliding=!1,a(fo)};this._queueCallback(p,i,this._isAnimated()),c&&this.cycle()}_isAnimated(){return this._element.classList.contains(Md)}_getActive(){return j.findOne(Id,this._element)}_getItems(){return j.find(xa,this._element)}_clearInterval(){this._interval&&(clearInterval(this._interval),this._interval=null)}_directionToOrder(e){return Ke()?e===xn?_n:Zn:e===xn?Zn:_n}_orderToDirection(e){return Ke()?e===_n?xn:Gi:e===_n?Gi:xn}static jQueryInterface(e){return this.each(function(){let t=n.getOrCreateInstance(this,e);if(typeof e=="number"){t.to(e);return}if(typeof e=="string"){if(t[e]===void 0||e.startsWith("_")||e==="constructor")throw new TypeError(`No method named "${e}"`);t[e]()}})}};x.on(document,Ld,$d,function(n){let e=j.getElementFromSelector(this);if(!e||!e.classList.contains(_a))return;n.preventDefault();let t=ti.getOrCreateInstance(e),i=this.getAttribute("data-bs-slide-to");if(i){t.to(i),t._maybeEnableCycle();return}if(ht.getDataAttribute(this,"slide")==="next"){t.next(),t._maybeEnableCycle();return}t.prev(),t._maybeEnableCycle()});x.on(window,Od,()=>{let n=j.find(Bd);for(let e of n)ti.getOrCreateInstance(e)});Qe(ti);var Wd="collapse",qd="bs.collapse",ri=`.${qd}`,Ud=".data-api",Yd=`show${ri}`,Gd=`shown${ri}`,Kd=`hide${ri}`,Xd=`hidden${ri}`,Qd=`click${ri}${Ud}`,ho="show",Cn="collapse",ji="collapsing",Jd="collapsed",Zd=`:scope .${Cn} .${Cn}`,ef="collapse-horizontal",tf="width",nf="height",rf=".collapse.show, .collapse.collapsing",To='[data-bs-toggle="collapse"]',of={parent:null,toggle:!0},sf={parent:"(null|element)",toggle:"boolean"},St=class n extends je{constructor(e,t){super(e,t),this._isTransitioning=!1,this._triggerArray=[];let i=j.find(To);for(let r of i){let o=j.getSelectorFromElement(r),s=j.find(o).filter(a=>a===this._element);o!==null&&s.length&&this._triggerArray.push(r)}this._initializeChildren(),this._config.parent||this._addAriaAndCollapsedClass(this._triggerArray,this._isShown()),this._config.toggle&&this.toggle()}static get Default(){return of}static get DefaultType(){return sf}static get NAME(){return Wd}toggle(){this._isShown()?this.hide():this.show()}show(){if(this._isTransitioning||this._isShown())return;let e=[];if(this._config.parent&&(e=this._getFirstLevelChildren(rf).filter(a=>a!==this._element).map(a=>n.getOrCreateInstance(a,{toggle:!1}))),e.length&&e[0]._isTransitioning||x.trigger(this._element,Yd).defaultPrevented)return;for(let a of e)a.hide();let i=this._getDimension();this._element.classList.remove(Cn),this._element.classList.add(ji),this._element.style[i]=0,this._addAriaAndCollapsedClass(this._triggerArray,!0),this._isTransitioning=!0;let r=()=>{this._isTransitioning=!1,this._element.classList.remove(ji),this._element.classList.add(Cn,ho),this._element.style[i]="",x.trigger(this._element,Gd)},s=`scroll${i[0].toUpperCase()+i.slice(1)}`;this._queueCallback(r,this._element,!0),this._element.style[i]=`${this._element[s]}px`}hide(){if(this._isTransitioning||!this._isShown()||x.trigger(this._element,Kd).defaultPrevented)return;let t=this._getDimension();this._element.style[t]=`${this._element.getBoundingClientRect()[t]}px`,ii(this._element),this._element.classList.add(ji),this._element.classList.remove(Cn,ho);for(let r of this._triggerArray){let o=j.getElementFromSelector(r);o&&!this._isShown(o)&&this._addAriaAndCollapsedClass([r],!1)}this._isTransitioning=!0;let i=()=>{this._isTransitioning=!1,this._element.classList.remove(ji),this._element.classList.add(Cn),x.trigger(this._element,Xd)};this._element.style[t]="",this._queueCallback(i,this._element,!0)}_isShown(e=this._element){return e.classList.contains(ho)}_configAfterMerge(e){return e.toggle=!!e.toggle,e.parent=Tt(e.parent),e}_getDimension(){return this._element.classList.contains(ef)?tf:nf}_initializeChildren(){if(!this._config.parent)return;let e=this._getFirstLevelChildren(To);for(let t of e){let i=j.getElementFromSelector(t);i&&this._addAriaAndCollapsedClass([t],this._isShown(i))}}_getFirstLevelChildren(e){let t=j.find(Zd,this._config.parent);return j.find(e,this._config.parent).filter(i=>!t.includes(i))}_addAriaAndCollapsedClass(e,t){if(e.length)for(let i of e)i.classList.toggle(Jd,!t),i.setAttribute("aria-expanded",t)}static jQueryInterface(e){let t={};return typeof e=="string"&&/show|hide/.test(e)&&(t.toggle=!1),this.each(function(){let i=n.getOrCreateInstance(this,t);if(typeof e=="string"){if(typeof i[e]=="undefined")throw new TypeError(`No method named "${e}"`);i[e]()}})}};x.on(document,Qd,To,function(n){(n.target.tagName==="A"||n.delegateTarget&&n.delegateTarget.tagName==="A")&&n.preventDefault();for(let e of j.getMultipleElementsFromSelector(this))St.getOrCreateInstance(e,{toggle:!1}).toggle()});Qe(St);var Fs="dropdown",af="bs.dropdown",Zt=`.${af}`,Do=".data-api",lf="Escape",$s="Tab",cf="ArrowUp",Bs="ArrowDown",uf=2,df=`hide${Zt}`,ff=`hidden${Zt}`,hf=`show${Zt}`,pf=`shown${Zt}`,Ta=`click${Zt}${Do}`,Ca=`keydown${Zt}${Do}`,mf=`keyup${Zt}${Do}`,Tn="show",gf="dropup",vf="dropend",yf="dropstart",Ef="dropup-center",bf="dropdown-center",Kt='[data-bs-toggle="dropdown"]:not(.disabled):not(:disabled)',_f=`${Kt}.${Tn}`,Ki=".dropdown-menu",wf=".navbar",xf=".navbar-nav",Tf=".dropdown-menu .dropdown-item:not(.disabled):not(:disabled)",Cf=Ke()?"top-end":"top-start",Sf=Ke()?"top-start":"top-end",Af=Ke()?"bottom-end":"bottom-start",Df=Ke()?"bottom-start":"bottom-end",Of=Ke()?"left-start":"right-start",Lf=Ke()?"right-start":"left-start",Mf="top",kf="bottom",Nf={autoClose:!0,boundary:"clippingParents",display:"dynamic",offset:[0,2],popperConfig:null,reference:"toggle"},Rf={autoClose:"(boolean|string)",boundary:"(string|element)",display:"string",offset:"(array|string|function)",popperConfig:"(null|object|function)",reference:"(string|element|object)"},At=class n extends je{constructor(e,t){super(e,t),this._popper=null,this._parent=this._element.parentNode,this._menu=j.next(this._element,Ki)[0]||j.prev(this._element,Ki)[0]||j.findOne(Ki,this._parent),this._inNavbar=this._detectNavbar()}static get Default(){return Nf}static get DefaultType(){return Rf}static get NAME(){return Fs}toggle(){return this._isShown()?this.hide():this.show()}show(){if(Ct(this._element)||this._isShown())return;let e={relatedTarget:this._element};if(!x.trigger(this._element,hf,e).defaultPrevented){if(this._createPopper(),"ontouchstart"in document.documentElement&&!this._parent.closest(xf))for(let i of[].concat(...document.body.children))x.on(i,"mouseover",Xi);this._element.focus(),this._element.setAttribute("aria-expanded",!0),this._menu.classList.add(Tn),this._element.classList.add(Tn),x.trigger(this._element,pf,e)}}hide(){if(Ct(this._element)||!this._isShown())return;let e={relatedTarget:this._element};this._completeHide(e)}dispose(){this._popper&&this._popper.destroy(),super.dispose()}update(){this._inNavbar=this._detectNavbar(),this._popper&&this._popper.update()}_completeHide(e){if(!x.trigger(this._element,df,e).defaultPrevented){if("ontouchstart"in document.documentElement)for(let i of[].concat(...document.body.children))x.off(i,"mouseover",Xi);this._popper&&this._popper.destroy(),this._menu.classList.remove(Tn),this._element.classList.remove(Tn),this._element.setAttribute("aria-expanded","false"),ht.removeDataAttribute(this._menu,"popper"),x.trigger(this._element,ff,e)}}_getConfig(e){if(e=super._getConfig(e),typeof e.reference=="object"&&!ft(e.reference)&&typeof e.reference.getBoundingClientRect!="function")throw new TypeError(`${Fs.toUpperCase()}: Option "reference" provided type "object" without a required "getBoundingClientRect" method.`);return e}_createPopper(){if(typeof Vi=="undefined")throw new TypeError("Bootstrap's dropdowns require Popper (https://popper.js.org)");let e=this._element;this._config.reference==="parent"?e=this._parent:ft(this._config.reference)?e=Tt(this._config.reference):typeof this._config.reference=="object"&&(e=this._config.reference);let t=this._getPopperConfig();this._popper=Jn(e,this._menu,t)}_isShown(){return this._menu.classList.contains(Tn)}_getPlacement(){let e=this._parent;if(e.classList.contains(vf))return Of;if(e.classList.contains(yf))return Lf;if(e.classList.contains(Ef))return Mf;if(e.classList.contains(bf))return kf;let t=getComputedStyle(this._menu).getPropertyValue("--bs-position").trim()==="end";return e.classList.contains(gf)?t?Sf:Cf:t?Df:Af}_detectNavbar(){return this._element.closest(wf)!==null}_getOffset(){let{offset:e}=this._config;return typeof e=="string"?e.split(",").map(t=>Number.parseInt(t,10)):typeof e=="function"?t=>e(t,this._element):e}_getPopperConfig(){let e={placement:this._getPlacement(),modifiers:[{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"offset",options:{offset:this._getOffset()}}]};return(this._inNavbar||this._config.display==="static")&&(ht.setDataAttribute(this._menu,"popper","static"),e.modifiers=[{name:"applyStyles",enabled:!1}]),O(O({},e),Ie(this._config.popperConfig,[e]))}_selectMenuItem({key:e,target:t}){let i=j.find(Tf,this._menu).filter(r=>An(r));i.length&&So(i,t,e===Bs,!i.includes(t)).focus()}static jQueryInterface(e){return this.each(function(){let t=n.getOrCreateInstance(this,e);if(typeof e=="string"){if(typeof t[e]=="undefined")throw new TypeError(`No method named "${e}"`);t[e]()}})}static clearMenus(e){if(e.button===uf||e.type==="keyup"&&e.key!==$s)return;let t=j.find(_f);for(let i of t){let r=n.getInstance(i);if(!r||r._config.autoClose===!1)continue;let o=e.composedPath(),s=o.includes(r._menu);if(o.includes(r._element)||r._config.autoClose==="inside"&&!s||r._config.autoClose==="outside"&&s||r._menu.contains(e.target)&&(e.type==="keyup"&&e.key===$s||/input|select|option|textarea|form/i.test(e.target.tagName)))continue;let a={relatedTarget:r._element};e.type==="click"&&(a.clickEvent=e),r._completeHide(a)}}static dataApiKeydownHandler(e){let t=/input|textarea/i.test(e.target.tagName),i=e.key===lf,r=[cf,Bs].includes(e.key);if(!r&&!i||t&&!i)return;e.preventDefault();let o=this.matches(Kt)?this:j.prev(this,Kt)[0]||j.next(this,Kt)[0]||j.findOne(Kt,e.delegateTarget.parentNode),s=n.getOrCreateInstance(o);if(r){e.stopPropagation(),s.show(),s._selectMenuItem(e);return}s._isShown()&&(e.stopPropagation(),s.hide(),o.focus())}};x.on(document,Ca,Kt,At.dataApiKeydownHandler);x.on(document,Ca,Ki,At.dataApiKeydownHandler);x.on(document,Ta,At.clearMenus);x.on(document,mf,At.clearMenus);x.on(document,Ta,Kt,function(n){n.preventDefault(),At.getOrCreateInstance(this).toggle()});Qe(At);var Sa="backdrop",Hf="fade",Vs="show",zs=`mousedown.bs.${Sa}`,If={className:"modal-backdrop",clickCallback:null,isAnimated:!1,isVisible:!0,rootElement:"body"},Pf={className:"string",clickCallback:"(function|null)",isAnimated:"boolean",isVisible:"boolean",rootElement:"(element|string)"},er=class extends Qt{constructor(e){super(),this._config=this._getConfig(e),this._isAppended=!1,this._element=null}static get Default(){return If}static get DefaultType(){return Pf}static get NAME(){return Sa}show(e){if(!this._config.isVisible){Ie(e);return}this._append();let t=this._getElement();this._config.isAnimated&&ii(t),t.classList.add(Vs),this._emulateAnimation(()=>{Ie(e)})}hide(e){if(!this._config.isVisible){Ie(e);return}this._getElement().classList.remove(Vs),this._emulateAnimation(()=>{this.dispose(),Ie(e)})}dispose(){this._isAppended&&(x.off(this._element,zs),this._element.remove(),this._isAppended=!1)}_getElement(){if(!this._element){let e=document.createElement("div");e.className=this._config.className,this._config.isAnimated&&e.classList.add(Hf),this._element=e}return this._element}_configAfterMerge(e){return e.rootElement=Tt(e.rootElement),e}_append(){if(this._isAppended)return;let e=this._getElement();this._config.rootElement.append(e),x.on(e,zs,()=>{Ie(this._config.clickCallback)}),this._isAppended=!0}_emulateAnimation(e){fa(e,this._getElement(),this._config.isAnimated)}},Ff="focustrap",$f="bs.focustrap",tr=`.${$f}`,Bf=`focusin${tr}`,Vf=`keydown.tab${tr}`,zf="Tab",jf="forward",js="backward",Wf={autofocus:!0,trapElement:null},qf={autofocus:"boolean",trapElement:"element"},nr=class extends Qt{constructor(e){super(),this._config=this._getConfig(e),this._isActive=!1,this._lastTabNavDirection=null}static get Default(){return Wf}static get DefaultType(){return qf}static get NAME(){return Ff}activate(){this._isActive||(this._config.autofocus&&this._config.trapElement.focus(),x.off(document,tr),x.on(document,Bf,e=>this._handleFocusin(e)),x.on(document,Vf,e=>this._handleKeydown(e)),this._isActive=!0)}deactivate(){this._isActive&&(this._isActive=!1,x.off(document,tr))}_handleFocusin(e){let{trapElement:t}=this._config;if(e.target===document||e.target===t||t.contains(e.target))return;let i=j.focusableChildren(t);i.length===0?t.focus():this._lastTabNavDirection===js?i[i.length-1].focus():i[0].focus()}_handleKeydown(e){e.key===zf&&(this._lastTabNavDirection=e.shiftKey?js:jf)}},Ws=".fixed-top, .fixed-bottom, .is-fixed, .sticky-top",qs=".sticky-top",Wi="padding-right",Us="margin-right",ni=class{constructor(){this._element=document.body}getWidth(){let e=document.documentElement.clientWidth;return Math.abs(window.innerWidth-e)}hide(){let e=this.getWidth();this._disableOverFlow(),this._setElementAttributes(this._element,Wi,t=>t+e),this._setElementAttributes(Ws,Wi,t=>t+e),this._setElementAttributes(qs,Us,t=>t-e)}reset(){this._resetElementAttributes(this._element,"overflow"),this._resetElementAttributes(this._element,Wi),this._resetElementAttributes(Ws,Wi),this._resetElementAttributes(qs,Us)}isOverflowing(){return this.getWidth()>0}_disableOverFlow(){this._saveInitialAttribute(this._element,"overflow"),this._element.style.overflow="hidden"}_setElementAttributes(e,t,i){let r=this.getWidth(),o=s=>{if(s!==this._element&&window.innerWidth>s.clientWidth+r)return;this._saveInitialAttribute(s,t);let a=window.getComputedStyle(s).getPropertyValue(t);s.style.setProperty(t,`${i(Number.parseFloat(a))}px`)};this._applyManipulationCallback(e,o)}_saveInitialAttribute(e,t){let i=e.style.getPropertyValue(t);i&&ht.setDataAttribute(e,t,i)}_resetElementAttributes(e,t){let i=r=>{let o=ht.getDataAttribute(r,t);if(o===null){r.style.removeProperty(t);return}ht.removeDataAttribute(r,t),r.style.setProperty(t,o)};this._applyManipulationCallback(e,i)}_applyManipulationCallback(e,t){if(ft(e)){t(e);return}for(let i of j.find(e,this._element))t(i)}},Uf="modal",Yf="bs.modal",Xe=`.${Yf}`,Gf=".data-api",Kf="Escape",Xf=`hide${Xe}`,Qf=`hidePrevented${Xe}`,Aa=`hidden${Xe}`,Da=`show${Xe}`,Jf=`shown${Xe}`,Zf=`resize${Xe}`,eh=`click.dismiss${Xe}`,th=`mousedown.dismiss${Xe}`,nh=`keydown.dismiss${Xe}`,ih=`click${Xe}${Gf}`,Ys="modal-open",rh="fade",Gs="show",po="modal-static",oh=".modal.show",sh=".modal-dialog",ah=".modal-body",lh='[data-bs-toggle="modal"]',ch={backdrop:!0,focus:!0,keyboard:!0},uh={backdrop:"(boolean|string)",focus:"boolean",keyboard:"boolean"},nt=class n extends je{constructor(e,t){super(e,t),this._dialog=j.findOne(sh,this._element),this._backdrop=this._initializeBackDrop(),this._focustrap=this._initializeFocusTrap(),this._isShown=!1,this._isTransitioning=!1,this._scrollBar=new ni,this._addEventListeners()}static get Default(){return ch}static get DefaultType(){return uh}static get NAME(){return Uf}toggle(e){return this._isShown?this.hide():this.show(e)}show(e){this._isShown||this._isTransitioning||x.trigger(this._element,Da,{relatedTarget:e}).defaultPrevented||(this._isShown=!0,this._isTransitioning=!0,this._scrollBar.hide(),document.body.classList.add(Ys),this._adjustDialog(),this._backdrop.show(()=>this._showElement(e)))}hide(){!this._isShown||this._isTransitioning||x.trigger(this._element,Xf).defaultPrevented||(this._isShown=!1,this._isTransitioning=!0,this._focustrap.deactivate(),this._element.classList.remove(Gs),this._queueCallback(()=>this._hideModal(),this._element,this._isAnimated()))}dispose(){x.off(window,Xe),x.off(this._dialog,Xe),this._backdrop.dispose(),this._focustrap.deactivate(),super.dispose()}handleUpdate(){this._adjustDialog()}_initializeBackDrop(){return new er({isVisible:!!this._config.backdrop,isAnimated:this._isAnimated()})}_initializeFocusTrap(){return new nr({trapElement:this._element})}_showElement(e){document.body.contains(this._element)||document.body.append(this._element),this._element.style.display="block",this._element.removeAttribute("aria-hidden"),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.scrollTop=0;let t=j.findOne(ah,this._dialog);t&&(t.scrollTop=0),ii(this._element),this._element.classList.add(Gs);let i=()=>{this._config.focus&&this._focustrap.activate(),this._isTransitioning=!1,x.trigger(this._element,Jf,{relatedTarget:e})};this._queueCallback(i,this._dialog,this._isAnimated())}_addEventListeners(){x.on(this._element,nh,e=>{if(e.key===Kf){if(this._config.keyboard){this.hide();return}this._triggerBackdropTransition()}}),x.on(window,Zf,()=>{this._isShown&&!this._isTransitioning&&this._adjustDialog()}),x.on(this._element,th,e=>{x.one(this._element,eh,t=>{if(!(this._element!==e.target||this._element!==t.target)){if(this._config.backdrop==="static"){this._triggerBackdropTransition();return}this._config.backdrop&&this.hide()}})})}_hideModal(){this._element.style.display="none",this._element.setAttribute("aria-hidden",!0),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._isTransitioning=!1,this._backdrop.hide(()=>{document.body.classList.remove(Ys),this._resetAdjustments(),this._scrollBar.reset(),x.trigger(this._element,Aa)})}_isAnimated(){return this._element.classList.contains(rh)}_triggerBackdropTransition(){if(x.trigger(this._element,Qf).defaultPrevented)return;let t=this._element.scrollHeight>document.documentElement.clientHeight,i=this._element.style.overflowY;i==="hidden"||this._element.classList.contains(po)||(t||(this._element.style.overflowY="hidden"),this._element.classList.add(po),this._queueCallback(()=>{this._element.classList.remove(po),this._queueCallback(()=>{this._element.style.overflowY=i},this._dialog)},this._dialog),this._element.focus())}_adjustDialog(){let e=this._element.scrollHeight>document.documentElement.clientHeight,t=this._scrollBar.getWidth(),i=t>0;if(i&&!e){let r=Ke()?"paddingLeft":"paddingRight";this._element.style[r]=`${t}px`}if(!i&&e){let r=Ke()?"paddingRight":"paddingLeft";this._element.style[r]=`${t}px`}}_resetAdjustments(){this._element.style.paddingLeft="",this._element.style.paddingRight=""}static jQueryInterface(e,t){return this.each(function(){let i=n.getOrCreateInstance(this,e);if(typeof e=="string"){if(typeof i[e]=="undefined")throw new TypeError(`No method named "${e}"`);i[e](t)}})}};x.on(document,ih,lh,function(n){let e=j.getElementFromSelector(this);["A","AREA"].includes(this.tagName)&&n.preventDefault(),x.one(e,Da,r=>{r.defaultPrevented||x.one(e,Aa,()=>{An(this)&&this.focus()})});let t=j.findOne(oh);t&&nt.getInstance(t).hide(),nt.getOrCreateInstance(e).toggle(this)});rr(nt);Qe(nt);var dh="offcanvas",fh="bs.offcanvas",gt=`.${fh}`,Oa=".data-api",hh=`load${gt}${Oa}`,ph="Escape",Ks="show",Xs="showing",Qs="hiding",mh="offcanvas-backdrop",La=".offcanvas.show",gh=`show${gt}`,vh=`shown${gt}`,yh=`hide${gt}`,Js=`hidePrevented${gt}`,Ma=`hidden${gt}`,Eh=`resize${gt}`,bh=`click${gt}${Oa}`,_h=`keydown.dismiss${gt}`,wh='[data-bs-toggle="offcanvas"]',xh={backdrop:!0,keyboard:!0,scroll:!1},Th={backdrop:"(boolean|string)",keyboard:"boolean",scroll:"boolean"},Dt=class n extends je{constructor(e,t){super(e,t),this._isShown=!1,this._backdrop=this._initializeBackDrop(),this._focustrap=this._initializeFocusTrap(),this._addEventListeners()}static get Default(){return xh}static get DefaultType(){return Th}static get NAME(){return dh}toggle(e){return this._isShown?this.hide():this.show(e)}show(e){if(this._isShown||x.trigger(this._element,gh,{relatedTarget:e}).defaultPrevented)return;this._isShown=!0,this._backdrop.show(),this._config.scroll||new ni().hide(),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.classList.add(Xs);let i=()=>{(!this._config.scroll||this._config.backdrop)&&this._focustrap.activate(),this._element.classList.add(Ks),this._element.classList.remove(Xs),x.trigger(this._element,vh,{relatedTarget:e})};this._queueCallback(i,this._element,!0)}hide(){if(!this._isShown||x.trigger(this._element,yh).defaultPrevented)return;this._focustrap.deactivate(),this._element.blur(),this._isShown=!1,this._element.classList.add(Qs),this._backdrop.hide();let t=()=>{this._element.classList.remove(Ks,Qs),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._config.scroll||new ni().reset(),x.trigger(this._element,Ma)};this._queueCallback(t,this._element,!0)}dispose(){this._backdrop.dispose(),this._focustrap.deactivate(),super.dispose()}_initializeBackDrop(){let e=()=>{if(this._config.backdrop==="static"){x.trigger(this._element,Js);return}this.hide()},t=!!this._config.backdrop;return new er({className:mh,isVisible:t,isAnimated:!0,rootElement:this._element.parentNode,clickCallback:t?e:null})}_initializeFocusTrap(){return new nr({trapElement:this._element})}_addEventListeners(){x.on(this._element,_h,e=>{if(e.key===ph){if(this._config.keyboard){this.hide();return}x.trigger(this._element,Js)}})}static jQueryInterface(e){return this.each(function(){let t=n.getOrCreateInstance(this,e);if(typeof e=="string"){if(t[e]===void 0||e.startsWith("_")||e==="constructor")throw new TypeError(`No method named "${e}"`);t[e](this)}})}};x.on(document,bh,wh,function(n){let e=j.getElementFromSelector(this);if(["A","AREA"].includes(this.tagName)&&n.preventDefault(),Ct(this))return;x.one(e,Ma,()=>{An(this)&&this.focus()});let t=j.findOne(La);t&&t!==e&&Dt.getInstance(t).hide(),Dt.getOrCreateInstance(e).toggle(this)});x.on(window,hh,()=>{for(let n of j.find(La))Dt.getOrCreateInstance(n).show()});x.on(window,Eh,()=>{for(let n of j.find("[aria-modal][class*=show][class*=offcanvas-]"))getComputedStyle(n).position!=="fixed"&&Dt.getOrCreateInstance(n).hide()});rr(Dt);Qe(Dt);var Ch=/^aria-[\w-]*$/i,ka={"*":["class","dir","id","lang","role",Ch],a:["target","href","title","rel"],area:[],b:[],br:[],col:[],code:[],dd:[],div:[],dl:[],dt:[],em:[],hr:[],h1:[],h2:[],h3:[],h4:[],h5:[],h6:[],i:[],img:["src","srcset","alt","title","width","height"],li:[],ol:[],p:[],pre:[],s:[],small:[],span:[],sub:[],sup:[],strong:[],u:[],ul:[]},Sh=new Set(["background","cite","href","itemtype","longdesc","poster","src","xlink:href"]),Ah=/^(?!javascript:)(?:[a-z0-9+.-]+:|[^&:/?#]*(?:[/?#]|$))/i,Dh=(n,e)=>{let t=n.nodeName.toLowerCase();return e.includes(t)?Sh.has(t)?!!Ah.test(n.nodeValue):!0:e.filter(i=>i instanceof RegExp).some(i=>i.test(t))};function Oh(n,e,t){if(!n.length)return n;if(t&&typeof t=="function")return t(n);let r=new window.DOMParser().parseFromString(n,"text/html"),o=[].concat(...r.body.querySelectorAll("*"));for(let s of o){let a=s.nodeName.toLowerCase();if(!Object.keys(e).includes(a)){s.remove();continue}let l=[].concat(...s.attributes),c=[].concat(e["*"]||[],e[a]||[]);for(let u of l)Dh(u,c)||s.removeAttribute(u.nodeName)}return r.body.innerHTML}var Lh="TemplateFactory",Mh={allowList:ka,content:{},extraClass:"",html:!1,sanitize:!0,sanitizeFn:null,template:"
"},kh={allowList:"object",content:"object",extraClass:"(string|function)",html:"boolean",sanitize:"boolean",sanitizeFn:"(null|function)",template:"string"},Nh={entry:"(string|element|function|null)",selector:"(string|element)"},Co=class extends Qt{constructor(e){super(),this._config=this._getConfig(e)}static get Default(){return Mh}static get DefaultType(){return kh}static get NAME(){return Lh}getContent(){return Object.values(this._config.content).map(e=>this._resolvePossibleFunction(e)).filter(Boolean)}hasContent(){return this.getContent().length>0}changeContent(e){return this._checkContent(e),this._config.content=O(O({},this._config.content),e),this}toHtml(){let e=document.createElement("div");e.innerHTML=this._maybeSanitize(this._config.template);for(let[r,o]of Object.entries(this._config.content))this._setContent(e,o,r);let t=e.children[0],i=this._resolvePossibleFunction(this._config.extraClass);return i&&t.classList.add(...i.split(" ")),t}_typeCheckConfig(e){super._typeCheckConfig(e),this._checkContent(e.content)}_checkContent(e){for(let[t,i]of Object.entries(e))super._typeCheckConfig({selector:t,entry:i},Nh)}_setContent(e,t,i){let r=j.findOne(i,e);if(r){if(t=this._resolvePossibleFunction(t),!t){r.remove();return}if(ft(t)){this._putElementInTemplate(Tt(t),r);return}if(this._config.html){r.innerHTML=this._maybeSanitize(t);return}r.textContent=t}}_maybeSanitize(e){return this._config.sanitize?Oh(e,this._config.allowList,this._config.sanitizeFn):e}_resolvePossibleFunction(e){return Ie(e,[this])}_putElementInTemplate(e,t){if(this._config.html){t.innerHTML="",t.append(e);return}t.textContent=e.textContent}},Rh="tooltip",Hh=new Set(["sanitize","allowList","sanitizeFn"]),mo="fade",Ih="modal",qi="show",Ph=".tooltip-inner",Zs=`.${Ih}`,ea="hide.bs.modal",ei="hover",go="focus",Fh="click",$h="manual",Bh="hide",Vh="hidden",zh="show",jh="shown",Wh="inserted",qh="click",Uh="focusin",Yh="focusout",Gh="mouseenter",Kh="mouseleave",Xh={AUTO:"auto",TOP:"top",RIGHT:Ke()?"left":"right",BOTTOM:"bottom",LEFT:Ke()?"right":"left"},Qh={allowList:ka,animation:!0,boundary:"clippingParents",container:!1,customClass:"",delay:0,fallbackPlacements:["top","right","bottom","left"],html:!1,offset:[0,6],placement:"top",popperConfig:null,sanitize:!0,sanitizeFn:null,selector:!1,template:'',title:"",trigger:"hover focus"},Jh={allowList:"object",animation:"boolean",boundary:"(string|element)",container:"(string|element|boolean)",customClass:"(string|function)",delay:"(number|object)",fallbackPlacements:"array",html:"boolean",offset:"(array|string|function)",placement:"(string|function)",popperConfig:"(null|object|function)",sanitize:"boolean",sanitizeFn:"(null|function)",selector:"(string|boolean)",template:"string",title:"(string|element|function)",trigger:"string"},pt=class n extends je{constructor(e,t){if(typeof Vi=="undefined")throw new TypeError("Bootstrap's tooltips require Popper (https://popper.js.org)");super(e,t),this._isEnabled=!0,this._timeout=0,this._isHovered=null,this._activeTrigger={},this._popper=null,this._templateFactory=null,this._newContent=null,this.tip=null,this._setListeners(),this._config.selector||this._fixTitle()}static get Default(){return Qh}static get DefaultType(){return Jh}static get NAME(){return Rh}enable(){this._isEnabled=!0}disable(){this._isEnabled=!1}toggleEnabled(){this._isEnabled=!this._isEnabled}toggle(){if(this._isEnabled){if(this._activeTrigger.click=!this._activeTrigger.click,this._isShown()){this._leave();return}this._enter()}}dispose(){clearTimeout(this._timeout),x.off(this._element.closest(Zs),ea,this._hideModalHandler),this._element.getAttribute("data-bs-original-title")&&this._element.setAttribute("title",this._element.getAttribute("data-bs-original-title")),this._disposePopper(),super.dispose()}show(){if(this._element.style.display==="none")throw new Error("Please use show on visible elements");if(!(this._isWithContent()&&this._isEnabled))return;let e=x.trigger(this._element,this.constructor.eventName(zh)),i=(ua(this._element)||this._element.ownerDocument.documentElement).contains(this._element);if(e.defaultPrevented||!i)return;this._disposePopper();let r=this._getTipElement();this._element.setAttribute("aria-describedby",r.getAttribute("id"));let{container:o}=this._config;if(this._element.ownerDocument.documentElement.contains(this.tip)||(o.append(r),x.trigger(this._element,this.constructor.eventName(Wh))),this._popper=this._createPopper(r),r.classList.add(qi),"ontouchstart"in document.documentElement)for(let a of[].concat(...document.body.children))x.on(a,"mouseover",Xi);let s=()=>{x.trigger(this._element,this.constructor.eventName(jh)),this._isHovered===!1&&this._leave(),this._isHovered=!1};this._queueCallback(s,this.tip,this._isAnimated())}hide(){if(!this._isShown()||x.trigger(this._element,this.constructor.eventName(Bh)).defaultPrevented)return;if(this._getTipElement().classList.remove(qi),"ontouchstart"in document.documentElement)for(let r of[].concat(...document.body.children))x.off(r,"mouseover",Xi);this._activeTrigger[Fh]=!1,this._activeTrigger[go]=!1,this._activeTrigger[ei]=!1,this._isHovered=null;let i=()=>{this._isWithActiveTrigger()||(this._isHovered||this._disposePopper(),this._element.removeAttribute("aria-describedby"),x.trigger(this._element,this.constructor.eventName(Vh)))};this._queueCallback(i,this.tip,this._isAnimated())}update(){this._popper&&this._popper.update()}_isWithContent(){return!!this._getTitle()}_getTipElement(){return this.tip||(this.tip=this._createTipElement(this._newContent||this._getContentForTemplate())),this.tip}_createTipElement(e){let t=this._getTemplateFactory(e).toHtml();if(!t)return null;t.classList.remove(mo,qi),t.classList.add(`bs-${this.constructor.NAME}-auto`);let i=Fu(this.constructor.NAME).toString();return t.setAttribute("id",i),this._isAnimated()&&t.classList.add(mo),t}setContent(e){this._newContent=e,this._isShown()&&(this._disposePopper(),this.show())}_getTemplateFactory(e){return this._templateFactory?this._templateFactory.changeContent(e):this._templateFactory=new Co(ae(O({},this._config),{content:e,extraClass:this._resolvePossibleFunction(this._config.customClass)})),this._templateFactory}_getContentForTemplate(){return{[Ph]:this._getTitle()}}_getTitle(){return this._resolvePossibleFunction(this._config.title)||this._element.getAttribute("data-bs-original-title")}_initializeOnDelegatedTarget(e){return this.constructor.getOrCreateInstance(e.delegateTarget,this._getDelegateConfig())}_isAnimated(){return this._config.animation||this.tip&&this.tip.classList.contains(mo)}_isShown(){return this.tip&&this.tip.classList.contains(qi)}_createPopper(e){let t=Ie(this._config.placement,[this,e,this._element]),i=Xh[t.toUpperCase()];return Jn(this._element,e,this._getPopperConfig(i))}_getOffset(){let{offset:e}=this._config;return typeof e=="string"?e.split(",").map(t=>Number.parseInt(t,10)):typeof e=="function"?t=>e(t,this._element):e}_resolvePossibleFunction(e){return Ie(e,[this._element])}_getPopperConfig(e){let t={placement:e,modifiers:[{name:"flip",options:{fallbackPlacements:this._config.fallbackPlacements}},{name:"offset",options:{offset:this._getOffset()}},{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"arrow",options:{element:`.${this.constructor.NAME}-arrow`}},{name:"preSetPlacement",enabled:!0,phase:"beforeMain",fn:i=>{this._getTipElement().setAttribute("data-popper-placement",i.state.placement)}}]};return O(O({},t),Ie(this._config.popperConfig,[t]))}_setListeners(){let e=this._config.trigger.split(" ");for(let t of e)if(t==="click")x.on(this._element,this.constructor.eventName(qh),this._config.selector,i=>{this._initializeOnDelegatedTarget(i).toggle()});else if(t!==$h){let i=t===ei?this.constructor.eventName(Gh):this.constructor.eventName(Uh),r=t===ei?this.constructor.eventName(Kh):this.constructor.eventName(Yh);x.on(this._element,i,this._config.selector,o=>{let s=this._initializeOnDelegatedTarget(o);s._activeTrigger[o.type==="focusin"?go:ei]=!0,s._enter()}),x.on(this._element,r,this._config.selector,o=>{let s=this._initializeOnDelegatedTarget(o);s._activeTrigger[o.type==="focusout"?go:ei]=s._element.contains(o.relatedTarget),s._leave()})}this._hideModalHandler=()=>{this._element&&this.hide()},x.on(this._element.closest(Zs),ea,this._hideModalHandler)}_fixTitle(){let e=this._element.getAttribute("title");e&&(!this._element.getAttribute("aria-label")&&!this._element.textContent.trim()&&this._element.setAttribute("aria-label",e),this._element.setAttribute("data-bs-original-title",e),this._element.removeAttribute("title"))}_enter(){if(this._isShown()||this._isHovered){this._isHovered=!0;return}this._isHovered=!0,this._setTimeout(()=>{this._isHovered&&this.show()},this._config.delay.show)}_leave(){this._isWithActiveTrigger()||(this._isHovered=!1,this._setTimeout(()=>{this._isHovered||this.hide()},this._config.delay.hide))}_setTimeout(e,t){clearTimeout(this._timeout),this._timeout=setTimeout(e,t)}_isWithActiveTrigger(){return Object.values(this._activeTrigger).includes(!0)}_getConfig(e){let t=ht.getDataAttributes(this._element);for(let i of Object.keys(t))Hh.has(i)&&delete t[i];return e=O(O({},t),typeof e=="object"&&e?e:{}),e=this._mergeConfigObj(e),e=this._configAfterMerge(e),this._typeCheckConfig(e),e}_configAfterMerge(e){return e.container=e.container===!1?document.body:Tt(e.container),typeof e.delay=="number"&&(e.delay={show:e.delay,hide:e.delay}),typeof e.title=="number"&&(e.title=e.title.toString()),typeof e.content=="number"&&(e.content=e.content.toString()),e}_getDelegateConfig(){let e={};for(let[t,i]of Object.entries(this._config))this.constructor.Default[t]!==i&&(e[t]=i);return e.selector=!1,e.trigger="manual",e}_disposePopper(){this._popper&&(this._popper.destroy(),this._popper=null),this.tip&&(this.tip.remove(),this.tip=null)}static jQueryInterface(e){return this.each(function(){let t=n.getOrCreateInstance(this,e);if(typeof e=="string"){if(typeof t[e]=="undefined")throw new TypeError(`No method named "${e}"`);t[e]()}})}};Qe(pt);var Zh="popover",ep=".popover-header",tp=".popover-body",np=ae(O({},pt.Default),{content:"",offset:[0,8],placement:"right",template:'',trigger:"click"}),ip=ae(O({},pt.DefaultType),{content:"(null|string|element|function)"}),Sn=class n extends pt{static get Default(){return np}static get DefaultType(){return ip}static get NAME(){return Zh}_isWithContent(){return this._getTitle()||this._getContent()}_getContentForTemplate(){return{[ep]:this._getTitle(),[tp]:this._getContent()}}_getContent(){return this._resolvePossibleFunction(this._config.content)}static jQueryInterface(e){return this.each(function(){let t=n.getOrCreateInstance(this,e);if(typeof e=="string"){if(typeof t[e]=="undefined")throw new TypeError(`No method named "${e}"`);t[e]()}})}};Qe(Sn);var rp="scrollspy",op="bs.scrollspy",Oo=`.${op}`,sp=".data-api",ap=`activate${Oo}`,ta=`click${Oo}`,lp=`load${Oo}${sp}`,cp="dropdown-item",wn="active",up='[data-bs-spy="scroll"]',vo="[href]",dp=".nav, .list-group",na=".nav-link",fp=".nav-item",hp=".list-group-item",pp=`${na}, ${fp} > ${na}, ${hp}`,mp=".dropdown",gp=".dropdown-toggle",vp={offset:null,rootMargin:"0px 0px -25%",smoothScroll:!1,target:null,threshold:[.1,.5,1]},yp={offset:"(number|null)",rootMargin:"string",smoothScroll:"boolean",target:"element",threshold:"array"},ir=class n extends je{constructor(e,t){super(e,t),this._targetLinks=new Map,this._observableSections=new Map,this._rootElement=getComputedStyle(this._element).overflowY==="visible"?null:this._element,this._activeTarget=null,this._observer=null,this._previousScrollData={visibleEntryTop:0,parentScrollTop:0},this.refresh()}static get Default(){return vp}static get DefaultType(){return yp}static get NAME(){return rp}refresh(){this._initializeTargetsAndObservables(),this._maybeEnableSmoothScroll(),this._observer?this._observer.disconnect():this._observer=this._getNewObserver();for(let e of this._observableSections.values())this._observer.observe(e)}dispose(){this._observer.disconnect(),super.dispose()}_configAfterMerge(e){return e.target=Tt(e.target)||document.body,e.rootMargin=e.offset?`${e.offset}px 0px -30%`:e.rootMargin,typeof e.threshold=="string"&&(e.threshold=e.threshold.split(",").map(t=>Number.parseFloat(t))),e}_maybeEnableSmoothScroll(){this._config.smoothScroll&&(x.off(this._config.target,ta),x.on(this._config.target,ta,vo,e=>{let t=this._observableSections.get(e.target.hash);if(t){e.preventDefault();let i=this._rootElement||window,r=t.offsetTop-this._element.offsetTop;if(i.scrollTo){i.scrollTo({top:r,behavior:"smooth"});return}i.scrollTop=r}}))}_getNewObserver(){let e={root:this._rootElement,threshold:this._config.threshold,rootMargin:this._config.rootMargin};return new IntersectionObserver(t=>this._observerCallback(t),e)}_observerCallback(e){let t=s=>this._targetLinks.get(`#${s.target.id}`),i=s=>{this._previousScrollData.visibleEntryTop=s.target.offsetTop,this._process(t(s))},r=(this._rootElement||document.documentElement).scrollTop,o=r>=this._previousScrollData.parentScrollTop;this._previousScrollData.parentScrollTop=r;for(let s of e){if(!s.isIntersecting){this._activeTarget=null,this._clearActiveClass(t(s));continue}let a=s.target.offsetTop>=this._previousScrollData.visibleEntryTop;if(o&&a){if(i(s),!r)return;continue}!o&&!a&&i(s)}}_initializeTargetsAndObservables(){this._targetLinks=new Map,this._observableSections=new Map;let e=j.find(vo,this._config.target);for(let t of e){if(!t.hash||Ct(t))continue;let i=j.findOne(decodeURI(t.hash),this._element);An(i)&&(this._targetLinks.set(decodeURI(t.hash),t),this._observableSections.set(t.hash,i))}}_process(e){this._activeTarget!==e&&(this._clearActiveClass(this._config.target),this._activeTarget=e,e.classList.add(wn),this._activateParents(e),x.trigger(this._element,ap,{relatedTarget:e}))}_activateParents(e){if(e.classList.contains(cp)){j.findOne(gp,e.closest(mp)).classList.add(wn);return}for(let t of j.parents(e,dp))for(let i of j.prev(t,pp))i.classList.add(wn)}_clearActiveClass(e){e.classList.remove(wn);let t=j.find(`${vo}.${wn}`,e);for(let i of t)i.classList.remove(wn)}static jQueryInterface(e){return this.each(function(){let t=n.getOrCreateInstance(this,e);if(typeof e=="string"){if(t[e]===void 0||e.startsWith("_")||e==="constructor")throw new TypeError(`No method named "${e}"`);t[e]()}})}};x.on(window,lp,()=>{for(let n of j.find(up))ir.getOrCreateInstance(n)});Qe(ir);var Ep="tab",bp="bs.tab",en=`.${bp}`,_p=`hide${en}`,wp=`hidden${en}`,xp=`show${en}`,Tp=`shown${en}`,Cp=`click${en}`,Sp=`keydown${en}`,Ap=`load${en}`,Dp="ArrowLeft",ia="ArrowRight",Op="ArrowUp",ra="ArrowDown",yo="Home",oa="End",Xt="active",sa="fade",Eo="show",Lp="dropdown",Na=".dropdown-toggle",Mp=".dropdown-menu",bo=`:not(${Na})`,kp='.list-group, .nav, [role="tablist"]',Np=".nav-item, .list-group-item",Rp=`.nav-link${bo}, .list-group-item${bo}, [role="tab"]${bo}`,Ra='[data-bs-toggle="tab"], [data-bs-toggle="pill"], [data-bs-toggle="list"]',_o=`${Rp}, ${Ra}`,Hp=`.${Xt}[data-bs-toggle="tab"], .${Xt}[data-bs-toggle="pill"], .${Xt}[data-bs-toggle="list"]`,Jt=class n extends je{constructor(e){super(e),this._parent=this._element.closest(kp),this._parent&&(this._setInitialAttributes(this._parent,this._getChildren()),x.on(this._element,Sp,t=>this._keydown(t)))}static get NAME(){return Ep}show(){let e=this._element;if(this._elemIsActive(e))return;let t=this._getActiveElem(),i=t?x.trigger(t,_p,{relatedTarget:e}):null;x.trigger(e,xp,{relatedTarget:t}).defaultPrevented||i&&i.defaultPrevented||(this._deactivate(t,e),this._activate(e,t))}_activate(e,t){if(!e)return;e.classList.add(Xt),this._activate(j.getElementFromSelector(e));let i=()=>{if(e.getAttribute("role")!=="tab"){e.classList.add(Eo);return}e.removeAttribute("tabindex"),e.setAttribute("aria-selected",!0),this._toggleDropDown(e,!0),x.trigger(e,Tp,{relatedTarget:t})};this._queueCallback(i,e,e.classList.contains(sa))}_deactivate(e,t){if(!e)return;e.classList.remove(Xt),e.blur(),this._deactivate(j.getElementFromSelector(e));let i=()=>{if(e.getAttribute("role")!=="tab"){e.classList.remove(Eo);return}e.setAttribute("aria-selected",!1),e.setAttribute("tabindex","-1"),this._toggleDropDown(e,!1),x.trigger(e,wp,{relatedTarget:t})};this._queueCallback(i,e,e.classList.contains(sa))}_keydown(e){if(![Dp,ia,Op,ra,yo,oa].includes(e.key))return;e.stopPropagation(),e.preventDefault();let t=this._getChildren().filter(r=>!Ct(r)),i;if([yo,oa].includes(e.key))i=t[e.key===yo?0:t.length-1];else{let r=[ia,ra].includes(e.key);i=So(t,e.target,r,!0)}i&&(i.focus({preventScroll:!0}),n.getOrCreateInstance(i).show())}_getChildren(){return j.find(_o,this._parent)}_getActiveElem(){return this._getChildren().find(e=>this._elemIsActive(e))||null}_setInitialAttributes(e,t){this._setAttributeIfNotExists(e,"role","tablist");for(let i of t)this._setInitialAttributesOnChild(i)}_setInitialAttributesOnChild(e){e=this._getInnerElement(e);let t=this._elemIsActive(e),i=this._getOuterElement(e);e.setAttribute("aria-selected",t),i!==e&&this._setAttributeIfNotExists(i,"role","presentation"),t||e.setAttribute("tabindex","-1"),this._setAttributeIfNotExists(e,"role","tab"),this._setInitialAttributesOnTargetPanel(e)}_setInitialAttributesOnTargetPanel(e){let t=j.getElementFromSelector(e);t&&(this._setAttributeIfNotExists(t,"role","tabpanel"),e.id&&this._setAttributeIfNotExists(t,"aria-labelledby",`${e.id}`))}_toggleDropDown(e,t){let i=this._getOuterElement(e);if(!i.classList.contains(Lp))return;let r=(o,s)=>{let a=j.findOne(o,i);a&&a.classList.toggle(s,t)};r(Na,Xt),r(Mp,Eo),i.setAttribute("aria-expanded",t)}_setAttributeIfNotExists(e,t,i){e.hasAttribute(t)||e.setAttribute(t,i)}_elemIsActive(e){return e.classList.contains(Xt)}_getInnerElement(e){return e.matches(_o)?e:j.findOne(_o,e)}_getOuterElement(e){return e.closest(Np)||e}static jQueryInterface(e){return this.each(function(){let t=n.getOrCreateInstance(this);if(typeof e=="string"){if(t[e]===void 0||e.startsWith("_")||e==="constructor")throw new TypeError(`No method named "${e}"`);t[e]()}})}};x.on(document,Cp,Ra,function(n){["A","AREA"].includes(this.tagName)&&n.preventDefault(),!Ct(this)&&Jt.getOrCreateInstance(this).show()});x.on(window,Ap,()=>{for(let n of j.find(Hp))Jt.getOrCreateInstance(n)});Qe(Jt);var Ip="toast",Pp="bs.toast",Lt=`.${Pp}`,Fp=`mouseover${Lt}`,$p=`mouseout${Lt}`,Bp=`focusin${Lt}`,Vp=`focusout${Lt}`,zp=`hide${Lt}`,jp=`hidden${Lt}`,Wp=`show${Lt}`,qp=`shown${Lt}`,Up="fade",aa="hide",Ui="show",Yi="showing",Yp={animation:"boolean",autohide:"boolean",delay:"number"},Gp={animation:!0,autohide:!0,delay:5e3},mt=class n extends je{constructor(e,t){super(e,t),this._timeout=null,this._hasMouseInteraction=!1,this._hasKeyboardInteraction=!1,this._setListeners()}static get Default(){return Gp}static get DefaultType(){return Yp}static get NAME(){return Ip}show(){if(x.trigger(this._element,Wp).defaultPrevented)return;this._clearTimeout(),this._config.animation&&this._element.classList.add(Up);let t=()=>{this._element.classList.remove(Yi),x.trigger(this._element,qp),this._maybeScheduleHide()};this._element.classList.remove(aa),ii(this._element),this._element.classList.add(Ui,Yi),this._queueCallback(t,this._element,this._config.animation)}hide(){if(!this.isShown()||x.trigger(this._element,zp).defaultPrevented)return;let t=()=>{this._element.classList.add(aa),this._element.classList.remove(Yi,Ui),x.trigger(this._element,jp)};this._element.classList.add(Yi),this._queueCallback(t,this._element,this._config.animation)}dispose(){this._clearTimeout(),this.isShown()&&this._element.classList.remove(Ui),super.dispose()}isShown(){return this._element.classList.contains(Ui)}_maybeScheduleHide(){this._config.autohide&&(this._hasMouseInteraction||this._hasKeyboardInteraction||(this._timeout=setTimeout(()=>{this.hide()},this._config.delay)))}_onInteraction(e,t){switch(e.type){case"mouseover":case"mouseout":{this._hasMouseInteraction=t;break}case"focusin":case"focusout":{this._hasKeyboardInteraction=t;break}}if(t){this._clearTimeout();return}let i=e.relatedTarget;this._element===i||this._element.contains(i)||this._maybeScheduleHide()}_setListeners(){x.on(this._element,Fp,e=>this._onInteraction(e,!0)),x.on(this._element,$p,e=>this._onInteraction(e,!1)),x.on(this._element,Bp,e=>this._onInteraction(e,!0)),x.on(this._element,Vp,e=>this._onInteraction(e,!1))}_clearTimeout(){clearTimeout(this._timeout),this._timeout=null}static jQueryInterface(e){return this.each(function(){let t=n.getOrCreateInstance(this,e);if(typeof e=="string"){if(typeof t[e]=="undefined")throw new TypeError(`No method named "${e}"`);t[e](this)}})}};rr(mt);Qe(mt);var Kp=function(){"use strict";let htmx={onLoad:null,process:null,on:null,off:null,trigger:null,ajax:null,find:null,findAll:null,closest:null,values:function(n,e){return getInputValues(n,e||"post").values},remove:null,addClass:null,removeClass:null,toggleClass:null,takeClass:null,swap:null,defineExtension:null,removeExtension:null,logAll:null,logNone:null,logger:null,config:{historyEnabled:!0,historyCacheSize:10,refreshOnHistoryMiss:!1,defaultSwapStyle:"innerHTML",defaultSwapDelay:0,defaultSettleDelay:20,includeIndicatorStyles:!0,indicatorClass:"htmx-indicator",requestClass:"htmx-request",addedClass:"htmx-added",settlingClass:"htmx-settling",swappingClass:"htmx-swapping",allowEval:!0,allowScriptTags:!0,inlineScriptNonce:"",inlineStyleNonce:"",attributesToSettle:["class","style","width","height"],withCredentials:!1,timeout:0,wsReconnectDelay:"full-jitter",wsBinaryType:"blob",disableSelector:"[hx-disable], [data-hx-disable]",scrollBehavior:"instant",defaultFocusScroll:!1,getCacheBusterParam:!1,globalViewTransitions:!1,methodsThatUseUrlParams:["get","delete"],selfRequestsOnly:!0,ignoreTitle:!1,scrollIntoViewOnBoost:!0,triggerSpecsCache:null,disableInheritance:!1,responseHandling:[{code:"204",swap:!1},{code:"[23]..",swap:!0},{code:"[45]..",swap:!1,error:!0}],allowNestedOobSwaps:!0},parseInterval:null,_:null,version:"2.0.4"};htmx.onLoad=onLoadHelper,htmx.process=processNode,htmx.on=addEventListenerImpl,htmx.off=removeEventListenerImpl,htmx.trigger=triggerEvent,htmx.ajax=ajaxHelper,htmx.find=find,htmx.findAll=findAll,htmx.closest=closest,htmx.remove=removeElement,htmx.addClass=addClassToElement,htmx.removeClass=removeClassFromElement,htmx.toggleClass=toggleClassOnElement,htmx.takeClass=takeClassForElement,htmx.swap=swap,htmx.defineExtension=defineExtension,htmx.removeExtension=removeExtension,htmx.logAll=logAll,htmx.logNone=logNone,htmx.parseInterval=parseInterval,htmx._=internalEval;let internalAPI={addTriggerHandler,bodyContains,canAccessLocalStorage,findThisElement,filterValues,swap,hasAttribute,getAttributeValue,getClosestAttributeValue,getClosestMatch,getExpressionVars,getHeaders,getInputValues,getInternalData,getSwapSpecification,getTriggerSpecs,getTarget,makeFragment,mergeObjects,makeSettleInfo,oobSwap,querySelectorExt,settleImmediately,shouldCancel,triggerEvent,triggerErrorEvent,withExtensions},VERBS=["get","post","put","delete","patch"],VERB_SELECTOR=VERBS.map(function(n){return"[hx-"+n+"], [data-hx-"+n+"]"}).join(", ");function parseInterval(n){if(n==null)return;let e=NaN;return n.slice(-2)=="ms"?e=parseFloat(n.slice(0,-2)):n.slice(-1)=="s"?e=parseFloat(n.slice(0,-1))*1e3:n.slice(-1)=="m"?e=parseFloat(n.slice(0,-1))*1e3*60:e=parseFloat(n),isNaN(e)?void 0:e}function getRawAttribute(n,e){return n instanceof Element&&n.getAttribute(e)}function hasAttribute(n,e){return!!n.hasAttribute&&(n.hasAttribute(e)||n.hasAttribute("data-"+e))}function getAttributeValue(n,e){return getRawAttribute(n,e)||getRawAttribute(n,"data-"+e)}function parentElt(n){let e=n.parentElement;return!e&&n.parentNode instanceof ShadowRoot?n.parentNode:e}function getDocument(){return document}function getRootNode(n,e){return n.getRootNode?n.getRootNode({composed:e}):getDocument()}function getClosestMatch(n,e){for(;n&&!e(n);)n=parentElt(n);return n||null}function getAttributeValueWithDisinheritance(n,e,t){let i=getAttributeValue(e,t),r=getAttributeValue(e,"hx-disinherit");var o=getAttributeValue(e,"hx-inherit");if(n!==e){if(htmx.config.disableInheritance)return o&&(o==="*"||o.split(" ").indexOf(t)>=0)?i:null;if(r&&(r==="*"||r.split(" ").indexOf(t)>=0))return"unset"}return i}function getClosestAttributeValue(n,e){let t=null;if(getClosestMatch(n,function(i){return!!(t=getAttributeValueWithDisinheritance(n,asElement(i),e))}),t!=="unset")return t}function matches(n,e){let t=n instanceof Element&&(n.matches||n.matchesSelector||n.msMatchesSelector||n.mozMatchesSelector||n.webkitMatchesSelector||n.oMatchesSelector);return!!t&&t.call(n,e)}function getStartTag(n){let t=/<([a-z][^\/\0>\x20\t\r\n\f]*)/i.exec(n);return t?t[1].toLowerCase():""}function parseHTML(n){return new DOMParser().parseFromString(n,"text/html")}function takeChildrenFor(n,e){for(;e.childNodes.length>0;)n.append(e.childNodes[0])}function duplicateScript(n){let e=getDocument().createElement("script");return forEach(n.attributes,function(t){e.setAttribute(t.name,t.value)}),e.textContent=n.textContent,e.async=!1,htmx.config.inlineScriptNonce&&(e.nonce=htmx.config.inlineScriptNonce),e}function isJavaScriptScriptNode(n){return n.matches("script")&&(n.type==="text/javascript"||n.type==="module"||n.type==="")}function normalizeScriptTags(n){Array.from(n.querySelectorAll("script")).forEach(e=>{if(isJavaScriptScriptNode(e)){let t=duplicateScript(e),i=e.parentNode;try{i.insertBefore(t,e)}catch(r){logError(r)}finally{e.remove()}}})}function makeFragment(n){let e=n.replace(/]*)?>[\s\S]*?<\/head>/i,""),t=getStartTag(e),i;if(t==="html"){i=new DocumentFragment;let o=parseHTML(n);takeChildrenFor(i,o.body),i.title=o.title}else if(t==="body"){i=new DocumentFragment;let o=parseHTML(e);takeChildrenFor(i,o.body),i.title=o.title}else{let o=parseHTML('");i=o.querySelector("template").content,i.title=o.title;var r=i.querySelector("title");r&&r.parentNode===i&&(r.remove(),i.title=r.innerText)}return i&&(htmx.config.allowScriptTags?normalizeScriptTags(i):i.querySelectorAll("script").forEach(o=>o.remove())),i}function maybeCall(n){n&&n()}function isType(n,e){return Object.prototype.toString.call(n)==="[object "+e+"]"}function isFunction(n){return typeof n=="function"}function isRawObject(n){return isType(n,"Object")}function getInternalData(n){let e="htmx-internal-data",t=n[e];return t||(t=n[e]={}),t}function toArray(n){let e=[];if(n)for(let t=0;t=0}function bodyContains(n){return n.getRootNode({composed:!0})===document}function splitOnWhitespace(n){return n.trim().split(/\s+/)}function mergeObjects(n,e){for(let t in e)e.hasOwnProperty(t)&&(n[t]=e[t]);return n}function parseJSON(n){try{return JSON.parse(n)}catch(e){return logError(e),null}}function canAccessLocalStorage(){let n="htmx:localStorageTest";try{return localStorage.setItem(n,n),localStorage.removeItem(n),!0}catch(e){return!1}}function normalizePath(n){try{let e=new URL(n);return e&&(n=e.pathname+e.search),/^\/$/.test(n)||(n=n.replace(/\/+$/,"")),n}catch(e){return n}}function internalEval(str){return maybeEval(getDocument().body,function(){return eval(str)})}function onLoadHelper(n){return htmx.on("htmx:load",function(t){n(t.detail.elt)})}function logAll(){htmx.logger=function(n,e,t){console&&console.log(e,n,t)}}function logNone(){htmx.logger=null}function find(n,e){return typeof n!="string"?n.querySelector(e):find(getDocument(),n)}function findAll(n,e){return typeof n!="string"?n.querySelectorAll(e):findAll(getDocument(),n)}function getWindow(){return window}function removeElement(n,e){n=resolveTarget(n),e?getWindow().setTimeout(function(){removeElement(n),n=null},e):parentElt(n).removeChild(n)}function asElement(n){return n instanceof Element?n:null}function asHtmlElement(n){return n instanceof HTMLElement?n:null}function asString(n){return typeof n=="string"?n:null}function asParentNode(n){return n instanceof Element||n instanceof Document||n instanceof DocumentFragment?n:null}function addClassToElement(n,e,t){n=asElement(resolveTarget(n)),n&&(t?getWindow().setTimeout(function(){addClassToElement(n,e),n=null},t):n.classList&&n.classList.add(e))}function removeClassFromElement(n,e,t){let i=asElement(resolveTarget(n));i&&(t?getWindow().setTimeout(function(){removeClassFromElement(i,e),i=null},t):i.classList&&(i.classList.remove(e),i.classList.length===0&&i.removeAttribute("class")))}function toggleClassOnElement(n,e){n=resolveTarget(n),n.classList.toggle(e)}function takeClassForElement(n,e){n=resolveTarget(n),forEach(n.parentElement.children,function(t){removeClassFromElement(t,e)}),addClassToElement(asElement(n),e)}function closest(n,e){if(n=asElement(resolveTarget(n)),n&&n.closest)return n.closest(e);do if(n==null||matches(n,e))return n;while(n=n&&asElement(parentElt(n)));return null}function startsWith(n,e){return n.substring(0,e.length)===e}function endsWith(n,e){return n.substring(n.length-e.length)===e}function normalizeSelector(n){let e=n.trim();return startsWith(e,"<")&&endsWith(e,"/>")?e.substring(1,e.length-2):e}function querySelectorAllExt(n,e,t){if(e.indexOf("global ")===0)return querySelectorAllExt(n,e.slice(7),!0);n=resolveTarget(n);let i=[];{let s=0,a=0;for(let l=0;l"&&s--}a0;){let s=normalizeSelector(i.shift()),a;s.indexOf("closest ")===0?a=closest(asElement(n),normalizeSelector(s.substr(8))):s.indexOf("find ")===0?a=find(asParentNode(n),normalizeSelector(s.substr(5))):s==="next"||s==="nextElementSibling"?a=asElement(n).nextElementSibling:s.indexOf("next ")===0?a=scanForwardQuery(n,normalizeSelector(s.substr(5)),!!t):s==="previous"||s==="previousElementSibling"?a=asElement(n).previousElementSibling:s.indexOf("previous ")===0?a=scanBackwardsQuery(n,normalizeSelector(s.substr(9)),!!t):s==="document"?a=document:s==="window"?a=window:s==="body"?a=document.body:s==="root"?a=getRootNode(n,!!t):s==="host"?a=n.getRootNode().host:o.push(s),a&&r.push(a)}if(o.length>0){let s=o.join(","),a=asParentNode(getRootNode(n,!!t));r.push(...toArray(a.querySelectorAll(s)))}return r}var scanForwardQuery=function(n,e,t){let i=asParentNode(getRootNode(n,t)).querySelectorAll(e);for(let r=0;r=0;r--){let o=i[r];if(o.compareDocumentPosition(n)===Node.DOCUMENT_POSITION_FOLLOWING)return o}};function querySelectorExt(n,e){return typeof n!="string"?querySelectorAllExt(n,e)[0]:querySelectorAllExt(getDocument().body,n)[0]}function resolveTarget(n,e){return typeof n=="string"?find(asParentNode(e)||document,n):n}function processEventArgs(n,e,t,i){return isFunction(e)?{target:getDocument().body,event:asString(n),listener:e,options:t}:{target:resolveTarget(n),event:asString(e),listener:t,options:i}}function addEventListenerImpl(n,e,t,i){return ready(function(){let o=processEventArgs(n,e,t,i);o.target.addEventListener(o.event,o.listener,o.options)}),isFunction(e)?e:t}function removeEventListenerImpl(n,e,t){return ready(function(){let i=processEventArgs(n,e,t);i.target.removeEventListener(i.event,i.listener)}),isFunction(e)?e:t}let DUMMY_ELT=getDocument().createElement("output");function findAttributeTargets(n,e){let t=getClosestAttributeValue(n,e);if(t){if(t==="this")return[findThisElement(n,e)];{let i=querySelectorAllExt(n,t);return i.length===0?(logError('The selector "'+t+'" on '+e+" returned no matches!"),[DUMMY_ELT]):i}}}function findThisElement(n,e){return asElement(getClosestMatch(n,function(t){return getAttributeValue(asElement(t),e)!=null}))}function getTarget(n){let e=getClosestAttributeValue(n,"hx-target");return e?e==="this"?findThisElement(n,"hx-target"):querySelectorExt(n,e):getInternalData(n).boosted?getDocument().body:n}function shouldSettleAttribute(n){let e=htmx.config.attributesToSettle;for(let t=0;t0?(o=n.substring(0,n.indexOf(":")),r=n.substring(n.indexOf(":")+1)):o=n),e.removeAttribute("hx-swap-oob"),e.removeAttribute("data-hx-swap-oob");let s=querySelectorAllExt(i,r,!1);return s?(forEach(s,function(a){let l,c=e.cloneNode(!0);l=getDocument().createDocumentFragment(),l.appendChild(c),isInlineSwap(o,a)||(l=asParentNode(c));let u={shouldSwap:!0,target:a,fragment:l};triggerEvent(a,"htmx:oobBeforeSwap",u)&&(a=u.target,u.shouldSwap&&(handlePreservedElements(l),swapWithStyle(o,a,a,l,t),restorePreservedElements()),forEach(t.elts,function(d){triggerEvent(d,"htmx:oobAfterSwap",u)}))}),e.parentNode.removeChild(e)):(e.parentNode.removeChild(e),triggerErrorEvent(getDocument().body,"htmx:oobErrorNoTarget",{content:e})),n}function restorePreservedElements(){let n=find("#--htmx-preserve-pantry--");if(n){for(let e of[...n.children]){let t=find("#"+e.id);t.parentNode.moveBefore(e,t),t.remove()}n.remove()}}function handlePreservedElements(n){forEach(findAll(n,"[hx-preserve], [data-hx-preserve]"),function(e){let t=getAttributeValue(e,"id"),i=getDocument().getElementById(t);if(i!=null)if(e.moveBefore){let r=find("#--htmx-preserve-pantry--");r==null&&(getDocument().body.insertAdjacentHTML("afterend","
"),r=find("#--htmx-preserve-pantry--")),r.moveBefore(i,null)}else e.parentNode.replaceChild(i,e)})}function handleAttributes(n,e,t){forEach(e.querySelectorAll("[id]"),function(i){let r=getRawAttribute(i,"id");if(r&&r.length>0){let o=r.replace("'","\\'"),s=i.tagName.replace(":","\\:"),a=asParentNode(n),l=a&&a.querySelector(s+"[id='"+o+"']");if(l&&l!==a){let c=i.cloneNode();cloneAttributes(i,l),t.tasks.push(function(){cloneAttributes(i,c)})}}})}function makeAjaxLoadTask(n){return function(){removeClassFromElement(n,htmx.config.addedClass),processNode(asElement(n)),processFocus(asParentNode(n)),triggerEvent(n,"htmx:load")}}function processFocus(n){let e="[autofocus]",t=asHtmlElement(matches(n,e)?n:n.querySelector(e));t!=null&&t.focus()}function insertNodesBefore(n,e,t,i){for(handleAttributes(n,t,i);t.childNodes.length>0;){let r=t.firstChild;addClassToElement(asElement(r),htmx.config.addedClass),n.insertBefore(r,e),r.nodeType!==Node.TEXT_NODE&&r.nodeType!==Node.COMMENT_NODE&&i.tasks.push(makeAjaxLoadTask(r))}}function stringHash(n,e){let t=0;for(;t0}function swap(n,e,t,i){i||(i={}),n=resolveTarget(n);let r=i.contextElement?getRootNode(i.contextElement,!1):getDocument(),o=document.activeElement,s={};try{s={elt:o,start:o?o.selectionStart:null,end:o?o.selectionEnd:null}}catch(c){}let a=makeSettleInfo(n);if(t.swapStyle==="textContent")n.textContent=e;else{let c=makeFragment(e);if(a.title=c.title,i.selectOOB){let u=i.selectOOB.split(",");for(let d=0;d0?getWindow().setTimeout(l,t.settleDelay):l()}function handleTriggerHeader(n,e,t){let i=n.getResponseHeader(e);if(i.indexOf("{")===0){let r=parseJSON(i);for(let o in r)if(r.hasOwnProperty(o)){let s=r[o];isRawObject(s)?t=s.target!==void 0?s.target:t:s={value:s},triggerEvent(t,o,s)}}else{let r=i.split(",");for(let o=0;o0;){let s=e[0];if(s==="]"){if(i--,i===0){o===null&&(r=r+"true"),e.shift(),r+=")})";try{let a=maybeEval(n,function(){return Function(r)()},function(){return!0});return a.source=r,a}catch(a){return triggerErrorEvent(getDocument().body,"htmx:syntax:error",{error:a,source:r}),null}}}else s==="["&&i++;isPossibleRelativeReference(s,o,t)?r+="(("+t+"."+s+") ? ("+t+"."+s+") : (window."+s+"))":r=r+s,o=e.shift()}}}function consumeUntil(n,e){let t="";for(;n.length>0&&!e.test(n[0]);)t+=n.shift();return t}function consumeCSSSelector(n){let e;return n.length>0&&COMBINED_SELECTOR_START.test(n[0])?(n.shift(),e=consumeUntil(n,COMBINED_SELECTOR_END).trim(),n.shift()):e=consumeUntil(n,WHITESPACE_OR_COMMA),e}let INPUT_SELECTOR="input, textarea, select";function parseAndCacheTrigger(n,e,t){let i=[],r=tokenizeString(e);do{consumeUntil(r,NOT_WHITESPACE);let a=r.length,l=consumeUntil(r,/[,\[\s]/);if(l!=="")if(l==="every"){let c={trigger:"every"};consumeUntil(r,NOT_WHITESPACE),c.pollInterval=parseInterval(consumeUntil(r,/[,\[\s]/)),consumeUntil(r,NOT_WHITESPACE);var o=maybeGenerateConditional(n,r,"event");o&&(c.eventFilter=o),i.push(c)}else{let c={trigger:l};var o=maybeGenerateConditional(n,r,"event");for(o&&(c.eventFilter=o),consumeUntil(r,NOT_WHITESPACE);r.length>0&&r[0]!==",";){let d=r.shift();if(d==="changed")c.changed=!0;else if(d==="once")c.once=!0;else if(d==="consume")c.consume=!0;else if(d==="delay"&&r[0]===":")r.shift(),c.delay=parseInterval(consumeUntil(r,WHITESPACE_OR_COMMA));else if(d==="from"&&r[0]===":"){if(r.shift(),COMBINED_SELECTOR_START.test(r[0]))var s=consumeCSSSelector(r);else{var s=consumeUntil(r,WHITESPACE_OR_COMMA);if(s==="closest"||s==="find"||s==="next"||s==="previous"){r.shift();let v=consumeCSSSelector(r);v.length>0&&(s+=" "+v)}}c.from=s}else d==="target"&&r[0]===":"?(r.shift(),c.target=consumeCSSSelector(r)):d==="throttle"&&r[0]===":"?(r.shift(),c.throttle=parseInterval(consumeUntil(r,WHITESPACE_OR_COMMA))):d==="queue"&&r[0]===":"?(r.shift(),c.queue=consumeUntil(r,WHITESPACE_OR_COMMA)):d==="root"&&r[0]===":"?(r.shift(),c[d]=consumeCSSSelector(r)):d==="threshold"&&r[0]===":"?(r.shift(),c[d]=consumeUntil(r,WHITESPACE_OR_COMMA)):triggerErrorEvent(n,"htmx:syntax:error",{token:r.shift()});consumeUntil(r,NOT_WHITESPACE)}i.push(c)}r.length===a&&triggerErrorEvent(n,"htmx:syntax:error",{token:r.shift()}),consumeUntil(r,NOT_WHITESPACE)}while(r[0]===","&&r.shift());return t&&(t[e]=i),i}function getTriggerSpecs(n){let e=getAttributeValue(n,"hx-trigger"),t=[];if(e){let i=htmx.config.triggerSpecsCache;t=i&&i[e]||parseAndCacheTrigger(n,e,i)}return t.length>0?t:matches(n,"form")?[{trigger:"submit"}]:matches(n,'input[type="button"], input[type="submit"]')?[{trigger:"click"}]:matches(n,INPUT_SELECTOR)?[{trigger:"change"}]:[{trigger:"click"}]}function cancelPolling(n){getInternalData(n).cancelled=!0}function processPolling(n,e,t){let i=getInternalData(n);i.timeout=getWindow().setTimeout(function(){bodyContains(n)&&i.cancelled!==!0&&(maybeFilterEvent(t,n,makeEvent("hx:poll:trigger",{triggerSpec:t,target:n}))||e(n),processPolling(n,e,t))},t.pollInterval)}function isLocalLink(n){return location.hostname===n.hostname&&getRawAttribute(n,"href")&&getRawAttribute(n,"href").indexOf("#")!==0}function eltIsDisabled(n){return closest(n,htmx.config.disableSelector)}function boostElement(n,e,t){if(n instanceof HTMLAnchorElement&&isLocalLink(n)&&(n.target===""||n.target==="_self")||n.tagName==="FORM"&&String(getRawAttribute(n,"method")).toLowerCase()!=="dialog"){e.boosted=!0;let i,r;if(n.tagName==="A")i="get",r=getRawAttribute(n,"href");else{let o=getRawAttribute(n,"method");i=o?o.toLowerCase():"get",r=getRawAttribute(n,"action"),(r==null||r==="")&&(r=getDocument().location.href),i==="get"&&r.includes("?")&&(r=r.replace(/\?[^#]+/,""))}t.forEach(function(o){addEventListener(n,function(s,a){let l=asElement(s);if(eltIsDisabled(l)){cleanUpElement(l);return}issueAjaxRequest(i,r,l,a)},e,o,!0)})}}function shouldCancel(n,e){let t=asElement(e);return t?!!((n.type==="submit"||n.type==="click")&&(t.tagName==="FORM"||matches(t,'input[type="submit"], button')&&(matches(t,"[form]")||closest(t,"form")!==null)||t instanceof HTMLAnchorElement&&t.href&&(t.getAttribute("href")==="#"||t.getAttribute("href").indexOf("#")!==0))):!1}function ignoreBoostedAnchorCtrlClick(n,e){return getInternalData(n).boosted&&n instanceof HTMLAnchorElement&&e.type==="click"&&(e.ctrlKey||e.metaKey)}function maybeFilterEvent(n,e,t){let i=n.eventFilter;if(i)try{return i.call(e,t)!==!0}catch(r){let o=i.source;return triggerErrorEvent(getDocument().body,"htmx:eventFilter:error",{error:r,source:o}),!0}return!1}function addEventListener(n,e,t,i,r){let o=getInternalData(n),s;i.from?s=querySelectorAllExt(n,i.from):s=[n],i.changed&&("lastValue"in o||(o.lastValue=new WeakMap),s.forEach(function(a){o.lastValue.has(i)||o.lastValue.set(i,new WeakMap),o.lastValue.get(i).set(a,a.value)})),forEach(s,function(a){let l=function(c){if(!bodyContains(n)){a.removeEventListener(i.trigger,l);return}if(ignoreBoostedAnchorCtrlClick(n,c)||((r||shouldCancel(c,n))&&c.preventDefault(),maybeFilterEvent(i,n,c)))return;let u=getInternalData(c);if(u.triggerSpec=i,u.handledFor==null&&(u.handledFor=[]),u.handledFor.indexOf(n)<0){if(u.handledFor.push(n),i.consume&&c.stopPropagation(),i.target&&c.target&&!matches(asElement(c.target),i.target))return;if(i.once){if(o.triggeredOnce)return;o.triggeredOnce=!0}if(i.changed){let d=event.target,p=d.value,v=o.lastValue.get(i);if(v.has(d)&&v.get(d)===p)return;v.set(d,p)}if(o.delayed&&clearTimeout(o.delayed),o.throttle)return;i.throttle>0?o.throttle||(triggerEvent(n,"htmx:trigger"),e(n,c),o.throttle=getWindow().setTimeout(function(){o.throttle=null},i.throttle)):i.delay>0?o.delayed=getWindow().setTimeout(function(){triggerEvent(n,"htmx:trigger"),e(n,c)},i.delay):(triggerEvent(n,"htmx:trigger"),e(n,c))}};t.listenerInfos==null&&(t.listenerInfos=[]),t.listenerInfos.push({trigger:i.trigger,listener:l,on:a}),a.addEventListener(i.trigger,l)})}let windowIsScrolling=!1,scrollHandler=null;function initScrollHandler(){scrollHandler||(scrollHandler=function(){windowIsScrolling=!0},window.addEventListener("scroll",scrollHandler),window.addEventListener("resize",scrollHandler),setInterval(function(){windowIsScrolling&&(windowIsScrolling=!1,forEach(getDocument().querySelectorAll("[hx-trigger*='revealed'],[data-hx-trigger*='revealed']"),function(n){maybeReveal(n)}))},200))}function maybeReveal(n){!hasAttribute(n,"data-hx-revealed")&&isScrolledIntoView(n)&&(n.setAttribute("data-hx-revealed","true"),getInternalData(n).initHash?triggerEvent(n,"revealed"):n.addEventListener("htmx:afterProcessNode",function(){triggerEvent(n,"revealed")},{once:!0}))}function loadImmediately(n,e,t,i){let r=function(){t.loaded||(t.loaded=!0,triggerEvent(n,"htmx:trigger"),e(n))};i>0?getWindow().setTimeout(r,i):r()}function processVerbs(n,e,t){let i=!1;return forEach(VERBS,function(r){if(hasAttribute(n,"hx-"+r)){let o=getAttributeValue(n,"hx-"+r);i=!0,e.path=o,e.verb=r,t.forEach(function(s){addTriggerHandler(n,s,e,function(a,l){let c=asElement(a);if(closest(c,htmx.config.disableSelector)){cleanUpElement(c);return}issueAjaxRequest(r,o,c,l)})})}}),i}function addTriggerHandler(n,e,t,i){if(e.trigger==="revealed")initScrollHandler(),addEventListener(n,i,t,e),maybeReveal(asElement(n));else if(e.trigger==="intersect"){let r={};e.root&&(r.root=querySelectorExt(n,e.root)),e.threshold&&(r.threshold=parseFloat(e.threshold)),new IntersectionObserver(function(s){for(let a=0;a0?(t.polling=!0,processPolling(asElement(n),i,e)):addEventListener(n,i,t,e)}function shouldProcessHxOn(n){let e=asElement(n);if(!e)return!1;let t=e.attributes;for(let i=0;i", "+o).join(""))}else return[]}function maybeSetLastButtonClicked(n){let e=closest(asElement(n.target),"button, input[type='submit']"),t=getRelatedFormData(n);t&&(t.lastButtonClicked=e)}function maybeUnsetLastButtonClicked(n){let e=getRelatedFormData(n);e&&(e.lastButtonClicked=null)}function getRelatedFormData(n){let e=closest(asElement(n.target),"button, input[type='submit']");if(!e)return;let t=resolveTarget("#"+getRawAttribute(e,"form"),e.getRootNode())||closest(e,"form");if(t)return getInternalData(t)}function initButtonTracking(n){n.addEventListener("click",maybeSetLastButtonClicked),n.addEventListener("focusin",maybeSetLastButtonClicked),n.addEventListener("focusout",maybeUnsetLastButtonClicked)}function addHxOnEventHandler(n,e,t){let i=getInternalData(n);Array.isArray(i.onHandlers)||(i.onHandlers=[]);let r,o=function(s){maybeEval(n,function(){eltIsDisabled(n)||(r||(r=new Function("event",t)),r.call(n,s))})};n.addEventListener(e,o),i.onHandlers.push({event:e,listener:o})}function processHxOnWildcard(n){deInitOnHandlers(n);for(let e=0;ehtmx.config.historyCacheSize;)o.shift();for(;o.length>0;)try{localStorage.setItem("htmx-history-cache",JSON.stringify(o));break}catch(a){triggerErrorEvent(getDocument().body,"htmx:historyCacheError",{cause:a,cache:o}),o.shift()}}function getCachedHistory(n){if(!canAccessLocalStorage())return null;n=normalizePath(n);let e=parseJSON(localStorage.getItem("htmx-history-cache"))||[];for(let t=0;t=200&&this.status<400){triggerEvent(getDocument().body,"htmx:historyCacheMissLoad",t);let i=makeFragment(this.response),r=i.querySelector("[hx-history-elt],[data-hx-history-elt]")||i,o=getHistoryElement(),s=makeSettleInfo(o);handleTitle(i.title),handlePreservedElements(i),swapInnerHTML(o,r,s),restorePreservedElements(),settleImmediately(s.tasks),currentPathForHistory=n,triggerEvent(getDocument().body,"htmx:historyRestore",{path:n,cacheMiss:!0,serverResponse:this.response})}else triggerErrorEvent(getDocument().body,"htmx:historyCacheMissLoadError",t)},e.send()}function restoreHistory(n){saveCurrentPageToHistory(),n=n||location.pathname+location.search;let e=getCachedHistory(n);if(e){let t=makeFragment(e.content),i=getHistoryElement(),r=makeSettleInfo(i);handleTitle(e.title),handlePreservedElements(t),swapInnerHTML(i,t,r),restorePreservedElements(),settleImmediately(r.tasks),getWindow().setTimeout(function(){window.scrollTo(0,e.scroll)},0),currentPathForHistory=n,triggerEvent(getDocument().body,"htmx:historyRestore",{path:n,item:e})}else htmx.config.refreshOnHistoryMiss?window.location.reload(!0):loadHistoryFromServer(n)}function addRequestIndicatorClasses(n){let e=findAttributeTargets(n,"hx-indicator");return e==null&&(e=[n]),forEach(e,function(t){let i=getInternalData(t);i.requestCount=(i.requestCount||0)+1,t.classList.add.call(t.classList,htmx.config.requestClass)}),e}function disableElements(n){let e=findAttributeTargets(n,"hx-disabled-elt");return e==null&&(e=[]),forEach(e,function(t){let i=getInternalData(t);i.requestCount=(i.requestCount||0)+1,t.setAttribute("disabled",""),t.setAttribute("data-disabled-by-htmx","")}),e}function removeRequestIndicators(n,e){forEach(n.concat(e),function(t){let i=getInternalData(t);i.requestCount=(i.requestCount||1)-1}),forEach(n,function(t){getInternalData(t).requestCount===0&&t.classList.remove.call(t.classList,htmx.config.requestClass)}),forEach(e,function(t){getInternalData(t).requestCount===0&&(t.removeAttribute("disabled"),t.removeAttribute("data-disabled-by-htmx"))})}function haveSeenNode(n,e){for(let t=0;te.indexOf(r)<0):i=i.filter(r=>r!==e),t.delete(n),forEach(i,r=>t.append(n,r))}}function processInputValue(n,e,t,i,r){if(!(i==null||haveSeenNode(n,i))){if(n.push(i),shouldInclude(i)){let o=getRawAttribute(i,"name"),s=i.value;i instanceof HTMLSelectElement&&i.multiple&&(s=toArray(i.querySelectorAll("option:checked")).map(function(a){return a.value})),i instanceof HTMLInputElement&&i.files&&(s=toArray(i.files)),addValueToFormData(o,s,e),r&&validateElement(i,t)}i instanceof HTMLFormElement&&(forEach(i.elements,function(o){n.indexOf(o)>=0?removeValueFromFormData(o.name,o.value,e):n.push(o),r&&validateElement(o,t)}),new FormData(i).forEach(function(o,s){o instanceof File&&o.name===""||addValueToFormData(s,o,e)}))}}function validateElement(n,e){let t=n;t.willValidate&&(triggerEvent(t,"htmx:validation:validate"),t.checkValidity()||(e.push({elt:t,message:t.validationMessage,validity:t.validity}),triggerEvent(t,"htmx:validation:failed",{message:t.validationMessage,validity:t.validity})))}function overrideFormData(n,e){for(let t of e.keys())n.delete(t);return e.forEach(function(t,i){n.append(i,t)}),n}function getInputValues(n,e){let t=[],i=new FormData,r=new FormData,o=[],s=getInternalData(n);s.lastButtonClicked&&!bodyContains(s.lastButtonClicked)&&(s.lastButtonClicked=null);let a=n instanceof HTMLFormElement&&n.noValidate!==!0||getAttributeValue(n,"hx-validate")==="true";if(s.lastButtonClicked&&(a=a&&s.lastButtonClicked.formNoValidate!==!0),e!=="get"&&processInputValue(t,r,o,closest(n,"form"),a),processInputValue(t,i,o,n,a),s.lastButtonClicked||n.tagName==="BUTTON"||n.tagName==="INPUT"&&getRawAttribute(n,"type")==="submit"){let c=s.lastButtonClicked||n,u=getRawAttribute(c,"name");addValueToFormData(u,c.value,r)}let l=findAttributeTargets(n,"hx-include");return forEach(l,function(c){processInputValue(t,i,o,asElement(c),a),matches(c,"form")||forEach(asParentNode(c).querySelectorAll(INPUT_SELECTOR),function(u){processInputValue(t,i,o,u,a)})}),overrideFormData(i,r),{errors:o,formData:i,values:formDataProxy(i)}}function appendParam(n,e,t){n!==""&&(n+="&"),String(t)==="[object Object]"&&(t=JSON.stringify(t));let i=encodeURIComponent(t);return n+=encodeURIComponent(e)+"="+i,n}function urlEncode(n){n=formDataFromObject(n);let e="";return n.forEach(function(t,i){e=appendParam(e,i,t)}),e}function getHeaders(n,e,t){let i={"HX-Request":"true","HX-Trigger":getRawAttribute(n,"id"),"HX-Trigger-Name":getRawAttribute(n,"name"),"HX-Target":getAttributeValue(e,"id"),"HX-Current-URL":getDocument().location.href};return getValuesForElement(n,"hx-headers",!1,i),t!==void 0&&(i["HX-Prompt"]=t),getInternalData(n).boosted&&(i["HX-Boosted"]="true"),i}function filterValues(n,e){let t=getClosestAttributeValue(e,"hx-params");if(t){if(t==="none")return new FormData;if(t==="*")return n;if(t.indexOf("not ")===0)return forEach(t.slice(4).split(","),function(i){i=i.trim(),n.delete(i)}),n;{let i=new FormData;return forEach(t.split(","),function(r){r=r.trim(),n.has(r)&&n.getAll(r).forEach(function(o){i.append(r,o)})}),i}}else return n}function isAnchorLink(n){return!!getRawAttribute(n,"href")&&getRawAttribute(n,"href").indexOf("#")>=0}function getSwapSpecification(n,e){let t=e||getClosestAttributeValue(n,"hx-swap"),i={swapStyle:getInternalData(n).boosted?"innerHTML":htmx.config.defaultSwapStyle,swapDelay:htmx.config.defaultSwapDelay,settleDelay:htmx.config.defaultSettleDelay};if(htmx.config.scrollIntoViewOnBoost&&getInternalData(n).boosted&&!isAnchorLink(n)&&(i.show="top"),t){let s=splitOnWhitespace(t);if(s.length>0)for(let a=0;a0?r.join(":"):null;i.scroll=u,i.scrollTarget=o}else if(l.indexOf("show:")===0){var r=l.slice(5).split(":");let d=r.pop();var o=r.length>0?r.join(":"):null;i.show=d,i.showTarget=o}else if(l.indexOf("focus-scroll:")===0){let c=l.slice(13);i.focusScroll=c=="true"}else a==0?i.swapStyle=l:logError("Unknown modifier in hx-swap: "+l)}}return i}function usesFormData(n){return getClosestAttributeValue(n,"hx-encoding")==="multipart/form-data"||matches(n,"form")&&getRawAttribute(n,"enctype")==="multipart/form-data"}function encodeParamsForBody(n,e,t){let i=null;return withExtensions(e,function(r){i==null&&(i=r.encodeParameters(n,t,e))}),i!=null?i:usesFormData(e)?overrideFormData(new FormData,formDataFromObject(t)):urlEncode(t)}function makeSettleInfo(n){return{tasks:[],elts:[n]}}function updateScrollState(n,e){let t=n[0],i=n[n.length-1];if(e.scroll){var r=null;e.scrollTarget&&(r=asElement(querySelectorExt(t,e.scrollTarget))),e.scroll==="top"&&(t||r)&&(r=r||t,r.scrollTop=0),e.scroll==="bottom"&&(i||r)&&(r=r||i,r.scrollTop=r.scrollHeight)}if(e.show){var r=null;if(e.showTarget){let s=e.showTarget;e.showTarget==="window"&&(s="body"),r=asElement(querySelectorExt(t,s))}e.show==="top"&&(t||r)&&(r=r||t,r.scrollIntoView({block:"start",behavior:htmx.config.scrollBehavior})),e.show==="bottom"&&(i||r)&&(r=r||i,r.scrollIntoView({block:"end",behavior:htmx.config.scrollBehavior}))}}function getValuesForElement(n,e,t,i){if(i==null&&(i={}),n==null)return i;let r=getAttributeValue(n,e);if(r){let o=r.trim(),s=t;if(o==="unset")return null;o.indexOf("javascript:")===0?(o=o.slice(11),s=!0):o.indexOf("js:")===0&&(o=o.slice(3),s=!0),o.indexOf("{")!==0&&(o="{"+o+"}");let a;s?a=maybeEval(n,function(){return Function("return ("+o+")")()},{}):a=parseJSON(o);for(let l in a)a.hasOwnProperty(l)&&i[l]==null&&(i[l]=a[l])}return getValuesForElement(asElement(parentElt(n)),e,t,i)}function maybeEval(n,e,t){return htmx.config.allowEval?e():(triggerErrorEvent(n,"htmx:evalDisallowedError"),t)}function getHXVarsForElement(n,e){return getValuesForElement(n,"hx-vars",!0,e)}function getHXValsForElement(n,e){return getValuesForElement(n,"hx-vals",!1,e)}function getExpressionVars(n){return mergeObjects(getHXVarsForElement(n),getHXValsForElement(n))}function safelySetHeaderValue(n,e,t){if(t!==null)try{n.setRequestHeader(e,t)}catch(i){n.setRequestHeader(e,encodeURIComponent(t)),n.setRequestHeader(e+"-URI-AutoEncoded","true")}}function getPathFromResponse(n){if(n.responseURL&&typeof URL!="undefined")try{let e=new URL(n.responseURL);return e.pathname+e.search}catch(e){triggerErrorEvent(getDocument().body,"htmx:badResponseUrl",{url:n.responseURL})}}function hasHeader(n,e){return e.test(n.getAllResponseHeaders())}function ajaxHelper(n,e,t){if(n=n.toLowerCase(),t){if(t instanceof Element||typeof t=="string")return issueAjaxRequest(n,e,null,null,{targetOverride:resolveTarget(t)||DUMMY_ELT,returnPromise:!0});{let i=resolveTarget(t.target);return(t.target&&!i||t.source&&!i&&!resolveTarget(t.source))&&(i=DUMMY_ELT),issueAjaxRequest(n,e,resolveTarget(t.source),t.event,{handler:t.handler,headers:t.headers,values:t.values,targetOverride:i,swapOverride:t.swap,select:t.select,returnPromise:!0})}}else return issueAjaxRequest(n,e,null,null,{returnPromise:!0})}function hierarchyForElt(n){let e=[];for(;n;)e.push(n),n=n.parentElement;return e}function verifyPath(n,e,t){let i,r;return typeof URL=="function"?(r=new URL(e,document.location.href),i=document.location.origin===r.origin):(r=e,i=startsWith(e,document.location.origin)),htmx.config.selfRequestsOnly&&!i?!1:triggerEvent(n,"htmx:validateUrl",mergeObjects({url:r,sameHost:i},t))}function formDataFromObject(n){if(n instanceof FormData)return n;let e=new FormData;for(let t in n)n.hasOwnProperty(t)&&(n[t]&&typeof n[t].forEach=="function"?n[t].forEach(function(i){e.append(t,i)}):typeof n[t]=="object"&&!(n[t]instanceof Blob)?e.append(t,JSON.stringify(n[t])):e.append(t,n[t]));return e}function formDataArrayProxy(n,e,t){return new Proxy(t,{get:function(i,r){return typeof r=="number"?i[r]:r==="length"?i.length:r==="push"?function(o){i.push(o),n.append(e,o)}:typeof i[r]=="function"?function(){i[r].apply(i,arguments),n.delete(e),i.forEach(function(o){n.append(e,o)})}:i[r]&&i[r].length===1?i[r][0]:i[r]},set:function(i,r,o){return i[r]=o,n.delete(e),i.forEach(function(s){n.append(e,s)}),!0}})}function formDataProxy(n){return new Proxy(n,{get:function(e,t){if(typeof t=="symbol"){let r=Reflect.get(e,t);return typeof r=="function"?function(){return r.apply(n,arguments)}:r}if(t==="toJSON")return()=>Object.fromEntries(n);if(t in e)return typeof e[t]=="function"?function(){return n[t].apply(n,arguments)}:e[t];let i=n.getAll(t);if(i.length!==0)return i.length===1?i[0]:formDataArrayProxy(e,t,i)},set:function(e,t,i){return typeof t!="string"?!1:(e.delete(t),i&&typeof i.forEach=="function"?i.forEach(function(r){e.append(t,r)}):typeof i=="object"&&!(i instanceof Blob)?e.append(t,JSON.stringify(i)):e.append(t,i),!0)},deleteProperty:function(e,t){return typeof t=="string"&&e.delete(t),!0},ownKeys:function(e){return Reflect.ownKeys(Object.fromEntries(e))},getOwnPropertyDescriptor:function(e,t){return Reflect.getOwnPropertyDescriptor(Object.fromEntries(e),t)}})}function issueAjaxRequest(n,e,t,i,r,o){let s=null,a=null;if(r=r!=null?r:{},r.returnPromise&&typeof Promise!="undefined")var l=new Promise(function(U,Z){s=U,a=Z});t==null&&(t=getDocument().body);let c=r.handler||handleAjaxResponse,u=r.select||null;if(!bodyContains(t))return maybeCall(s),l;let d=r.targetOverride||asElement(getTarget(t));if(d==null||d==DUMMY_ELT)return triggerErrorEvent(t,"htmx:targetError",{target:getAttributeValue(t,"hx-target")}),maybeCall(a),l;let p=getInternalData(t),v=p.lastButtonClicked;if(v){let U=getRawAttribute(v,"formaction");U!=null&&(e=U);let Z=getRawAttribute(v,"formmethod");Z!=null&&Z.toLowerCase()!=="dialog"&&(n=Z)}let g=getClosestAttributeValue(t,"hx-confirm");if(o===void 0&&triggerEvent(t,"htmx:confirm",{target:d,elt:t,path:e,verb:n,triggeringEvent:i,etc:r,issueRequest:function(oe){return issueAjaxRequest(n,e,t,i,r,!!oe)},question:g})===!1)return maybeCall(s),l;let y=t,_=getClosestAttributeValue(t,"hx-sync"),T=null,w=!1;if(_){let U=_.split(":"),Z=U[0].trim();if(Z==="this"?y=findThisElement(t,"hx-sync"):y=asElement(querySelectorExt(t,Z)),_=(U[1]||"drop").trim(),p=getInternalData(y),_==="drop"&&p.xhr&&p.abortable!==!0)return maybeCall(s),l;if(_==="abort"){if(p.xhr)return maybeCall(s),l;w=!0}else _==="replace"?triggerEvent(y,"htmx:abort"):_.indexOf("queue")===0&&(T=(_.split(" ")[1]||"last").trim())}if(p.xhr)if(p.abortable)triggerEvent(y,"htmx:abort");else{if(T==null){if(i){let U=getInternalData(i);U&&U.triggerSpec&&U.triggerSpec.queue&&(T=U.triggerSpec.queue)}T==null&&(T="last")}return p.queuedRequests==null&&(p.queuedRequests=[]),T==="first"&&p.queuedRequests.length===0?p.queuedRequests.push(function(){issueAjaxRequest(n,e,t,i,r)}):T==="all"?p.queuedRequests.push(function(){issueAjaxRequest(n,e,t,i,r)}):T==="last"&&(p.queuedRequests=[],p.queuedRequests.push(function(){issueAjaxRequest(n,e,t,i,r)})),maybeCall(s),l}let S=new XMLHttpRequest;p.xhr=S,p.abortable=w;let M=function(){p.xhr=null,p.abortable=!1,p.queuedRequests!=null&&p.queuedRequests.length>0&&p.queuedRequests.shift()()},G=getClosestAttributeValue(t,"hx-prompt");if(G){var F=prompt(G);if(F===null||!triggerEvent(t,"htmx:prompt",{prompt:F,target:d}))return maybeCall(s),M(),l}if(g&&!o&&!confirm(g))return maybeCall(s),M(),l;let D=getHeaders(t,d,F);n!=="get"&&!usesFormData(t)&&(D["Content-Type"]="application/x-www-form-urlencoded"),r.headers&&(D=mergeObjects(D,r.headers));let L=getInputValues(t,n),N=L.errors,Y=L.formData;r.values&&overrideFormData(Y,formDataFromObject(r.values));let B=formDataFromObject(getExpressionVars(t)),ie=overrideFormData(Y,B),J=filterValues(ie,t);htmx.config.getCacheBusterParam&&n==="get"&&J.set("org.htmx.cache-buster",getRawAttribute(d,"id")||"true"),(e==null||e==="")&&(e=getDocument().location.href);let Te=getValuesForElement(t,"hx-request"),Ce=getInternalData(t).boosted,se=htmx.config.methodsThatUseUrlParams.indexOf(n)>=0,ne={boosted:Ce,useUrlParams:se,formData:J,parameters:formDataProxy(J),unfilteredFormData:ie,unfilteredParameters:formDataProxy(ie),headers:D,target:d,verb:n,errors:N,withCredentials:r.credentials||Te.credentials||htmx.config.withCredentials,timeout:r.timeout||Te.timeout||htmx.config.timeout,path:e,triggeringEvent:i};if(!triggerEvent(t,"htmx:configRequest",ne))return maybeCall(s),M(),l;if(e=ne.path,n=ne.verb,D=ne.headers,J=formDataFromObject(ne.parameters),N=ne.errors,se=ne.useUrlParams,N&&N.length>0)return triggerEvent(t,"htmx:validation:halted",ne),maybeCall(s),M(),l;let qe=e.split("#"),He=qe[0],W=qe[1],k=e;if(se&&(k=He,!J.keys().next().done&&(k.indexOf("?")<0?k+="?":k+="&",k+=urlEncode(J),W&&(k+="#"+W))),!verifyPath(t,k,ne))return triggerErrorEvent(t,"htmx:invalidPath",ne),maybeCall(a),l;if(S.open(n.toUpperCase(),k,!0),S.overrideMimeType("text/html"),S.withCredentials=ne.withCredentials,S.timeout=ne.timeout,!Te.noHeaders){for(let U in D)if(D.hasOwnProperty(U)){let Z=D[U];safelySetHeaderValue(S,U,Z)}}let A={xhr:S,target:d,requestConfig:ne,etc:r,boosted:Ce,select:u,pathInfo:{requestPath:e,finalRequestPath:k,responsePath:null,anchor:W}};if(S.onload=function(){try{let U=hierarchyForElt(t);if(A.pathInfo.responsePath=getPathFromResponse(S),c(t,A),A.keepIndicators!==!0&&removeRequestIndicators(V,z),triggerEvent(t,"htmx:afterRequest",A),triggerEvent(t,"htmx:afterOnLoad",A),!bodyContains(t)){let Z=null;for(;U.length>0&&Z==null;){let oe=U.shift();bodyContains(oe)&&(Z=oe)}Z&&(triggerEvent(Z,"htmx:afterRequest",A),triggerEvent(Z,"htmx:afterOnLoad",A))}maybeCall(s),M()}catch(U){throw triggerErrorEvent(t,"htmx:onLoadError",mergeObjects({error:U},A)),U}},S.onerror=function(){removeRequestIndicators(V,z),triggerErrorEvent(t,"htmx:afterRequest",A),triggerErrorEvent(t,"htmx:sendError",A),maybeCall(a),M()},S.onabort=function(){removeRequestIndicators(V,z),triggerErrorEvent(t,"htmx:afterRequest",A),triggerErrorEvent(t,"htmx:sendAbort",A),maybeCall(a),M()},S.ontimeout=function(){removeRequestIndicators(V,z),triggerErrorEvent(t,"htmx:afterRequest",A),triggerErrorEvent(t,"htmx:timeout",A),maybeCall(a),M()},!triggerEvent(t,"htmx:beforeRequest",A))return maybeCall(s),M(),l;var V=addRequestIndicatorClasses(t),z=disableElements(t);forEach(["loadstart","loadend","progress","abort"],function(U){forEach([S,S.upload],function(Z){Z.addEventListener(U,function(oe){triggerEvent(t,"htmx:xhr:"+U,{lengthComputable:oe.lengthComputable,loaded:oe.loaded,total:oe.total})})})}),triggerEvent(t,"htmx:beforeSend",A);let q=se?null:encodeParamsForBody(S,t,J);return S.send(q),l}function determineHistoryUpdates(n,e){let t=e.xhr,i=null,r=null;if(hasHeader(t,/HX-Push:/i)?(i=t.getResponseHeader("HX-Push"),r="push"):hasHeader(t,/HX-Push-Url:/i)?(i=t.getResponseHeader("HX-Push-Url"),r="push"):hasHeader(t,/HX-Replace-Url:/i)&&(i=t.getResponseHeader("HX-Replace-Url"),r="replace"),i)return i==="false"?{}:{type:r,path:i};let o=e.pathInfo.finalRequestPath,s=e.pathInfo.responsePath,a=getClosestAttributeValue(n,"hx-push-url"),l=getClosestAttributeValue(n,"hx-replace-url"),c=getInternalData(n).boosted,u=null,d=null;return a?(u="push",d=a):l?(u="replace",d=l):c&&(u="push",d=s||o),d?d==="false"?{}:(d==="true"&&(d=s||o),e.pathInfo.anchor&&d.indexOf("#")===-1&&(d=d+"#"+e.pathInfo.anchor),{type:u,path:d}):{}}function codeMatches(n,e){var t=new RegExp(n.code);return t.test(e.toString(10))}function resolveResponseHandling(n){for(var e=0;e0?getWindow().setTimeout(F,T.swapDelay):F()}d&&triggerErrorEvent(n,"htmx:responseError",mergeObjects({error:"Response Status Error Code "+t.status+" from "+e.pathInfo.requestPath},e))}}let extensions={};function extensionBase(){return{init:function(n){return null},getSelectors:function(){return null},onEvent:function(n,e){return!0},transformResponse:function(n,e,t){return n},isInlineSwap:function(n){return!1},handleSwap:function(n,e,t,i){return!1},encodeParameters:function(n,e,t){return null}}}function defineExtension(n,e){e.init&&e.init(internalAPI),extensions[n]=mergeObjects(extensionBase(),e)}function removeExtension(n){delete extensions[n]}function getExtensions(n,e,t){if(e==null&&(e=[]),n==null)return e;t==null&&(t=[]);let i=getAttributeValue(n,"hx-ext");return i&&forEach(i.split(","),function(r){if(r=r.replace(/ /g,""),r.slice(0,7)=="ignore:"){t.push(r.slice(7));return}if(t.indexOf(r)<0){let o=extensions[r];o&&e.indexOf(o)<0&&e.push(o)}}),getExtensions(asElement(parentElt(n)),e,t)}var isReady=!1;getDocument().addEventListener("DOMContentLoaded",function(){isReady=!0});function ready(n){isReady||getDocument().readyState==="complete"?n():getDocument().addEventListener("DOMContentLoaded",n)}function insertIndicatorStyles(){if(htmx.config.includeIndicatorStyles!==!1){let n=htmx.config.inlineStyleNonce?` nonce="${htmx.config.inlineStyleNonce}"`:"";getDocument().head.insertAdjacentHTML("beforeend"," ."+htmx.config.indicatorClass+"{opacity:0} ."+htmx.config.requestClass+" ."+htmx.config.indicatorClass+"{opacity:1; transition: opacity 200ms ease-in;} ."+htmx.config.requestClass+"."+htmx.config.indicatorClass+"{opacity:1; transition: opacity 200ms ease-in;} ")}}function getMetaConfig(){let n=getDocument().querySelector('meta[name="htmx-config"]');return n?parseJSON(n.content):null}function mergeMetaConfig(){let n=getMetaConfig();n&&(htmx.config=mergeObjects(htmx.config,n))}return ready(function(){mergeMetaConfig(),insertIndicatorStyles();let n=getDocument().body;processNode(n);let e=getDocument().querySelectorAll("[hx-trigger='restored'],[data-hx-trigger='restored']");n.addEventListener("htmx:abort",function(i){let r=i.target,o=getInternalData(r);o&&o.xhr&&o.xhr.abort()});let t=window.onpopstate?window.onpopstate.bind(window):null;window.onpopstate=function(i){i.state&&i.state.htmx?(restoreHistory(),forEach(e,function(r){triggerEvent(r,"htmx:restored",{document:getDocument(),triggerEvent})})):t&&t(i)},getWindow().setTimeout(function(){triggerEvent(n,"htmx:load",{}),n=null},0)}),htmx}(),b_=Kp;function Lo(n,e){n.split(/\s+/).forEach(t=>{e(t)})}var oi=class{constructor(){this._events={}}on(e,t){Lo(e,i=>{let r=this._events[i]||[];r.push(t),this._events[i]=r})}off(e,t){var i=arguments.length;if(i===0){this._events={};return}Lo(e,r=>{if(i===1){delete this._events[r];return}let o=this._events[r];o!==void 0&&(o.splice(o.indexOf(t),1),this._events[r]=o)})}trigger(e,...t){var i=this;Lo(e,r=>{let o=i._events[r];o!==void 0&&o.forEach(s=>{s.apply(i,t)})})}};function Mo(n){return n.plugins={},class extends n{constructor(){super(...arguments),this.plugins={names:[],settings:{},requested:{},loaded:{}}}static define(e,t){n.plugins[e]={name:e,fn:t}}initializePlugins(e){var t,i;let r=this,o=[];if(Array.isArray(e))e.forEach(s=>{typeof s=="string"?o.push(s):(r.plugins.settings[s.name]=s.options,o.push(s.name))});else if(e)for(t in e)e.hasOwnProperty(t)&&(r.plugins.settings[t]=e[t],o.push(t));for(;i=o.shift();)r.require(i)}loadPlugin(e){var t=this,i=t.plugins,r=n.plugins[e];if(!n.plugins.hasOwnProperty(e))throw new Error('Unable to find "'+e+'" plugin');i.requested[e]=!0,i.loaded[e]=r.fn.apply(t,[t.plugins.settings[e]||{}]),i.names.push(e)}require(e){var t=this,i=t.plugins;if(!t.plugins.loaded.hasOwnProperty(e)){if(i.requested[e])throw new Error('Plugin has circular dependency ("'+e+'")');t.loadPlugin(e)}return i.loaded[e]}}}var si=n=>(n=n.filter(Boolean),n.length<2?n[0]||"":Qp(n)==1?"["+n.join("")+"]":"(?:"+n.join("|")+")"),ko=n=>{if(!Xp(n))return n.join("");let e="",t=0,i=()=>{t>1&&(e+="{"+t+"}")};return n.forEach((r,o)=>{if(r===n[o-1]){t++;return}i(),e+=r,t=1}),i(),e},No=n=>{let e=Array.from(n);return si(e)},Xp=n=>new Set(n).size!==n.length,Mt=n=>(n+"").replace(/([\$\(\)\*\+\.\?\[\]\^\{\|\}\\])/gu,"\\$1"),Qp=n=>n.reduce((e,t)=>Math.max(e,Jp(t)),0),Jp=n=>Array.from(n).length;var Ro=n=>{if(n.length===1)return[[n]];let e=[],t=n.substring(1);return Ro(t).forEach(function(r){let o=r.slice(0);o[0]=n.charAt(0)+o[0],e.push(o),o=r.slice(0),o.unshift(n.charAt(0)),e.push(o)}),e};var Zp=[[0,65535]],em="[\u0300-\u036F\xB7\u02BE\u02BC]",or,Fa,tm=3,Ho={},Ha={"/":"\u2044\u2215",0:"\u07C0",a:"\u2C65\u0250\u0251",aa:"\uA733",ae:"\xE6\u01FD\u01E3",ao:"\uA735",au:"\uA737",av:"\uA739\uA73B",ay:"\uA73D",b:"\u0180\u0253\u0183",c:"\uA73F\u0188\u023C\u2184",d:"\u0111\u0257\u0256\u1D05\u018C\uABB7\u0501\u0266",e:"\u025B\u01DD\u1D07\u0247",f:"\uA77C\u0192",g:"\u01E5\u0260\uA7A1\u1D79\uA77F\u0262",h:"\u0127\u2C68\u2C76\u0265",i:"\u0268\u0131",j:"\u0249\u0237",k:"\u0199\u2C6A\uA741\uA743\uA745\uA7A3",l:"\u0142\u019A\u026B\u2C61\uA749\uA747\uA781\u026D",m:"\u0271\u026F\u03FB",n:"\uA7A5\u019E\u0272\uA791\u1D0E\u043B\u0509",o:"\xF8\u01FF\u0254\u0275\uA74B\uA74D\u1D11",oe:"\u0153",oi:"\u01A3",oo:"\uA74F",ou:"\u0223",p:"\u01A5\u1D7D\uA751\uA753\uA755\u03C1",q:"\uA757\uA759\u024B",r:"\u024D\u027D\uA75B\uA7A7\uA783",s:"\xDF\u023F\uA7A9\uA785\u0282",t:"\u0167\u01AD\u0288\u2C66\uA787",th:"\xFE",tz:"\uA729",u:"\u0289",v:"\u028B\uA75F\u028C",vy:"\uA761",w:"\u2C73",y:"\u01B4\u024F\u1EFF",z:"\u01B6\u0225\u0240\u2C6C\uA763",hv:"\u0195"};for(let n in Ha){let e=Ha[n]||"";for(let t=0;t{or===void 0&&(or=am(n||Zp))},Ia=(n,e="NFKD")=>n.normalize(e),ai=n=>Array.from(n).reduce((e,t)=>e+rm(t),""),rm=n=>(n=Ia(n).toLowerCase().replace(nm,e=>Ho[e]||""),Ia(n,"NFC"));function*om(n){for(let[e,t]of n)for(let i=e;i<=t;i++){let r=String.fromCharCode(i),o=ai(r);o!=r.toLowerCase()&&(o.length>tm||o.length!=0&&(yield{folded:o,composed:r,code_point:i}))}}var sm=n=>{let e={},t=(i,r)=>{let o=e[i]||new Set,s=new RegExp("^"+No(o)+"$","iu");r.match(s)||(o.add(Mt(r)),e[i]=o)};for(let i of om(n))t(i.folded,i.folded),t(i.folded,i.composed);return e},am=n=>{let e=sm(n),t={},i=[];for(let o in e){let s=e[o];s&&(t[o]=No(s)),o.length>1&&i.push(Mt(o))}i.sort((o,s)=>s.length-o.length);let r=si(i);return Fa=new RegExp("^"+r,"u"),t},lm=(n,e=1)=>{let t=0;return n=n.map(i=>(or[i]&&(t+=i.length),or[i]||i)),t>=e?ko(n):""},cm=(n,e=1)=>(e=Math.max(e,n.length-1),si(Ro(n).map(t=>lm(t,e)))),Pa=(n,e=!0)=>{let t=n.length>1?1:0;return si(n.map(i=>{let r=[],o=e?i.length():i.length()-1;for(let s=0;s{for(let t of e){if(t.start!=n.start||t.end!=n.end||t.substrs.join("")!==n.substrs.join(""))continue;let i=n.parts,r=s=>{for(let a of i){if(a.start===s.start&&a.substr===s.substr)return!1;if(!(s.length==1||a.length==1)&&(s.starta.start||a.starts.start))return!0}return!1};if(!(t.parts.filter(r).length>0))return!0}return!1},sr=class n{constructor(){ee(this,"parts");ee(this,"substrs");ee(this,"start");ee(this,"end");this.parts=[],this.substrs=[],this.start=0,this.end=0}add(e){e&&(this.parts.push(e),this.substrs.push(e.substr),this.start=Math.min(e.start,this.start),this.end=Math.max(e.end,this.end))}last(){return this.parts[this.parts.length-1]}length(){return this.parts.length}clone(e,t){let i=new n,r=JSON.parse(JSON.stringify(this.parts)),o=r.pop();for(let l of r)i.add(l);let s=t.substr.substring(0,e-o.start),a=s.length;return i.add({start:o.start,end:o.start+a,length:a,substr:s}),i}},$a=n=>{im(),n=ai(n);let e="",t=[new sr];for(let i=0;i0){l=l.sort((u,d)=>u.length()-d.length());for(let u of l)um(u,t)||t.push(u);continue}if(i>0&&c.size==1&&!c.has("3")){e+=Pa(t,!1);let u=new sr,d=t[0];d&&u.add(d.last()),t=[u]}}return e+=Pa(t,!0),e};var Ba=(n,e)=>{if(n)return n[e]},Va=(n,e)=>{if(n){for(var t,i=e.split(".");(t=i.shift())&&(n=n[t]););return n}},ar=(n,e,t)=>{var i,r;return!n||(n=n+"",e.regex==null)||(r=n.search(e.regex),r===-1)?0:(i=e.string.length/n.length,r===0&&(i+=.5),i*t)},lr=(n,e)=>{var t=n[e];if(typeof t=="function")return t;t&&!Array.isArray(t)&&(n[e]=[t])},li=(n,e)=>{if(Array.isArray(n))n.forEach(e);else for(var t in n)n.hasOwnProperty(t)&&e(n[t],t)},za=(n,e)=>typeof n=="number"&&typeof e=="number"?n>e?1:ne?1:e>n?-1:0);var cr=class{constructor(e,t){ee(this,"items");ee(this,"settings");this.items=e,this.settings=t||{diacritics:!0}}tokenize(e,t,i){if(!e||!e.length)return[];let r=[],o=e.split(/\s+/);var s;return i&&(s=new RegExp("^("+Object.keys(i).map(Mt).join("|")+"):(.*)$")),o.forEach(a=>{let l,c=null,u=null;s&&(l=a.match(s))&&(c=l[1],a=l[2]),a.length>0&&(this.settings.diacritics?u=$a(a)||null:u=Mt(a),u&&t&&(u="\\b"+u)),r.push({string:a,regex:u?new RegExp(u,"iu"):null,field:c})}),r}getScoreFunction(e,t){var i=this.prepareSearch(e,t);return this._getScoreFunction(i)}_getScoreFunction(e){let t=e.tokens,i=t.length;if(!i)return function(){return 0};let r=e.options.fields,o=e.weights,s=r.length,a=e.getAttrFn;if(!s)return function(){return 1};let l=function(){return s===1?function(c,u){let d=r[0].field;return ar(a(u,d),c,o[d]||1)}:function(c,u){var d=0;if(c.field){let p=a(u,c.field);!c.regex&&p?d+=1/s:d+=ar(p,c,1)}else li(o,(p,v)=>{d+=ar(a(u,v),c,p)});return d/s}}();return i===1?function(c){return l(t[0],c)}:e.options.conjunction==="and"?function(c){var u,d=0;for(let p of t){if(u=l(p,c),u<=0)return 0;d+=u}return d/i}:function(c){var u=0;return li(t,d=>{u+=l(d,c)}),u/i}}getSortFunction(e,t){var i=this.prepareSearch(e,t);return this._getSortFunction(i)}_getSortFunction(e){var t,i=[];let r=this,o=e.options,s=!e.query&&o.sort_empty?o.sort_empty:o.sort;if(typeof s=="function")return s.bind(this);let a=function(c,u){return c==="$score"?u.score:e.getAttrFn(r.items[u.id],c)};if(s)for(let c of s)(e.query||c.field!=="$score")&&i.push(c);if(e.query){t=!0;for(let c of i)if(c.field==="$score"){t=!1;break}t&&i.unshift({field:"$score",direction:"desc"})}else i=i.filter(c=>c.field!=="$score");return i.length?function(c,u){var d,p;for(let v of i)if(p=v.field,d=(v.direction==="desc"?-1:1)*za(a(p,c),a(p,u)),d)return d;return 0}:null}prepareSearch(e,t){let i={};var r=Object.assign({},t);if(lr(r,"sort"),lr(r,"sort_empty"),r.fields){lr(r,"fields");let o=[];r.fields.forEach(s=>{typeof s=="string"&&(s={field:s,weight:1}),o.push(s),i[s.field]="weight"in s?s.weight:1}),r.fields=o}return{options:r,query:e.toLowerCase().trim(),tokens:this.tokenize(e,r.respect_word_boundaries,i),total:0,items:[],weights:i,getAttrFn:r.nesting?Va:Ba}}search(e,t){var i=this,r,o;o=this.prepareSearch(e,t),t=o.options,e=o.query;let s=t.score||i._getScoreFunction(o);e.length?li(i.items,(l,c)=>{r=s(l),(t.filter===!1||r>0)&&o.items.push({score:r,id:c})}):li(i.items,(l,c)=>{o.items.push({score:1,id:c})});let a=i._getSortFunction(o);return a&&o.items.sort(a),o.total=o.items.length,typeof t.limit=="number"&&(o.items=o.items.slice(0,t.limit)),o}};var We=n=>typeof n=="undefined"||n===null?null:ci(n),ci=n=>typeof n=="boolean"?n?"1":"0":n+"",ur=n=>(n+"").replace(/&/g,"&").replace(//g,">").replace(/"/g,"""),ja=(n,e)=>e>0?window.setTimeout(n,e):(n.call(null),null),Wa=(n,e)=>{var t;return function(i,r){var o=this;t&&(o.loading=Math.max(o.loading-1,0),clearTimeout(t)),t=setTimeout(function(){t=null,o.loadedSearches[i]=!0,n.call(o,i,r)},e)}},Io=(n,e,t)=>{var i,r=n.trigger,o={};n.trigger=function(){var s=arguments[0];if(e.indexOf(s)!==-1)o[s]=arguments;else return r.apply(n,arguments)},t.apply(n,[]),n.trigger=r;for(i of e)i in o&&r.apply(n,o[i])},qa=n=>({start:n.selectionStart||0,length:(n.selectionEnd||0)-(n.selectionStart||0)}),fe=(n,e=!1)=>{n&&(n.preventDefault(),e&&n.stopPropagation())},Ae=(n,e,t,i)=>{n.addEventListener(e,t,i)},kt=(n,e)=>{if(!e||!e[n])return!1;var t=(e.altKey?1:0)+(e.ctrlKey?1:0)+(e.shiftKey?1:0)+(e.metaKey?1:0);return t===1},dr=(n,e)=>{let t=n.getAttribute("id");return t||(n.setAttribute("id",e),e)},Po=n=>n.replace(/[\\"']/g,"\\$&"),Nt=(n,e)=>{e&&n.append(e)},ve=(n,e)=>{if(Array.isArray(n))n.forEach(e);else for(var t in n)n.hasOwnProperty(t)&&e(n[t],t)};var it=n=>{if(n.jquery)return n[0];if(n instanceof HTMLElement)return n;if(Fo(n)){var e=document.createElement("template");return e.innerHTML=n.trim(),e.content.firstChild}return document.querySelector(n)},Fo=n=>typeof n=="string"&&n.indexOf("<")>-1,Ua=n=>n.replace(/['"\\]/g,"\\$&"),fr=(n,e)=>{var t=document.createEvent("HTMLEvents");t.initEvent(e,!0,!1),n.dispatchEvent(t)},ui=(n,e)=>{Object.assign(n.style,e)},Pe=(n,...e)=>{var t=Ya(e);n=Ga(n),n.map(i=>{t.map(r=>{i.classList.add(r)})})},vt=(n,...e)=>{var t=Ya(e);n=Ga(n),n.map(i=>{t.map(r=>{i.classList.remove(r)})})},Ya=n=>{var e=[];return ve(n,t=>{typeof t=="string"&&(t=t.trim().split(/[\t\n\f\r\s]/)),Array.isArray(t)&&(e=e.concat(t))}),e.filter(Boolean)},Ga=n=>(Array.isArray(n)||(n=[n]),n),hr=(n,e,t)=>{if(!(t&&!t.contains(n)))for(;n&&n.matches;){if(n.matches(e))return n;n=n.parentNode}},$o=(n,e=0)=>e>0?n[n.length-1]:n[0],Ka=n=>Object.keys(n).length===0,Bo=(n,e)=>{if(!n)return-1;e=e||n.nodeName;for(var t=0;n=n.previousElementSibling;)n.matches(e)&&t++;return t},le=(n,e)=>{ve(e,(t,i)=>{t==null?n.removeAttribute(i):n.setAttribute(i,""+t)})},di=(n,e)=>{n.parentNode&&n.parentNode.replaceChild(e,n)};var Xa=(n,e)=>{if(e===null)return;if(typeof e=="string"){if(!e.length)return;e=new RegExp(e,"i")}let t=o=>{var s=o.data.match(e);if(s&&o.data.length>0){var a=document.createElement("span");a.className="highlight";var l=o.splitText(s.index);l.splitText(s[0].length);var c=l.cloneNode(!0);return a.appendChild(c),di(l,a),1}return 0},i=o=>{o.nodeType===1&&o.childNodes&&!/(script|style)/i.test(o.tagName)&&(o.className!=="highlight"||o.tagName!=="SPAN")&&Array.from(o.childNodes).forEach(s=>{r(s)})},r=o=>o.nodeType===3?t(o):(i(o),0);r(n)},Qa=n=>{var e=n.querySelectorAll("span.highlight");Array.prototype.forEach.call(e,function(t){var i=t.parentNode;i.replaceChild(t.firstChild,t),i.normalize()})};var dm=typeof navigator=="undefined"?!1:/Mac/.test(navigator.userAgent),fi=dm?"metaKey":"ctrlKey";var Vo={options:[],optgroups:[],plugins:[],delimiter:",",splitOn:null,persist:!0,diacritics:!0,create:null,createOnBlur:!1,createFilter:null,highlight:!0,openOnFocus:!0,shouldOpen:null,maxOptions:50,maxItems:null,hideSelected:null,duplicates:!1,addPrecedence:!1,selectOnTab:!1,preload:null,allowEmptyOption:!1,refreshThrottle:300,loadThrottle:300,loadingClass:"loading",dataAttr:null,optgroupField:"optgroup",valueField:"value",labelField:"text",disabledField:"disabled",optgroupLabelField:"label",optgroupValueField:"value",lockOptgroupOrder:!1,sortField:"$order",searchField:["text"],searchConjunction:"and",mode:null,wrapperClass:"ts-wrapper",controlClass:"ts-control",dropdownClass:"ts-dropdown",dropdownContentClass:"ts-dropdown-content",itemClass:"item",optionClass:"option",dropdownParent:null,controlInput:'',copyClassesToDropdown:!1,placeholder:null,hidePlaceholder:null,shouldLoad:function(n){return n.length>0},render:{}};function pr(n,e){var t=Object.assign({},Vo,e),i=t.dataAttr,r=t.labelField,o=t.valueField,s=t.disabledField,a=t.optgroupField,l=t.optgroupLabelField,c=t.optgroupValueField,u=n.tagName.toLowerCase(),d=n.getAttribute("placeholder")||n.getAttribute("data-placeholder");if(!d&&!t.allowEmptyOption){let y=n.querySelector('option[value=""]');y&&(d=y.textContent)}var p={placeholder:d,options:[],optgroups:[],items:[],maxItems:null},v=()=>{var y,_=p.options,T={},w=1;let S=0;var M=D=>{var L=Object.assign({},D.dataset),N=i&&L[i];return typeof N=="string"&&N.length&&(L=Object.assign(L,JSON.parse(N))),L},G=(D,L)=>{var N=We(D.value);if(N!=null&&!(!N&&!t.allowEmptyOption)){if(T.hasOwnProperty(N)){if(L){var Y=T[N][a];Y?Array.isArray(Y)?Y.push(L):T[N][a]=[Y,L]:T[N][a]=L}}else{var B=M(D);B[r]=B[r]||D.textContent,B[o]=B[o]||N,B[s]=B[s]||D.disabled,B[a]=B[a]||L,B.$option=D,B.$order=B.$order||++S,T[N]=B,_.push(B)}D.selected&&p.items.push(N)}},F=D=>{var L,N;N=M(D),N[l]=N[l]||D.getAttribute("label")||"",N[c]=N[c]||w++,N[s]=N[s]||D.disabled,N.$order=N.$order||++S,p.optgroups.push(N),L=N[c],ve(D.children,Y=>{G(Y,L)})};p.maxItems=n.hasAttribute("multiple")?null:1,ve(n.children,D=>{y=D.tagName.toLowerCase(),y==="optgroup"?F(D):y==="option"&&G(D)})},g=()=>{let y=n.getAttribute(i);if(y)p.options=JSON.parse(y),ve(p.options,T=>{p.items.push(T[o])});else{var _=n.value.trim()||"";if(!t.allowEmptyOption&&!_.length)return;let T=_.split(t.delimiter);ve(T,w=>{let S={};S[r]=w,S[o]=w,p.options.push(S)}),p.items=T}};return u==="select"?v():g(),Object.assign({},Vo,p,e)}var el=0,_e=class extends Mo(oi){constructor(e,t){super(),this.order=0,this.isOpen=!1,this.isDisabled=!1,this.isReadOnly=!1,this.isInvalid=!1,this.isValid=!0,this.isLocked=!1,this.isFocused=!1,this.isInputHidden=!1,this.isSetup=!1,this.ignoreFocus=!1,this.ignoreHover=!1,this.hasOptions=!1,this.lastValue="",this.caretPos=0,this.loading=0,this.loadedSearches={},this.activeOption=null,this.activeItems=[],this.optgroups={},this.options={},this.userOptions={},this.items=[],this.refreshTimeout=null,el++;var i,r=it(e);if(r.tomselect)throw new Error("Tom Select already initialized on this element");r.tomselect=this;var o=window.getComputedStyle&&window.getComputedStyle(r,null);i=o.getPropertyValue("direction");let s=pr(r,t);this.settings=s,this.input=r,this.tabIndex=r.tabIndex||0,this.is_select_tag=r.tagName.toLowerCase()==="select",this.rtl=/rtl/i.test(i),this.inputId=dr(r,"tomselect-"+el),this.isRequired=r.required,this.sifter=new cr(this.options,{diacritics:s.diacritics}),s.mode=s.mode||(s.maxItems===1?"single":"multi"),typeof s.hideSelected!="boolean"&&(s.hideSelected=s.mode==="multi"),typeof s.hidePlaceholder!="boolean"&&(s.hidePlaceholder=s.mode!=="multi");var a=s.createFilter;typeof a!="function"&&(typeof a=="string"&&(a=new RegExp(a)),a instanceof RegExp?s.createFilter=_=>a.test(_):s.createFilter=_=>this.settings.duplicates||!this.options[_]),this.initializePlugins(s.plugins),this.setupCallbacks(),this.setupTemplates();let l=it("
"),c=it("
"),u=this._render("dropdown"),d=it('
'),p=this.input.getAttribute("class")||"",v=s.mode;var g;if(Pe(l,s.wrapperClass,p,v),Pe(c,s.controlClass),Nt(l,c),Pe(u,s.dropdownClass,v),s.copyClassesToDropdown&&Pe(u,p),Pe(d,s.dropdownContentClass),Nt(u,d),it(s.dropdownParent||l).appendChild(u),Fo(s.controlInput)){g=it(s.controlInput);var y=["autocorrect","autocapitalize","autocomplete","spellcheck"];ve(y,_=>{r.getAttribute(_)&&le(g,{[_]:r.getAttribute(_)})}),g.tabIndex=-1,c.appendChild(g),this.focus_node=g}else s.controlInput?(g=it(s.controlInput),this.focus_node=g):(g=it(""),this.focus_node=c);this.wrapper=l,this.dropdown=u,this.dropdown_content=d,this.control=c,this.control_input=g,this.setup()}setup(){let e=this,t=e.settings,i=e.control_input,r=e.dropdown,o=e.dropdown_content,s=e.wrapper,a=e.control,l=e.input,c=e.focus_node,u={passive:!0},d=e.inputId+"-ts-dropdown";le(o,{id:d}),le(c,{role:"combobox","aria-haspopup":"listbox","aria-expanded":"false","aria-controls":d});let p=dr(c,e.inputId+"-ts-control"),v="label[for='"+Ua(e.inputId)+"']",g=document.querySelector(v),y=e.focus.bind(e);if(g){Ae(g,"click",y),le(g,{for:p});let w=dr(g,e.inputId+"-ts-label");le(c,{"aria-labelledby":w}),le(o,{"aria-labelledby":w})}if(s.style.width=l.style.width,e.plugins.names.length){let w="plugin-"+e.plugins.names.join(" plugin-");Pe([s,r],w)}(t.maxItems===null||t.maxItems>1)&&e.is_select_tag&&le(l,{multiple:"multiple"}),t.placeholder&&le(i,{placeholder:t.placeholder}),!t.splitOn&&t.delimiter&&(t.splitOn=new RegExp("\\s*"+Mt(t.delimiter)+"+\\s*")),t.load&&t.loadThrottle&&(t.load=Wa(t.load,t.loadThrottle)),Ae(r,"mousemove",()=>{e.ignoreHover=!1}),Ae(r,"mouseenter",w=>{var S=hr(w.target,"[data-selectable]",r);S&&e.onOptionHover(w,S)},{capture:!0}),Ae(r,"click",w=>{let S=hr(w.target,"[data-selectable]");S&&(e.onOptionSelect(w,S),fe(w,!0))}),Ae(a,"click",w=>{var S=hr(w.target,"[data-ts-item]",a);if(S&&e.onItemSelect(w,S)){fe(w,!0);return}i.value==""&&(e.onClick(),fe(w,!0))}),Ae(c,"keydown",w=>e.onKeyDown(w)),Ae(i,"keypress",w=>e.onKeyPress(w)),Ae(i,"input",w=>e.onInput(w)),Ae(c,"blur",w=>e.onBlur(w)),Ae(c,"focus",w=>e.onFocus(w)),Ae(i,"paste",w=>e.onPaste(w));let _=w=>{let S=w.composedPath()[0];if(!s.contains(S)&&!r.contains(S)){e.isFocused&&e.blur(),e.inputState();return}S==i&&e.isOpen?w.stopPropagation():fe(w,!0)},T=()=>{e.isOpen&&e.positionDropdown()};Ae(document,"mousedown",_),Ae(window,"scroll",T,u),Ae(window,"resize",T,u),this._destroy=()=>{document.removeEventListener("mousedown",_),window.removeEventListener("scroll",T),window.removeEventListener("resize",T),g&&g.removeEventListener("click",y)},this.revertSettings={innerHTML:l.innerHTML,tabIndex:l.tabIndex},l.tabIndex=-1,l.insertAdjacentElement("afterend",e.wrapper),e.sync(!1),t.items=[],delete t.optgroups,delete t.options,Ae(l,"invalid",()=>{e.isValid&&(e.isValid=!1,e.isInvalid=!0,e.refreshState())}),e.updateOriginalInput(),e.refreshItems(),e.close(!1),e.inputState(),e.isSetup=!0,l.disabled?e.disable():l.readOnly?e.setReadOnly(!0):e.enable(),e.on("change",this.onChange),Pe(l,"tomselected","ts-hidden-accessible"),e.trigger("initialize"),t.preload===!0&&e.preload()}setupOptions(e=[],t=[]){this.addOptions(e),ve(t,i=>{this.registerOptionGroup(i)})}setupTemplates(){var e=this,t=e.settings.labelField,i=e.settings.optgroupLabelField,r={optgroup:o=>{let s=document.createElement("div");return s.className="optgroup",s.appendChild(o.options),s},optgroup_header:(o,s)=>'
'+s(o[i])+"
",option:(o,s)=>"
"+s(o[t])+"
",item:(o,s)=>"
"+s(o[t])+"
",option_create:(o,s)=>'
Add '+s(o.input)+"
",no_results:()=>'
No results found
',loading:()=>'
',not_loading:()=>{},dropdown:()=>"
"};e.settings.render=Object.assign({},r,e.settings.render)}setupCallbacks(){var e,t,i={initialize:"onInitialize",change:"onChange",item_add:"onItemAdd",item_remove:"onItemRemove",item_select:"onItemSelect",clear:"onClear",option_add:"onOptionAdd",option_remove:"onOptionRemove",option_clear:"onOptionClear",optgroup_add:"onOptionGroupAdd",optgroup_remove:"onOptionGroupRemove",optgroup_clear:"onOptionGroupClear",dropdown_open:"onDropdownOpen",dropdown_close:"onDropdownClose",type:"onType",load:"onLoad",focus:"onFocus",blur:"onBlur"};for(e in i)t=this.settings[i[e]],t&&this.on(e,t)}sync(e=!0){let t=this,i=e?pr(t.input,{delimiter:t.settings.delimiter}):t.settings;t.setupOptions(i.options,i.optgroups),t.setValue(i.items||[],!0),t.lastQuery=null}onClick(){var e=this;if(e.activeItems.length>0){e.clearActiveItems(),e.focus();return}e.isFocused&&e.isOpen?e.blur():e.focus()}onMouseDown(){}onChange(){fr(this.input,"input"),fr(this.input,"change")}onPaste(e){var t=this;if(t.isInputHidden||t.isLocked){fe(e);return}t.settings.splitOn&&setTimeout(()=>{var i=t.inputValue();if(i.match(t.settings.splitOn)){var r=i.trim().split(t.settings.splitOn);ve(r,o=>{We(o)&&(this.options[o]?t.addItem(o):t.createItem(o))})}},0)}onKeyPress(e){var t=this;if(t.isLocked){fe(e);return}var i=String.fromCharCode(e.keyCode||e.which);if(t.settings.create&&t.settings.mode==="multi"&&i===t.settings.delimiter){t.createItem(),fe(e);return}}onKeyDown(e){var t=this;if(t.ignoreHover=!0,t.isLocked){e.keyCode!==9&&fe(e);return}switch(e.keyCode){case 65:if(kt(fi,e)&&t.control_input.value==""){fe(e),t.selectAll();return}break;case 27:t.isOpen&&(fe(e,!0),t.close()),t.clearActiveItems();return;case 40:if(!t.isOpen&&t.hasOptions)t.open();else if(t.activeOption){let i=t.getAdjacent(t.activeOption,1);i&&t.setActiveOption(i)}fe(e);return;case 38:if(t.activeOption){let i=t.getAdjacent(t.activeOption,-1);i&&t.setActiveOption(i)}fe(e);return;case 13:t.canSelect(t.activeOption)?(t.onOptionSelect(e,t.activeOption),fe(e)):t.settings.create&&t.createItem()?fe(e):document.activeElement==t.control_input&&t.isOpen&&fe(e);return;case 37:t.advanceSelection(-1,e);return;case 39:t.advanceSelection(1,e);return;case 9:t.settings.selectOnTab&&(t.canSelect(t.activeOption)&&(t.onOptionSelect(e,t.activeOption),fe(e)),t.settings.create&&t.createItem()&&fe(e));return;case 8:case 46:t.deleteSelection(e);return}t.isInputHidden&&!kt(fi,e)&&fe(e)}onInput(e){if(this.isLocked)return;let t=this.inputValue();if(this.lastValue!==t){if(this.lastValue=t,t==""){this._onInput();return}this.refreshTimeout&&window.clearTimeout(this.refreshTimeout),this.refreshTimeout=ja(()=>{this.refreshTimeout=null,this._onInput()},this.settings.refreshThrottle)}}_onInput(){let e=this.lastValue;this.settings.shouldLoad.call(this,e)&&this.load(e),this.refreshOptions(),this.trigger("type",e)}onOptionHover(e,t){this.ignoreHover||this.setActiveOption(t,!1)}onFocus(e){var t=this,i=t.isFocused;if(t.isDisabled||t.isReadOnly){t.blur(),fe(e);return}t.ignoreFocus||(t.isFocused=!0,t.settings.preload==="focus"&&t.preload(),i||t.trigger("focus"),t.activeItems.length||(t.inputState(),t.refreshOptions(!!t.settings.openOnFocus)),t.refreshState())}onBlur(e){if(document.hasFocus()!==!1){var t=this;if(t.isFocused){t.isFocused=!1,t.ignoreFocus=!1;var i=()=>{t.close(),t.setActiveItem(),t.setCaret(t.items.length),t.trigger("blur")};t.settings.create&&t.settings.createOnBlur?t.createItem(null,i):i()}}}onOptionSelect(e,t){var i,r=this;t.parentElement&&t.parentElement.matches("[data-disabled]")||(t.classList.contains("create")?r.createItem(null,()=>{r.settings.closeAfterSelect&&r.close()}):(i=t.dataset.value,typeof i!="undefined"&&(r.lastQuery=null,r.addItem(i),r.settings.closeAfterSelect&&r.close(),!r.settings.hideSelected&&e.type&&/click/.test(e.type)&&r.setActiveOption(t))))}canSelect(e){return!!(this.isOpen&&e&&this.dropdown_content.contains(e))}onItemSelect(e,t){var i=this;return!i.isLocked&&i.settings.mode==="multi"?(fe(e),i.setActiveItem(t,e),!0):!1}canLoad(e){return!(!this.settings.load||this.loadedSearches.hasOwnProperty(e))}load(e){let t=this;if(!t.canLoad(e))return;Pe(t.wrapper,t.settings.loadingClass),t.loading++;let i=t.loadCallback.bind(t);t.settings.load.call(t,e,i)}loadCallback(e,t){let i=this;i.loading=Math.max(i.loading-1,0),i.lastQuery=null,i.clearActiveOption(),i.setupOptions(e,t),i.refreshOptions(i.isFocused&&!i.isInputHidden),i.loading||vt(i.wrapper,i.settings.loadingClass),i.trigger("load",e,t)}preload(){var e=this.wrapper.classList;e.contains("preloaded")||(e.add("preloaded"),this.load(""))}setTextboxValue(e=""){var t=this.control_input,i=t.value!==e;i&&(t.value=e,fr(t,"update"),this.lastValue=e)}getValue(){return this.is_select_tag&&this.input.hasAttribute("multiple")?this.items:this.items.join(this.settings.delimiter)}setValue(e,t){var i=t?[]:["change"];Io(this,i,()=>{this.clear(t),this.addItems(e,t)})}setMaxItems(e){e===0&&(e=null),this.settings.maxItems=e,this.refreshState()}setActiveItem(e,t){var i=this,r,o,s,a,l,c;if(i.settings.mode!=="single"){if(!e){i.clearActiveItems(),i.isFocused&&i.inputState();return}if(r=t&&t.type.toLowerCase(),r==="click"&&kt("shiftKey",t)&&i.activeItems.length){for(c=i.getLastActive(),s=Array.prototype.indexOf.call(i.control.children,c),a=Array.prototype.indexOf.call(i.control.children,e),s>a&&(l=s,s=a,a=l),o=s;o<=a;o++)e=i.control.children[o],i.activeItems.indexOf(e)===-1&&i.setActiveItemClass(e);fe(t)}else r==="click"&&kt(fi,t)||r==="keydown"&&kt("shiftKey",t)?e.classList.contains("active")?i.removeActiveItem(e):i.setActiveItemClass(e):(i.clearActiveItems(),i.setActiveItemClass(e));i.inputState(),i.isFocused||i.focus()}}setActiveItemClass(e){let t=this,i=t.control.querySelector(".last-active");i&&vt(i,"last-active"),Pe(e,"active last-active"),t.trigger("item_select",e),t.activeItems.indexOf(e)==-1&&t.activeItems.push(e)}removeActiveItem(e){var t=this.activeItems.indexOf(e);this.activeItems.splice(t,1),vt(e,"active")}clearActiveItems(){vt(this.activeItems,"active"),this.activeItems=[]}setActiveOption(e,t=!0){e!==this.activeOption&&(this.clearActiveOption(),e&&(this.activeOption=e,le(this.focus_node,{"aria-activedescendant":e.getAttribute("id")}),le(e,{"aria-selected":"true"}),Pe(e,"active"),t&&this.scrollToOption(e)))}scrollToOption(e,t){if(!e)return;let i=this.dropdown_content,r=i.clientHeight,o=i.scrollTop||0,s=e.offsetHeight,a=e.getBoundingClientRect().top-i.getBoundingClientRect().top+o;a+s>r+o?this.scroll(a-r+s,t):a{e.setActiveItemClass(i)}))}inputState(){var e=this;e.control.contains(e.control_input)&&(le(e.control_input,{placeholder:e.settings.placeholder}),e.activeItems.length>0||!e.isFocused&&e.settings.hidePlaceholder&&e.items.length>0?(e.setTextboxValue(),e.isInputHidden=!0):(e.settings.hidePlaceholder&&e.items.length>0&&le(e.control_input,{placeholder:""}),e.isInputHidden=!1),e.wrapper.classList.toggle("input-hidden",e.isInputHidden))}inputValue(){return this.control_input.value.trim()}focus(){var e=this;e.isDisabled||e.isReadOnly||(e.ignoreFocus=!0,e.control_input.offsetWidth?e.control_input.focus():e.focus_node.focus(),setTimeout(()=>{e.ignoreFocus=!1,e.onFocus()},0))}blur(){this.focus_node.blur(),this.onBlur()}getScoreFunction(e){return this.sifter.getScoreFunction(e,this.getSearchOptions())}getSearchOptions(){var e=this.settings,t=e.sortField;return typeof e.sortField=="string"&&(t=[{field:e.sortField}]),{fields:e.searchField,conjunction:e.searchConjunction,sort:t,nesting:e.nesting}}search(e){var t,i,r=this,o=this.getSearchOptions();if(r.settings.score&&(i=r.settings.score.call(r,e),typeof i!="function"))throw new Error('Tom Select "score" setting must be a function that returns a function');return e!==r.lastQuery?(r.lastQuery=e,t=r.sifter.search(e,Object.assign(o,{score:i})),r.currentResults=t):t=Object.assign({},r.currentResults),r.settings.hideSelected&&(t.items=t.items.filter(s=>{let a=We(s.id);return!(a&&r.items.indexOf(a)!==-1)})),t}refreshOptions(e=!0){var t,i,r,o,s,a,l,c,u,d;let p={},v=[];var g=this,y=g.inputValue();let _=y===g.lastQuery||y==""&&g.lastQuery==null;var T=g.search(y),w=null,S=g.settings.shouldOpen||!1,M=g.dropdown_content;_&&(w=g.activeOption,w&&(u=w.closest("[data-group]"))),o=T.items.length,typeof g.settings.maxOptions=="number"&&(o=Math.min(o,g.settings.maxOptions)),o>0&&(S=!0);let G=(D,L)=>{let N=p[D];if(N!==void 0){let B=v[N];if(B!==void 0)return[N,B.fragment]}let Y=document.createDocumentFragment();return N=v.length,v.push({fragment:Y,order:L,optgroup:D}),[N,Y]};for(t=0;t0&&(B=B.cloneNode(!0),le(B,{id:N.$id+"-clone-"+i,"aria-selected":null}),B.classList.add("ts-cloned"),vt(B,"active"),g.activeOption&&g.activeOption.dataset.value==L&&u&&u.dataset.group===s.toString()&&(w=B)),Ce.appendChild(B),s!=""&&(p[s]=Te)}}g.settings.lockOptgroupOrder&&v.sort((D,L)=>D.order-L.order),l=document.createDocumentFragment(),ve(v,D=>{let L=D.fragment,N=D.optgroup;if(!L||!L.children.length)return;let Y=g.optgroups[N];if(Y!==void 0){let B=document.createDocumentFragment(),ie=g.render("optgroup_header",Y);Nt(B,ie),Nt(B,L);let J=g.render("optgroup",{group:Y,options:B});Nt(l,J)}else Nt(l,L)}),M.innerHTML="",Nt(M,l),g.settings.highlight&&(Qa(M),T.query.length&&T.tokens.length&&ve(T.tokens,D=>{Xa(M,D.regex)}));var F=D=>{let L=g.render(D,{input:y});return L&&(S=!0,M.insertBefore(L,M.firstChild)),L};if(g.loading?F("loading"):g.settings.shouldLoad.call(g,y)?T.items.length===0&&F("no_results"):F("not_loading"),c=g.canCreate(y),c&&(d=F("option_create")),g.hasOptions=T.items.length>0||c,S){if(T.items.length>0){if(!w&&g.settings.mode==="single"&&g.items[0]!=null&&(w=g.getOption(g.items[0])),!M.contains(w)){let D=0;d&&!g.settings.addPrecedence&&(D=1),w=g.selectable()[D]}}else d&&(w=d);e&&!g.isOpen&&(g.open(),g.scrollToOption(w,"auto")),g.setActiveOption(w)}else g.clearActiveOption(),e&&g.isOpen&&g.close(!1)}selectable(){return this.dropdown_content.querySelectorAll("[data-selectable]")}addOption(e,t=!1){let i=this;if(Array.isArray(e))return i.addOptions(e,t),!1;let r=We(e[i.settings.valueField]);return r===null||i.options.hasOwnProperty(r)?!1:(e.$order=e.$order||++i.order,e.$id=i.inputId+"-opt-"+e.$order,i.options[r]=e,i.lastQuery=null,t&&(i.userOptions[r]=t,i.trigger("option_add",r,e)),r)}addOptions(e,t=!1){ve(e,i=>{this.addOption(i,t)})}registerOption(e){return this.addOption(e)}registerOptionGroup(e){var t=We(e[this.settings.optgroupValueField]);return t===null?!1:(e.$order=e.$order||++this.order,this.optgroups[t]=e,t)}addOptionGroup(e,t){var i;t[this.settings.optgroupValueField]=e,(i=this.registerOptionGroup(t))&&this.trigger("optgroup_add",i,t)}removeOptionGroup(e){this.optgroups.hasOwnProperty(e)&&(delete this.optgroups[e],this.clearCache(),this.trigger("optgroup_remove",e))}clearOptionGroups(){this.optgroups={},this.clearCache(),this.trigger("optgroup_clear")}updateOption(e,t){let i=this;var r,o;let s=We(e),a=We(t[i.settings.valueField]);if(s===null)return;let l=i.options[s];if(l==null)return;if(typeof a!="string")throw new Error("Value must be set in option data");let c=i.getOption(s),u=i.getItem(s);if(t.$order=t.$order||l.$order,delete i.options[s],i.uncacheValue(a),i.options[a]=t,c){if(i.dropdown_content.contains(c)){let d=i._render("option",t);di(c,d),i.activeOption===c&&i.setActiveOption(d)}c.remove()}u&&(o=i.items.indexOf(s),o!==-1&&i.items.splice(o,1,a),r=i._render("item",t),u.classList.contains("active")&&Pe(r,"active"),di(u,r)),i.lastQuery=null}removeOption(e,t){let i=this;e=ci(e),i.uncacheValue(e),delete i.userOptions[e],delete i.options[e],i.lastQuery=null,i.trigger("option_remove",e),i.removeItem(e,t)}clearOptions(e){let t=(e||this.clearFilter).bind(this);this.loadedSearches={},this.userOptions={},this.clearCache();let i={};ve(this.options,(r,o)=>{t(r,o)&&(i[o]=r)}),this.options=this.sifter.items=i,this.lastQuery=null,this.trigger("option_clear")}clearFilter(e,t){return this.items.indexOf(t)>=0}getOption(e,t=!1){let i=We(e);if(i===null)return null;let r=this.options[i];if(r!=null){if(r.$div)return r.$div;if(t)return this._render("option",r)}return null}getAdjacent(e,t,i="option"){var r=this,o;if(!e)return null;i=="item"?o=r.controlChildren():o=r.dropdown_content.querySelectorAll("[data-selectable]");for(let s=0;s0?o[s+1]:o[s-1];return null}getItem(e){if(typeof e=="object")return e;var t=We(e);return t!==null?this.control.querySelector(`[data-value="${Po(t)}"]`):null}addItems(e,t){var i=this,r=Array.isArray(e)?e:[e];r=r.filter(s=>i.items.indexOf(s)===-1);let o=r[r.length-1];r.forEach(s=>{i.isPending=s!==o,i.addItem(s,t)})}addItem(e,t){var i=t?[]:["change","dropdown_close"];Io(this,i,()=>{var r,o;let s=this,a=s.settings.mode,l=We(e);if(!(l&&s.items.indexOf(l)!==-1&&(a==="single"&&s.close(),a==="single"||!s.settings.duplicates))&&!(l===null||!s.options.hasOwnProperty(l))&&(a==="single"&&s.clear(t),!(a==="multi"&&s.isFull()))){if(r=s._render("item",s.options[l]),s.control.contains(r)&&(r=r.cloneNode(!0)),o=s.isFull(),s.items.splice(s.caretPos,0,l),s.insertAtCaret(r),s.isSetup){if(!s.isPending&&s.settings.hideSelected){let c=s.getOption(l),u=s.getAdjacent(c,1);u&&s.setActiveOption(u)}!s.isPending&&!s.settings.closeAfterSelect&&s.refreshOptions(s.isFocused&&a!=="single"),s.settings.closeAfterSelect!=!1&&s.isFull()?s.close():s.isPending||s.positionDropdown(),s.trigger("item_add",l,r),s.isPending||s.updateOriginalInput({silent:t})}(!s.isPending||!o&&s.isFull())&&(s.inputState(),s.refreshState())}})}removeItem(e=null,t){let i=this;if(e=i.getItem(e),!e)return;var r,o;let s=e.dataset.value;r=Bo(e),e.remove(),e.classList.contains("active")&&(o=i.activeItems.indexOf(e),i.activeItems.splice(o,1),vt(e,"active")),i.items.splice(r,1),i.lastQuery=null,!i.settings.persist&&i.userOptions.hasOwnProperty(s)&&i.removeOption(s,t),r{}){arguments.length===3&&(t=arguments[2]),typeof t!="function"&&(t=()=>{});var i=this,r=i.caretPos,o;if(e=e||i.inputValue(),!i.canCreate(e))return t(),!1;i.lock();var s=!1,a=l=>{if(i.unlock(),!l||typeof l!="object")return t();var c=We(l[i.settings.valueField]);if(typeof c!="string")return t();i.setTextboxValue(),i.addOption(l,!0),i.setCaret(r),i.addItem(c),t(l),s=!0};return typeof i.settings.create=="function"?o=i.settings.create.call(this,e,a):o={[i.settings.labelField]:e,[i.settings.valueField]:e},s||a(o),!0}refreshItems(){var e=this;e.lastQuery=null,e.isSetup&&e.addItems(e.items),e.updateOriginalInput(),e.refreshState()}refreshState(){let e=this;e.refreshValidityState();let t=e.isFull(),i=e.isLocked;e.wrapper.classList.toggle("rtl",e.rtl);let r=e.wrapper.classList;r.toggle("focus",e.isFocused),r.toggle("disabled",e.isDisabled),r.toggle("readonly",e.isReadOnly),r.toggle("required",e.isRequired),r.toggle("invalid",!e.isValid),r.toggle("locked",i),r.toggle("full",t),r.toggle("input-active",e.isFocused&&!e.isInputHidden),r.toggle("dropdown-active",e.isOpen),r.toggle("has-options",Ka(e.options)),r.toggle("has-items",e.items.length>0)}refreshValidityState(){var e=this;e.input.validity&&(e.isValid=e.input.validity.valid,e.isInvalid=!e.isValid)}isFull(){return this.settings.maxItems!==null&&this.items.length>=this.settings.maxItems}updateOriginalInput(e={}){let t=this;var i,r;let o=t.input.querySelector('option[value=""]');if(t.is_select_tag){let l=function(c,u,d){return c||(c=it('")),c!=o&&t.input.append(c),s.push(c),(c!=o||a>0)&&(c.selected=!0),c},s=[],a=t.input.querySelectorAll("option:checked").length;t.input.querySelectorAll("option:checked").forEach(c=>{c.selected=!1}),t.items.length==0&&t.settings.mode=="single"?l(o,"",""):t.items.forEach(c=>{if(i=t.options[c],r=i[t.settings.labelField]||"",s.includes(i.$option)){let u=t.input.querySelector(`option[value="${Po(c)}"]:not(:checked)`);l(u,c,r)}else i.$option=l(i.$option,c,r)})}else t.input.value=t.getValue();t.isSetup&&(e.silent||t.trigger("change",t.getValue()))}open(){var e=this;e.isLocked||e.isOpen||e.settings.mode==="multi"&&e.isFull()||(e.isOpen=!0,le(e.focus_node,{"aria-expanded":"true"}),e.refreshState(),ui(e.dropdown,{visibility:"hidden",display:"block"}),e.positionDropdown(),ui(e.dropdown,{visibility:"visible",display:"block"}),e.focus(),e.trigger("dropdown_open",e.dropdown))}close(e=!0){var t=this,i=t.isOpen;e&&(t.setTextboxValue(),t.settings.mode==="single"&&t.items.length&&t.inputState()),t.isOpen=!1,le(t.focus_node,{"aria-expanded":"false"}),ui(t.dropdown,{display:"none"}),t.settings.hideSelected&&t.clearActiveOption(),t.refreshState(),i&&t.trigger("dropdown_close",t.dropdown)}positionDropdown(){if(this.settings.dropdownParent==="body"){var e=this.control,t=e.getBoundingClientRect(),i=e.offsetHeight+t.top+window.scrollY,r=t.left+window.scrollX;ui(this.dropdown,{width:t.width+"px",top:i+"px",left:r+"px"})}}clear(e){var t=this;if(t.items.length){var i=t.controlChildren();ve(i,r=>{t.removeItem(r,!0)}),t.inputState(),e||t.updateOriginalInput(),t.trigger("clear")}}insertAtCaret(e){let t=this,i=t.caretPos,r=t.control;r.insertBefore(e,r.children[i]||null),t.setCaret(i+1)}deleteSelection(e){var t,i,r,o,s=this;t=e&&e.keyCode===8?-1:1,i=qa(s.control_input);let a=[];if(s.activeItems.length)o=$o(s.activeItems,t),r=Bo(o),t>0&&r++,ve(s.activeItems,l=>a.push(l));else if((s.isFocused||s.settings.mode==="single")&&s.items.length){let l=s.controlChildren(),c;t<0&&i.start===0&&i.length===0?c=l[s.caretPos-1]:t>0&&i.start===s.inputValue().length&&(c=l[s.caretPos]),c!==void 0&&a.push(c)}if(!s.shouldDelete(a,e))return!1;for(fe(e,!0),typeof r!="undefined"&&s.setCaret(r);a.length;)s.removeItem(a.pop());return s.inputState(),s.positionDropdown(),s.refreshOptions(!1),!0}shouldDelete(e,t){let i=e.map(r=>r.dataset.value);return!(!i.length||typeof this.settings.onDelete=="function"&&this.settings.onDelete(i,t)===!1)}advanceSelection(e,t){var i,r,o=this;o.rtl&&(e*=-1),!o.inputValue().length&&(kt(fi,t)||kt("shiftKey",t)?(i=o.getLastActive(e),i?i.classList.contains("active")?r=o.getAdjacent(i,e,"item"):r=i:e>0?r=o.control_input.nextElementSibling:r=o.control_input.previousElementSibling,r&&(r.classList.contains("active")&&o.removeActiveItem(i),o.setActiveItemClass(r))):o.moveCaret(e))}moveCaret(e){}getLastActive(e){let t=this.control.querySelector(".last-active");if(t)return t;var i=this.control.querySelectorAll(".active");if(i)return $o(i,e)}setCaret(e){this.caretPos=this.items.length}controlChildren(){return Array.from(this.control.querySelectorAll("[data-ts-item]"))}lock(){this.setLocked(!0)}unlock(){this.setLocked(!1)}setLocked(e=this.isReadOnly||this.isDisabled){this.isLocked=e,this.refreshState()}disable(){this.setDisabled(!0),this.close()}enable(){this.setDisabled(!1)}setDisabled(e){this.focus_node.tabIndex=e?-1:this.tabIndex,this.isDisabled=e,this.input.disabled=e,this.control_input.disabled=e,this.setLocked()}setReadOnly(e){this.isReadOnly=e,this.input.readOnly=e,this.control_input.readOnly=e,this.setLocked()}destroy(){var e=this,t=e.revertSettings;e.trigger("destroy"),e.off(),e.wrapper.remove(),e.dropdown.remove(),e.input.innerHTML=t.innerHTML,e.input.tabIndex=t.tabIndex,vt(e.input,"tomselected","ts-hidden-accessible"),e._destroy(),delete e.input.tomselect}render(e,t){var i,r;let o=this;if(typeof this.settings.render[e]!="function"||(r=o.settings.render[e].call(this,t,ur),!r))return null;if(r=it(r),e==="option"||e==="option_create"?t[o.settings.disabledField]?le(r,{"aria-disabled":"true"}):le(r,{"data-selectable":""}):e==="optgroup"&&(i=t.group[o.settings.optgroupValueField],le(r,{"data-group":i}),t.group[o.settings.disabledField]&&le(r,{"data-disabled":""})),e==="option"||e==="item"){let s=ci(t[o.settings.valueField]);le(r,{"data-value":s}),e==="item"?(Pe(r,o.settings.itemClass),le(r,{"data-ts-item":""})):(Pe(r,o.settings.optionClass),le(r,{role:"option",id:t.$id}),t.$div=r,o.options[s]=t)}return r}_render(e,t){let i=this.render(e,t);if(i==null)throw"HTMLElement expected";return i}clearCache(){ve(this.options,e=>{e.$div&&(e.$div.remove(),delete e.$div)})}uncacheValue(e){let t=this.getOption(e);t&&t.remove()}canCreate(e){return this.settings.create&&e.length>0&&this.settings.createFilter.call(this,e)}hook(e,t,i){var r=this,o=r[t];r[t]=function(){var s,a;return e==="after"&&(s=o.apply(r,arguments)),a=i.apply(r,arguments),e==="instead"?a:(e==="before"&&(s=o.apply(r,arguments)),s)}}};var _m=(n,e,t,i)=>{n.addEventListener(e,t,i)};function tl(){_m(this.input,"change",()=>{this.sync()})}var wm=n=>typeof n=="undefined"||n===null?null:xm(n),xm=n=>typeof n=="boolean"?n?"1":"0":n+"",nl=(n,e=!1)=>{n&&(n.preventDefault(),e&&n.stopPropagation())},Tm=n=>{if(n.jquery)return n[0];if(n instanceof HTMLElement)return n;if(Cm(n)){var e=document.createElement("template");return e.innerHTML=n.trim(),e.content.firstChild}return document.querySelector(n)},Cm=n=>typeof n=="string"&&n.indexOf("<")>-1;function il(n){var e=this,t=e.onOptionSelect;e.settings.hideSelected=!1;let i=Object.assign({className:"tomselect-checkbox",checkedClassNames:void 0,uncheckedClassNames:void 0},n);var r=function(a,l){l?(a.checked=!0,i.uncheckedClassNames&&a.classList.remove(...i.uncheckedClassNames),i.checkedClassNames&&a.classList.add(...i.checkedClassNames)):(a.checked=!1,i.checkedClassNames&&a.classList.remove(...i.checkedClassNames),i.uncheckedClassNames&&a.classList.add(...i.uncheckedClassNames))},o=function(a){setTimeout(()=>{var l=a.querySelector("input."+i.className);l instanceof HTMLInputElement&&r(l,a.classList.contains("selected"))},1)};e.hook("after","setupTemplates",()=>{var s=e.settings.render.option;e.settings.render.option=(a,l)=>{var c=Tm(s.call(e,a,l)),u=document.createElement("input");i.className&&u.classList.add(i.className),u.addEventListener("click",function(p){nl(p)}),u.type="checkbox";let d=wm(a[e.settings.valueField]);return r(u,!!(d&&e.items.indexOf(d)>-1)),c.prepend(u),c}}),e.on("item_remove",s=>{var a=e.getOption(s);a&&(a.classList.remove("selected"),o(a))}),e.on("item_add",s=>{var a=e.getOption(s);a&&o(a)}),e.hook("instead","onOptionSelect",(s,a)=>{if(a.classList.contains("selected")){a.classList.remove("selected"),e.removeItem(a.dataset.value),e.refreshOptions(),nl(s,!0);return}t.call(e,s,a),o(a)})}var Sm=n=>{if(n.jquery)return n[0];if(n instanceof HTMLElement)return n;if(Am(n)){var e=document.createElement("template");return e.innerHTML=n.trim(),e.content.firstChild}return document.querySelector(n)},Am=n=>typeof n=="string"&&n.indexOf("<")>-1;function rl(n){let e=this,t=Object.assign({className:"clear-button",title:"Clear All",html:i=>`
`},n);e.on("initialize",()=>{var i=Sm(t.html(t));i.addEventListener("click",r=>{e.isLocked||(e.clear(),e.settings.mode==="single"&&e.settings.allowEmptyOption&&e.addItem(""),r.preventDefault(),r.stopPropagation())}),e.control.appendChild(i)})}var Dm=(n,e=!1)=>{n&&(n.preventDefault(),e&&n.stopPropagation())},On=(n,e,t,i)=>{n.addEventListener(e,t,i)},Om=(n,e)=>{if(Array.isArray(n))n.forEach(e);else for(var t in n)n.hasOwnProperty(t)&&e(n[t],t)},Lm=n=>{if(n.jquery)return n[0];if(n instanceof HTMLElement)return n;if(Mm(n)){var e=document.createElement("template");return e.innerHTML=n.trim(),e.content.firstChild}return document.querySelector(n)},Mm=n=>typeof n=="string"&&n.indexOf("<")>-1,km=(n,e)=>{Om(e,(t,i)=>{t==null?n.removeAttribute(i):n.setAttribute(i,""+t)})},Nm=(n,e)=>{var t;(t=n.parentNode)==null||t.insertBefore(e,n.nextSibling)},Rm=(n,e)=>{var t;(t=n.parentNode)==null||t.insertBefore(e,n)},Hm=(n,e)=>{do{var t;if(e=(t=e)==null?void 0:t.previousElementSibling,n==e)return!0}while(e&&e.previousElementSibling);return!1};function ol(){var n=this;if(n.settings.mode!=="multi")return;var e=n.lock,t=n.unlock;let i=!0,r;n.hook("after","setupTemplates",()=>{var o=n.settings.render.item;n.settings.render.item=(s,a)=>{let l=Lm(o.call(n,s,a));km(l,{draggable:"true"});let c=y=>{i||Dm(y),y.stopPropagation()},u=y=>{r=l,setTimeout(()=>{l.classList.add("ts-dragging")},0)},d=y=>{y.preventDefault(),l.classList.add("ts-drag-over"),v(l,r)},p=()=>{l.classList.remove("ts-drag-over")},v=(y,_)=>{_!==void 0&&(Hm(_,l)?Nm(y,_):Rm(y,_))},g=()=>{var y;document.querySelectorAll(".ts-drag-over").forEach(T=>T.classList.remove("ts-drag-over")),(y=r)==null||y.classList.remove("ts-dragging"),r=void 0;var _=[];n.control.querySelectorAll("[data-value]").forEach(T=>{if(T.dataset.value){let w=T.dataset.value;w&&_.push(w)}}),n.setValue(_)};return On(l,"mousedown",c),On(l,"dragstart",u),On(l,"dragenter",d),On(l,"dragover",d),On(l,"dragleave",p),On(l,"dragend",g),l}}),n.hook("instead","lock",()=>(i=!1,e.call(n))),n.hook("instead","unlock",()=>(i=!0,t.call(n)))}var Im=(n,e=!1)=>{n&&(n.preventDefault(),e&&n.stopPropagation())},Pm=n=>{if(n.jquery)return n[0];if(n instanceof HTMLElement)return n;if(Fm(n)){var e=document.createElement("template");return e.innerHTML=n.trim(),e.content.firstChild}return document.querySelector(n)},Fm=n=>typeof n=="string"&&n.indexOf("<")>-1;function sl(n){let e=this,t=Object.assign({title:"Untitled",headerClass:"dropdown-header",titleRowClass:"dropdown-header-title",labelClass:"dropdown-header-label",closeClass:"dropdown-header-close",html:i=>'
'+i.title+'×
'},n);e.on("initialize",()=>{var i=Pm(t.html(t)),r=i.querySelector("."+t.closeClass);r&&r.addEventListener("click",o=>{Im(o,!0),e.close()}),e.dropdown.insertBefore(i,e.dropdown.firstChild)})}var $m=(n,e)=>{if(Array.isArray(n))n.forEach(e);else for(var t in n)n.hasOwnProperty(t)&&e(n[t],t)},Bm=(n,...e)=>{var t=Vm(e);n=zm(n),n.map(i=>{t.map(r=>{i.classList.remove(r)})})},Vm=n=>{var e=[];return $m(n,t=>{typeof t=="string"&&(t=t.trim().split(/[\t\n\f\r\s]/)),Array.isArray(t)&&(e=e.concat(t))}),e.filter(Boolean)},zm=n=>(Array.isArray(n)||(n=[n]),n),jm=(n,e)=>{if(!n)return-1;e=e||n.nodeName;for(var t=0;n=n.previousElementSibling;)n.matches(e)&&t++;return t};function al(){var n=this;n.hook("instead","setCaret",e=>{n.settings.mode==="single"||!n.control.contains(n.control_input)?e=n.items.length:(e=Math.max(0,Math.min(n.items.length,e)),e!=n.caretPos&&!n.isPending&&n.controlChildren().forEach((t,i)=>{i{if(!n.isFocused)return;let t=n.getLastActive(e);if(t){let i=jm(t);n.setCaret(e>0?i+1:i),n.setActiveItem(),Bm(t,"last-active")}else n.setCaret(n.caretPos+e)})}var Wm=(n,e=!1)=>{n&&(n.preventDefault(),e&&n.stopPropagation())},qm=(n,e,t,i)=>{n.addEventListener(e,t,i)},Um=(n,e)=>{if(Array.isArray(n))n.forEach(e);else for(var t in n)n.hasOwnProperty(t)&&e(n[t],t)},ll=n=>{if(n.jquery)return n[0];if(n instanceof HTMLElement)return n;if(Ym(n)){var e=document.createElement("template");return e.innerHTML=n.trim(),e.content.firstChild}return document.querySelector(n)},Ym=n=>typeof n=="string"&&n.indexOf("<")>-1,Gm=(n,...e)=>{var t=Km(e);n=Xm(n),n.map(i=>{t.map(r=>{i.classList.add(r)})})},Km=n=>{var e=[];return Um(n,t=>{typeof t=="string"&&(t=t.trim().split(/[\t\n\f\r\s]/)),Array.isArray(t)&&(e=e.concat(t))}),e.filter(Boolean)},Xm=n=>(Array.isArray(n)||(n=[n]),n);function cl(){let n=this;n.settings.shouldOpen=!0,n.hook("before","setup",()=>{n.focus_node=n.control,Gm(n.control_input,"dropdown-input");let e=ll('