Browse code

Update htmx lib

Benjamin Roth authored on08/03/2024 10:15:01
Showing12 changed files
... ...
@@ -83,9 +83,12 @@
83 83
       "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw=="
84 84
     },
85 85
     "node_modules/function-bind": {
86
-      "version": "1.1.1",
87
-      "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
88
-      "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
86
+      "version": "1.1.2",
87
+      "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
88
+      "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
89
+      "funding": {
90
+        "url": "https://github.com/sponsors/ljharb"
91
+      }
89 92
     },
90 93
     "node_modules/gently-copy": {
91 94
       "version": "3.2.0",
... ...
@@ -118,17 +121,6 @@
118 121
         "url": "https://github.com/sponsors/isaacs"
119 122
       }
120 123
     },
121
-    "node_modules/has": {
122
-      "version": "1.0.3",
123
-      "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
124
-      "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
125
-      "dependencies": {
126
-        "function-bind": "^1.1.1"
127
-      },
128
-      "engines": {
129
-        "node": ">= 0.4.0"
130
-      }
131
-    },
132 124
     "node_modules/has-flag": {
133 125
       "version": "3.0.0",
134 126
       "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
... ...
@@ -137,10 +129,21 @@
137 129
         "node": ">=4"
138 130
       }
139 131
     },
132
+    "node_modules/hasown": {
133
+      "version": "2.0.1",
134
+      "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.1.tgz",
135
+      "integrity": "sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA==",
136
+      "dependencies": {
137
+        "function-bind": "^1.1.2"
138
+      },
139
+      "engines": {
140
+        "node": ">= 0.4"
141
+      }
142
+    },
140 143
     "node_modules/htmx.org": {
141
-      "version": "1.9.2",
142
-      "resolved": "https://registry.npmjs.org/htmx.org/-/htmx.org-1.9.2.tgz",
143
-      "integrity": "sha512-ZGbucKcalQyXdGUl+4Zt3xdRDPmNy70yNhMyDG1eDYUm/ImxmSo2rhIBDa53XitrAVhA+/CGgry+wJ1SO77wrA=="
144
+      "version": "1.9.10",
145
+      "resolved": "https://registry.npmjs.org/htmx.org/-/htmx.org-1.9.10.tgz",
146
+      "integrity": "sha512-UgchasltTCrTuU2DQLom3ohHrBvwr7OqpwyAVJ9VxtNBng4XKkVsqrv0Qr3srqvM9ZNI3f1MmvVQQqK7KW/bTA=="
144 147
     },
145 148
     "node_modules/inflight": {
146 149
       "version": "1.0.6",
... ...
@@ -165,11 +168,11 @@
165 168
       }
166 169
     },
167 170
     "node_modules/is-core-module": {
168
-      "version": "2.12.1",
169
-      "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz",
170
-      "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==",
171
+      "version": "2.13.1",
172
+      "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz",
173
+      "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==",
171 174
       "dependencies": {
172
-        "has": "^1.0.3"
175
+        "hasown": "^2.0.0"
173 176
       },
174 177
       "funding": {
175 178
         "url": "https://github.com/sponsors/ljharb"
... ...
@@ -219,11 +222,11 @@
219 222
       }
220 223
     },
221 224
     "node_modules/resolve": {
222
-      "version": "1.22.2",
223
-      "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz",
224
-      "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==",
225
+      "version": "1.22.8",
226
+      "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz",
227
+      "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==",
225 228
       "dependencies": {
226
-        "is-core-module": "^2.11.0",
229
+        "is-core-module": "^2.13.0",
227 230
         "path-parse": "^1.0.7",
228 231
         "supports-preserve-symlinks-flag": "^1.0.0"
229 232
       },
... ...
@@ -13,11 +13,42 @@ htmx.defineExtension('client-side-templates', {
13 13
             }
14 14
         }
15 15
 
16
+        var mustacheArrayTemplate = htmx.closest(elt, "[mustache-array-template]");
17
+        if (mustacheArrayTemplate) {
18
+            var data = JSON.parse(text);
19
+            var templateId = mustacheArrayTemplate.getAttribute('mustache-array-template');
20
+            var template = htmx.find("#" + templateId);
21
+            if (template) {
22
+                return Mustache.render(template.innerHTML, {"data": data });
23
+            } else {
24
+                throw "Unknown mustache template: " + templateId;
25
+            }
26
+        }
27
+
16 28
         var handlebarsTemplate = htmx.closest(elt, "[handlebars-template]");
17 29
         if (handlebarsTemplate) {
18 30
             var data = JSON.parse(text);
19
-            var templateName = handlebarsTemplate.getAttribute('handlebars-template');
20
-            return Handlebars.partials[templateName](data);
31
+            var templateId = handlebarsTemplate.getAttribute('handlebars-template');
32
+            var templateElement = htmx.find('#' + templateId).innerHTML;
33
+            var renderTemplate = Handlebars.compile(templateElement);
34
+            if (renderTemplate) {
35
+                return renderTemplate(data);
36
+            } else {
37
+                throw "Unknown handlebars template: " + templateId;
38
+            }
39
+        }
40
+
41
+        var handlebarsArrayTemplate = htmx.closest(elt, "[handlebars-array-template]");
42
+        if (handlebarsArrayTemplate) {
43
+            var data = JSON.parse(text);
44
+            var templateId = handlebarsArrayTemplate.getAttribute('handlebars-array-template');
45
+            var templateElement = htmx.find('#' + templateId).innerHTML;
46
+            var renderTemplate = Handlebars.compile(templateElement);
47
+            if (renderTemplate) {
48
+                return renderTemplate(data);
49
+            } else {
50
+                throw "Unknown handlebars template: " + templateId;
51
+            }
21 52
         }
22 53
 
23 54
         var nunjucksTemplate = htmx.closest(elt, "[nunjucks-template]");
... ...
@@ -30,8 +61,36 @@ htmx.defineExtension('client-side-templates', {
30 61
             } else {
31 62
                 return nunjucks.render(templateName, data);
32 63
             }
33
-          }
64
+        }
34 65
 
66
+        var xsltTemplate = htmx.closest(elt, "[xslt-template]");
67
+        if (xsltTemplate) {
68
+            var templateId = xsltTemplate.getAttribute('xslt-template');
69
+            var template = htmx.find("#" + templateId);
70
+            if (template) {
71
+              var content = template.innerHTML ? new DOMParser().parseFromString(template.innerHTML, 'application/xml')
72
+                                               : template.contentDocument;
73
+              var processor = new XSLTProcessor();
74
+              processor.importStylesheet(content);
75
+              var data = new DOMParser().parseFromString(text, "application/xml");
76
+              var frag = processor.transformToFragment(data, document);
77
+              return new XMLSerializer().serializeToString(frag);
78
+            } else {
79
+              throw "Unknown XSLT template: " + templateId;
80
+            }
81
+        }
82
+
83
+          var nunjucksArrayTemplate = htmx.closest(elt, "[nunjucks-array-template]");
84
+          if (nunjucksArrayTemplate) {
85
+              var data = JSON.parse(text);
86
+              var templateName = nunjucksArrayTemplate.getAttribute('nunjucks-array-template');
87
+              var template = htmx.find('#' + templateName);
88
+              if (template) {
89
+                  return nunjucks.renderString(template.innerHTML, {"data": data});
90
+              } else {
91
+                  return nunjucks.render(templateName, {"data": data});
92
+              }
93
+            }
35 94
         return text;
36 95
     }
37 96
 });
... ...
@@ -5,12 +5,14 @@ htmx.defineExtension('disable-element', {
5 5
     onEvent: function (name, evt) {
6 6
         let elt = evt.detail.elt;
7 7
         let target = elt.getAttribute("hx-disable-element");
8
-        let targetElement = (target == "self") ? elt : document.querySelector(target);
8
+        let targetElements = (target == "self") ? [ elt ] : document.querySelectorAll(target);
9 9
 
10
-        if (name === "htmx:beforeRequest" && targetElement) {
11
-            targetElement.disabled = true;
12
-        } else if (name == "htmx:afterRequest" && targetElement) {
13
-            targetElement.disabled = false;
10
+        for (var i = 0; i < targetElements.length; i++) {
11
+            if (name === "htmx:beforeRequest" && targetElements[i]) {
12
+                targetElements[i].disabled = true;
13
+            } else if (name == "htmx:afterRequest" && targetElements[i]) {
14
+                targetElements[i].disabled = false;
15
+            }
14 16
         }
15 17
     }
16 18
 });
17 19
\ No newline at end of file
... ...
@@ -25,28 +25,28 @@
25 25
 		if (delayElt) {
26 26
 			const delayInMilliseconds =
27 27
 				delayElt.getAttribute('data-loading-delay') || 200
28
-			const timeout = setTimeout(() => {
28
+			const timeout = setTimeout(function () {
29 29
 				doCallback()
30 30
 
31
-				loadingStatesUndoQueue.push(() => {
32
-					mayProcessUndoCallback(targetElt, () => undoCallback())
31
+				loadingStatesUndoQueue.push(function () {
32
+					mayProcessUndoCallback(targetElt, undoCallback)
33 33
 				})
34 34
 			}, delayInMilliseconds)
35 35
 
36
-			loadingStatesUndoQueue.push(() => {
37
-				mayProcessUndoCallback(targetElt, () => clearTimeout(timeout))
36
+			loadingStatesUndoQueue.push(function () {
37
+				mayProcessUndoCallback(targetElt, function () { clearTimeout(timeout) })
38 38
 			})
39 39
 		} else {
40 40
 			doCallback()
41
-			loadingStatesUndoQueue.push(() => {
42
-				mayProcessUndoCallback(targetElt, () => undoCallback())
41
+			loadingStatesUndoQueue.push(function () {
42
+				mayProcessUndoCallback(targetElt, undoCallback)
43 43
 			})
44 44
 		}
45 45
 	}
46 46
 
47 47
 	function getLoadingStateElts(loadingScope, type, path) {
48
-		return Array.from(htmx.findAll(loadingScope, `[${type}]`)).filter(
49
-			(elt) => mayProcessLoadingStateByPath(elt, path)
48
+		return Array.from(htmx.findAll(loadingScope, "[" + type + "]")).filter(
49
+			function (elt) { return mayProcessLoadingStateByPath(elt, path) }
50 50
 		)
51 51
 	}
52 52
 
... ...
@@ -74,7 +74,7 @@
74 74
 
75 75
 				let loadingStateEltsByType = {}
76 76
 
77
-				loadingStateTypes.forEach((type) => {
77
+				loadingStateTypes.forEach(function (type) {
78 78
 					loadingStateEltsByType[type] = getLoadingStateElts(
79 79
 						container,
80 80
 						type,
... ...
@@ -82,87 +82,91 @@
82 82
 					)
83 83
 				})
84 84
 
85
-				loadingStateEltsByType['data-loading'].forEach((sourceElt) => {
86
-					getLoadingTarget(sourceElt).forEach((targetElt) => {
85
+				loadingStateEltsByType['data-loading'].forEach(function (sourceElt) {
86
+					getLoadingTarget(sourceElt).forEach(function (targetElt) {
87 87
 						queueLoadingState(
88 88
 							sourceElt,
89 89
 							targetElt,
90
-							() =>
91
-								(targetElt.style.display =
90
+							function () {
91
+								targetElt.style.display =
92 92
 									sourceElt.getAttribute('data-loading') ||
93
-									'inline-block'),
94
-							() => (targetElt.style.display = 'none')
93
+									'inline-block' },
94
+							function () { targetElt.style.display = 'none' }
95 95
 						)
96 96
 					})
97 97
 				})
98 98
 
99 99
 				loadingStateEltsByType['data-loading-class'].forEach(
100
-					(sourceElt) => {
100
+					function (sourceElt) {
101 101
 						const classNames = sourceElt
102 102
 							.getAttribute('data-loading-class')
103 103
 							.split(' ')
104 104
 
105
-						getLoadingTarget(sourceElt).forEach((targetElt) => {
105
+						getLoadingTarget(sourceElt).forEach(function (targetElt) {
106 106
 							queueLoadingState(
107 107
 								sourceElt,
108 108
 								targetElt,
109
-								() =>
110
-									classNames.forEach((className) =>
111
-										targetElt.classList.add(className)
112
-									),
113
-								() =>
114
-									classNames.forEach((className) =>
115
-										targetElt.classList.remove(className)
116
-									)
109
+								function () {
110
+									classNames.forEach(function (className) {
111
+                                        targetElt.classList.add(className)
112
+                                    })
113
+                                },
114
+								function() {
115
+									classNames.forEach(function (className) {
116
+                                        targetElt.classList.remove(className)
117
+                                    })
118
+                                }
117 119
 							)
118 120
 						})
119 121
 					}
120 122
 				)
121 123
 
122 124
 				loadingStateEltsByType['data-loading-class-remove'].forEach(
123
-					(sourceElt) => {
125
+					function (sourceElt) {
124 126
 						const classNames = sourceElt
125 127
 							.getAttribute('data-loading-class-remove')
126 128
 							.split(' ')
127 129
 
128
-						getLoadingTarget(sourceElt).forEach((targetElt) => {
130
+						getLoadingTarget(sourceElt).forEach(function (targetElt) {
129 131
 							queueLoadingState(
130 132
 								sourceElt,
131 133
 								targetElt,
132
-								() =>
133
-									classNames.forEach((className) =>
134
-										targetElt.classList.remove(className)
135
-									),
136
-								() =>
137
-									classNames.forEach((className) =>
138
-										targetElt.classList.add(className)
139
-									)
134
+								function () {
135
+									classNames.forEach(function (className) {
136
+                                        targetElt.classList.remove(className)
137
+                                    })
138
+                                },
139
+								function() {
140
+									classNames.forEach(function (className) {
141
+                                        targetElt.classList.add(className)
142
+                                    })
143
+                                }
140 144
 							)
141 145
 						})
142 146
 					}
143 147
 				)
144 148
 
145 149
 				loadingStateEltsByType['data-loading-disable'].forEach(
146
-					(sourceElt) => {
147
-						getLoadingTarget(sourceElt).forEach((targetElt) => {
150
+					function (sourceElt) {
151
+						getLoadingTarget(sourceElt).forEach(function (targetElt) {
148 152
 							queueLoadingState(
149 153
 								sourceElt,
150 154
 								targetElt,
151
-								() => (targetElt.disabled = true),
152
-								() => (targetElt.disabled = false)
155
+								function() { targetElt.disabled = true },
156
+                                function() { targetElt.disabled = false }
153 157
 							)
154 158
 						})
155 159
 					}
156 160
 				)
157 161
 
158 162
 				loadingStateEltsByType['data-loading-aria-busy'].forEach(
159
-					(sourceElt) => {
160
-						getLoadingTarget(sourceElt).forEach((targetElt) => {
163
+					function (sourceElt) {
164
+						getLoadingTarget(sourceElt).forEach(function (targetElt) {
161 165
 							queueLoadingState(
162 166
 								sourceElt,
163 167
 								targetElt,
164
-								() => (targetElt.setAttribute("aria-busy", "true")),
165
-								() => (targetElt.removeAttribute("aria-busy"))
168
+								function () { targetElt.setAttribute("aria-busy", "true") },
169
+								function () { targetElt.removeAttribute("aria-busy") }
166 170
 							)
167 171
 						})
168 172
 					}
... ...
@@ -5,7 +5,8 @@ htmx.defineExtension('morphdom-swap', {
5 5
     handleSwap: function (swapStyle, target, fragment) {
6 6
         if (swapStyle === 'morphdom') {
7 7
             if (fragment.nodeType === Node.DOCUMENT_FRAGMENT_NODE) {
8
-                morphdom(target, fragment.firstElementChild);
8
+                // IE11 doesn't support DocumentFragment.firstElementChild
9
+                morphdom(target, fragment.firstElementChild || fragment.firstChild);
9 10
                 return [target];
10 11
             } else {
11 12
                 morphdom(target, fragment.outerHTML);
... ...
@@ -48,9 +48,12 @@ htmx.defineExtension("preload", {
48 48
 				// in the future
49 49
 				var hxGet = node.getAttribute("hx-get") || node.getAttribute("data-hx-get")
50 50
 				if (hxGet) {
51
-					htmx.ajax("GET", hxGet, {handler:function(elt, info) {
52
-						done(info.xhr.responseText);
53
-					}});
51
+					htmx.ajax("GET", hxGet, {
52
+						source: node,
53
+						handler:function(elt, info) {
54
+							done(info.xhr.responseText);
55
+						}
56
+					});
54 57
 					return;
55 58
 				}
56 59
 
... ...
@@ -93,7 +96,7 @@ htmx.defineExtension("preload", {
93 96
 			// Apply the listener to the node
94 97
 			node.addEventListener(on, function(evt) {
95 98
 				if (node.preloadState === "PAUSE") { // Only add one event listener
96
-					node.preloadState = "READY"; // Requred for the `load` function to trigger
99
+					node.preloadState = "READY"; // Required for the `load` function to trigger
97 100
 
98 101
 					// Special handling for "mouseover" events.  Wait 100ms before triggering load.
99 102
 					if (on === "mouseover") {
... ...
@@ -5,7 +5,7 @@ This extension adds support for Server Sent Events to htmx.  See /www/extensions
5 5
 
6 6
 */
7 7
 
8
-(function(){
8
+(function() {
9 9
 
10 10
 	/** @type {import("../htmx").HtmxInternalApi} */
11 11
 	var api;
... ...
@@ -39,17 +39,19 @@ This extension adds support for Server Sent Events to htmx.  See /www/extensions
39 39
 
40 40
 			switch (name) {
41 41
 
42
-			// Try to remove remove an EventSource when elements are removed
43
-			case "htmx:beforeCleanupElement":
44
-				var internalData = api.getInternalData(evt.target)
45
-				if (internalData.sseEventSource) {
46
-					internalData.sseEventSource.close();
47
-				}
48
-				return;
42
+				case "htmx:beforeCleanupElement":
43
+					var internalData = api.getInternalData(evt.target)
44
+					// Try to remove remove an EventSource when elements are removed
45
+					if (internalData.sseEventSource) {
46
+						internalData.sseEventSource.close();
47
+					}
49 48
 
50
-			// Try to create EventSources when elements are processed
51
-			case "htmx:afterProcessNode":
52
-				createEventSourceOnElement(evt.target);
49
+					return;
50
+
51
+				// Try to create EventSources when elements are processed
52
+				case "htmx:afterProcessNode":
53
+					ensureEventSourceOnElement(evt.target);
54
+					registerSSE(evt.target);
53 55
 			}
54 56
 		}
55 57
 	});
... ...
@@ -66,8 +68,8 @@ This extension adds support for Server Sent Events to htmx.  See /www/extensions
66 68
 	 * @param {string} url 
67 69
 	 * @returns EventSource
68 70
 	 */
69
-	 function createEventSource(url) {
70
-		return new EventSource(url, {withCredentials:true});
71
+	function createEventSource(url) {
72
+		return new EventSource(url, { withCredentials: true });
71 73
 	}
72 74
 
73 75
 	function splitOnWhitespace(trigger) {
... ...
@@ -90,7 +92,7 @@ This extension adds support for Server Sent Events to htmx.  See /www/extensions
90 92
 	function getLegacySSESwaps(elt) {
91 93
 		var legacySSEValue = api.getAttributeValue(elt, "hx-sse");
92 94
 		var returnArr = [];
93
-		if (legacySSEValue) {
95
+		if (legacySSEValue != null) {
94 96
 			var values = splitOnWhitespace(legacySSEValue);
95 97
 			for (var i = 0; i < values.length; i++) {
96 98
 				var value = values[i].split(/:(.+)/);
... ...
@@ -103,63 +105,24 @@ This extension adds support for Server Sent Events to htmx.  See /www/extensions
103 105
 	}
104 106
 
105 107
 	/**
106
-	 * createEventSourceOnElement creates a new EventSource connection on the provided element.
107
-	 * If a usable EventSource already exists, then it is returned.  If not, then a new EventSource
108
-	 * is created and stored in the element's internalData.
108
+	 * registerSSE looks for attributes that can contain sse events, right 
109
+	 * now hx-trigger and sse-swap and adds listeners based on these attributes too
110
+	 * the closest event source
111
+	 *
109 112
 	 * @param {HTMLElement} elt
110
-	 * @param {number} retryCount
111
-	 * @returns {EventSource | null}
112 113
 	 */
113
-	function createEventSourceOnElement(elt, retryCount) {
114
-
115
-		if (elt == null) {
116
-			return null;
114
+	function registerSSE(elt) {
115
+		// Find closest existing event source
116
+		var sourceElement = api.getClosestMatch(elt, hasEventSource);
117
+		if (sourceElement == null) {
118
+			// api.triggerErrorEvent(elt, "htmx:noSSESourceError")
119
+			return null; // no eventsource in parentage, orphaned element
117 120
 		}
118 121
 
119
-		var internalData = api.getInternalData(elt);
120
-
121
-		// get URL from element's attribute
122
-		var sseURL = api.getAttributeValue(elt, "sse-connect");
123
-
124
-
125
-		if (sseURL == undefined) {
126
-			var legacyURL = getLegacySSEURL(elt)
127
-			if (legacyURL) {
128
-				sseURL = legacyURL;
129
-			} else {
130
-				return null;
131
-			}
132
-		}
133
-
134
-		// Connect to the EventSource
135
-		var source = htmx.createEventSource(sseURL);
136
-		internalData.sseEventSource = source;
137
-
138
-		// Create event handlers
139
-		source.onerror = function (err) {
140
-
141
-			// Log an error event
142
-			api.triggerErrorEvent(elt, "htmx:sseError", {error:err, source:source});
122
+		// Set internalData and source
123
+		var internalData = api.getInternalData(sourceElement);
124
+		var source = internalData.sseEventSource;
143 125
 
144
-			// If parent no longer exists in the document, then clean up this EventSource
145
-			if (maybeCloseSSESource(elt)) {
146
-				return;
147
-			}
148
-
149
-			// Otherwise, try to reconnect the EventSource
150
-			if (source.readyState === EventSource.CLOSED) {
151
-				retryCount = retryCount || 0;
152
-				var timeout = Math.random() * (2 ^ retryCount) * 500;
153
-				window.setTimeout(function() {
154
-					createEventSourceOnElement(elt, Math.min(7, retryCount+1));
155
-				}, timeout);
156
-			}			
157
-		};
158
-
159
-		source.onopen = function (evt) {
160
-			api.triggerEvent(elt, "htmx::sseOpen", {source: source});
161
-		}
162
-		
163 126
 		// Add message handlers for every `sse-swap` attribute
164 127
 		queryAttributeOnThisOrChildren(elt, "sse-swap").forEach(function(child) {
165 128
 
... ...
@@ -170,23 +133,27 @@ This extension adds support for Server Sent Events to htmx.  See /www/extensions
170 133
 				var sseEventNames = getLegacySSESwaps(child);
171 134
 			}
172 135
 
173
-			for (var i = 0 ; i < sseEventNames.length ; i++) {
136
+			for (var i = 0; i < sseEventNames.length; i++) {
174 137
 				var sseEventName = sseEventNames[i].trim();
175 138
 				var listener = function(event) {
176 139
 
177
-					// If the parent is missing then close SSE and remove listener
178
-					if (maybeCloseSSESource(elt)) {
179
-						source.removeEventListener(sseEventName, listener);
140
+					// If the source is missing then close SSE
141
+					if (maybeCloseSSESource(sourceElement)) {
180 142
 						return;
181 143
 					}
182 144
 
145
+					// If the body no longer contains the element, remove the listener
146
+					if (!api.bodyContains(child)) {
147
+						source.removeEventListener(sseEventName, listener);
148
+					}
149
+
183 150
 					// swap the response into the DOM and trigger a notification
184 151
 					swap(child, event.data);
185 152
 					api.triggerEvent(elt, "htmx:sseMessage", event);
186 153
 				};
187 154
 
188 155
 				// Register the new listener
189
-				api.getInternalData(elt).sseEventListener = listener;
156
+				api.getInternalData(child).sseEventListener = listener;
190 157
 				source.addEventListener(sseEventName, listener);
191 158
 			}
192 159
 		});
... ...
@@ -203,24 +170,86 @@ This extension adds support for Server Sent Events to htmx.  See /www/extensions
203 170
 			if (sseEventName.slice(0, 4) != "sse:") {
204 171
 				return;
205 172
 			}
173
+			
174
+			// remove the sse: prefix from here on out
175
+			sseEventName = sseEventName.substr(4);
206 176
 
207
-			var listener = function(event) {
177
+			var listener = function() {
178
+				if (maybeCloseSSESource(sourceElement)) {
179
+					return
180
+				}
208 181
 
209
-				// If parent is missing, then close SSE and remove listener
210
-				if (maybeCloseSSESource(elt)) {
182
+				if (!api.bodyContains(child)) {
211 183
 					source.removeEventListener(sseEventName, listener);
212
-					return;
213 184
 				}
185
+			}
186
+		});
187
+	}
188
+
189
+	/**
190
+	 * ensureEventSourceOnElement creates a new EventSource connection on the provided element.
191
+	 * If a usable EventSource already exists, then it is returned.  If not, then a new EventSource
192
+	 * is created and stored in the element's internalData.
193
+	 * @param {HTMLElement} elt
194
+	 * @param {number} retryCount
195
+	 * @returns {EventSource | null}
196
+	 */
197
+	function ensureEventSourceOnElement(elt, retryCount) {
198
+
199
+		if (elt == null) {
200
+			return null;
201
+		}
214 202
 
215
-				// Trigger events to be handled by the rest of htmx
216
-				htmx.trigger(child, sseEventName, event);
217
-				htmx.trigger(child, "htmx:sseMessage", event);
203
+		// handle extension source creation attribute
204
+		queryAttributeOnThisOrChildren(elt, "sse-connect").forEach(function(child) {
205
+			var sseURL = api.getAttributeValue(child, "sse-connect");
206
+			if (sseURL == null) {
207
+				return;
218 208
 			}
219 209
 
220
-			// Register the new listener
221
-			api.getInternalData(elt).sseEventListener = listener;
222
-			source.addEventListener(sseEventName.slice(4), listener);
210
+			ensureEventSource(child, sseURL, retryCount);
223 211
 		});
212
+
213
+		// handle legacy sse, remove for HTMX2
214
+		queryAttributeOnThisOrChildren(elt, "hx-sse").forEach(function(child) {
215
+			var sseURL = getLegacySSEURL(child);
216
+			if (sseURL == null) {
217
+				return;
218
+			}
219
+
220
+			ensureEventSource(child, sseURL, retryCount);
221
+		});
222
+
223
+	}
224
+
225
+	function ensureEventSource(elt, url, retryCount) {
226
+		var source = htmx.createEventSource(url);
227
+
228
+		source.onerror = function(err) {
229
+
230
+			// Log an error event
231
+			api.triggerErrorEvent(elt, "htmx:sseError", { error: err, source: source });
232
+
233
+			// If parent no longer exists in the document, then clean up this EventSource
234
+			if (maybeCloseSSESource(elt)) {
235
+				return;
236
+			}
237
+
238
+			// Otherwise, try to reconnect the EventSource
239
+			if (source.readyState === EventSource.CLOSED) {
240
+				retryCount = retryCount || 0;
241
+				var timeout = Math.random() * (2 ^ retryCount) * 500;
242
+				window.setTimeout(function() {
243
+					ensureEventSourceOnElement(elt, Math.min(7, retryCount + 1));
244
+				}, timeout);
245
+			}
246
+		};
247
+
248
+		source.onopen = function(evt) {
249
+			api.triggerEvent(elt, "htmx:sseOpen", { source: source });
250
+		}
251
+
252
+		api.getInternalData(elt).sseEventSource = source;
224 253
 	}
225 254
 
226 255
 	/**
... ...
@@ -253,12 +282,12 @@ This extension adds support for Server Sent Events to htmx.  See /www/extensions
253 282
 		var result = [];
254 283
 
255 284
 		// If the parent element also contains the requested attribute, then add it to the results too.
256
-		if (api.hasAttribute(elt, attributeName) || api.hasAttribute(elt, "hx-sse")) {
285
+		if (api.hasAttribute(elt, attributeName)) {
257 286
 			result.push(elt);
258 287
 		}
259 288
 
260 289
 		// Search all child nodes that match the requested attribute
261
-		elt.querySelectorAll("[" + attributeName + "], [data-" + attributeName + "], [hx-sse], [data-hx-sse]").forEach(function(node) {
290
+		elt.querySelectorAll("[" + attributeName + "], [data-" + attributeName + "]").forEach(function(node) {
262 291
 			result.push(node);
263 292
 		});
264 293
 
... ...
@@ -281,7 +310,7 @@ This extension adds support for Server Sent Events to htmx.  See /www/extensions
281 310
 
282 311
 		api.selectAndSwap(swapSpec.swapStyle, target, elt, content, settleInfo);
283 312
 
284
-		settleInfo.elts.forEach(function (elt) {
313
+		settleInfo.elts.forEach(function(elt) {
285 314
 			if (elt.classList) {
286 315
 				elt.classList.add(htmx.config.settlingClass);
287 316
 			}
... ...
@@ -306,11 +335,11 @@ This extension adds support for Server Sent Events to htmx.  See /www/extensions
306 335
 	function doSettle(settleInfo) {
307 336
 
308 337
 		return function() {
309
-			settleInfo.tasks.forEach(function (task) {
338
+			settleInfo.tasks.forEach(function(task) {
310 339
 				task.call();
311 340
 			});
312 341
 
313
-			settleInfo.elts.forEach(function (elt) {
342
+			settleInfo.elts.forEach(function(elt) {
314 343
 				if (elt.classList) {
315 344
 					elt.classList.remove(htmx.config.settlingClass);
316 345
 				}
... ...
@@ -319,4 +348,8 @@ This extension adds support for Server Sent Events to htmx.  See /www/extensions
319 348
 		}
320 349
 	}
321 350
 
322
-})();
323 351
\ No newline at end of file
352
+	function hasEventSource(node) {
353
+		return api.getInternalData(node).sseEventSource != null;
354
+	}
355
+
356
+})();
... ...
@@ -52,7 +52,7 @@ This extension adds support for WebSockets to htmx.  See /www/extensions/ws.md f
52 52
 					return;
53 53
 
54 54
 				// Try to create websockets when elements are processed
55
-				case "htmx:afterProcessNode":
55
+				case "htmx:beforeProcessNode":
56 56
 					var parent = evt.target;
57 57
 
58 58
 					forEach(queryAttributeOnThisOrChildren(parent, "ws-connect"), function (child) {
... ...
@@ -200,7 +200,7 @@ This extension adds support for WebSockets to htmx.  See /www/extensions/ws.md f
200 200
 				if (!this.socket) {
201 201
 					api.triggerErrorEvent()
202 202
 				}
203
-				if (sendElt && api.triggerEvent(sendElt, 'htmx:wsBeforeSend', {
203
+				if (!sendElt || api.triggerEvent(sendElt, 'htmx:wsBeforeSend', {
204 204
 					message: message,
205 205
 					socketWrapper: this.publicInterface
206 206
 				})) {
... ...
@@ -341,7 +341,7 @@ This extension adds support for WebSockets to htmx.  See /www/extensions/ws.md f
341 341
 
342 342
 				/** @type {WebSocketWrapper} */
343 343
 				var socketWrapper = api.getInternalData(socketElt).webSocket;
344
-				var headers = api.getHeaders(sendElt, socketElt);
344
+				var headers = api.getHeaders(sendElt, api.getTarget(sendElt));
345 345
 				var results = api.getInputValues(sendElt, 'post');
346 346
 				var errors = results.errors;
347 347
 				var rawParameters = results.values;
... ...
@@ -379,7 +379,7 @@ This extension adds support for WebSockets to htmx.  See /www/extensions/ws.md f
379 379
 
380 380
 				socketWrapper.send(body, elt);
381 381
 
382
-				if (api.shouldCancel(evt, elt)) {
382
+				if (evt && api.shouldCancel(evt, elt)) {
383 383
 					evt.preventDefault();
384 384
 				}
385 385
 			});
... ...
@@ -19,8 +19,9 @@ export function addClass(elt: Element, clazz: string, delay?: number): void;
19 19
  * @param verb 'GET', 'POST', etc.
20 20
  * @param path the URL path to make the AJAX
21 21
  * @param element the element to target (defaults to the **body**)
22
+ * @returns Promise that resolves immediately if no request is sent, or when the request is complete
22 23
  */
23
-export function ajax(verb: string, path: string, element: Element): void;
24
+export function ajax(verb: string, path: string, element: Element): Promise<void>;
24 25
 
25 26
 /**
26 27
  * Issues an htmx-style AJAX request
... ...
@@ -30,8 +31,9 @@ export function ajax(verb: string, path: string, element: Element): void;
30 31
  * @param verb 'GET', 'POST', etc.
31 32
  * @param path the URL path to make the AJAX
32 33
  * @param selector a selector for the target
34
+ * @returns Promise that resolves immediately if no request is sent, or when the request is complete
33 35
  */
34
-export function ajax(verb: string, path: string, selector: string): void;
36
+export function ajax(verb: string, path: string, selector: string): Promise<void>;
35 37
 
36 38
 /**
37 39
  * Issues an htmx-style AJAX request
... ...
@@ -41,12 +43,13 @@ export function ajax(verb: string, path: string, selector: string): void;
41 43
  * @param verb 'GET', 'POST', etc.
42 44
  * @param path the URL path to make the AJAX
43 45
  * @param context a context object that contains any of the following
46
+ * @returns Promise that resolves immediately if no request is sent, or when the request is complete
44 47
  */
45 48
 export function ajax(
46 49
     verb: string,
47 50
     path: string,
48
-    context: Partial<{ source: any; event: any; handler: any; target: any; values: any; headers: any }>
49
-): void;
51
+    context: Partial<{ source: any; event: any; handler: any; target: any; swap: any; values: any; headers: any; select: any }>
52
+): Promise<void>;
50 53
 
51 54
 /**
52 55
  * Finds the closest matching element in the given elements parentage, inclusive of the element
... ...
@@ -288,43 +291,151 @@ export function values(elt: Element, requestType?: string): any;
288 291
 export const version: string;
289 292
 
290 293
 export interface HtmxConfig {
291
-    /** array of strings: the attributes to settle during the settling phase */
294
+    /**
295
+     * The attributes to settle during the settling phase.
296
+     * @default ["class", "style", "width", "height"]
297
+     */
292 298
     attributesToSettle?: ["class", "style", "width", "height"] | string[];
293
-    /** the default delay between completing the content swap and settling attributes */
299
+    /**
300
+     * If the focused element should be scrolled into view.
301
+     * @default false
302
+    */
303
+    defaultFocusScroll?: boolean;
304
+    /**
305
+     * The default delay between completing the content swap and settling attributes.
306
+     * @default 20
307
+     */
294 308
     defaultSettleDelay?: number;
295
-    /** the default delay between receiving a response from the server and doing the swap */
309
+    /**
310
+     * The default delay between receiving a response from the server and doing the swap.
311
+     * @default 0
312
+     */
296 313
     defaultSwapDelay?: number;
297
-    /** the default swap style to use if **[hx-swap](https://htmx.org/attributes/hx-swap)** is omitted */
314
+    /**
315
+     * The default swap style to use if **[hx-swap](https://htmx.org/attributes/hx-swap)** is omitted.
316
+     * @default "innerHTML"
317
+     */
298 318
     defaultSwapStyle?: "innerHTML" | string;
299
-    /** the number of pages to keep in **localStorage** for history support */
319
+    /**
320
+     * The number of pages to keep in **localStorage** for history support.
321
+     * @default 10
322
+     */
300 323
     historyCacheSize?: number;
301
-    /** whether or not to use history */
324
+    /**
325
+     * Whether or not to use history.
326
+     * @default true
327
+     */
302 328
     historyEnabled?: boolean;
303
-    /** if true, htmx will inject a small amount of CSS into the page to make indicators invisible unless the **htmx-indicator** class is present */
329
+    /**
330
+     * If true, htmx will inject a small amount of CSS into the page to make indicators invisible unless the **htmx-indicator** class is present.
331
+     * @default true
332
+     */
304 333
     includeIndicatorStyles?: boolean;
305
-    /** the class to place on indicators when a request is in flight */
334
+    /**
335
+     * The class to place on indicators when a request is in flight.
336
+     * @default "htmx-indicator"
337
+     */
306 338
     indicatorClass?: "htmx-indicator" | string;
307
-    /** the class to place on triggering elements when a request is in flight */
339
+    /**
340
+     * The class to place on triggering elements when a request is in flight.
341
+     * @default "htmx-request"
342
+     */
308 343
     requestClass?: "htmx-request" | string;
309
-    /** the class to temporarily place on elements that htmx has added to the DOM */
344
+    /**
345
+     * The class to temporarily place on elements that htmx has added to the DOM.
346
+     * @default "htmx-added"
347
+     */
310 348
     addedClass?: "htmx-added" | string;
311
-    /** the class to place on target elements when htmx is in the settling phase */
349
+    /**
350
+     * The class to place on target elements when htmx is in the settling phase.
351
+     * @default "htmx-settling"
352
+     */
312 353
     settlingClass?: "htmx-settling" | string;
313
-    /** the class to place on target elements when htmx is in the swapping phase */
354
+    /**
355
+     * The class to place on target elements when htmx is in the swapping phase.
356
+     * @default "htmx-swapping"
357
+     */
314 358
     swappingClass?: "htmx-swapping" | string;
315
-    /** allows the use of eval-like functionality in htmx, to enable **hx-vars**, trigger conditions & script tag evaluation. Can be set to **false** for CSP compatibility */
359
+    /**
360
+     * Allows the use of eval-like functionality in htmx, to enable **hx-vars**, trigger conditions & script tag evaluation. Can be set to **false** for CSP compatibility.
361
+     * @default true
362
+     */
316 363
     allowEval?: boolean;
317
-    /** use HTML template tags for parsing content from the server. This allows you to use Out of Band content when returning things like table rows, but it is *not* IE11 compatible. */
364
+    /**
365
+     * Use HTML template tags for parsing content from the server. This allows you to use Out of Band content when returning things like table rows, but it is *not* IE11 compatible.
366
+     * @default false
367
+     */
318 368
     useTemplateFragments?: boolean;
319
-    /** allow cross-site Access-Control requests using credentials such as cookies, authorization headers or TLS client certificates */
369
+    /**
370
+     * Allow cross-site Access-Control requests using credentials such as cookies, authorization headers or TLS client certificates.
371
+     * @default false
372
+     */
320 373
     withCredentials?: boolean;
321
-    /** the default implementation of **getWebSocketReconnectDelay** for reconnecting after unexpected connection loss by the event code **Abnormal Closure**, **Service Restart** or **Try Again Later** */
374
+    /**
375
+     * The default implementation of **getWebSocketReconnectDelay** for reconnecting after unexpected connection loss by the event code **Abnormal Closure**, **Service Restart** or **Try Again Later**.
376
+     * @default "full-jitter"
377
+     */
322 378
     wsReconnectDelay?: "full-jitter" | string | ((retryCount: number) => number);
323 379
     // following don't appear in the docs
380
+    /** @default false */
324 381
     refreshOnHistoryMiss?: boolean;
382
+    /** @default 0 */
325 383
     timeout?: number;
384
+    /** @default "[hx-disable], [data-hx-disable]" */
326 385
     disableSelector?: "[hx-disable], [data-hx-disable]" | string;
327
-    scrollBehavior?: "smooth";
386
+    /** @default "smooth" */
387
+    scrollBehavior?: "smooth" | "auto";
388
+    /**
389
+     * If set to false, disables the interpretation of script tags.
390
+     * @default true
391
+     */
392
+    allowScriptTags?: boolean;
393
+    /**
394
+     * If set to true, disables htmx-based requests to non-origin hosts.
395
+     * @default false
396
+     */
397
+    selfRequestsOnly?: boolean;
398
+    /**
399
+     * Whether or not the target of a boosted element is scrolled into the viewport.
400
+     * @default true
401
+     */
402
+    scrollIntoViewOnBoost?: boolean;
403
+    /**
404
+     * If set, the nonce will be added to inline scripts.
405
+     * @default ''
406
+     */
407
+    inlineScriptNonce?: string;
408
+    /**
409
+     * The type of binary data being received over the WebSocket connection
410
+     * @default 'blob'
411
+     */
412
+    wsBinaryType?: 'blob' | 'arraybuffer'; 
413
+    /**
414
+     * If set to true htmx will include a cache-busting parameter in GET requests to avoid caching partial responses by the browser
415
+     * @default false 
416
+     */
417
+    getCacheBusterParam?: boolean;
418
+    /**
419
+     * If set to true, htmx will use the View Transition API when swapping in new content.
420
+     * @default false 
421
+     */
422
+    globalViewTransitions?: boolean;
423
+    /**
424
+     * htmx will format requests with these methods by encoding their parameters in the URL, not the request body
425
+     * @default ["get"] 
426
+     */
427
+    methodsThatUseUrlParams?: ('get' | 'head' | 'post' | 'put' | 'delete' | 'connect' | 'options' | 'trace' | 'patch' )[];
428
+    /**
429
+     * If set to true htmx will not update the title of the document when a title tag is found in new content
430
+     * @default false 
431
+     */
432
+    ignoreTitle:? boolean;
433
+    /**
434
+     * The cache to store evaluated trigger specifications into.
435
+     * You may define a simple object to use a never-clearing cache, or implement your own system using a [proxy object](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Proxy)
436
+     * @default null
437
+     */
438
+    triggerSpecsCache?: {[trigger: string]: HtmxTriggerSpecification[]};
328 439
 }
329 440
 
330 441
 /**
... ...
@@ -44,6 +44,7 @@ return (function () {
44 44
             defineExtension : defineExtension,
45 45
             removeExtension : removeExtension,
46 46
             logAll : logAll,
47
+            logNone : logNone,
47 48
             logger : null,
48 49
             config : {
49 50
                 historyEnabled:true,
... ...
@@ -59,6 +60,7 @@ return (function () {
59 60
                 settlingClass:'htmx-settling',
60 61
                 swappingClass:'htmx-swapping',
61 62
                 allowEval:true,
63
+                allowScriptTags:true,
62 64
                 inlineScriptNonce:'',
63 65
                 attributesToSettle:["class", "style", "width", "height"],
64 66
                 withCredentials:false,
... ...
@@ -71,6 +73,11 @@ return (function () {
71 73
                 defaultFocusScroll: false,
72 74
                 getCacheBusterParam: false,
73 75
                 globalViewTransitions: false,
76
+                methodsThatUseUrlParams: ["get"],
77
+                selfRequestsOnly: false,
78
+                ignoreTitle: false,
79
+                scrollIntoViewOnBoost: true,
80
+                triggerSpecsCache: null,
74 81
             },
75 82
             parseInterval:parseInterval,
76 83
             _:internalEval,
... ...
@@ -82,7 +89,7 @@ return (function () {
82 89
                 sock.binaryType = htmx.config.wsBinaryType;
83 90
                 return sock;
84 91
             },
85
-            version: "1.9.2"
92
+            version: "1.9.10"
86 93
         };
87 94
 
88 95
         /** @type {import("./htmx").HtmxInternalApi} */
... ...
@@ -90,9 +97,11 @@ return (function () {
90 97
             addTriggerHandler: addTriggerHandler,
91 98
             bodyContains: bodyContains,
92 99
             canAccessLocalStorage: canAccessLocalStorage,
100
+            findThisElement: findThisElement,
93 101
             filterValues: filterValues,
94 102
             hasAttribute: hasAttribute,
95 103
             getAttributeValue: getAttributeValue,
104
+            getClosestAttributeValue: getClosestAttributeValue,
96 105
             getClosestMatch: getClosestMatch,
97 106
             getExpressionVars: getExpressionVars,
98 107
             getHeaders: getHeaders,
... ...
@@ -105,6 +114,7 @@ return (function () {
105 114
             mergeObjects: mergeObjects,
106 115
             makeSettleInfo: makeSettleInfo,
107 116
             oobSwap: oobSwap,
117
+            querySelectorExt: querySelectorExt,
108 118
             selectAndSwap: selectAndSwap,
109 119
             settleImmediately: settleImmediately,
110 120
             shouldCancel: shouldCancel,
... ...
@@ -118,24 +128,40 @@ return (function () {
118 128
             return "[hx-" + verb + "], [data-hx-" + verb + "]"
119 129
         }).join(", ");
120 130
 
131
+        var HEAD_TAG_REGEX = makeTagRegEx('head'),
132
+            TITLE_TAG_REGEX = makeTagRegEx('title'),
133
+            SVG_TAGS_REGEX = makeTagRegEx('svg', true);
134
+
121 135
         //====================================================================
122 136
         // Utilities
123 137
         //====================================================================
124 138
 
139
+        /**
140
+         * @param {string} tag
141
+         * @param {boolean} global
142
+         * @returns {RegExp}
143
+         */
144
+        function makeTagRegEx(tag, global = false) {
145
+            return new RegExp(`<${tag}(\\s[^>]*>|>)([\\s\\S]*?)<\\/${tag}>`,
146
+                global ? 'gim' : 'im');
147
+        }
148
+
125 149
         function parseInterval(str) {
126 150
             if (str == undefined)  {
127
-                return undefined
151
+                return undefined;
128 152
             }
153
+
154
+            let interval = NaN;
129 155
             if (str.slice(-2) == "ms") {
130
-                return parseFloat(str.slice(0,-2)) || undefined
131
-            }
132
-            if (str.slice(-1) == "s") {
133
-                return (parseFloat(str.slice(0,-1)) * 1000) || undefined
134
-            }
135
-            if (str.slice(-1) == "m") {
136
-                return (parseFloat(str.slice(0,-1)) * 1000 * 60) || undefined
156
+                interval = parseFloat(str.slice(0, -2));
157
+            } else if (str.slice(-1) == "s") {
158
+                interval = parseFloat(str.slice(0, -1)) * 1000;
159
+            } else if (str.slice(-1) == "m") {
160
+                interval = parseFloat(str.slice(0, -1)) * 1000 * 60;
161
+            } else {
162
+                interval = parseFloat(str);
137 163
             }
138
-            return parseFloat(str) || undefined
164
+            return isNaN(interval) ? undefined : interval;
139 165
         }
140 166
 
141 167
         /**
... ...
@@ -222,7 +248,7 @@ return (function () {
222 248
          * @returns {boolean}
223 249
          */
224 250
         function matches(elt, selector) {
225
-            // @ts-ignore: non-standard properties for browser compatability
251
+            // @ts-ignore: non-standard properties for browser compatibility
226 252
             // noinspection JSUnresolvedVariable
227 253
             var matchesFunction = elt.matches || elt.matchesSelector || elt.msMatchesSelector || elt.mozMatchesSelector || elt.webkitMatchesSelector || elt.oMatchesSelector;
228 254
             return matchesFunction && matchesFunction.call(elt, selector);
... ...
@@ -267,42 +293,46 @@ return (function () {
267 293
         }
268 294
 
269 295
         function aFullPageResponse(resp) {
270
-            return resp.match(/<body/);
296
+            return /<body/.test(resp)
271 297
         }
272 298
 
273 299
         /**
274 300
          *
275
-         * @param {string} resp
301
+         * @param {string} response
276 302
          * @returns {Element}
277 303
          */
278
-        function makeFragment(resp) {
279
-            var partialResponse = !aFullPageResponse(resp);
304
+        function makeFragment(response) {
305
+            var partialResponse = !aFullPageResponse(response);
306
+            var startTag = getStartTag(response);
307
+            var content = response;
308
+            if (startTag === 'head') {
309
+                content = content.replace(HEAD_TAG_REGEX, '');
310
+            }
280 311
             if (htmx.config.useTemplateFragments && partialResponse) {
281
-                var documentFragment = parseHTML("<body><template>" + resp + "</template></body>", 0);
312
+                var documentFragment = parseHTML("<body><template>" + content + "</template></body>", 0);
282 313
                 // @ts-ignore type mismatch between DocumentFragment and Element.
283
-                // TODO: Are these close enough for htmx to use interchangably?
314
+                // TODO: Are these close enough for htmx to use interchangeably?
284 315
                 return documentFragment.querySelector('template').content;
285
-            } else {
286
-                var startTag = getStartTag(resp);
287
-                switch (startTag) {
288
-                    case "thead":
289
-                    case "tbody":
290
-                    case "tfoot":
291
-                    case "colgroup":
292
-                    case "caption":
293
-                        return parseHTML("<table>" + resp + "</table>", 1);
294
-                    case "col":
295
-                        return parseHTML("<table><colgroup>" + resp + "</colgroup></table>", 2);
296
-                    case "tr":
297
-                        return parseHTML("<table><tbody>" + resp + "</tbody></table>", 2);
298
-                    case "td":
299
-                    case "th":
300
-                        return parseHTML("<table><tbody><tr>" + resp + "</tr></tbody></table>", 3);
301
-                    case "script":
302
-                        return parseHTML("<div>" + resp + "</div>", 1);
303
-                    default:
304
-                        return parseHTML(resp, 0);
305
-                }
316
+            }
317
+            switch (startTag) {
318
+                case "thead":
319
+                case "tbody":
320
+                case "tfoot":
321
+                case "colgroup":
322
+                case "caption":
323
+                    return parseHTML("<table>" + content + "</table>", 1);
324
+                case "col":
325
+                    return parseHTML("<table><colgroup>" + content + "</colgroup></table>", 2);
326
+                case "tr":
327
+                    return parseHTML("<table><tbody>" + content + "</tbody></table>", 2);
328
+                case "td":
329
+                case "th":
330
+                    return parseHTML("<table><tbody><tr>" + content + "</tr></tbody></table>", 3);
331
+                case "script":
332
+                case "style":
333
+                    return parseHTML("<div>" + content + "</div>", 1);
334
+                default:
335
+                    return parseHTML(content, 0);
306 336
             }
307 337
         }
308 338
 
... ...
@@ -386,7 +416,7 @@ return (function () {
386 416
 
387 417
         function bodyContains(elt) {
388 418
             // IE Fix
389
-            if (elt.getRootNode && elt.getRootNode() instanceof ShadowRoot) {
419
+            if (elt.getRootNode && elt.getRootNode() instanceof window.ShadowRoot) {
390 420
                 return getDocument().body.contains(elt.getRootNode().host);
391 421
             } else {
392 422
                 return getDocument().body.contains(elt);
... ...
@@ -440,7 +470,7 @@ return (function () {
440 470
                     path = url.pathname + url.search;
441 471
                 }
442 472
                 // remove trailing slash, unless index page
443
-                if (!path.match('^/$')) {
473
+                if (!(/^\/$/.test(path))) {
444 474
                     path = path.replace(/\/+$/, '');
445 475
                 }
446 476
                 return path;
... ...
@@ -475,6 +505,10 @@ return (function () {
475 505
             }
476 506
         }
477 507
 
508
+        function logNone() {
509
+            htmx.logger = null
510
+        }
511
+
478 512
         function find(eltOrSelector, selector) {
479 513
             if (selector) {
480 514
                 return eltOrSelector.querySelector(selector);
... ...
@@ -562,9 +596,17 @@ return (function () {
562 596
             }
563 597
         }
564 598
 
599
+        function startsWith(str, prefix) {
600
+            return str.substring(0, prefix.length) === prefix
601
+        }
602
+
603
+        function endsWith(str, suffix) {
604
+            return str.substring(str.length - suffix.length) === suffix
605
+        }
606
+
565 607
         function normalizeSelector(selector) {
566 608
             var trimmedSelector = selector.trim();
567
-            if (trimmedSelector.startsWith("<") && trimmedSelector.endsWith("/>")) {
609
+            if (startsWith(trimmedSelector, "<") && endsWith(trimmedSelector, "/>")) {
568 610
                 return trimmedSelector.substring(1, trimmedSelector.length - 2);
569 611
             } else {
570 612
                 return trimmedSelector;
... ...
@@ -576,14 +618,20 @@ return (function () {
576 618
                 return [closest(elt, normalizeSelector(selector.substr(8)))];
577 619
             } else if (selector.indexOf("find ") === 0) {
578 620
                 return [find(elt, normalizeSelector(selector.substr(5)))];
621
+            } else if (selector === "next") {
622
+                return [elt.nextElementSibling]
579 623
             } else if (selector.indexOf("next ") === 0) {
580 624
                 return [scanForwardQuery(elt, normalizeSelector(selector.substr(5)))];
625
+            } else if (selector === "previous") {
626
+                return [elt.previousElementSibling]
581 627
             } else if (selector.indexOf("previous ") === 0) {
582 628
                 return [scanBackwardsQuery(elt, normalizeSelector(selector.substr(9)))];
583 629
             } else if (selector === 'document') {
584 630
                 return [document];
585 631
             } else if (selector === 'window') {
586 632
                 return [window];
633
+            } else if (selector === 'body') {
634
+                return [document.body];
587 635
             } else {
588 636
                 return getDocument().querySelectorAll(normalizeSelector(selector));
589 637
             }
... ...
@@ -751,7 +799,7 @@ return (function () {
751 799
          * @returns
752 800
          */
753 801
         function oobSwap(oobValue, oobElement, settleInfo) {
754
-            var selector = "#" + oobElement.id;
802
+            var selector = "#" + getRawAttribute(oobElement, "id");
755 803
             var swapStyle = "outerHTML";
756 804
             if (oobValue === "true") {
757 805
                 // do nothing
... ...
@@ -799,7 +847,7 @@ return (function () {
799 847
             var oobSelects = getClosestAttributeValue(elt, "hx-select-oob");
800 848
             if (oobSelects) {
801 849
                 var oobSelectValues = oobSelects.split(",");
802
-                for (let i = 0; i < oobSelectValues.length; i++) {
850
+                for (var i = 0; i < oobSelectValues.length; i++) {
803 851
                     var oobSelectValue = oobSelectValues[i].split(":", 2);
804 852
                     var id = oobSelectValue[0].trim();
805 853
                     if (id.indexOf("#") === 0) {
... ...
@@ -832,8 +880,9 @@ return (function () {
832 880
 
833 881
         function handleAttributes(parentNode, fragment, settleInfo) {
834 882
             forEach(fragment.querySelectorAll("[id]"), function (newNode) {
835
-                if (newNode.id && newNode.id.length > 0) {
836
-                    var normalizedId = newNode.id.replace("'", "\\'");
883
+                var id = getRawAttribute(newNode, "id")
884
+                if (id && id.length > 0) {
885
+                    var normalizedId = id.replace("'", "\\'");
837 886
                     var normalizedTag = newNode.tagName.replace(':', '\\:');
838 887
                     var oldNode = parentNode.querySelector(normalizedTag + "[id='" + normalizedId + "']");
839 888
                     if (oldNode && oldNode !== parentNode) {
... ...
@@ -902,6 +951,17 @@ return (function () {
902 951
             return hash;
903 952
         }
904 953
 
954
+        function deInitOnHandlers(elt) {
955
+            var internalData = getInternalData(elt);
956
+            if (internalData.onHandlers) {
957
+                for (var i = 0; i < internalData.onHandlers.length; i++) {
958
+                    const handlerInfo = internalData.onHandlers[i];
959
+                    elt.removeEventListener(handlerInfo.event, handlerInfo.listener);
960
+                }
961
+                delete internalData.onHandlers
962
+            }
963
+        }
964
+
905 965
         function deInitNode(element) {
906 966
             var internalData = getInternalData(element);
907 967
             if (internalData.timeout) {
... ...
@@ -920,12 +980,8 @@ return (function () {
920 980
                     }
921 981
                 });
922 982
             }
923
-            if (internalData.onHandlers) {
924
-                for (let i = 0; i < internalData.onHandlers.length; i++) {
925
-                    const handlerInfo = internalData.onHandlers[i];
926
-                    element.removeEventListener(handlerInfo.name, handlerInfo.handler);
927
-                }
928
-            }
983
+            deInitOnHandlers(element);
984
+            forEach(Object.keys(internalData), function(key) { delete internalData[key] });
929 985
         }
930 986
 
931 987
         function cleanUpElement(element) {
... ...
@@ -949,8 +1005,7 @@ return (function () {
949 1005
                 } else {
950 1006
                     newElt = eltBeforeNewContent.nextSibling;
951 1007
                 }
952
-                getInternalData(target).replacedWith = newElt; // tuck away so we can fire events on it later
953
-                settleInfo.elts = [] // clear existing elements
1008
+                settleInfo.elts = settleInfo.elts.filter(function(e) { return e != target });
954 1009
                 while(newElt && newElt !== target) {
955 1010
                     if (newElt.nodeType === Node.ELEMENT_NODE) {
956 1011
                         settleInfo.elts.push(newElt);
... ...
@@ -995,8 +1050,8 @@ return (function () {
995 1050
             }
996 1051
         }
997 1052
 
998
-        function maybeSelectFromResponse(elt, fragment) {
999
-            var selector = getClosestAttributeValue(elt, "hx-select");
1053
+        function maybeSelectFromResponse(elt, fragment, selectOverride) {
1054
+            var selector = selectOverride || getClosestAttributeValue(elt, "hx-select");
1000 1055
             if (selector) {
1001 1056
                 var newFragment = getDocument().createDocumentFragment();
1002 1057
                 forEach(fragment.querySelectorAll(selector), function (node) {
... ...
@@ -1061,21 +1116,20 @@ return (function () {
1061 1116
 
1062 1117
         function findTitle(content) {
1063 1118
             if (content.indexOf('<title') > -1) {
1064
-                var contentWithSvgsRemoved = content.replace(/<svg(\s[^>]*>|>)([\s\S]*?)<\/svg>/gim, '');
1065
-                var result = contentWithSvgsRemoved.match(/<title(\s[^>]*>|>)([\s\S]*?)<\/title>/im);
1066
-
1119
+                var contentWithSvgsRemoved = content.replace(SVG_TAGS_REGEX, '');
1120
+                var result = contentWithSvgsRemoved.match(TITLE_TAG_REGEX);
1067 1121
                 if (result) {
1068 1122
                     return result[2];
1069 1123
                 }
1070 1124
             }
1071 1125
         }
1072 1126
 
1073
-        function selectAndSwap(swapStyle, target, elt, responseText, settleInfo) {
1127
+        function selectAndSwap(swapStyle, target, elt, responseText, settleInfo, selectOverride) {
1074 1128
             settleInfo.title = findTitle(responseText);
1075 1129
             var fragment = makeFragment(responseText);
1076 1130
             if (fragment) {
1077 1131
                 handleOutOfBandSwaps(elt, fragment, settleInfo);
1078
-                fragment = maybeSelectFromResponse(elt, fragment);
1132
+                fragment = maybeSelectFromResponse(elt, fragment, selectOverride);
1079 1133
                 handlePreservedElements(fragment);
1080 1134
                 return swap(swapStyle, elt, target, fragment, settleInfo);
1081 1135
             }
... ...
@@ -1095,7 +1149,10 @@ return (function () {
1095 1149
                     }
1096 1150
                 }
1097 1151
             } else {
1098
-                triggerEvent(elt, triggerBody, []);
1152
+                var eventNames = triggerBody.split(",")
1153
+                for (var i = 0; i < eventNames.length; i++) {
1154
+                    triggerEvent(elt, eventNames[i].trim(), []);
1155
+                }
1099 1156
             }
1100 1157
         }
1101 1158
 
... ...
@@ -1105,6 +1162,8 @@ return (function () {
1105 1162
         var SYMBOL_CONT = /[_$a-zA-Z0-9]/;
1106 1163
         var STRINGISH_START = ['"', "'", "/"];
1107 1164
         var NOT_WHITESPACE = /[^\s]/;
1165
+        var COMBINED_SELECTOR_START = /[{(]/;
1166
+        var COMBINED_SELECTOR_END = /[})]/;
1108 1167
         function tokenizeString(str) {
1109 1168
             var tokens = [];
1110 1169
             var position = 0;
... ...
@@ -1187,102 +1246,136 @@ return (function () {
1187 1246
 
1188 1247
         function consumeUntil(tokens, match) {
1189 1248
             var result = "";
1190
-            while (tokens.length > 0 && !tokens[0].match(match)) {
1249
+            while (tokens.length > 0 && !match.test(tokens[0])) {
1191 1250
                 result += tokens.shift();
1192 1251
             }
1193 1252
             return result;
1194 1253
         }
1195 1254
 
1255
+        function consumeCSSSelector(tokens) {
1256
+            var result;
1257
+            if (tokens.length > 0 && COMBINED_SELECTOR_START.test(tokens[0])) {
1258
+                tokens.shift();
1259
+                result = consumeUntil(tokens, COMBINED_SELECTOR_END).trim();
1260
+                tokens.shift();
1261
+            } else {
1262
+                result = consumeUntil(tokens, WHITESPACE_OR_COMMA);
1263
+            }
1264
+            return result;
1265
+        }
1266
+
1196 1267
         var INPUT_SELECTOR = 'input, textarea, select';
1197 1268
 
1198 1269
         /**
1199 1270
          * @param {HTMLElement} elt
1271
+         * @param {string} explicitTrigger
1272
+         * @param {cache} cache for trigger specs
1200 1273
          * @returns {import("./htmx").HtmxTriggerSpecification[]}
1201 1274
          */
1202
-        function getTriggerSpecs(elt) {
1203
-            var explicitTrigger = getAttributeValue(elt, 'hx-trigger');
1275
+        function parseAndCacheTrigger(elt, explicitTrigger, cache) {
1204 1276
             var triggerSpecs = [];
1205
-            if (explicitTrigger) {
1206
-                var tokens = tokenizeString(explicitTrigger);
1207
-                do {
1208
-                    consumeUntil(tokens, NOT_WHITESPACE);
1209
-                    var initialLength = tokens.length;
1210
-                    var trigger = consumeUntil(tokens, /[,\[\s]/);
1211
-                    if (trigger !== "") {
1212
-                        if (trigger === "every") {
1213
-                            var every = {trigger: 'every'};
1214
-                            consumeUntil(tokens, NOT_WHITESPACE);
1215
-                            every.pollInterval = parseInterval(consumeUntil(tokens, /[,\[\s]/));
1216
-                            consumeUntil(tokens, NOT_WHITESPACE);
1217
-                            var eventFilter = maybeGenerateConditional(elt, tokens, "event");
1218
-                            if (eventFilter) {
1219
-                                every.eventFilter = eventFilter;
1220
-                            }
1221
-                            triggerSpecs.push(every);
1222
-                        } else if (trigger.indexOf("sse:") === 0) {
1223
-                            triggerSpecs.push({trigger: 'sse', sseEvent: trigger.substr(4)});
1224
-                        } else {
1225
-                            var triggerSpec = {trigger: trigger};
1226
-                            var eventFilter = maybeGenerateConditional(elt, tokens, "event");
1227
-                            if (eventFilter) {
1228
-                                triggerSpec.eventFilter = eventFilter;
1229
-                            }
1230
-                            while (tokens.length > 0 && tokens[0] !== ",") {
1231
-                                consumeUntil(tokens, NOT_WHITESPACE)
1232
-                                var token = tokens.shift();
1233
-                                if (token === "changed") {
1234
-                                    triggerSpec.changed = true;
1235
-                                } else if (token === "once") {
1236
-                                    triggerSpec.once = true;
1237
-                                } else if (token === "consume") {
1238
-                                    triggerSpec.consume = true;
1239
-                                } else if (token === "delay" && tokens[0] === ":") {
1240
-                                    tokens.shift();
1241
-                                    triggerSpec.delay = parseInterval(consumeUntil(tokens, WHITESPACE_OR_COMMA));
1242
-                                } else if (token === "from" && tokens[0] === ":") {
1243
-                                    tokens.shift();
1277
+            var tokens = tokenizeString(explicitTrigger);
1278
+            do {
1279
+                consumeUntil(tokens, NOT_WHITESPACE);
1280
+                var initialLength = tokens.length;
1281
+                var trigger = consumeUntil(tokens, /[,\[\s]/);
1282
+                if (trigger !== "") {
1283
+                    if (trigger === "every") {
1284
+                        var every = {trigger: 'every'};
1285
+                        consumeUntil(tokens, NOT_WHITESPACE);
1286
+                        every.pollInterval = parseInterval(consumeUntil(tokens, /[,\[\s]/));
1287
+                        consumeUntil(tokens, NOT_WHITESPACE);
1288
+                        var eventFilter = maybeGenerateConditional(elt, tokens, "event");
1289
+                        if (eventFilter) {
1290
+                            every.eventFilter = eventFilter;
1291
+                        }
1292
+                        triggerSpecs.push(every);
1293
+                    } else if (trigger.indexOf("sse:") === 0) {
1294
+                        triggerSpecs.push({trigger: 'sse', sseEvent: trigger.substr(4)});
1295
+                    } else {
1296
+                        var triggerSpec = {trigger: trigger};
1297
+                        var eventFilter = maybeGenerateConditional(elt, tokens, "event");
1298
+                        if (eventFilter) {
1299
+                            triggerSpec.eventFilter = eventFilter;
1300
+                        }
1301
+                        while (tokens.length > 0 && tokens[0] !== ",") {
1302
+                            consumeUntil(tokens, NOT_WHITESPACE)
1303
+                            var token = tokens.shift();
1304
+                            if (token === "changed") {
1305
+                                triggerSpec.changed = true;
1306
+                            } else if (token === "once") {
1307
+                                triggerSpec.once = true;
1308
+                            } else if (token === "consume") {
1309
+                                triggerSpec.consume = true;
1310
+                            } else if (token === "delay" && tokens[0] === ":") {
1311
+                                tokens.shift();
1312
+                                triggerSpec.delay = parseInterval(consumeUntil(tokens, WHITESPACE_OR_COMMA));
1313
+                            } else if (token === "from" && tokens[0] === ":") {
1314
+                                tokens.shift();
1315
+                                if (COMBINED_SELECTOR_START.test(tokens[0])) {
1316
+                                    var from_arg = consumeCSSSelector(tokens);
1317
+                                } else {
1244 1318
                                     var from_arg = consumeUntil(tokens, WHITESPACE_OR_COMMA);
1245 1319
                                     if (from_arg === "closest" || from_arg === "find" || from_arg === "next" || from_arg === "previous") {
1246 1320
                                         tokens.shift();
1247
-                                        from_arg +=
1248
-                                            " " +
1249
-                                            consumeUntil(
1250
-                                                tokens,
1251
-                                                WHITESPACE_OR_COMMA
1252
-                                            );
1321
+                                        var selector = consumeCSSSelector(tokens);
1322
+                                        // `next` and `previous` allow a selector-less syntax
1323
+                                        if (selector.length > 0) {
1324
+                                            from_arg += " " + selector;
1325
+                                        }
1253 1326
                                     }
1254
-                                    triggerSpec.from = from_arg;
1255
-                                } else if (token === "target" && tokens[0] === ":") {
1256
-                                    tokens.shift();
1257
-                                    triggerSpec.target = consumeUntil(tokens, WHITESPACE_OR_COMMA);
1258
-                                } else if (token === "throttle" && tokens[0] === ":") {
1259
-                                    tokens.shift();
1260
-                                    triggerSpec.throttle = parseInterval(consumeUntil(tokens, WHITESPACE_OR_COMMA));
1261
-                                } else if (token === "queue" && tokens[0] === ":") {
1262
-                                    tokens.shift();
1263
-                                    triggerSpec.queue = consumeUntil(tokens, WHITESPACE_OR_COMMA);
1264
-                                } else if ((token === "root" || token === "threshold") && tokens[0] === ":") {
1265
-                                    tokens.shift();
1266
-                                    triggerSpec[token] = consumeUntil(tokens, WHITESPACE_OR_COMMA);
1267
-                                } else {
1268
-                                    triggerErrorEvent(elt, "htmx:syntax:error", {token:tokens.shift()});
1269 1327
                                 }
1328
+                                triggerSpec.from = from_arg;
1329
+                            } else if (token === "target" && tokens[0] === ":") {
1330
+                                tokens.shift();
1331
+                                triggerSpec.target = consumeCSSSelector(tokens);
1332
+                            } else if (token === "throttle" && tokens[0] === ":") {
1333
+                                tokens.shift();
1334
+                                triggerSpec.throttle = parseInterval(consumeUntil(tokens, WHITESPACE_OR_COMMA));
1335
+                            } else if (token === "queue" && tokens[0] === ":") {
1336
+                                tokens.shift();
1337
+                                triggerSpec.queue = consumeUntil(tokens, WHITESPACE_OR_COMMA);
1338
+                            } else if (token === "root" && tokens[0] === ":") {
1339
+                                tokens.shift();
1340
+                                triggerSpec[token] = consumeCSSSelector(tokens);
1341
+                            } else if (token === "threshold" && tokens[0] === ":") {
1342
+                                tokens.shift();
1343
+                                triggerSpec[token] = consumeUntil(tokens, WHITESPACE_OR_COMMA);
1344
+                            } else {
1345
+                                triggerErrorEvent(elt, "htmx:syntax:error", {token:tokens.shift()});
1270 1346
                             }
1271
-                            triggerSpecs.push(triggerSpec);
1272 1347
                         }
1348
+                        triggerSpecs.push(triggerSpec);
1273 1349
                     }
1274
-                    if (tokens.length === initialLength) {
1275
-                        triggerErrorEvent(elt, "htmx:syntax:error", {token:tokens.shift()});
1276
-                    }
1277
-                    consumeUntil(tokens, NOT_WHITESPACE);
1278
-                } while (tokens[0] === "," && tokens.shift())
1350
+                }
1351
+                if (tokens.length === initialLength) {
1352
+                    triggerErrorEvent(elt, "htmx:syntax:error", {token:tokens.shift()});
1353
+                }
1354
+                consumeUntil(tokens, NOT_WHITESPACE);
1355
+            } while (tokens[0] === "," && tokens.shift())
1356
+            if (cache) {
1357
+                cache[explicitTrigger] = triggerSpecs
1358
+            }
1359
+            return triggerSpecs
1360
+        }
1361
+
1362
+        /**
1363
+         * @param {HTMLElement} elt
1364
+         * @returns {import("./htmx").HtmxTriggerSpecification[]}
1365
+         */
1366
+        function getTriggerSpecs(elt) {
1367
+            var explicitTrigger = getAttributeValue(elt, 'hx-trigger');
1368
+            var triggerSpecs = [];
1369
+            if (explicitTrigger) {
1370
+                var cache = htmx.config.triggerSpecsCache
1371
+                triggerSpecs = (cache && cache[explicitTrigger]) || parseAndCacheTrigger(elt, explicitTrigger, cache)
1279 1372
             }
1280 1373
 
1281 1374
             if (triggerSpecs.length > 0) {
1282 1375
                 return triggerSpecs;
1283 1376
             } else if (matches(elt, 'form')) {
1284 1377
                 return [{trigger: 'submit'}];
1285
-            } else if (matches(elt, 'input[type="button"]')){
1378
+            } else if (matches(elt, 'input[type="button"], input[type="submit"]')){
1286 1379
                 return [{trigger: 'click'}];
1287 1380
             } else if (matches(elt, INPUT_SELECTOR)) {
1288 1381
                 return [{trigger: 'change'}];
... ...
@@ -1299,7 +1392,10 @@ return (function () {
1299 1392
             var nodeData = getInternalData(elt);
1300 1393
             nodeData.timeout = setTimeout(function () {
1301 1394
                 if (bodyContains(elt) && nodeData.cancelled !== true) {
1302
-                    if (!maybeFilterEvent(spec, makeEvent('hx:poll:trigger', {triggerSpec:spec, target:elt}))) {
1395
+                    if (!maybeFilterEvent(spec, elt, makeEvent('hx:poll:trigger', {
1396
+                        triggerSpec: spec,
1397
+                        target: elt
1398
+                    }))) {
1303 1399
                         handler(elt);
1304 1400
                     }
1305 1401
                     processPolling(elt, handler, spec);
... ...
@@ -1319,7 +1415,7 @@ return (function () {
1319 1415
                 var verb, path;
1320 1416
                 if (elt.tagName === "A") {
1321 1417
                     verb = "get";
1322
-                    path = elt.href; // DOM property gives the fully resolved href of a relative link
1418
+                    path = getRawAttribute(elt, 'href')
1323 1419
                 } else {
1324 1420
                     var rawAttribute = getRawAttribute(elt, "method");
1325 1421
                     verb = rawAttribute ? rawAttribute.toLowerCase() : "get";
... ...
@@ -1329,6 +1425,10 @@ return (function () {
1329 1425
                 }
1330 1426
                 triggerSpecs.forEach(function(triggerSpec) {
1331 1427
                     addEventListener(elt, function(elt, evt) {
1428
+                        if (closest(elt, htmx.config.disableSelector)) {
1429
+                            cleanUpElement(elt)
1430
+                            return
1431
+                        }
1332 1432
                         issueAjaxRequest(verb, path, elt, evt)
1333 1433
                     }, nodeData, triggerSpec, true);
1334 1434
                 });
... ...
@@ -1361,11 +1461,11 @@ return (function () {
1361 1461
             return getInternalData(elt).boosted && elt.tagName === "A" && evt.type === "click" && (evt.ctrlKey || evt.metaKey);
1362 1462
         }
1363 1463
 
1364
-        function maybeFilterEvent(triggerSpec, evt) {
1464
+        function maybeFilterEvent(triggerSpec, elt, evt) {
1365 1465
             var eventFilter = triggerSpec.eventFilter;
1366 1466
             if(eventFilter){
1367 1467
                 try {
1368
-                    return eventFilter(evt) !== true;
1468
+                    return eventFilter.call(elt, evt) !== true;
1369 1469
                 } catch(e) {
1370 1470
                     triggerErrorEvent(getDocument().body, "htmx:eventFilter:error", {error: e, source:eventFilter.source});
1371 1471
                     return true;
... ...
@@ -1382,9 +1482,12 @@ return (function () {
1382 1482
             } else {
1383 1483
                 eltsToListenOn = [elt];
1384 1484
             }
1385
-            // store the initial value of the element so we can tell if it changes
1485
+            // store the initial values of the elements, so we can tell if they change
1386 1486
             if (triggerSpec.changed) {
1387
-                elementData.lastValue = elt.value;
1487
+                eltsToListenOn.forEach(function (eltToListenOn) {
1488
+                    var eltToListenOnData = getInternalData(eltToListenOn);
1489
+                    eltToListenOnData.lastValue = eltToListenOn.value;
1490
+                })
1388 1491
             }
1389 1492
             forEach(eltsToListenOn, function (eltToListenOn) {
1390 1493
                 var eventListener = function (evt) {
... ...
@@ -1398,7 +1501,7 @@ return (function () {
1398 1501
                     if (explicitCancel || shouldCancel(evt, elt)) {
1399 1502
                         evt.preventDefault();
1400 1503
                     }
1401
-                    if (maybeFilterEvent(triggerSpec, evt)) {
1504
+                    if (maybeFilterEvent(triggerSpec, elt, evt)) {
1402 1505
                         return;
1403 1506
                     }
1404 1507
                     var eventData = getInternalData(evt);
... ...
@@ -1424,11 +1527,11 @@ return (function () {
1424 1527
                             }
1425 1528
                         }
1426 1529
                         if (triggerSpec.changed) {
1427
-                            if (elementData.lastValue === elt.value) {
1530
+                            var eltToListenOnData = getInternalData(eltToListenOn)
1531
+                            if (eltToListenOnData.lastValue === eltToListenOn.value) {
1428 1532
                                 return;
1429
-                            } else {
1430
-                                elementData.lastValue = elt.value;
1431 1533
                             }
1534
+                            eltToListenOnData.lastValue = eltToListenOn.value
1432 1535
                         }
1433 1536
                         if (elementData.delayed) {
1434 1537
                             clearTimeout(elementData.delayed);
... ...
@@ -1437,14 +1540,14 @@ return (function () {
1437 1540
                             return;
1438 1541
                         }
1439 1542
 
1440
-                        if (triggerSpec.throttle) {
1543
+                        if (triggerSpec.throttle > 0) {
1441 1544
                             if (!elementData.throttle) {
1442 1545
                                 handler(elt, evt);
1443 1546
                                 elementData.throttle = setTimeout(function () {
1444 1547
                                     elementData.throttle = null;
1445 1548
                                 }, triggerSpec.throttle);
1446 1549
                             }
1447
-                        } else if (triggerSpec.delay) {
1550
+                        } else if (triggerSpec.delay > 0) {
1448 1551
                             elementData.delayed = setTimeout(function() { handler(elt, evt) }, triggerSpec.delay);
1449 1552
                         } else {
1450 1553
                             triggerEvent(elt, 'htmx:trigger')
... ...
@@ -1650,6 +1753,9 @@ return (function () {
1650 1753
                 var sseEventSource = getInternalData(sseSourceElt).sseEventSource;
1651 1754
                 var sseListener = function (event) {
1652 1755
                     if (maybeCloseSSESource(sseSourceElt)) {
1756
+                        return;
1757
+                    }
1758
+                    if (!bodyContains(elt)) {
1653 1759
                         sseEventSource.removeEventListener(sseEventName, sseListener);
1654 1760
                         return;
1655 1761
                     }
... ...
@@ -1666,7 +1772,7 @@ return (function () {
1666 1772
                     var target = getTarget(elt)
1667 1773
                     var settleInfo = makeSettleInfo(elt);
1668 1774
 
1669
-                    selectAndSwap(swapSpec.swapStyle, elt, target, response, settleInfo)
1775
+                    selectAndSwap(swapSpec.swapStyle, target, elt, response, settleInfo)
1670 1776
                     settleImmediately(settleInfo.tasks)
1671 1777
                     triggerEvent(elt, "htmx:sseMessage", event)
1672 1778
                 };
... ...
@@ -1718,7 +1824,7 @@ return (function () {
1718 1824
                     handler(elt);
1719 1825
                 }
1720 1826
             }
1721
-            if (delay) {
1827
+            if (delay > 0) {
1722 1828
                 setTimeout(load, delay);
1723 1829
             } else {
1724 1830
                 load();
... ...
@@ -1735,6 +1841,10 @@ return (function () {
1735 1841
                     nodeData.verb = verb;
1736 1842
                     triggerSpecs.forEach(function(triggerSpec) {
1737 1843
                         addTriggerHandler(elt, triggerSpec, nodeData, function (elt, evt) {
1844
+                            if (closest(elt, htmx.config.disableSelector)) {
1845
+                                cleanUpElement(elt)
1846
+                                return
1847
+                            }
1738 1848
                             issueAjaxRequest(verb, path, elt, evt)
1739 1849
                         })
1740 1850
                     });
... ...
@@ -1770,10 +1880,10 @@ return (function () {
1770 1880
                 observer.observe(elt);
1771 1881
                 addEventListener(elt, handler, nodeData, triggerSpec);
1772 1882
             } else if (triggerSpec.trigger === "load") {
1773
-                if (!maybeFilterEvent(triggerSpec, makeEvent("load", {elt:elt}))) {
1883
+                if (!maybeFilterEvent(triggerSpec, elt, makeEvent("load", {elt: elt}))) {
1774 1884
                                 loadImmediately(elt, handler, nodeData, triggerSpec.delay);
1775 1885
                             }
1776
-            } else if (triggerSpec.pollInterval) {
1886
+            } else if (triggerSpec.pollInterval > 0) {
1777 1887
                 nodeData.polling = true;
1778 1888
                 processPolling(elt, handler, triggerSpec);
1779 1889
             } else {
... ...
@@ -1782,7 +1892,7 @@ return (function () {
1782 1892
         }
1783 1893
 
1784 1894
         function evalScript(script) {
1785
-            if (script.type === "text/javascript" || script.type === "module" || script.type === "") {
1895
+            if (htmx.config.allowScriptTags && (script.type === "text/javascript" || script.type === "module" || script.type === "") ) {
1786 1896
                 var newScript = getDocument().createElement("script");
1787 1897
                 forEach(script.attributes, function (attr) {
1788 1898
                     newScript.setAttribute(attr.name, attr.value);
... ...
@@ -1816,14 +1926,46 @@ return (function () {
1816 1926
             });
1817 1927
         }
1818 1928
 
1819
-        function hasChanceOfBeingBoosted() {
1820
-            return document.querySelector("[hx-boost], [data-hx-boost]");
1929
+        function shouldProcessHxOn(elt) {
1930
+            var attributes = elt.attributes
1931
+            for (var j = 0; j < attributes.length; j++) {
1932
+                var attrName = attributes[j].name
1933
+                if (startsWith(attrName, "hx-on:") || startsWith(attrName, "data-hx-on:") ||
1934
+                    startsWith(attrName, "hx-on-") || startsWith(attrName, "data-hx-on-")) {
1935
+                    return true
1936
+                }
1937
+            }
1938
+            return false
1939
+        }
1940
+
1941
+        function findHxOnWildcardElements(elt) {
1942
+            var node = null
1943
+            var elements = []
1944
+
1945
+            if (shouldProcessHxOn(elt)) {
1946
+                elements.push(elt)
1947
+            }
1948
+
1949
+            if (document.evaluate) {
1950
+                var iter = document.evaluate('.//*[@*[ starts-with(name(), "hx-on:") or starts-with(name(), "data-hx-on:") or' +
1951
+                                                                           ' starts-with(name(), "hx-on-") or starts-with(name(), "data-hx-on-") ]]', elt)
1952
+                while (node = iter.iterateNext()) elements.push(node)
1953
+            } else {
1954
+                var allElements = elt.getElementsByTagName("*")
1955
+                for (var i = 0; i < allElements.length; i++) {
1956
+                    if (shouldProcessHxOn(allElements[i])) {
1957
+                        elements.push(allElements[i])
1958
+                    }
1959
+                }
1960
+            }
1961
+
1962
+            return elements
1821 1963
         }
1822 1964
 
1823 1965
         function findElementsToProcess(elt) {
1824 1966
             if (elt.querySelectorAll) {
1825
-                var boostedElts = hasChanceOfBeingBoosted() ? ", a, form" : "";
1826
-                var results = elt.querySelectorAll(VERB_SELECTOR + boostedElts + ", [hx-sse], [data-hx-sse], [hx-ws]," +
1967
+                var boostedSelector = ", [hx-boost] a, [data-hx-boost] a, a[hx-boost], a[data-hx-boost]";
1968
+                var results = elt.querySelectorAll(VERB_SELECTOR + boostedSelector + ", form, [type='submit'], [hx-sse], [data-hx-sse], [hx-ws]," +
1827 1969
                     " [data-hx-ws], [hx-ext], [data-hx-ext], [hx-trigger], [data-hx-trigger], [hx-on], [data-hx-on]");
1828 1970
                 return results;
1829 1971
             } else {
... ...
@@ -1831,31 +1973,45 @@ return (function () {
1831 1973
             }
1832 1974
         }
1833 1975
 
1834
-        function initButtonTracking(form){
1835
-            var maybeSetLastButtonClicked = function(evt){
1836
-                var elt = closest(evt.target, "button, input[type='submit']");
1837
-                if (elt !== null) {
1838
-                    var internalData = getInternalData(form);
1839
-                    internalData.lastButtonClicked = elt;
1840
-                }
1841
-            };
1842
-
1976
+        // Handle submit buttons/inputs that have the form attribute set
1977
+        // see https://developer.mozilla.org/docs/Web/HTML/Element/button
1978
+         function maybeSetLastButtonClicked(evt) {
1979
+            var elt = closest(evt.target, "button, input[type='submit']");
1980
+            var internalData = getRelatedFormData(evt)
1981
+            if (internalData) {
1982
+              internalData.lastButtonClicked = elt;
1983
+            }
1984
+        };
1985
+        function maybeUnsetLastButtonClicked(evt){
1986
+            var internalData = getRelatedFormData(evt)
1987
+            if (internalData) {
1988
+              internalData.lastButtonClicked = null;
1989
+            }
1990
+        }
1991
+        function getRelatedFormData(evt) {
1992
+           var elt = closest(evt.target, "button, input[type='submit']");
1993
+           if (!elt) {
1994
+             return;
1995
+           }
1996
+           var form = resolveTarget('#' + getRawAttribute(elt, 'form')) || closest(elt, 'form');
1997
+           if (!form) {
1998
+             return;
1999
+           }
2000
+           return getInternalData(form);
2001
+        }
2002
+        function initButtonTracking(elt) {
1843 2003
             // need to handle both click and focus in:
1844 2004
             //   focusin - in case someone tabs in to a button and hits the space bar
1845 2005
             //   click - on OSX buttons do not focus on click see https://bugs.webkit.org/show_bug.cgi?id=13724
1846
-
1847
-            form.addEventListener('click', maybeSetLastButtonClicked)
1848
-            form.addEventListener('focusin', maybeSetLastButtonClicked)
1849
-            form.addEventListener('focusout', function(evt){
1850
-                var internalData = getInternalData(form);
1851
-                internalData.lastButtonClicked = null;
1852
-            })
2006
+            elt.addEventListener('click', maybeSetLastButtonClicked)
2007
+            elt.addEventListener('focusin', maybeSetLastButtonClicked)
2008
+            elt.addEventListener('focusout', maybeUnsetLastButtonClicked)
1853 2009
         }
1854 2010
 
1855 2011
         function countCurlies(line) {
1856 2012
             var tokens = tokenizeString(line);
1857 2013
             var netCurlies = 0;
1858
-            for (let i = 0; i < tokens.length; i++) {
2014
+            for (var i = 0; i < tokens.length; i++) {
1859 2015
                 const token = tokens[i];
1860 2016
                 if (token === "{") {
1861 2017
                     netCurlies++;
... ...
@@ -1868,13 +2024,20 @@ return (function () {
1868 2024
 
1869 2025
         function addHxOnEventHandler(elt, eventName, code) {
1870 2026
             var nodeData = getInternalData(elt);
1871
-            nodeData.onHandlers = [];
1872
-            var func = new Function("event", code + "; return;");
1873
-            var listener = elt.addEventListener(eventName, function (e) {
1874
-                return func.call(elt, e);
1875
-            });
2027
+            if (!Array.isArray(nodeData.onHandlers)) {
2028
+                nodeData.onHandlers = [];
2029
+            }
2030
+            var func;
2031
+            var listener = function (e) {
2032
+                return maybeEval(elt, function() {
2033
+                    if (!func) {
2034
+                        func = new Function("event", code);
2035
+                    }
2036
+                    func.call(elt, e);
2037
+                });
2038
+            };
2039
+            elt.addEventListener(eventName, listener);
1876 2040
             nodeData.onHandlers.push({event:eventName, listener:listener});
1877
-            return {nodeData, code, func, listener};
1878 2041
         }
1879 2042
 
1880 2043
         function processHxOn(elt) {
... ...
@@ -1886,7 +2049,7 @@ return (function () {
1886 2049
                 var curlyCount = 0;
1887 2050
                 while (lines.length > 0) {
1888 2051
                     var line = lines.shift();
1889
-                    var match = line.match(/^\s*([a-zA-Z:\-]+:)(.*)/);
2052
+                    var match = line.match(/^\s*([a-zA-Z:\-\.]+:)(.*)/);
1890 2053
                     if (curlyCount === 0 && match) {
1891 2054
                         line.split(":")
1892 2055
                         currentEvent = match[1].slice(0, -1); // strip last colon
... ...
@@ -1903,18 +2066,45 @@ return (function () {
1903 2066
             }
1904 2067
         }
1905 2068
 
2069
+        function processHxOnWildcard(elt) {
2070
+            // wipe any previous on handlers so that this function takes precedence
2071
+            deInitOnHandlers(elt)
2072
+
2073
+            for (var i = 0; i < elt.attributes.length; i++) {
2074
+                var name = elt.attributes[i].name
2075
+                var value = elt.attributes[i].value
2076
+                if (startsWith(name, "hx-on") || startsWith(name, "data-hx-on")) {
2077
+                    var afterOnPosition = name.indexOf("-on") + 3;
2078
+                    var nextChar = name.slice(afterOnPosition, afterOnPosition + 1);
2079
+                    if (nextChar === "-" || nextChar === ":") {
2080
+                        var eventName = name.slice(afterOnPosition + 1);
2081
+                        // if the eventName starts with a colon or dash, prepend "htmx" for shorthand support
2082
+                        if (startsWith(eventName, ":")) {
2083
+                            eventName = "htmx" + eventName
2084
+                        } else if (startsWith(eventName, "-")) {
2085
+                            eventName = "htmx:" + eventName.slice(1);
2086
+                        } else if (startsWith(eventName, "htmx-")) {
2087
+                            eventName = "htmx:" + eventName.slice(5);
2088
+                        }
2089
+
2090
+                        addHxOnEventHandler(elt, eventName, value)
2091
+                    }
2092
+                }
2093
+            }
2094
+        }
2095
+
1906 2096
         function initNode(elt) {
1907
-            if (elt.closest && elt.closest(htmx.config.disableSelector)) {
2097
+            if (closest(elt, htmx.config.disableSelector)) {
2098
+                cleanUpElement(elt)
1908 2099
                 return;
1909 2100
             }
1910 2101
             var nodeData = getInternalData(elt);
1911 2102
             if (nodeData.initHash !== attributeHash(elt)) {
1912
-
1913
-                nodeData.initHash = attributeHash(elt);
1914
-
1915 2103
                 // clean up any previously processed info
1916 2104
                 deInitNode(elt);
1917 2105
 
2106
+                nodeData.initHash = attributeHash(elt);
2107
+
1918 2108
                 processHxOn(elt);
1919 2109
 
1920 2110
                 triggerEvent(elt, "htmx:beforeProcessNode")
... ...
@@ -1938,8 +2128,10 @@ return (function () {
1938 2128
                     }
1939 2129
                 }
1940 2130
 
1941
-                if (elt.tagName === "FORM") {
1942
-                    initButtonTracking(elt);
2131
+                // Handle submit buttons/inputs that have the form attribute set
2132
+                // see https://developer.mozilla.org/docs/Web/HTML/Element/button
2133
+                if (elt.tagName === "FORM" || (getRawAttribute(elt, "type") === "submit" && hasAttribute(elt, "form"))) {
2134
+                    initButtonTracking(elt)
1943 2135
                 }
1944 2136
 
1945 2137
                 var sseInfo = getAttributeValue(elt, 'hx-sse');
... ...
@@ -1957,8 +2149,15 @@ return (function () {
1957 2149
 
1958 2150
         function processNode(elt) {
1959 2151
             elt = resolveTarget(elt);
2152
+            if (closest(elt, htmx.config.disableSelector)) {
2153
+                cleanUpElement(elt)
2154
+                return;
2155
+            }
1960 2156
             initNode(elt);
1961 2157
             forEach(findElementsToProcess(elt), function(child) { initNode(child) });
2158
+            // Because it happens second, the new way of adding onHandlers superseeds the old one
2159
+            // i.e. if there are any hx-on:eventName attributes, the hx-on attribute will be ignored
2160
+            forEach(findHxOnWildcardElements(elt), processHxOnWildcard);
1962 2161
         }
1963 2162
 
1964 2163
         //====================================================================
... ...
@@ -2036,7 +2235,7 @@ return (function () {
2036 2235
                 eventResult = eventResult && elt.dispatchEvent(kebabedEvent)
2037 2236
             }
2038 2237
             withExtensions(elt, function (extension) {
2039
-                eventResult = eventResult && (extension.onEvent(eventName, event) !== false)
2238
+                eventResult = eventResult && (extension.onEvent(eventName, event) !== false && !event.defaultPrevented)
2040 2239
             });
2041 2240
             return eventResult;
2042 2241
         }
... ...
@@ -2056,6 +2255,12 @@ return (function () {
2056 2255
                 return;
2057 2256
             }
2058 2257
 
2258
+            if (htmx.config.historyCacheSize <= 0) {
2259
+                // make sure that an eventually already existing cache is purged
2260
+                localStorage.removeItem("htmx-history-cache");
2261
+                return;
2262
+            }
2263
+
2059 2264
             url = normalizePath(url);
2060 2265
 
2061 2266
             var historyCache = parseJSON(localStorage.getItem("htmx-history-cache")) || [];
... ...
@@ -2116,7 +2321,13 @@ return (function () {
2116 2321
             // so we can prevent privileged data entering the cache.
2117 2322
             // The page will still be reachable as a history entry, but htmx will fetch it
2118 2323
             // live from the server onpopstate rather than look in the localStorage cache
2119
-            var disableHistoryCache = getDocument().querySelector('[hx-history="false" i],[data-hx-history="false" i]');
2324
+            var disableHistoryCache
2325
+            try {
2326
+                disableHistoryCache = getDocument().querySelector('[hx-history="false" i],[data-hx-history="false" i]')
2327
+            } catch (e) {
2328
+                // IE11: insensitive modifier not supported so fallback to case sensitive selector
2329
+                disableHistoryCache = getDocument().querySelector('[hx-history="false"],[data-hx-history="false"]')
2330
+            }
2120 2331
             if (!disableHistoryCache) {
2121 2332
                 triggerEvent(getDocument().body, "htmx:beforeHistorySave", {path: path, historyElt: elt});
2122 2333
                 saveToHistoryCache(path, cleanInnerHtmlForHistory(elt), getDocument().title, window.scrollY);
... ...
@@ -2129,7 +2340,7 @@ return (function () {
2129 2340
             // remove the cache buster parameter, if any
2130 2341
             if (htmx.config.getCacheBusterParam) {
2131 2342
                 path = path.replace(/org\.htmx\.cache-buster=[^&]*&?/, '')
2132
-                if (path.endsWith('&') || path.endsWith("?")) {
2343
+                if (endsWith(path, '&') || endsWith(path, "?")) {
2133 2344
                     path = path.slice(0, -1);
2134 2345
                 }
2135 2346
             }
... ...
@@ -2155,7 +2366,9 @@ return (function () {
2155 2366
             var details = {path: path, xhr:request};
2156 2367
             triggerEvent(getDocument().body, "htmx:historyCacheMiss", details);
2157 2368
             request.open('GET', path, true);
2369
+            request.setRequestHeader("HX-Request", "true");
2158 2370
             request.setRequestHeader("HX-History-Restore-Request", "true");
2371
+            request.setRequestHeader("HX-Current-URL", getDocument().location.href);
2159 2372
             request.onload = function () {
2160 2373
                 if (this.status >= 200 && this.status < 400) {
2161 2374
                     triggerEvent(getDocument().body, "htmx:historyCacheMissLoad", details);
... ...
@@ -2196,7 +2409,9 @@ return (function () {
2196 2409
                 swapInnerHTML(historyElement, fragment, settleInfo)
2197 2410
                 settleImmediately(settleInfo.tasks);
2198 2411
                 document.title = cached.title;
2199
-                window.scrollTo(0, cached.scroll);
2412
+                setTimeout(function () {
2413
+                    window.scrollTo(0, cached.scroll);
2414
+                }, 0); // next 'tick', so browser has time to render layout
2200 2415
                 currentPathForHistory = path;
2201 2416
                 triggerEvent(getDocument().body, "htmx:historyRestore", {path:path, item:cached});
2202 2417
             } else {
... ...
@@ -2223,7 +2438,20 @@ return (function () {
2223 2438
             return indicators;
2224 2439
         }
2225 2440
 
2226
-        function removeRequestIndicatorClasses(indicators) {
2441
+        function disableElements(elt) {
2442
+            var disabledElts = findAttributeTargets(elt, 'hx-disabled-elt');
2443
+            if (disabledElts == null) {
2444
+                disabledElts = [];
2445
+            }
2446
+            forEach(disabledElts, function (disabledElement) {
2447
+                var internalData = getInternalData(disabledElement);
2448
+                internalData.requestCount = (internalData.requestCount || 0) + 1;
2449
+                disabledElement.setAttribute("disabled", "");
2450
+            });
2451
+            return disabledElts;
2452
+        }
2453
+
2454
+        function removeRequestIndicators(indicators, disabled) {
2227 2455
             forEach(indicators, function (ic) {
2228 2456
                 var internalData = getInternalData(ic);
2229 2457
                 internalData.requestCount = (internalData.requestCount || 0) - 1;
... ...
@@ -2231,6 +2459,13 @@ return (function () {
2231 2459
                     ic.classList["remove"].call(ic.classList, htmx.config.requestClass);
2232 2460
                 }
2233 2461
             });
2462
+            forEach(disabled, function (disabledElement) {
2463
+                var internalData = getInternalData(disabledElement);
2464
+                internalData.requestCount = (internalData.requestCount || 0) - 1;
2465
+                if (internalData.requestCount === 0) {
2466
+                    disabledElement.removeAttribute('disabled');
2467
+                }
2468
+            });
2234 2469
         }
2235 2470
 
2236 2471
         //====================================================================
... ...
@@ -2248,7 +2483,7 @@ return (function () {
2248 2483
         }
2249 2484
 
2250 2485
         function shouldInclude(elt) {
2251
-            if(elt.name === "" || elt.name == null || elt.disabled) {
2486
+            if(elt.name === "" || elt.name == null || elt.disabled || closest(elt, "fieldset[disabled]")) {
2252 2487
                 return false;
2253 2488
             }
2254 2489
             // ignore "submitter" types (see jQuery src/serialize.js)
... ...
@@ -2261,6 +2496,29 @@ return (function () {
2261 2496
             return true;
2262 2497
         }
2263 2498
 
2499
+        function addValueToValues(name, value, values) {
2500
+            // This is a little ugly because both the current value of the named value in the form
2501
+            // and the new value could be arrays, so we have to handle all four cases :/
2502
+            if (name != null && value != null) {
2503
+                var current = values[name];
2504
+                if (current === undefined) {
2505
+                    values[name] = value;
2506
+                } else if (Array.isArray(current)) {
2507
+                    if (Array.isArray(value)) {
2508
+                        values[name] = current.concat(value);
2509
+                    } else {
2510
+                        current.push(value);
2511
+                    }
2512
+                } else {
2513
+                    if (Array.isArray(value)) {
2514
+                        values[name] = [current].concat(value);
2515
+                    } else {
2516
+                        values[name] = [current, value];
2517
+                    }
2518
+                }
2519
+            }
2520
+        }
2521
+
2264 2522
         function processInputValue(processed, values, errors, elt, validate) {
2265 2523
             if (elt == null || haveSeenNode(processed, elt)) {
2266 2524
                 return;
... ...
@@ -2270,35 +2528,14 @@ return (function () {
2270 2528
             if (shouldInclude(elt)) {
2271 2529
                 var name = getRawAttribute(elt,"name");
2272 2530
                 var value = elt.value;
2273
-                if (elt.multiple) {
2531
+                if (elt.multiple && elt.tagName === "SELECT") {
2274 2532
                     value = toArray(elt.querySelectorAll("option:checked")).map(function (e) { return e.value });
2275 2533
                 }
2276 2534
                 // include file inputs
2277 2535
                 if (elt.files) {
2278 2536
                     value = toArray(elt.files);
2279 2537
                 }
2280
-                // This is a little ugly because both the current value of the named value in the form
2281
-                // and the new value could be arrays, so we have to handle all four cases :/
2282
-                if (name != null && value != null) {
2283
-                    var current = values[name];
2284
-                    if (current !== undefined) {
2285
-                        if (Array.isArray(current)) {
2286
-                            if (Array.isArray(value)) {
2287
-                                values[name] = current.concat(value);
2288
-                            } else {
2289
-                                current.push(value);
2290
-                            }
2291
-                        } else {
2292
-                            if (Array.isArray(value)) {
2293
-                                values[name] = [current].concat(value);
2294
-                            } else {
2295
-                                values[name] = [current, value];
2296
-                            }
2297
-                        }
2298
-                    } else {
2299
-                        values[name] = value;
2300
-                    }
2301
-                }
2538
+                addValueToValues(name, value, values);
2302 2539
                 if (validate) {
2303 2540
                     validateElement(elt, errors);
2304 2541
                 }
... ...
@@ -2331,6 +2568,9 @@ return (function () {
2331 2568
             var formValues = {};
2332 2569
             var errors = [];
2333 2570
             var internalData = getInternalData(elt);
2571
+            if (internalData.lastButtonClicked && !bodyContains(internalData.lastButtonClicked)) {
2572
+                internalData.lastButtonClicked = null
2573
+            }
2334 2574
 
2335 2575
             // only validate when form is directly submitted and novalidate or formnovalidate are not set
2336 2576
             // or if the element has an explicit hx-validate="true" on it
... ...
@@ -2348,11 +2588,11 @@ return (function () {
2348 2588
             processInputValue(processed, values, errors, elt, validate);
2349 2589
 
2350 2590
             // if a button or submit was clicked last, include its value
2351
-            if (internalData.lastButtonClicked) {
2352
-                var name = getRawAttribute(internalData.lastButtonClicked,"name");
2353
-                if (name) {
2354
-                    values[name] = internalData.lastButtonClicked.value;
2355
-                }
2591
+            if (internalData.lastButtonClicked || elt.tagName === "BUTTON" ||
2592
+                (elt.tagName === "INPUT" && getRawAttribute(elt, "type") === "submit")) {
2593
+                var button = internalData.lastButtonClicked || elt
2594
+                var name = getRawAttribute(button, "name")
2595
+                addValueToValues(name, button.value, formValues)
2356 2596
             }
2357 2597
 
2358 2598
             // include any explicit includes
... ...
@@ -2498,43 +2738,43 @@ return (function () {
2498 2738
                 "swapDelay" : htmx.config.defaultSwapDelay,
2499 2739
                 "settleDelay" : htmx.config.defaultSettleDelay
2500 2740
             }
2501
-            if (getInternalData(elt).boosted && !isAnchorLink(elt)) {
2741
+            if (htmx.config.scrollIntoViewOnBoost && getInternalData(elt).boosted && !isAnchorLink(elt)) {
2502 2742
               swapSpec["show"] = "top"
2503 2743
             }
2504 2744
             if (swapInfo) {
2505 2745
                 var split = splitOnWhitespace(swapInfo);
2506 2746
                 if (split.length > 0) {
2507
-                    swapSpec["swapStyle"] = split[0];
2508
-                    for (var i = 1; i < split.length; i++) {
2509
-                        var modifier = split[i];
2510
-                        if (modifier.indexOf("swap:") === 0) {
2511
-                            swapSpec["swapDelay"] = parseInterval(modifier.substr(5));
2512
-                        }
2513
-                        if (modifier.indexOf("settle:") === 0) {
2514
-                            swapSpec["settleDelay"] = parseInterval(modifier.substr(7));
2515
-                        }
2516
-                        if (modifier.indexOf("transition:") === 0) {
2517
-                            swapSpec["transition"] = modifier.substr(11) === "true";
2518
-                        }
2519
-                        if (modifier.indexOf("scroll:") === 0) {
2520
-                            var scrollSpec = modifier.substr(7);
2747
+                    for (var i = 0; i < split.length; i++) {
2748
+                        var value = split[i];
2749
+                        if (value.indexOf("swap:") === 0) {
2750
+                            swapSpec["swapDelay"] = parseInterval(value.substr(5));
2751
+                        } else if (value.indexOf("settle:") === 0) {
2752
+                            swapSpec["settleDelay"] = parseInterval(value.substr(7));
2753
+                        } else if (value.indexOf("transition:") === 0) {
2754
+                            swapSpec["transition"] = value.substr(11) === "true";
2755
+                        } else if (value.indexOf("ignoreTitle:") === 0) {
2756
+                            swapSpec["ignoreTitle"] = value.substr(12) === "true";
2757
+                        } else if (value.indexOf("scroll:") === 0) {
2758
+                            var scrollSpec = value.substr(7);
2521 2759
                             var splitSpec = scrollSpec.split(":");
2522 2760
                             var scrollVal = splitSpec.pop();
2523 2761
                             var selectorVal = splitSpec.length > 0 ? splitSpec.join(":") : null;
2524 2762
                             swapSpec["scroll"] = scrollVal;
2525 2763
                             swapSpec["scrollTarget"] = selectorVal;
2526
-                        }
2527
-                        if (modifier.indexOf("show:") === 0) {
2528
-                            var showSpec = modifier.substr(5);
2764
+                        } else if (value.indexOf("show:") === 0) {
2765
+                            var showSpec = value.substr(5);
2529 2766
                             var splitSpec = showSpec.split(":");
2530 2767
                             var showVal = splitSpec.pop();
2531 2768
                             var selectorVal = splitSpec.length > 0 ? splitSpec.join(":") : null;
2532 2769
                             swapSpec["show"] = showVal;
2533 2770
                             swapSpec["showTarget"] = selectorVal;
2534
-                        }
2535
-                        if (modifier.indexOf("focus-scroll:") === 0) {
2536
-                            var focusScrollVal = modifier.substr("focus-scroll:".length);
2771
+                        } else if (value.indexOf("focus-scroll:") === 0) {
2772
+                            var focusScrollVal = value.substr("focus-scroll:".length);
2537 2773
                             swapSpec["focusScroll"] = focusScrollVal == "true";
2774
+                        } else if (i == 0) {
2775
+                            swapSpec["swapStyle"] = value;
2776
+                        } else {
2777
+                            logError('Unknown modifier in hx-swap: ' + value);
2538 2778
                         }
2539 2779
                     }
2540 2780
                 }
... ...
@@ -2719,7 +2959,7 @@ return (function () {
2719 2959
         }
2720 2960
 
2721 2961
         function hasHeader(xhr, regexp) {
2722
-            return xhr.getAllResponseHeaders().match(regexp);
2962
+            return regexp.test(xhr.getAllResponseHeaders())
2723 2963
         }
2724 2964
 
2725 2965
         function ajaxHelper(verb, path, context) {
... ...
@@ -2738,6 +2978,7 @@ return (function () {
2738 2978
                             values : context.values,
2739 2979
                             targetOverride: resolveTarget(context.target),
2740 2980
                             swapOverride: context.swap,
2981
+                            select: context.select,
2741 2982
                             returnPromise: true
2742 2983
                         });
2743 2984
                 }
... ...
@@ -2757,6 +2998,27 @@ return (function () {
2757 2998
             return arr;
2758 2999
         }
2759 3000
 
3001
+        function verifyPath(elt, path, requestConfig) {
3002
+            var sameHost
3003
+            var url
3004
+            if (typeof URL === "function") {
3005
+                url = new URL(path, document.location.href);
3006
+                var origin = document.location.origin;
3007
+                sameHost = origin === url.origin;
3008
+            } else {
3009
+                // IE11 doesn't support URL
3010
+                url = path
3011
+                sameHost = startsWith(path, document.location.origin)
3012
+            }
3013
+
3014
+            if (htmx.config.selfRequestsOnly) {
3015
+                if (!sameHost) {
3016
+                    return false;
3017
+                }
3018
+            }
3019
+            return triggerEvent(elt, "htmx:validateUrl", mergeObjects({url: url, sameHost: sameHost}, requestConfig));
3020
+        }
3021
+
2760 3022
         function issueAjaxRequest(verb, path, elt, event, etc, confirmed) {
2761 3023
             var resolve = null;
2762 3024
             var reject = null;
... ...
@@ -2771,29 +3033,52 @@ return (function () {
2771 3033
                 elt = getDocument().body;
2772 3034
             }
2773 3035
             var responseHandler = etc.handler || handleAjaxResponse;
3036
+            var select = etc.select || null;
2774 3037
 
2775 3038
             if (!bodyContains(elt)) {
2776
-                return; // do not issue requests for elements removed from the DOM
3039
+                // do not issue requests for elements removed from the DOM
3040
+                maybeCall(resolve);
3041
+                return promise;
2777 3042
             }
2778 3043
             var target = etc.targetOverride || getTarget(elt);
2779 3044
             if (target == null || target == DUMMY_ELT) {
2780 3045
                 triggerErrorEvent(elt, 'htmx:targetError', {target: getAttributeValue(elt, "hx-target")});
2781
-                return;
3046
+                maybeCall(reject);
3047
+                return promise;
3048
+            }
3049
+
3050
+            var eltData = getInternalData(elt);
3051
+            var submitter = eltData.lastButtonClicked;
3052
+
3053
+            if (submitter) {
3054
+                var buttonPath = getRawAttribute(submitter, "formaction");
3055
+                if (buttonPath != null) {
3056
+                    path = buttonPath;
3057
+                }
3058
+
3059
+                var buttonVerb = getRawAttribute(submitter, "formmethod")
3060
+                if (buttonVerb != null) {
3061
+                    // ignore buttons with formmethod="dialog"
3062
+                    if (buttonVerb.toLowerCase() !== "dialog") {
3063
+                        verb = buttonVerb;
3064
+                    }
3065
+                }
2782 3066
             }
2783 3067
 
3068
+            var confirmQuestion = getClosestAttributeValue(elt, "hx-confirm");
2784 3069
             // allow event-based confirmation w/ a callback
2785
-            if (!confirmed) {
2786
-                var issueRequest = function() {
2787
-                    return issueAjaxRequest(verb, path, elt, event, etc, true);
3070
+            if (confirmed === undefined) {
3071
+                var issueRequest = function(skipConfirmation) {
3072
+                    return issueAjaxRequest(verb, path, elt, event, etc, !!skipConfirmation);
2788 3073
                 }
2789
-                var confirmDetails = {target: target, elt: elt, path: path, verb: verb, triggeringEvent: event, etc: etc, issueRequest: issueRequest};
3074
+                var confirmDetails = {target: target, elt: elt, path: path, verb: verb, triggeringEvent: event, etc: etc, issueRequest: issueRequest, question: confirmQuestion};
2790 3075
                 if (triggerEvent(elt, 'htmx:confirm', confirmDetails) === false) {
2791
-                    return;
3076
+                    maybeCall(resolve);
3077
+                    return promise;
2792 3078
                 }
2793 3079
             }
2794 3080
 
2795 3081
             var syncElt = elt;
2796
-            var eltData = getInternalData(elt);
2797 3082
             var syncStrategy = getClosestAttributeValue(elt, "hx-sync");
2798 3083
             var queueStrategy = null;
2799 3084
             var abortable = false;
... ...
@@ -2809,10 +3094,12 @@ return (function () {
2809 3094
                 syncStrategy = (syncStrings[1] || 'drop').trim();
2810 3095
                 eltData = getInternalData(syncElt);
2811 3096
                 if (syncStrategy === "drop" && eltData.xhr && eltData.abortable !== true) {
2812
-                    return;
3097
+                    maybeCall(resolve);
3098
+                    return promise;
2813 3099
                 } else if (syncStrategy === "abort") {
2814 3100
                     if (eltData.xhr) {
2815
-                        return;
3101
+                        maybeCall(resolve);
3102
+                        return promise;
2816 3103
                     } else {
2817 3104
                         abortable = true;
2818 3105
                     }
... ...
@@ -2856,7 +3143,8 @@ return (function () {
2856 3143
                             issueAjaxRequest(verb, path, elt, event, etc)
2857 3144
                         });
2858 3145
                     }
2859
-                    return;
3146
+                    maybeCall(resolve);
3147
+                    return promise;
2860 3148
                 }
2861 3149
             }
2862 3150
 
... ...
@@ -2884,8 +3172,7 @@ return (function () {
2884 3172
                 }
2885 3173
             }
2886 3174
 
2887
-            var confirmQuestion = getClosestAttributeValue(elt, "hx-confirm");
2888
-            if (confirmQuestion) {
3175
+            if (confirmQuestion && !confirmed) {
2889 3176
                 if(!confirm(confirmQuestion)) {
2890 3177
                     maybeCall(resolve);
2891 3178
                     endRequestLock()
... ...
@@ -2895,6 +3182,11 @@ return (function () {
2895 3182
 
2896 3183
 
2897 3184
             var headers = getHeaders(elt, target, promptResponse);
3185
+
3186
+            if (verb !== 'get' && !usesFormData(elt)) {
3187
+                headers['Content-Type'] = 'application/x-www-form-urlencoded';
3188
+            }
3189
+
2898 3190
             if (etc.headers) {
2899 3191
                 headers = mergeObjects(headers, etc.headers);
2900 3192
             }
... ...
@@ -2908,10 +3200,6 @@ return (function () {
2908 3200
             var allParameters = mergeObjects(rawParameters, expressionVars);
2909 3201
             var filteredParameters = filterValues(allParameters, elt);
2910 3202
 
2911
-            if (verb !== 'get' && !usesFormData(elt)) {
2912
-                headers['Content-Type'] = 'application/x-www-form-urlencoded';
2913
-            }
2914
-
2915 3203
             if (htmx.config.getCacheBusterParam && verb === 'get') {
2916 3204
                 filteredParameters['org.htmx.cache-buster'] = getRawAttribute(target, "id") || "true";
2917 3205
             }
... ...
@@ -2925,8 +3213,12 @@ return (function () {
2925 3213
             var requestAttrValues = getValuesForElement(elt, 'hx-request');
2926 3214
 
2927 3215
             var eltIsBoosted = getInternalData(elt).boosted;
3216
+
3217
+            var useUrlParams = htmx.config.methodsThatUseUrlParams.indexOf(verb) >= 0
3218
+
2928 3219
             var requestConfig = {
2929 3220
                 boosted: eltIsBoosted,
3221
+                useUrlParams: useUrlParams,
2930 3222
                 parameters: filteredParameters,
2931 3223
                 unfilteredParameters: allParameters,
2932 3224
                 headers:headers,
... ...
@@ -2951,6 +3243,7 @@ return (function () {
2951 3243
             headers = requestConfig.headers;
2952 3244
             filteredParameters = requestConfig.parameters;
2953 3245
             errors = requestConfig.errors;
3246
+            useUrlParams = requestConfig.useUrlParams;
2954 3247
 
2955 3248
             if(errors && errors.length > 0){
2956 3249
                 triggerEvent(elt, 'htmx:validation:halted', requestConfig)
... ...
@@ -2962,26 +3255,31 @@ return (function () {
2962 3255
             var splitPath = path.split("#");
2963 3256
             var pathNoAnchor = splitPath[0];
2964 3257
             var anchor = splitPath[1];
2965
-            var finalPathForGet = null;
2966
-            if (verb === 'get') {
2967
-                finalPathForGet = pathNoAnchor;
3258
+
3259
+            var finalPath = path
3260
+            if (useUrlParams) {
3261
+                finalPath = pathNoAnchor;
2968 3262
                 var values = Object.keys(filteredParameters).length !== 0;
2969 3263
                 if (values) {
2970
-                    if (finalPathForGet.indexOf("?") < 0) {
2971
-                        finalPathForGet += "?";
3264
+                    if (finalPath.indexOf("?") < 0) {
3265
+                        finalPath += "?";
2972 3266
                     } else {
2973
-                        finalPathForGet += "&";
3267
+                        finalPath += "&";
2974 3268
                     }
2975
-                    finalPathForGet += urlEncode(filteredParameters);
3269
+                    finalPath += urlEncode(filteredParameters);
2976 3270
                     if (anchor) {
2977
-                        finalPathForGet += "#" + anchor;
3271
+                        finalPath += "#" + anchor;
2978 3272
                     }
2979 3273
                 }
2980
-                xhr.open('GET', finalPathForGet, true);
2981
-            } else {
2982
-                xhr.open(verb.toUpperCase(), path, true);
2983 3274
             }
2984 3275
 
3276
+            if (!verifyPath(elt, finalPath, requestConfig)) {
3277
+                triggerErrorEvent(elt, 'htmx:invalidPath', requestConfig)
3278
+                maybeCall(reject);
3279
+                return promise;
3280
+            };
3281
+
3282
+            xhr.open(verb.toUpperCase(), finalPath, true);
2985 3283
             xhr.overrideMimeType("text/html");
2986 3284
             xhr.withCredentials = requestConfig.withCredentials;
2987 3285
             xhr.timeout = requestConfig.timeout;
... ...
@@ -2999,10 +3297,10 @@ return (function () {
2999 3297
             }
3000 3298
 
3001 3299
             var responseInfo = {
3002
-                xhr: xhr, target: target, requestConfig: requestConfig, etc: etc, boosted: eltIsBoosted,
3300
+                xhr: xhr, target: target, requestConfig: requestConfig, etc: etc, boosted: eltIsBoosted, select: select,
3003 3301
                 pathInfo: {
3004 3302
                     requestPath: path,
3005
-                    finalRequestPath: finalPathForGet || path,
3303
+                    finalRequestPath: finalPath,
3006 3304
                     anchor: anchor
3007 3305
                 }
3008 3306
             };
... ...
@@ -3012,7 +3310,7 @@ return (function () {
3012 3310
                     var hierarchy = hierarchyForElt(elt);
3013 3311
                     responseInfo.pathInfo.responsePath = getPathFromResponse(xhr);
3014 3312
                     responseHandler(elt, responseInfo);
3015
-                    removeRequestIndicatorClasses(indicators);
3313
+                    removeRequestIndicators(indicators, disableElts);
3016 3314
                     triggerEvent(elt, 'htmx:afterRequest', responseInfo);
3017 3315
                     triggerEvent(elt, 'htmx:afterOnLoad', responseInfo);
3018 3316
                     // if the body no longer contains the element, trigger the event on the closest parent
... ...
@@ -3038,21 +3336,21 @@ return (function () {
3038 3336
                 }
3039 3337
             }
3040 3338
             xhr.onerror = function () {
3041
-                removeRequestIndicatorClasses(indicators);
3339
+                removeRequestIndicators(indicators, disableElts);
3042 3340
                 triggerErrorEvent(elt, 'htmx:afterRequest', responseInfo);
3043 3341
                 triggerErrorEvent(elt, 'htmx:sendError', responseInfo);
3044 3342
                 maybeCall(reject);
3045 3343
                 endRequestLock();
3046 3344
             }
3047 3345
             xhr.onabort = function() {
3048
-                removeRequestIndicatorClasses(indicators);
3346
+                removeRequestIndicators(indicators, disableElts);
3049 3347
                 triggerErrorEvent(elt, 'htmx:afterRequest', responseInfo);
3050 3348
                 triggerErrorEvent(elt, 'htmx:sendAbort', responseInfo);
3051 3349
                 maybeCall(reject);
3052 3350
                 endRequestLock();
3053 3351
             }
3054 3352
             xhr.ontimeout = function() {
3055
-                removeRequestIndicatorClasses(indicators);
3353
+                removeRequestIndicators(indicators, disableElts);
3056 3354
                 triggerErrorEvent(elt, 'htmx:afterRequest', responseInfo);
3057 3355
                 triggerErrorEvent(elt, 'htmx:timeout', responseInfo);
3058 3356
                 maybeCall(reject);
... ...
@@ -3064,6 +3362,7 @@ return (function () {
3064 3362
                 return promise
3065 3363
             }
3066 3364
             var indicators = addRequestIndicatorClasses(elt);
3365
+            var disableElts = disableElements(elt);
3067 3366
 
3068 3367
             forEach(['loadstart', 'loadend', 'progress', 'abort'], function(eventName) {
3069 3368
                 forEach([xhr, xhr.upload], function (target) {
... ...
@@ -3077,7 +3376,8 @@ return (function () {
3077 3376
                 });
3078 3377
             });
3079 3378
             triggerEvent(elt, 'htmx:beforeSend', responseInfo);
3080
-            xhr.send(verb === 'get' ? null : encodeParamsForBody(xhr, elt, filteredParameters));
3379
+            var params = useUrlParams ? null : encodeParamsForBody(xhr, elt, filteredParameters)
3380
+            xhr.send(params);
3081 3381
             return promise;
3082 3382
         }
3083 3383
 
... ...
@@ -3167,6 +3467,8 @@ return (function () {
3167 3467
             var xhr = responseInfo.xhr;
3168 3468
             var target = responseInfo.target;
3169 3469
             var etc = responseInfo.etc;
3470
+            var requestConfig = responseInfo.requestConfig;
3471
+            var select = responseInfo.select;
3170 3472
 
3171 3473
             if (!triggerEvent(elt, 'htmx:beforeOnLoad', responseInfo)) return;
3172 3474
 
... ...
@@ -3190,20 +3492,25 @@ return (function () {
3190 3492
                 return;
3191 3493
             }
3192 3494
 
3495
+            var shouldRefresh = hasHeader(xhr, /HX-Refresh:/i) && "true" === xhr.getResponseHeader("HX-Refresh");
3496
+
3193 3497
             if (hasHeader(xhr, /HX-Redirect:/i)) {
3194 3498
                 location.href = xhr.getResponseHeader("HX-Redirect");
3499
+                shouldRefresh && location.reload();
3195 3500
                 return;
3196 3501
             }
3197 3502
 
3198
-            if (hasHeader(xhr,/HX-Refresh:/i)) {
3199
-                if ("true" === xhr.getResponseHeader("HX-Refresh")) {
3200
-                    location.reload();
3201
-                    return;
3202
-                }
3503
+            if (shouldRefresh) {
3504
+                location.reload();
3505
+                return;
3203 3506
             }
3204 3507
 
3205 3508
             if (hasHeader(xhr,/HX-Retarget:/i)) {
3206
-                responseInfo.target = getDocument().querySelector(xhr.getResponseHeader("HX-Retarget"));
3509
+                if (xhr.getResponseHeader("HX-Retarget") === "this") {
3510
+                    responseInfo.target = elt;
3511
+                } else {
3512
+                    responseInfo.target = querySelectorExt(elt, xhr.getResponseHeader("HX-Retarget"));
3513
+                }
3207 3514
             }
3208 3515
 
3209 3516
             var historyUpdate = determineHistoryUpdates(elt, responseInfo);
... ...
@@ -3215,12 +3522,14 @@ return (function () {
3215 3522
             var shouldSwap = xhr.status >= 200 && xhr.status < 400 && xhr.status !== 204;
3216 3523
             var serverResponse = xhr.response;
3217 3524
             var isError = xhr.status >= 400;
3218
-            var beforeSwapDetails = mergeObjects({shouldSwap: shouldSwap, serverResponse:serverResponse, isError:isError}, responseInfo);
3525
+            var ignoreTitle = htmx.config.ignoreTitle
3526
+            var beforeSwapDetails = mergeObjects({shouldSwap: shouldSwap, serverResponse:serverResponse, isError:isError, ignoreTitle:ignoreTitle }, responseInfo);
3219 3527
             if (!triggerEvent(target, 'htmx:beforeSwap', beforeSwapDetails)) return;
3220 3528
 
3221 3529
             target = beforeSwapDetails.target; // allow re-targeting
3222 3530
             serverResponse = beforeSwapDetails.serverResponse; // allow updating content
3223 3531
             isError = beforeSwapDetails.isError; // allow updating error
3532
+            ignoreTitle = beforeSwapDetails.ignoreTitle; // allow updating ignoring title
3224 3533
 
3225 3534
             responseInfo.target = target; // Make updated target available to response events
3226 3535
             responseInfo.failed = isError; // Make failed property available to response events
... ...
@@ -3246,6 +3555,10 @@ return (function () {
3246 3555
                 }
3247 3556
                 var swapSpec = getSwapSpecification(elt, swapOverride);
3248 3557
 
3558
+                if (swapSpec.hasOwnProperty('ignoreTitle')) {
3559
+                    ignoreTitle = swapSpec.ignoreTitle;
3560
+                }
3561
+
3249 3562
                 target.classList.add(htmx.config.swappingClass);
3250 3563
 
3251 3564
                 // optional transition API promise callbacks
... ...
@@ -3268,13 +3581,34 @@ return (function () {
3268 3581
                             // safari issue - see https://github.com/microsoft/playwright/issues/5894
3269 3582
                         }
3270 3583
 
3584
+                        var selectOverride;
3585
+                        if (select) {
3586
+                            selectOverride = select;
3587
+                        }
3588
+
3589
+                        if (hasHeader(xhr, /HX-Reselect:/i)) {
3590
+                            selectOverride = xhr.getResponseHeader("HX-Reselect");
3591
+                        }
3592
+
3593
+                        // if we need to save history, do so, before swapping so that relative resources have the correct base URL
3594
+                        if (historyUpdate.type) {
3595
+                            triggerEvent(getDocument().body, 'htmx:beforeHistoryUpdate', mergeObjects({ history: historyUpdate }, responseInfo));
3596
+                            if (historyUpdate.type === "push") {
3597
+                                pushUrlIntoHistory(historyUpdate.path);
3598
+                                triggerEvent(getDocument().body, 'htmx:pushedIntoHistory', {path: historyUpdate.path});
3599
+                            } else {
3600
+                                replaceUrlInHistory(historyUpdate.path);
3601
+                                triggerEvent(getDocument().body, 'htmx:replacedInHistory', {path: historyUpdate.path});
3602
+                            }
3603
+                        }
3604
+
3271 3605
                         var settleInfo = makeSettleInfo(target);
3272
-                        selectAndSwap(swapSpec.swapStyle, target, elt, serverResponse, settleInfo);
3606
+                        selectAndSwap(swapSpec.swapStyle, target, elt, serverResponse, settleInfo, selectOverride);
3273 3607
 
3274 3608
                         if (selectionInfo.elt &&
3275 3609
                             !bodyContains(selectionInfo.elt) &&
3276
-                            selectionInfo.elt.id) {
3277
-                            var newActiveElt = document.getElementById(selectionInfo.elt.id);
3610
+                            getRawAttribute(selectionInfo.elt, "id")) {
3611
+                            var newActiveElt = document.getElementById(getRawAttribute(selectionInfo.elt, "id"));
3278 3612
                             var focusOptions = { preventScroll: swapSpec.focusScroll !== undefined ? !swapSpec.focusScroll : !htmx.config.defaultFocusScroll };
3279 3613
                             if (newActiveElt) {
3280 3614
                                 // @ts-ignore
... ...
@@ -3317,24 +3651,14 @@ return (function () {
3317 3651
                                 triggerEvent(elt, 'htmx:afterSettle', responseInfo);
3318 3652
                             });
3319 3653
 
3320
-                            // if we need to save history, do so
3321
-                            if (historyUpdate.type) {
3322
-                                if (historyUpdate.type === "push") {
3323
-                                    pushUrlIntoHistory(historyUpdate.path);
3324
-                                    triggerEvent(getDocument().body, 'htmx:pushedIntoHistory', {path: historyUpdate.path});
3325
-                                } else {
3326
-                                    replaceUrlInHistory(historyUpdate.path);
3327
-                                    triggerEvent(getDocument().body, 'htmx:replacedInHistory', {path: historyUpdate.path});
3328
-                                }
3329
-                            }
3330 3654
                             if (responseInfo.pathInfo.anchor) {
3331
-                                var anchorTarget = find("#" + responseInfo.pathInfo.anchor);
3655
+                                var anchorTarget = getDocument().getElementById(responseInfo.pathInfo.anchor);
3332 3656
                                 if(anchorTarget) {
3333 3657
                                     anchorTarget.scrollIntoView({block:'start', behavior: "auto"});
3334 3658
                                 }
3335 3659
                             }
3336 3660
 
3337
-                            if(settleInfo.title) {
3661
+                            if(settleInfo.title && !ignoreTitle) {
3338 3662
                                 var titleElt = find("title");
3339 3663
                                 if(titleElt) {
3340 3664
                                     titleElt.innerHTML = settleInfo.title;
... ...
@@ -3485,9 +3809,22 @@ return (function () {
3485 3809
         //====================================================================
3486 3810
         // Initialization
3487 3811
         //====================================================================
3812
+        var isReady = false
3813
+        getDocument().addEventListener('DOMContentLoaded', function() {
3814
+            isReady = true
3815
+        })
3488 3816
 
3817
+        /**
3818
+         * Execute a function now if DOMContentLoaded has fired, otherwise listen for it.
3819
+         *
3820
+         * This function uses isReady because there is no realiable way to ask the browswer whether
3821
+         * the DOMContentLoaded event has already been fired; there's a gap between DOMContentLoaded
3822
+         * firing and readystate=complete.
3823
+         */
3489 3824
         function ready(fn) {
3490
-            if (getDocument().readyState !== 'loading') {
3825
+            // Checking readyState here is a failsafe in case the htmx script tag entered the DOM by
3826
+            // some means other than the initial page load.
3827
+            if (isReady || getDocument().readyState === 'complete') {
3491 3828
                 fn();
3492 3829
             } else {
3493 3830
                 getDocument().addEventListener('DOMContentLoaded', fn);
... ...
@@ -3498,9 +3835,9 @@ return (function () {
3498 3835
             if (htmx.config.includeIndicatorStyles !== false) {
3499 3836
                 getDocument().head.insertAdjacentHTML("beforeend",
3500 3837
                     "<style>\
3501
-                      ." + htmx.config.indicatorClass + "{opacity:0;transition: opacity 200ms ease-in;}\
3502
-                      ." + htmx.config.requestClass + " ." + htmx.config.indicatorClass + "{opacity:1}\
3503
-                      ." + htmx.config.requestClass + "." + htmx.config.indicatorClass + "{opacity:1}\
3838
+                      ." + htmx.config.indicatorClass + "{opacity:0}\
3839
+                      ." + htmx.config.requestClass + " ." + htmx.config.indicatorClass + "{opacity:1; transition: opacity 200ms ease-in;}\
3840
+                      ." + htmx.config.requestClass + "." + htmx.config.indicatorClass + "{opacity:1; transition: opacity 200ms ease-in;}\
3504 3841
                     </style>");
3505 3842
             }
3506 3843
         }
... ...
@@ -3538,7 +3875,9 @@ return (function () {
3538 3875
                     internalData.xhr.abort();
3539 3876
                 }
3540 3877
             });
3541
-            var originalPopstate = window.onpopstate;
3878
+            /** @type {(ev: PopStateEvent) => any} */
3879
+            const originalPopstate = window.onpopstate ? window.onpopstate.bind(window) : null;
3880
+            /** @type {(ev: PopStateEvent) => any} */
3542 3881
             window.onpopstate = function (event) {
3543 3882
                 if (event.state && event.state.htmx) {
3544 3883
                     restoreHistory();
... ...
@@ -1 +1 @@
1
-(function(e,t){if(typeof define==="function"&&define.amd){define([],t)}else if(typeof module==="object"&&module.exports){module.exports=t()}else{e.htmx=e.htmx||t()}})(typeof self!=="undefined"?self:this,function(){return function(){"use strict";var z={onLoad:t,process:Tt,on:le,off:ue,trigger:ie,ajax:dr,find:b,findAll:f,closest:d,values:function(e,t){var r=Jt(e,t||"post");return r.values},remove:B,addClass:j,removeClass:n,toggleClass:U,takeClass:V,defineExtension:yr,removeExtension:br,logAll:F,logger:null,config:{historyEnabled:true,historyCacheSize:10,refreshOnHistoryMiss:false,defaultSwapStyle:"innerHTML",defaultSwapDelay:0,defaultSettleDelay:20,includeIndicatorStyles:true,indicatorClass:"htmx-indicator",requestClass:"htmx-request",addedClass:"htmx-added",settlingClass:"htmx-settling",swappingClass:"htmx-swapping",allowEval:true,inlineScriptNonce:"",attributesToSettle:["class","style","width","height"],withCredentials:false,timeout:0,wsReconnectDelay:"full-jitter",wsBinaryType:"blob",disableSelector:"[hx-disable], [data-hx-disable]",useTemplateFragments:false,scrollBehavior:"smooth",defaultFocusScroll:false,getCacheBusterParam:false,globalViewTransitions:false},parseInterval:v,_:e,createEventSource:function(e){return new EventSource(e,{withCredentials:true})},createWebSocket:function(e){var t=new WebSocket(e,[]);t.binaryType=z.config.wsBinaryType;return t},version:"1.9.2"};var C={addTriggerHandler:xt,bodyContains:ee,canAccessLocalStorage:D,filterValues:er,hasAttribute:q,getAttributeValue:G,getClosestMatch:c,getExpressionVars:fr,getHeaders:Qt,getInputValues:Jt,getInternalData:Y,getSwapSpecification:rr,getTriggerSpecs:ze,getTarget:de,makeFragment:l,mergeObjects:te,makeSettleInfo:S,oobSwap:me,selectAndSwap:Me,settleImmediately:Bt,shouldCancel:Ke,triggerEvent:ie,triggerErrorEvent:ne,withExtensions:w};var R=["get","post","put","delete","patch"];var O=R.map(function(e){return"[hx-"+e+"], [data-hx-"+e+"]"}).join(", ");function v(e){if(e==undefined){return undefined}if(e.slice(-2)=="ms"){return parseFloat(e.slice(0,-2))||undefined}if(e.slice(-1)=="s"){return parseFloat(e.slice(0,-1))*1e3||undefined}if(e.slice(-1)=="m"){return parseFloat(e.slice(0,-1))*1e3*60||undefined}return parseFloat(e)||undefined}function $(e,t){return e.getAttribute&&e.getAttribute(t)}function q(e,t){return e.hasAttribute&&(e.hasAttribute(t)||e.hasAttribute("data-"+t))}function G(e,t){return $(e,t)||$(e,"data-"+t)}function u(e){return e.parentElement}function J(){return document}function c(e,t){while(e&&!t(e)){e=u(e)}return e?e:null}function T(e,t,r){var n=G(t,r);var i=G(t,"hx-disinherit");if(e!==t&&i&&(i==="*"||i.split(" ").indexOf(r)>=0)){return"unset"}else{return n}}function Z(t,r){var n=null;c(t,function(e){return n=T(t,e,r)});if(n!=="unset"){return n}}function h(e,t){var r=e.matches||e.matchesSelector||e.msMatchesSelector||e.mozMatchesSelector||e.webkitMatchesSelector||e.oMatchesSelector;return r&&r.call(e,t)}function H(e){var t=/<([a-z][^\/\0>\x20\t\r\n\f]*)/i;var r=t.exec(e);if(r){return r[1].toLowerCase()}else{return""}}function i(e,t){var r=new DOMParser;var n=r.parseFromString(e,"text/html");var i=n.body;while(t>0){t--;i=i.firstChild}if(i==null){i=J().createDocumentFragment()}return i}function L(e){return e.match(/<body/)}function l(e){var t=!L(e);if(z.config.useTemplateFragments&&t){var r=i("<body><template>"+e+"</template></body>",0);return r.querySelector("template").content}else{var n=H(e);switch(n){case"thead":case"tbody":case"tfoot":case"colgroup":case"caption":return i("<table>"+e+"</table>",1);case"col":return i("<table><colgroup>"+e+"</colgroup></table>",2);case"tr":return i("<table><tbody>"+e+"</tbody></table>",2);case"td":case"th":return i("<table><tbody><tr>"+e+"</tr></tbody></table>",3);case"script":return i("<div>"+e+"</div>",1);default:return i(e,0)}}}function K(e){if(e){e()}}function A(e,t){return Object.prototype.toString.call(e)==="[object "+t+"]"}function N(e){return A(e,"Function")}function I(e){return A(e,"Object")}function Y(e){var t="htmx-internal-data";var r=e[t];if(!r){r=e[t]={}}return r}function k(e){var t=[];if(e){for(var r=0;r<e.length;r++){t.push(e[r])}}return t}function Q(e,t){if(e){for(var r=0;r<e.length;r++){t(e[r])}}}function P(e){var t=e.getBoundingClientRect();var r=t.top;var n=t.bottom;return r<window.innerHeight&&n>=0}function ee(e){if(e.getRootNode&&e.getRootNode()instanceof ShadowRoot){return J().body.contains(e.getRootNode().host)}else{return J().body.contains(e)}}function M(e){return e.trim().split(/\s+/)}function te(e,t){for(var r in t){if(t.hasOwnProperty(r)){e[r]=t[r]}}return e}function y(e){try{return JSON.parse(e)}catch(e){x(e);return null}}function D(){var e="htmx:localStorageTest";try{localStorage.setItem(e,e);localStorage.removeItem(e);return true}catch(e){return false}}function X(t){try{var e=new URL(t);if(e){t=e.pathname+e.search}if(!t.match("^/$")){t=t.replace(/\/+$/,"")}return t}catch(e){return t}}function e(e){return sr(J().body,function(){return eval(e)})}function t(t){var e=z.on("htmx:load",function(e){t(e.detail.elt)});return e}function F(){z.logger=function(e,t,r){if(console){console.log(t,e,r)}}}function b(e,t){if(t){return e.querySelector(t)}else{return b(J(),e)}}function f(e,t){if(t){return e.querySelectorAll(t)}else{return f(J(),e)}}function B(e,t){e=s(e);if(t){setTimeout(function(){B(e);e=null},t)}else{e.parentElement.removeChild(e)}}function j(e,t,r){e=s(e);if(r){setTimeout(function(){j(e,t);e=null},r)}else{e.classList&&e.classList.add(t)}}function n(e,t,r){e=s(e);if(r){setTimeout(function(){n(e,t);e=null},r)}else{if(e.classList){e.classList.remove(t);if(e.classList.length===0){e.removeAttribute("class")}}}}function U(e,t){e=s(e);e.classList.toggle(t)}function V(e,t){e=s(e);Q(e.parentElement.children,function(e){n(e,t)});j(e,t)}function d(e,t){e=s(e);if(e.closest){return e.closest(t)}else{do{if(e==null||h(e,t)){return e}}while(e=e&&u(e));return null}}function r(e){var t=e.trim();if(t.startsWith("<")&&t.endsWith("/>")){return t.substring(1,t.length-2)}else{return t}}function _(e,t){if(t.indexOf("closest ")===0){return[d(e,r(t.substr(8)))]}else if(t.indexOf("find ")===0){return[b(e,r(t.substr(5)))]}else if(t.indexOf("next ")===0){return[W(e,r(t.substr(5)))]}else if(t.indexOf("previous ")===0){return[oe(e,r(t.substr(9)))]}else if(t==="document"){return[document]}else if(t==="window"){return[window]}else{return J().querySelectorAll(r(t))}}var W=function(e,t){var r=J().querySelectorAll(t);for(var n=0;n<r.length;n++){var i=r[n];if(i.compareDocumentPosition(e)===Node.DOCUMENT_POSITION_PRECEDING){return i}}};var oe=function(e,t){var r=J().querySelectorAll(t);for(var n=r.length-1;n>=0;n--){var i=r[n];if(i.compareDocumentPosition(e)===Node.DOCUMENT_POSITION_FOLLOWING){return i}}};function re(e,t){if(t){return _(e,t)[0]}else{return _(J().body,e)[0]}}function s(e){if(A(e,"String")){return b(e)}else{return e}}function se(e,t,r){if(N(t)){return{target:J().body,event:e,listener:t}}else{return{target:s(e),event:t,listener:r}}}function le(t,r,n){Sr(function(){var e=se(t,r,n);e.target.addEventListener(e.event,e.listener)});var e=N(r);return e?r:n}function ue(t,r,n){Sr(function(){var e=se(t,r,n);e.target.removeEventListener(e.event,e.listener)});return N(r)?r:n}var fe=J().createElement("output");function ce(e,t){var r=Z(e,t);if(r){if(r==="this"){return[he(e,t)]}else{var n=_(e,r);if(n.length===0){x('The selector "'+r+'" on '+t+" returned no matches!");return[fe]}else{return n}}}}function he(e,t){return c(e,function(e){return G(e,t)!=null})}function de(e){var t=Z(e,"hx-target");if(t){if(t==="this"){return he(e,"hx-target")}else{return re(e,t)}}else{var r=Y(e);if(r.boosted){return J().body}else{return e}}}function ve(e){var t=z.config.attributesToSettle;for(var r=0;r<t.length;r++){if(e===t[r]){return true}}return false}function ge(t,r){Q(t.attributes,function(e){if(!r.hasAttribute(e.name)&&ve(e.name)){t.removeAttribute(e.name)}});Q(r.attributes,function(e){if(ve(e.name)){t.setAttribute(e.name,e.value)}})}function pe(e,t){var r=wr(t);for(var n=0;n<r.length;n++){var i=r[n];try{if(i.isInlineSwap(e)){return true}}catch(e){x(e)}}return e==="outerHTML"}function me(e,i,a){var t="#"+i.id;var o="outerHTML";if(e==="true"){}else if(e.indexOf(":")>0){o=e.substr(0,e.indexOf(":"));t=e.substr(e.indexOf(":")+1,e.length)}else{o=e}var r=J().querySelectorAll(t);if(r){Q(r,function(e){var t;var r=i.cloneNode(true);t=J().createDocumentFragment();t.appendChild(r);if(!pe(o,e)){t=r}var n={shouldSwap:true,target:e,fragment:t};if(!ie(e,"htmx:oobBeforeSwap",n))return;e=n.target;if(n["shouldSwap"]){ke(o,e,e,t,a)}Q(a.elts,function(e){ie(e,"htmx:oobAfterSwap",n)})});i.parentNode.removeChild(i)}else{i.parentNode.removeChild(i);ne(J().body,"htmx:oobErrorNoTarget",{content:i})}return e}function xe(e,t,r){var n=Z(e,"hx-select-oob");if(n){var i=n.split(",");for(let e=0;e<i.length;e++){var a=i[e].split(":",2);var o=a[0].trim();if(o.indexOf("#")===0){o=o.substring(1)}var s=a[1]||"true";var l=t.querySelector("#"+o);if(l){me(s,l,r)}}}Q(f(t,"[hx-swap-oob], [data-hx-swap-oob]"),function(e){var t=G(e,"hx-swap-oob");if(t!=null){me(t,e,r)}})}function ye(e){Q(f(e,"[hx-preserve], [data-hx-preserve]"),function(e){var t=G(e,"id");var r=J().getElementById(t);if(r!=null){e.parentNode.replaceChild(r,e)}})}function be(a,e,o){Q(e.querySelectorAll("[id]"),function(e){if(e.id&&e.id.length>0){var t=e.id.replace("'","\\'");var r=e.tagName.replace(":","\\:");var n=a.querySelector(r+"[id='"+t+"']");if(n&&n!==a){var i=e.cloneNode();ge(e,n);o.tasks.push(function(){ge(e,i)})}}})}function we(e){return function(){n(e,z.config.addedClass);Tt(e);bt(e);Se(e);ie(e,"htmx:load")}}function Se(e){var t="[autofocus]";var r=h(e,t)?e:e.querySelector(t);if(r!=null){r.focus()}}function a(e,t,r,n){be(e,r,n);while(r.childNodes.length>0){var i=r.firstChild;j(i,z.config.addedClass);e.insertBefore(i,t);if(i.nodeType!==Node.TEXT_NODE&&i.nodeType!==Node.COMMENT_NODE){n.tasks.push(we(i))}}}function Ee(e,t){var r=0;while(r<e.length){t=(t<<5)-t+e.charCodeAt(r++)|0}return t}function Ce(e){var t=0;if(e.attributes){for(var r=0;r<e.attributes.length;r++){var n=e.attributes[r];if(n.value){t=Ee(n.name,t);t=Ee(n.value,t)}}}return t}function Re(t){var r=Y(t);if(r.timeout){clearTimeout(r.timeout)}if(r.webSocket){r.webSocket.close()}if(r.sseEventSource){r.sseEventSource.close()}if(r.listenerInfos){Q(r.listenerInfos,function(e){if(e.on){e.on.removeEventListener(e.trigger,e.listener)}})}if(r.onHandlers){for(let e=0;e<r.onHandlers.length;e++){const n=r.onHandlers[e];t.removeEventListener(n.name,n.handler)}}}function o(e){ie(e,"htmx:beforeCleanupElement");Re(e);if(e.children){Q(e.children,function(e){o(e)})}}function Oe(e,t,r){if(e.tagName==="BODY"){return Ne(e,t,r)}else{var n;var i=e.previousSibling;a(u(e),e,t,r);if(i==null){n=u(e).firstChild}else{n=i.nextSibling}Y(e).replacedWith=n;r.elts=[];while(n&&n!==e){if(n.nodeType===Node.ELEMENT_NODE){r.elts.push(n)}n=n.nextElementSibling}o(e);u(e).removeChild(e)}}function qe(e,t,r){return a(e,e.firstChild,t,r)}function Te(e,t,r){return a(u(e),e,t,r)}function He(e,t,r){return a(e,null,t,r)}function Le(e,t,r){return a(u(e),e.nextSibling,t,r)}function Ae(e,t,r){o(e);return u(e).removeChild(e)}function Ne(e,t,r){var n=e.firstChild;a(e,n,t,r);if(n){while(n.nextSibling){o(n.nextSibling);e.removeChild(n.nextSibling)}o(n);e.removeChild(n)}}function Ie(e,t){var r=Z(e,"hx-select");if(r){var n=J().createDocumentFragment();Q(t.querySelectorAll(r),function(e){n.appendChild(e)});t=n}return t}function ke(e,t,r,n,i){switch(e){case"none":return;case"outerHTML":Oe(r,n,i);return;case"afterbegin":qe(r,n,i);return;case"beforebegin":Te(r,n,i);return;case"beforeend":He(r,n,i);return;case"afterend":Le(r,n,i);return;case"delete":Ae(r,n,i);return;default:var a=wr(t);for(var o=0;o<a.length;o++){var s=a[o];try{var l=s.handleSwap(e,r,n,i);if(l){if(typeof l.length!=="undefined"){for(var u=0;u<l.length;u++){var f=l[u];if(f.nodeType!==Node.TEXT_NODE&&f.nodeType!==Node.COMMENT_NODE){i.tasks.push(we(f))}}}return}}catch(e){x(e)}}if(e==="innerHTML"){Ne(r,n,i)}else{ke(z.config.defaultSwapStyle,t,r,n,i)}}}function Pe(e){if(e.indexOf("<title")>-1){var t=e.replace(/<svg(\s[^>]*>|>)([\s\S]*?)<\/svg>/gim,"");var r=t.match(/<title(\s[^>]*>|>)([\s\S]*?)<\/title>/im);if(r){return r[2]}}}function Me(e,t,r,n,i){i.title=Pe(n);var a=l(n);if(a){xe(r,a,i);a=Ie(r,a);ye(a);return ke(e,r,t,a,i)}}function De(e,t,r){var n=e.getResponseHeader(t);if(n.indexOf("{")===0){var i=y(n);for(var a in i){if(i.hasOwnProperty(a)){var o=i[a];if(!I(o)){o={value:o}}ie(r,a,o)}}}else{ie(r,n,[])}}var Xe=/\s/;var g=/[\s,]/;var Fe=/[_$a-zA-Z]/;var Be=/[_$a-zA-Z0-9]/;var je=['"',"'","/"];var p=/[^\s]/;function Ue(e){var t=[];var r=0;while(r<e.length){if(Fe.exec(e.charAt(r))){var n=r;while(Be.exec(e.charAt(r+1))){r++}t.push(e.substr(n,r-n+1))}else if(je.indexOf(e.charAt(r))!==-1){var i=e.charAt(r);var n=r;r++;while(r<e.length&&e.charAt(r)!==i){if(e.charAt(r)==="\\"){r++}r++}t.push(e.substr(n,r-n+1))}else{var a=e.charAt(r);t.push(a)}r++}return t}function Ve(e,t,r){return Fe.exec(e.charAt(0))&&e!=="true"&&e!=="false"&&e!=="this"&&e!==r&&t!=="."}function _e(e,t,r){if(t[0]==="["){t.shift();var n=1;var i=" return (function("+r+"){ return (";var a=null;while(t.length>0){var o=t[0];if(o==="]"){n--;if(n===0){if(a===null){i=i+"true"}t.shift();i+=")})";try{var s=sr(e,function(){return Function(i)()},function(){return true});s.source=i;return s}catch(e){ne(J().body,"htmx:syntax:error",{error:e,source:i});return null}}}else if(o==="["){n++}if(Ve(o,a,r)){i+="(("+r+"."+o+") ? ("+r+"."+o+") : (window."+o+"))"}else{i=i+o}a=t.shift()}}}function m(e,t){var r="";while(e.length>0&&!e[0].match(t)){r+=e.shift()}return r}var We="input, textarea, select";function ze(e){var t=G(e,"hx-trigger");var r=[];if(t){var n=Ue(t);do{m(n,p);var i=n.length;var a=m(n,/[,\[\s]/);if(a!==""){if(a==="every"){var o={trigger:"every"};m(n,p);o.pollInterval=v(m(n,/[,\[\s]/));m(n,p);var s=_e(e,n,"event");if(s){o.eventFilter=s}r.push(o)}else if(a.indexOf("sse:")===0){r.push({trigger:"sse",sseEvent:a.substr(4)})}else{var l={trigger:a};var s=_e(e,n,"event");if(s){l.eventFilter=s}while(n.length>0&&n[0]!==","){m(n,p);var u=n.shift();if(u==="changed"){l.changed=true}else if(u==="once"){l.once=true}else if(u==="consume"){l.consume=true}else if(u==="delay"&&n[0]===":"){n.shift();l.delay=v(m(n,g))}else if(u==="from"&&n[0]===":"){n.shift();var f=m(n,g);if(f==="closest"||f==="find"||f==="next"||f==="previous"){n.shift();f+=" "+m(n,g)}l.from=f}else if(u==="target"&&n[0]===":"){n.shift();l.target=m(n,g)}else if(u==="throttle"&&n[0]===":"){n.shift();l.throttle=v(m(n,g))}else if(u==="queue"&&n[0]===":"){n.shift();l.queue=m(n,g)}else if((u==="root"||u==="threshold")&&n[0]===":"){n.shift();l[u]=m(n,g)}else{ne(e,"htmx:syntax:error",{token:n.shift()})}}r.push(l)}}if(n.length===i){ne(e,"htmx:syntax:error",{token:n.shift()})}m(n,p)}while(n[0]===","&&n.shift())}if(r.length>0){return r}else if(h(e,"form")){return[{trigger:"submit"}]}else if(h(e,'input[type="button"]')){return[{trigger:"click"}]}else if(h(e,We)){return[{trigger:"change"}]}else{return[{trigger:"click"}]}}function $e(e){Y(e).cancelled=true}function Ge(e,t,r){var n=Y(e);n.timeout=setTimeout(function(){if(ee(e)&&n.cancelled!==true){if(!Qe(r,Lt("hx:poll:trigger",{triggerSpec:r,target:e}))){t(e)}Ge(e,t,r)}},r.pollInterval)}function Je(e){return location.hostname===e.hostname&&$(e,"href")&&$(e,"href").indexOf("#")!==0}function Ze(t,r,e){if(t.tagName==="A"&&Je(t)&&(t.target===""||t.target==="_self")||t.tagName==="FORM"){r.boosted=true;var n,i;if(t.tagName==="A"){n="get";i=t.href}else{var a=$(t,"method");n=a?a.toLowerCase():"get";if(n==="get"){}i=$(t,"action")}e.forEach(function(e){et(t,function(e,t){ae(n,i,e,t)},r,e,true)})}}function Ke(e,t){if(e.type==="submit"||e.type==="click"){if(t.tagName==="FORM"){return true}if(h(t,'input[type="submit"], button')&&d(t,"form")!==null){return true}if(t.tagName==="A"&&t.href&&(t.getAttribute("href")==="#"||t.getAttribute("href").indexOf("#")!==0)){return true}}return false}function Ye(e,t){return Y(e).boosted&&e.tagName==="A"&&t.type==="click"&&(t.ctrlKey||t.metaKey)}function Qe(e,t){var r=e.eventFilter;if(r){try{return r(t)!==true}catch(e){ne(J().body,"htmx:eventFilter:error",{error:e,source:r.source});return true}}return false}function et(i,a,e,o,s){var l=Y(i);var t;if(o.from){t=_(i,o.from)}else{t=[i]}if(o.changed){l.lastValue=i.value}Q(t,function(r){var n=function(e){if(!ee(i)){r.removeEventListener(o.trigger,n);return}if(Ye(i,e)){return}if(s||Ke(e,i)){e.preventDefault()}if(Qe(o,e)){return}var t=Y(e);t.triggerSpec=o;if(t.handledFor==null){t.handledFor=[]}if(t.handledFor.indexOf(i)<0){t.handledFor.push(i);if(o.consume){e.stopPropagation()}if(o.target&&e.target){if(!h(e.target,o.target)){return}}if(o.once){if(l.triggeredOnce){return}else{l.triggeredOnce=true}}if(o.changed){if(l.lastValue===i.value){return}else{l.lastValue=i.value}}if(l.delayed){clearTimeout(l.delayed)}if(l.throttle){return}if(o.throttle){if(!l.throttle){a(i,e);l.throttle=setTimeout(function(){l.throttle=null},o.throttle)}}else if(o.delay){l.delayed=setTimeout(function(){a(i,e)},o.delay)}else{ie(i,"htmx:trigger");a(i,e)}}};if(e.listenerInfos==null){e.listenerInfos=[]}e.listenerInfos.push({trigger:o.trigger,listener:n,on:r});r.addEventListener(o.trigger,n)})}var tt=false;var rt=null;function nt(){if(!rt){rt=function(){tt=true};window.addEventListener("scroll",rt);setInterval(function(){if(tt){tt=false;Q(J().querySelectorAll("[hx-trigger='revealed'],[data-hx-trigger='revealed']"),function(e){it(e)})}},200)}}function it(t){if(!q(t,"data-hx-revealed")&&P(t)){t.setAttribute("data-hx-revealed","true");var e=Y(t);if(e.initHash){ie(t,"revealed")}else{t.addEventListener("htmx:afterProcessNode",function(e){ie(t,"revealed")},{once:true})}}}function at(e,t,r){var n=M(r);for(var i=0;i<n.length;i++){var a=n[i].split(/:(.+)/);if(a[0]==="connect"){ot(e,a[1],0)}if(a[0]==="send"){lt(e)}}}function ot(s,r,n){if(!ee(s)){return}if(r.indexOf("/")==0){var e=location.hostname+(location.port?":"+location.port:"");if(location.protocol=="https:"){r="wss://"+e+r}else if(location.protocol=="http:"){r="ws://"+e+r}}var t=z.createWebSocket(r);t.onerror=function(e){ne(s,"htmx:wsError",{error:e,socket:t});st(s)};t.onclose=function(e){if([1006,1012,1013].indexOf(e.code)>=0){var t=ut(n);setTimeout(function(){ot(s,r,n+1)},t)}};t.onopen=function(e){n=0};Y(s).webSocket=t;t.addEventListener("message",function(e){if(st(s)){return}var t=e.data;w(s,function(e){t=e.transformResponse(t,null,s)});var r=S(s);var n=l(t);var i=k(n.children);for(var a=0;a<i.length;a++){var o=i[a];me(G(o,"hx-swap-oob")||"true",o,r)}Bt(r.tasks)})}function st(e){if(!ee(e)){Y(e).webSocket.close();return true}}function lt(u){var f=c(u,function(e){return Y(e).webSocket!=null});if(f){u.addEventListener(ze(u)[0].trigger,function(e){var t=Y(f).webSocket;var r=Qt(u,f);var n=Jt(u,"post");var i=n.errors;var a=n.values;var o=fr(u);var s=te(a,o);var l=er(s,u);l["HEADERS"]=r;if(i&&i.length>0){ie(u,"htmx:validation:halted",i);return}t.send(JSON.stringify(l));if(Ke(e,u)){e.preventDefault()}})}else{ne(u,"htmx:noWebSocketSourceError")}}function ut(e){var t=z.config.wsReconnectDelay;if(typeof t==="function"){return t(e)}if(t==="full-jitter"){var r=Math.min(e,6);var n=1e3*Math.pow(2,r);return n*Math.random()}x('htmx.config.wsReconnectDelay must either be a function or the string "full-jitter"')}function ft(e,t,r){var n=M(r);for(var i=0;i<n.length;i++){var a=n[i].split(/:(.+)/);if(a[0]==="connect"){ct(e,a[1])}if(a[0]==="swap"){ht(e,a[1])}}}function ct(t,e){var r=z.createEventSource(e);r.onerror=function(e){ne(t,"htmx:sseError",{error:e,source:r});vt(t)};Y(t).sseEventSource=r}function ht(a,o){var s=c(a,gt);if(s){var l=Y(s).sseEventSource;var u=function(e){if(vt(s)){l.removeEventListener(o,u);return}var t=e.data;w(a,function(e){t=e.transformResponse(t,null,a)});var r=rr(a);var n=de(a);var i=S(a);Me(r.swapStyle,a,n,t,i);Bt(i.tasks);ie(a,"htmx:sseMessage",e)};Y(a).sseListener=u;l.addEventListener(o,u)}else{ne(a,"htmx:noSSESourceError")}}function dt(e,t,r){var n=c(e,gt);if(n){var i=Y(n).sseEventSource;var a=function(){if(!vt(n)){if(ee(e)){t(e)}else{i.removeEventListener(r,a)}}};Y(e).sseListener=a;i.addEventListener(r,a)}else{ne(e,"htmx:noSSESourceError")}}function vt(e){if(!ee(e)){Y(e).sseEventSource.close();return true}}function gt(e){return Y(e).sseEventSource!=null}function pt(e,t,r,n){var i=function(){if(!r.loaded){r.loaded=true;t(e)}};if(n){setTimeout(i,n)}else{i()}}function mt(t,i,e){var a=false;Q(R,function(r){if(q(t,"hx-"+r)){var n=G(t,"hx-"+r);a=true;i.path=n;i.verb=r;e.forEach(function(e){xt(t,e,i,function(e,t){ae(r,n,e,t)})})}});return a}function xt(n,e,t,r){if(e.sseEvent){dt(n,r,e.sseEvent)}else if(e.trigger==="revealed"){nt();et(n,r,t,e);it(n)}else if(e.trigger==="intersect"){var i={};if(e.root){i.root=re(n,e.root)}if(e.threshold){i.threshold=parseFloat(e.threshold)}var a=new IntersectionObserver(function(e){for(var t=0;t<e.length;t++){var r=e[t];if(r.isIntersecting){ie(n,"intersect");break}}},i);a.observe(n);et(n,r,t,e)}else if(e.trigger==="load"){if(!Qe(e,Lt("load",{elt:n}))){pt(n,r,t,e.delay)}}else if(e.pollInterval){t.polling=true;Ge(n,r,e)}else{et(n,r,t,e)}}function yt(e){if(e.type==="text/javascript"||e.type==="module"||e.type===""){var t=J().createElement("script");Q(e.attributes,function(e){t.setAttribute(e.name,e.value)});t.textContent=e.textContent;t.async=false;if(z.config.inlineScriptNonce){t.nonce=z.config.inlineScriptNonce}var r=e.parentElement;try{r.insertBefore(t,e)}catch(e){x(e)}finally{if(e.parentElement){e.parentElement.removeChild(e)}}}}function bt(e){if(h(e,"script")){yt(e)}Q(f(e,"script"),function(e){yt(e)})}function wt(){return document.querySelector("[hx-boost], [data-hx-boost]")}function St(e){if(e.querySelectorAll){var t=wt()?", a, form":"";var r=e.querySelectorAll(O+t+", [hx-sse], [data-hx-sse], [hx-ws],"+" [data-hx-ws], [hx-ext], [data-hx-ext], [hx-trigger], [data-hx-trigger], [hx-on], [data-hx-on]");return r}else{return[]}}function Et(n){var e=function(e){var t=d(e.target,"button, input[type='submit']");if(t!==null){var r=Y(n);r.lastButtonClicked=t}};n.addEventListener("click",e);n.addEventListener("focusin",e);n.addEventListener("focusout",function(e){var t=Y(n);t.lastButtonClicked=null})}function Ct(e){var t=Ue(e);var r=0;for(let e=0;e<t.length;e++){const n=t[e];if(n==="{"){r++}else if(n==="}"){r--}}return r}function Rt(t,e,r){var n=Y(t);n.onHandlers=[];var i=new Function("event",r+"; return;");var a=t.addEventListener(e,function(e){return i.call(t,e)});n.onHandlers.push({event:e,listener:a});return{nodeData:n,code:r,func:i,listener:a}}function Ot(e){var t=G(e,"hx-on");if(t){var r={};var n=t.split("\n");var i=null;var a=0;while(n.length>0){var o=n.shift();var s=o.match(/^\s*([a-zA-Z:\-]+:)(.*)/);if(a===0&&s){o.split(":");i=s[1].slice(0,-1);r[i]=s[2]}else{r[i]+=o}a+=Ct(o)}for(var l in r){Rt(e,l,r[l])}}}function qt(t){if(t.closest&&t.closest(z.config.disableSelector)){return}var r=Y(t);if(r.initHash!==Ce(t)){r.initHash=Ce(t);Re(t);Ot(t);ie(t,"htmx:beforeProcessNode");if(t.value){r.lastValue=t.value}var e=ze(t);var n=mt(t,r,e);if(!n){if(Z(t,"hx-boost")==="true"){Ze(t,r,e)}else if(q(t,"hx-trigger")){e.forEach(function(e){xt(t,e,r,function(){})})}}if(t.tagName==="FORM"){Et(t)}var i=G(t,"hx-sse");if(i){ft(t,r,i)}var a=G(t,"hx-ws");if(a){at(t,r,a)}ie(t,"htmx:afterProcessNode")}}function Tt(e){e=s(e);qt(e);Q(St(e),function(e){qt(e)})}function Ht(e){return e.replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase()}function Lt(e,t){var r;if(window.CustomEvent&&typeof window.CustomEvent==="function"){r=new CustomEvent(e,{bubbles:true,cancelable:true,detail:t})}else{r=J().createEvent("CustomEvent");r.initCustomEvent(e,true,true,t)}return r}function ne(e,t,r){ie(e,t,te({error:t},r))}function At(e){return e==="htmx:afterProcessNode"}function w(e,t){Q(wr(e),function(e){try{t(e)}catch(e){x(e)}})}function x(e){if(console.error){console.error(e)}else if(console.log){console.log("ERROR: ",e)}}function ie(e,t,r){e=s(e);if(r==null){r={}}r["elt"]=e;var n=Lt(t,r);if(z.logger&&!At(t)){z.logger(e,t,r)}if(r.error){x(r.error);ie(e,"htmx:error",{errorInfo:r})}var i=e.dispatchEvent(n);var a=Ht(t);if(i&&a!==t){var o=Lt(a,n.detail);i=i&&e.dispatchEvent(o)}w(e,function(e){i=i&&e.onEvent(t,n)!==false});return i}var Nt=location.pathname+location.search;function It(){var e=J().querySelector("[hx-history-elt],[data-hx-history-elt]");return e||J().body}function kt(e,t,r,n){if(!D()){return}e=X(e);var i=y(localStorage.getItem("htmx-history-cache"))||[];for(var a=0;a<i.length;a++){if(i[a].url===e){i.splice(a,1);break}}var o={url:e,content:t,title:r,scroll:n};ie(J().body,"htmx:historyItemCreated",{item:o,cache:i});i.push(o);while(i.length>z.config.historyCacheSize){i.shift()}while(i.length>0){try{localStorage.setItem("htmx-history-cache",JSON.stringify(i));break}catch(e){ne(J().body,"htmx:historyCacheError",{cause:e,cache:i});i.shift()}}}function Pt(e){if(!D()){return null}e=X(e);var t=y(localStorage.getItem("htmx-history-cache"))||[];for(var r=0;r<t.length;r++){if(t[r].url===e){return t[r]}}return null}function Mt(e){var t=z.config.requestClass;var r=e.cloneNode(true);Q(f(r,"."+t),function(e){n(e,t)});return r.innerHTML}function Dt(){var e=It();var t=Nt||location.pathname+location.search;var r=J().querySelector('[hx-history="false" i],[data-hx-history="false" i]');if(!r){ie(J().body,"htmx:beforeHistorySave",{path:t,historyElt:e});kt(t,Mt(e),J().title,window.scrollY)}if(z.config.historyEnabled)history.replaceState({htmx:true},J().title,window.location.href)}function Xt(e){if(z.config.getCacheBusterParam){e=e.replace(/org\.htmx\.cache-buster=[^&]*&?/,"");if(e.endsWith("&")||e.endsWith("?")){e=e.slice(0,-1)}}if(z.config.historyEnabled){history.pushState({htmx:true},"",e)}Nt=e}function Ft(e){if(z.config.historyEnabled)history.replaceState({htmx:true},"",e);Nt=e}function Bt(e){Q(e,function(e){e.call()})}function jt(a){var e=new XMLHttpRequest;var o={path:a,xhr:e};ie(J().body,"htmx:historyCacheMiss",o);e.open("GET",a,true);e.setRequestHeader("HX-History-Restore-Request","true");e.onload=function(){if(this.status>=200&&this.status<400){ie(J().body,"htmx:historyCacheMissLoad",o);var e=l(this.response);e=e.querySelector("[hx-history-elt],[data-hx-history-elt]")||e;var t=It();var r=S(t);var n=Pe(this.response);if(n){var i=b("title");if(i){i.innerHTML=n}else{window.document.title=n}}Ne(t,e,r);Bt(r.tasks);Nt=a;ie(J().body,"htmx:historyRestore",{path:a,cacheMiss:true,serverResponse:this.response})}else{ne(J().body,"htmx:historyCacheMissLoadError",o)}};e.send()}function Ut(e){Dt();e=e||location.pathname+location.search;var t=Pt(e);if(t){var r=l(t.content);var n=It();var i=S(n);Ne(n,r,i);Bt(i.tasks);document.title=t.title;window.scrollTo(0,t.scroll);Nt=e;ie(J().body,"htmx:historyRestore",{path:e,item:t})}else{if(z.config.refreshOnHistoryMiss){window.location.reload(true)}else{jt(e)}}}function Vt(e){var t=ce(e,"hx-indicator");if(t==null){t=[e]}Q(t,function(e){var t=Y(e);t.requestCount=(t.requestCount||0)+1;e.classList["add"].call(e.classList,z.config.requestClass)});return t}function _t(e){Q(e,function(e){var t=Y(e);t.requestCount=(t.requestCount||0)-1;if(t.requestCount===0){e.classList["remove"].call(e.classList,z.config.requestClass)}})}function Wt(e,t){for(var r=0;r<e.length;r++){var n=e[r];if(n.isSameNode(t)){return true}}return false}function zt(e){if(e.name===""||e.name==null||e.disabled){return false}if(e.type==="button"||e.type==="submit"||e.tagName==="image"||e.tagName==="reset"||e.tagName==="file"){return false}if(e.type==="checkbox"||e.type==="radio"){return e.checked}return true}function $t(t,r,n,e,i){if(e==null||Wt(t,e)){return}else{t.push(e)}if(zt(e)){var a=$(e,"name");var o=e.value;if(e.multiple){o=k(e.querySelectorAll("option:checked")).map(function(e){return e.value})}if(e.files){o=k(e.files)}if(a!=null&&o!=null){var s=r[a];if(s!==undefined){if(Array.isArray(s)){if(Array.isArray(o)){r[a]=s.concat(o)}else{s.push(o)}}else{if(Array.isArray(o)){r[a]=[s].concat(o)}else{r[a]=[s,o]}}}else{r[a]=o}}if(i){Gt(e,n)}}if(h(e,"form")){var l=e.elements;Q(l,function(e){$t(t,r,n,e,i)})}}function Gt(e,t){if(e.willValidate){ie(e,"htmx:validation:validate");if(!e.checkValidity()){t.push({elt:e,message:e.validationMessage,validity:e.validity});ie(e,"htmx:validation:failed",{message:e.validationMessage,validity:e.validity})}}}function Jt(e,t){var r=[];var n={};var i={};var a=[];var o=Y(e);var s=h(e,"form")&&e.noValidate!==true||G(e,"hx-validate")==="true";if(o.lastButtonClicked){s=s&&o.lastButtonClicked.formNoValidate!==true}if(t!=="get"){$t(r,i,a,d(e,"form"),s)}$t(r,n,a,e,s);if(o.lastButtonClicked){var l=$(o.lastButtonClicked,"name");if(l){n[l]=o.lastButtonClicked.value}}var u=ce(e,"hx-include");Q(u,function(e){$t(r,n,a,e,s);if(!h(e,"form")){Q(e.querySelectorAll(We),function(e){$t(r,n,a,e,s)})}});n=te(n,i);return{errors:a,values:n}}function Zt(e,t,r){if(e!==""){e+="&"}if(String(r)==="[object Object]"){r=JSON.stringify(r)}var n=encodeURIComponent(r);e+=encodeURIComponent(t)+"="+n;return e}function Kt(e){var t="";for(var r in e){if(e.hasOwnProperty(r)){var n=e[r];if(Array.isArray(n)){Q(n,function(e){t=Zt(t,r,e)})}else{t=Zt(t,r,n)}}}return t}function Yt(e){var t=new FormData;for(var r in e){if(e.hasOwnProperty(r)){var n=e[r];if(Array.isArray(n)){Q(n,function(e){t.append(r,e)})}else{t.append(r,n)}}}return t}function Qt(e,t,r){var n={"HX-Request":"true","HX-Trigger":$(e,"id"),"HX-Trigger-Name":$(e,"name"),"HX-Target":G(t,"id"),"HX-Current-URL":J().location.href};or(e,"hx-headers",false,n);if(r!==undefined){n["HX-Prompt"]=r}if(Y(e).boosted){n["HX-Boosted"]="true"}return n}function er(t,e){var r=Z(e,"hx-params");if(r){if(r==="none"){return{}}else if(r==="*"){return t}else if(r.indexOf("not ")===0){Q(r.substr(4).split(","),function(e){e=e.trim();delete t[e]});return t}else{var n={};Q(r.split(","),function(e){e=e.trim();n[e]=t[e]});return n}}else{return t}}function tr(e){return $(e,"href")&&$(e,"href").indexOf("#")>=0}function rr(e,t){var r=t?t:Z(e,"hx-swap");var n={swapStyle:Y(e).boosted?"innerHTML":z.config.defaultSwapStyle,swapDelay:z.config.defaultSwapDelay,settleDelay:z.config.defaultSettleDelay};if(Y(e).boosted&&!tr(e)){n["show"]="top"}if(r){var i=M(r);if(i.length>0){n["swapStyle"]=i[0];for(var a=1;a<i.length;a++){var o=i[a];if(o.indexOf("swap:")===0){n["swapDelay"]=v(o.substr(5))}if(o.indexOf("settle:")===0){n["settleDelay"]=v(o.substr(7))}if(o.indexOf("transition:")===0){n["transition"]=o.substr(11)==="true"}if(o.indexOf("scroll:")===0){var s=o.substr(7);var l=s.split(":");var u=l.pop();var f=l.length>0?l.join(":"):null;n["scroll"]=u;n["scrollTarget"]=f}if(o.indexOf("show:")===0){var c=o.substr(5);var l=c.split(":");var h=l.pop();var f=l.length>0?l.join(":"):null;n["show"]=h;n["showTarget"]=f}if(o.indexOf("focus-scroll:")===0){var d=o.substr("focus-scroll:".length);n["focusScroll"]=d=="true"}}}}return n}function nr(e){return Z(e,"hx-encoding")==="multipart/form-data"||h(e,"form")&&$(e,"enctype")==="multipart/form-data"}function ir(t,r,n){var i=null;w(r,function(e){if(i==null){i=e.encodeParameters(t,n,r)}});if(i!=null){return i}else{if(nr(r)){return Yt(n)}else{return Kt(n)}}}function S(e){return{tasks:[],elts:[e]}}function ar(e,t){var r=e[0];var n=e[e.length-1];if(t.scroll){var i=null;if(t.scrollTarget){i=re(r,t.scrollTarget)}if(t.scroll==="top"&&(r||i)){i=i||r;i.scrollTop=0}if(t.scroll==="bottom"&&(n||i)){i=i||n;i.scrollTop=i.scrollHeight}}if(t.show){var i=null;if(t.showTarget){var a=t.showTarget;if(t.showTarget==="window"){a="body"}i=re(r,a)}if(t.show==="top"&&(r||i)){i=i||r;i.scrollIntoView({block:"start",behavior:z.config.scrollBehavior})}if(t.show==="bottom"&&(n||i)){i=i||n;i.scrollIntoView({block:"end",behavior:z.config.scrollBehavior})}}}function or(e,t,r,n){if(n==null){n={}}if(e==null){return n}var i=G(e,t);if(i){var a=i.trim();var o=r;if(a==="unset"){return null}if(a.indexOf("javascript:")===0){a=a.substr(11);o=true}else if(a.indexOf("js:")===0){a=a.substr(3);o=true}if(a.indexOf("{")!==0){a="{"+a+"}"}var s;if(o){s=sr(e,function(){return Function("return ("+a+")")()},{})}else{s=y(a)}for(var l in s){if(s.hasOwnProperty(l)){if(n[l]==null){n[l]=s[l]}}}}return or(u(e),t,r,n)}function sr(e,t,r){if(z.config.allowEval){return t()}else{ne(e,"htmx:evalDisallowedError");return r}}function lr(e,t){return or(e,"hx-vars",true,t)}function ur(e,t){return or(e,"hx-vals",false,t)}function fr(e){return te(lr(e),ur(e))}function cr(t,r,n){if(n!==null){try{t.setRequestHeader(r,n)}catch(e){t.setRequestHeader(r,encodeURIComponent(n));t.setRequestHeader(r+"-URI-AutoEncoded","true")}}}function hr(t){if(t.responseURL&&typeof URL!=="undefined"){try{var e=new URL(t.responseURL);return e.pathname+e.search}catch(e){ne(J().body,"htmx:badResponseUrl",{url:t.responseURL})}}}function E(e,t){return e.getAllResponseHeaders().match(t)}function dr(e,t,r){e=e.toLowerCase();if(r){if(r instanceof Element||A(r,"String")){return ae(e,t,null,null,{targetOverride:s(r),returnPromise:true})}else{return ae(e,t,s(r.source),r.event,{handler:r.handler,headers:r.headers,values:r.values,targetOverride:s(r.target),swapOverride:r.swap,returnPromise:true})}}else{return ae(e,t,null,null,{returnPromise:true})}}function vr(e){var t=[];while(e){t.push(e);e=e.parentElement}return t}function ae(e,t,n,r,i,M){var a=null;var o=null;i=i!=null?i:{};if(i.returnPromise&&typeof Promise!=="undefined"){var s=new Promise(function(e,t){a=e;o=t})}if(n==null){n=J().body}var D=i.handler||pr;if(!ee(n)){return}var l=i.targetOverride||de(n);if(l==null||l==fe){ne(n,"htmx:targetError",{target:G(n,"hx-target")});return}if(!M){var X=function(){return ae(e,t,n,r,i,true)};var F={target:l,elt:n,path:t,verb:e,triggeringEvent:r,etc:i,issueRequest:X};if(ie(n,"htmx:confirm",F)===false){return}}var u=n;var f=Y(n);var c=Z(n,"hx-sync");var h=null;var d=false;if(c){var v=c.split(":");var g=v[0].trim();if(g==="this"){u=he(n,"hx-sync")}else{u=re(n,g)}c=(v[1]||"drop").trim();f=Y(u);if(c==="drop"&&f.xhr&&f.abortable!==true){return}else if(c==="abort"){if(f.xhr){return}else{d=true}}else if(c==="replace"){ie(u,"htmx:abort")}else if(c.indexOf("queue")===0){var B=c.split(" ");h=(B[1]||"last").trim()}}if(f.xhr){if(f.abortable){ie(u,"htmx:abort")}else{if(h==null){if(r){var p=Y(r);if(p&&p.triggerSpec&&p.triggerSpec.queue){h=p.triggerSpec.queue}}if(h==null){h="last"}}if(f.queuedRequests==null){f.queuedRequests=[]}if(h==="first"&&f.queuedRequests.length===0){f.queuedRequests.push(function(){ae(e,t,n,r,i)})}else if(h==="all"){f.queuedRequests.push(function(){ae(e,t,n,r,i)})}else if(h==="last"){f.queuedRequests=[];f.queuedRequests.push(function(){ae(e,t,n,r,i)})}return}}var m=new XMLHttpRequest;f.xhr=m;f.abortable=d;var x=function(){f.xhr=null;f.abortable=false;if(f.queuedRequests!=null&&f.queuedRequests.length>0){var e=f.queuedRequests.shift();e()}};var y=Z(n,"hx-prompt");if(y){var b=prompt(y);if(b===null||!ie(n,"htmx:prompt",{prompt:b,target:l})){K(a);x();return s}}var w=Z(n,"hx-confirm");if(w){if(!confirm(w)){K(a);x();return s}}var S=Qt(n,l,b);if(i.headers){S=te(S,i.headers)}var E=Jt(n,e);var C=E.errors;var R=E.values;if(i.values){R=te(R,i.values)}var j=fr(n);var O=te(R,j);var q=er(O,n);if(e!=="get"&&!nr(n)){S["Content-Type"]="application/x-www-form-urlencoded"}if(z.config.getCacheBusterParam&&e==="get"){q["org.htmx.cache-buster"]=$(l,"id")||"true"}if(t==null||t===""){t=J().location.href}var T=or(n,"hx-request");var H=Y(n).boosted;var L={boosted:H,parameters:q,unfilteredParameters:O,headers:S,target:l,verb:e,errors:C,withCredentials:i.credentials||T.credentials||z.config.withCredentials,timeout:i.timeout||T.timeout||z.config.timeout,path:t,triggeringEvent:r};if(!ie(n,"htmx:configRequest",L)){K(a);x();return s}t=L.path;e=L.verb;S=L.headers;q=L.parameters;C=L.errors;if(C&&C.length>0){ie(n,"htmx:validation:halted",L);K(a);x();return s}var U=t.split("#");var V=U[0];var A=U[1];var N=null;if(e==="get"){N=V;var _=Object.keys(q).length!==0;if(_){if(N.indexOf("?")<0){N+="?"}else{N+="&"}N+=Kt(q);if(A){N+="#"+A}}m.open("GET",N,true)}else{m.open(e.toUpperCase(),t,true)}m.overrideMimeType("text/html");m.withCredentials=L.withCredentials;m.timeout=L.timeout;if(T.noHeaders){}else{for(var I in S){if(S.hasOwnProperty(I)){var W=S[I];cr(m,I,W)}}}var k={xhr:m,target:l,requestConfig:L,etc:i,boosted:H,pathInfo:{requestPath:t,finalRequestPath:N||t,anchor:A}};m.onload=function(){try{var e=vr(n);k.pathInfo.responsePath=hr(m);D(n,k);_t(P);ie(n,"htmx:afterRequest",k);ie(n,"htmx:afterOnLoad",k);if(!ee(n)){var t=null;while(e.length>0&&t==null){var r=e.shift();if(ee(r)){t=r}}if(t){ie(t,"htmx:afterRequest",k);ie(t,"htmx:afterOnLoad",k)}}K(a);x()}catch(e){ne(n,"htmx:onLoadError",te({error:e},k));throw e}};m.onerror=function(){_t(P);ne(n,"htmx:afterRequest",k);ne(n,"htmx:sendError",k);K(o);x()};m.onabort=function(){_t(P);ne(n,"htmx:afterRequest",k);ne(n,"htmx:sendAbort",k);K(o);x()};m.ontimeout=function(){_t(P);ne(n,"htmx:afterRequest",k);ne(n,"htmx:timeout",k);K(o);x()};if(!ie(n,"htmx:beforeRequest",k)){K(a);x();return s}var P=Vt(n);Q(["loadstart","loadend","progress","abort"],function(t){Q([m,m.upload],function(e){e.addEventListener(t,function(e){ie(n,"htmx:xhr:"+t,{lengthComputable:e.lengthComputable,loaded:e.loaded,total:e.total})})})});ie(n,"htmx:beforeSend",k);m.send(e==="get"?null:ir(m,n,q));return s}function gr(e,t){var r=t.xhr;var n=null;var i=null;if(E(r,/HX-Push:/i)){n=r.getResponseHeader("HX-Push");i="push"}else if(E(r,/HX-Push-Url:/i)){n=r.getResponseHeader("HX-Push-Url");i="push"}else if(E(r,/HX-Replace-Url:/i)){n=r.getResponseHeader("HX-Replace-Url");i="replace"}if(n){if(n==="false"){return{}}else{return{type:i,path:n}}}var a=t.pathInfo.finalRequestPath;var o=t.pathInfo.responsePath;var s=Z(e,"hx-push-url");var l=Z(e,"hx-replace-url");var u=Y(e).boosted;var f=null;var c=null;if(s){f="push";c=s}else if(l){f="replace";c=l}else if(u){f="push";c=o||a}if(c){if(c==="false"){return{}}if(c==="true"){c=o||a}if(t.pathInfo.anchor&&c.indexOf("#")===-1){c=c+"#"+t.pathInfo.anchor}return{type:f,path:c}}else{return{}}}function pr(s,l){var u=l.xhr;var f=l.target;var e=l.etc;if(!ie(s,"htmx:beforeOnLoad",l))return;if(E(u,/HX-Trigger:/i)){De(u,"HX-Trigger",s)}if(E(u,/HX-Location:/i)){Dt();var t=u.getResponseHeader("HX-Location");var c;if(t.indexOf("{")===0){c=y(t);t=c["path"];delete c["path"]}dr("GET",t,c).then(function(){Xt(t)});return}if(E(u,/HX-Redirect:/i)){location.href=u.getResponseHeader("HX-Redirect");return}if(E(u,/HX-Refresh:/i)){if("true"===u.getResponseHeader("HX-Refresh")){location.reload();return}}if(E(u,/HX-Retarget:/i)){l.target=J().querySelector(u.getResponseHeader("HX-Retarget"))}var h=gr(s,l);var r=u.status>=200&&u.status<400&&u.status!==204;var d=u.response;var n=u.status>=400;var i=te({shouldSwap:r,serverResponse:d,isError:n},l);if(!ie(f,"htmx:beforeSwap",i))return;f=i.target;d=i.serverResponse;n=i.isError;l.target=f;l.failed=n;l.successful=!n;if(i.shouldSwap){if(u.status===286){$e(s)}w(s,function(e){d=e.transformResponse(d,u,s)});if(h.type){Dt()}var a=e.swapOverride;if(E(u,/HX-Reswap:/i)){a=u.getResponseHeader("HX-Reswap")}var c=rr(s,a);f.classList.add(z.config.swappingClass);var v=null;var g=null;var o=function(){try{var e=document.activeElement;var t={};try{t={elt:e,start:e?e.selectionStart:null,end:e?e.selectionEnd:null}}catch(e){}var n=S(f);Me(c.swapStyle,f,s,d,n);if(t.elt&&!ee(t.elt)&&t.elt.id){var r=document.getElementById(t.elt.id);var i={preventScroll:c.focusScroll!==undefined?!c.focusScroll:!z.config.defaultFocusScroll};if(r){if(t.start&&r.setSelectionRange){try{r.setSelectionRange(t.start,t.end)}catch(e){}}r.focus(i)}}f.classList.remove(z.config.swappingClass);Q(n.elts,function(e){if(e.classList){e.classList.add(z.config.settlingClass)}ie(e,"htmx:afterSwap",l)});if(E(u,/HX-Trigger-After-Swap:/i)){var a=s;if(!ee(s)){a=J().body}De(u,"HX-Trigger-After-Swap",a)}var o=function(){Q(n.tasks,function(e){e.call()});Q(n.elts,function(e){if(e.classList){e.classList.remove(z.config.settlingClass)}ie(e,"htmx:afterSettle",l)});if(h.type){if(h.type==="push"){Xt(h.path);ie(J().body,"htmx:pushedIntoHistory",{path:h.path})}else{Ft(h.path);ie(J().body,"htmx:replacedInHistory",{path:h.path})}}if(l.pathInfo.anchor){var e=b("#"+l.pathInfo.anchor);if(e){e.scrollIntoView({block:"start",behavior:"auto"})}}if(n.title){var t=b("title");if(t){t.innerHTML=n.title}else{window.document.title=n.title}}ar(n.elts,c);if(E(u,/HX-Trigger-After-Settle:/i)){var r=s;if(!ee(s)){r=J().body}De(u,"HX-Trigger-After-Settle",r)}K(v)};if(c.settleDelay>0){setTimeout(o,c.settleDelay)}else{o()}}catch(e){ne(s,"htmx:swapError",l);K(g);throw e}};var p=z.config.globalViewTransitions;if(c.hasOwnProperty("transition")){p=c.transition}if(p&&ie(s,"htmx:beforeTransition",l)&&typeof Promise!=="undefined"&&document.startViewTransition){var m=new Promise(function(e,t){v=e;g=t});var x=o;o=function(){document.startViewTransition(function(){x();return m})}}if(c.swapDelay>0){setTimeout(o,c.swapDelay)}else{o()}}if(n){ne(s,"htmx:responseError",te({error:"Response Status Error Code "+u.status+" from "+l.pathInfo.requestPath},l))}}var mr={};function xr(){return{init:function(e){return null},onEvent:function(e,t){return true},transformResponse:function(e,t,r){return e},isInlineSwap:function(e){return false},handleSwap:function(e,t,r,n){return false},encodeParameters:function(e,t,r){return null}}}function yr(e,t){if(t.init){t.init(C)}mr[e]=te(xr(),t)}function br(e){delete mr[e]}function wr(e,r,n){if(e==undefined){return r}if(r==undefined){r=[]}if(n==undefined){n=[]}var t=G(e,"hx-ext");if(t){Q(t.split(","),function(e){e=e.replace(/ /g,"");if(e.slice(0,7)=="ignore:"){n.push(e.slice(7));return}if(n.indexOf(e)<0){var t=mr[e];if(t&&r.indexOf(t)<0){r.push(t)}}})}return wr(u(e),r,n)}function Sr(e){if(J().readyState!=="loading"){e()}else{J().addEventListener("DOMContentLoaded",e)}}function Er(){if(z.config.includeIndicatorStyles!==false){J().head.insertAdjacentHTML("beforeend","<style>                      ."+z.config.indicatorClass+"{opacity:0;transition: opacity 200ms ease-in;}                      ."+z.config.requestClass+" ."+z.config.indicatorClass+"{opacity:1}                      ."+z.config.requestClass+"."+z.config.indicatorClass+"{opacity:1}                    </style>")}}function Cr(){var e=J().querySelector('meta[name="htmx-config"]');if(e){return y(e.content)}else{return null}}function Rr(){var e=Cr();if(e){z.config=te(z.config,e)}}Sr(function(){Rr();Er();var e=J().body;Tt(e);var t=J().querySelectorAll("[hx-trigger='restored'],[data-hx-trigger='restored']");e.addEventListener("htmx:abort",function(e){var t=e.target;var r=Y(t);if(r&&r.xhr){r.xhr.abort()}});var r=window.onpopstate;window.onpopstate=function(e){if(e.state&&e.state.htmx){Ut();Q(t,function(e){ie(e,"htmx:restored",{document:J(),triggerEvent:ie})})}else{if(r){r(e)}}};setTimeout(function(){ie(e,"htmx:load",{});e=null},0)});return z}()});
2 1
\ No newline at end of file
2
+(function(e,t){if(typeof define==="function"&&define.amd){define([],t)}else if(typeof module==="object"&&module.exports){module.exports=t()}else{e.htmx=e.htmx||t()}})(typeof self!=="undefined"?self:this,function(){return function(){"use strict";var Q={onLoad:F,process:zt,on:de,off:ge,trigger:ce,ajax:Nr,find:C,findAll:f,closest:v,values:function(e,t){var r=dr(e,t||"post");return r.values},remove:_,addClass:z,removeClass:n,toggleClass:$,takeClass:W,defineExtension:Ur,removeExtension:Br,logAll:V,logNone:j,logger:null,config:{historyEnabled:true,historyCacheSize:10,refreshOnHistoryMiss:false,defaultSwapStyle:"innerHTML",defaultSwapDelay:0,defaultSettleDelay:20,includeIndicatorStyles:true,indicatorClass:"htmx-indicator",requestClass:"htmx-request",addedClass:"htmx-added",settlingClass:"htmx-settling",swappingClass:"htmx-swapping",allowEval:true,allowScriptTags:true,inlineScriptNonce:"",attributesToSettle:["class","style","width","height"],withCredentials:false,timeout:0,wsReconnectDelay:"full-jitter",wsBinaryType:"blob",disableSelector:"[hx-disable], [data-hx-disable]",useTemplateFragments:false,scrollBehavior:"smooth",defaultFocusScroll:false,getCacheBusterParam:false,globalViewTransitions:false,methodsThatUseUrlParams:["get"],selfRequestsOnly:false,ignoreTitle:false,scrollIntoViewOnBoost:true,triggerSpecsCache:null},parseInterval:d,_:t,createEventSource:function(e){return new EventSource(e,{withCredentials:true})},createWebSocket:function(e){var t=new WebSocket(e,[]);t.binaryType=Q.config.wsBinaryType;return t},version:"1.9.10"};var r={addTriggerHandler:Lt,bodyContains:se,canAccessLocalStorage:U,findThisElement:xe,filterValues:yr,hasAttribute:o,getAttributeValue:te,getClosestAttributeValue:ne,getClosestMatch:c,getExpressionVars:Hr,getHeaders:xr,getInputValues:dr,getInternalData:ae,getSwapSpecification:wr,getTriggerSpecs:it,getTarget:ye,makeFragment:l,mergeObjects:le,makeSettleInfo:T,oobSwap:Ee,querySelectorExt:ue,selectAndSwap:je,settleImmediately:nr,shouldCancel:ut,triggerEvent:ce,triggerErrorEvent:fe,withExtensions:R};var w=["get","post","put","delete","patch"];var i=w.map(function(e){return"[hx-"+e+"], [data-hx-"+e+"]"}).join(", ");var S=e("head"),q=e("title"),H=e("svg",true);function e(e,t=false){return new RegExp(`<${e}(\\s[^>]*>|>)([\\s\\S]*?)<\\/${e}>`,t?"gim":"im")}function d(e){if(e==undefined){return undefined}let t=NaN;if(e.slice(-2)=="ms"){t=parseFloat(e.slice(0,-2))}else if(e.slice(-1)=="s"){t=parseFloat(e.slice(0,-1))*1e3}else if(e.slice(-1)=="m"){t=parseFloat(e.slice(0,-1))*1e3*60}else{t=parseFloat(e)}return isNaN(t)?undefined:t}function ee(e,t){return e.getAttribute&&e.getAttribute(t)}function o(e,t){return e.hasAttribute&&(e.hasAttribute(t)||e.hasAttribute("data-"+t))}function te(e,t){return ee(e,t)||ee(e,"data-"+t)}function u(e){return e.parentElement}function re(){return document}function c(e,t){while(e&&!t(e)){e=u(e)}return e?e:null}function L(e,t,r){var n=te(t,r);var i=te(t,"hx-disinherit");if(e!==t&&i&&(i==="*"||i.split(" ").indexOf(r)>=0)){return"unset"}else{return n}}function ne(t,r){var n=null;c(t,function(e){return n=L(t,e,r)});if(n!=="unset"){return n}}function h(e,t){var r=e.matches||e.matchesSelector||e.msMatchesSelector||e.mozMatchesSelector||e.webkitMatchesSelector||e.oMatchesSelector;return r&&r.call(e,t)}function A(e){var t=/<([a-z][^\/\0>\x20\t\r\n\f]*)/i;var r=t.exec(e);if(r){return r[1].toLowerCase()}else{return""}}function a(e,t){var r=new DOMParser;var n=r.parseFromString(e,"text/html");var i=n.body;while(t>0){t--;i=i.firstChild}if(i==null){i=re().createDocumentFragment()}return i}function N(e){return/<body/.test(e)}function l(e){var t=!N(e);var r=A(e);var n=e;if(r==="head"){n=n.replace(S,"")}if(Q.config.useTemplateFragments&&t){var i=a("<body><template>"+n+"</template></body>",0);return i.querySelector("template").content}switch(r){case"thead":case"tbody":case"tfoot":case"colgroup":case"caption":return a("<table>"+n+"</table>",1);case"col":return a("<table><colgroup>"+n+"</colgroup></table>",2);case"tr":return a("<table><tbody>"+n+"</tbody></table>",2);case"td":case"th":return a("<table><tbody><tr>"+n+"</tr></tbody></table>",3);case"script":case"style":return a("<div>"+n+"</div>",1);default:return a(n,0)}}function ie(e){if(e){e()}}function I(e,t){return Object.prototype.toString.call(e)==="[object "+t+"]"}function k(e){return I(e,"Function")}function P(e){return I(e,"Object")}function ae(e){var t="htmx-internal-data";var r=e[t];if(!r){r=e[t]={}}return r}function M(e){var t=[];if(e){for(var r=0;r<e.length;r++){t.push(e[r])}}return t}function oe(e,t){if(e){for(var r=0;r<e.length;r++){t(e[r])}}}function X(e){var t=e.getBoundingClientRect();var r=t.top;var n=t.bottom;return r<window.innerHeight&&n>=0}function se(e){if(e.getRootNode&&e.getRootNode()instanceof window.ShadowRoot){return re().body.contains(e.getRootNode().host)}else{return re().body.contains(e)}}function D(e){return e.trim().split(/\s+/)}function le(e,t){for(var r in t){if(t.hasOwnProperty(r)){e[r]=t[r]}}return e}function E(e){try{return JSON.parse(e)}catch(e){b(e);return null}}function U(){var e="htmx:localStorageTest";try{localStorage.setItem(e,e);localStorage.removeItem(e);return true}catch(e){return false}}function B(t){try{var e=new URL(t);if(e){t=e.pathname+e.search}if(!/^\/$/.test(t)){t=t.replace(/\/+$/,"")}return t}catch(e){return t}}function t(e){return Tr(re().body,function(){return eval(e)})}function F(t){var e=Q.on("htmx:load",function(e){t(e.detail.elt)});return e}function V(){Q.logger=function(e,t,r){if(console){console.log(t,e,r)}}}function j(){Q.logger=null}function C(e,t){if(t){return e.querySelector(t)}else{return C(re(),e)}}function f(e,t){if(t){return e.querySelectorAll(t)}else{return f(re(),e)}}function _(e,t){e=g(e);if(t){setTimeout(function(){_(e);e=null},t)}else{e.parentElement.removeChild(e)}}function z(e,t,r){e=g(e);if(r){setTimeout(function(){z(e,t);e=null},r)}else{e.classList&&e.classList.add(t)}}function n(e,t,r){e=g(e);if(r){setTimeout(function(){n(e,t);e=null},r)}else{if(e.classList){e.classList.remove(t);if(e.classList.length===0){e.removeAttribute("class")}}}}function $(e,t){e=g(e);e.classList.toggle(t)}function W(e,t){e=g(e);oe(e.parentElement.children,function(e){n(e,t)});z(e,t)}function v(e,t){e=g(e);if(e.closest){return e.closest(t)}else{do{if(e==null||h(e,t)){return e}}while(e=e&&u(e));return null}}function s(e,t){return e.substring(0,t.length)===t}function G(e,t){return e.substring(e.length-t.length)===t}function J(e){var t=e.trim();if(s(t,"<")&&G(t,"/>")){return t.substring(1,t.length-2)}else{return t}}function Z(e,t){if(t.indexOf("closest ")===0){return[v(e,J(t.substr(8)))]}else if(t.indexOf("find ")===0){return[C(e,J(t.substr(5)))]}else if(t==="next"){return[e.nextElementSibling]}else if(t.indexOf("next ")===0){return[K(e,J(t.substr(5)))]}else if(t==="previous"){return[e.previousElementSibling]}else if(t.indexOf("previous ")===0){return[Y(e,J(t.substr(9)))]}else if(t==="document"){return[document]}else if(t==="window"){return[window]}else if(t==="body"){return[document.body]}else{return re().querySelectorAll(J(t))}}var K=function(e,t){var r=re().querySelectorAll(t);for(var n=0;n<r.length;n++){var i=r[n];if(i.compareDocumentPosition(e)===Node.DOCUMENT_POSITION_PRECEDING){return i}}};var Y=function(e,t){var r=re().querySelectorAll(t);for(var n=r.length-1;n>=0;n--){var i=r[n];if(i.compareDocumentPosition(e)===Node.DOCUMENT_POSITION_FOLLOWING){return i}}};function ue(e,t){if(t){return Z(e,t)[0]}else{return Z(re().body,e)[0]}}function g(e){if(I(e,"String")){return C(e)}else{return e}}function ve(e,t,r){if(k(t)){return{target:re().body,event:e,listener:t}}else{return{target:g(e),event:t,listener:r}}}function de(t,r,n){jr(function(){var e=ve(t,r,n);e.target.addEventListener(e.event,e.listener)});var e=k(r);return e?r:n}function ge(t,r,n){jr(function(){var e=ve(t,r,n);e.target.removeEventListener(e.event,e.listener)});return k(r)?r:n}var me=re().createElement("output");function pe(e,t){var r=ne(e,t);if(r){if(r==="this"){return[xe(e,t)]}else{var n=Z(e,r);if(n.length===0){b('The selector "'+r+'" on '+t+" returned no matches!");return[me]}else{return n}}}}function xe(e,t){return c(e,function(e){return te(e,t)!=null})}function ye(e){var t=ne(e,"hx-target");if(t){if(t==="this"){return xe(e,"hx-target")}else{return ue(e,t)}}else{var r=ae(e);if(r.boosted){return re().body}else{return e}}}function be(e){var t=Q.config.attributesToSettle;for(var r=0;r<t.length;r++){if(e===t[r]){return true}}return false}function we(t,r){oe(t.attributes,function(e){if(!r.hasAttribute(e.name)&&be(e.name)){t.removeAttribute(e.name)}});oe(r.attributes,function(e){if(be(e.name)){t.setAttribute(e.name,e.value)}})}function Se(e,t){var r=Fr(t);for(var n=0;n<r.length;n++){var i=r[n];try{if(i.isInlineSwap(e)){return true}}catch(e){b(e)}}return e==="outerHTML"}function Ee(e,i,a){var t="#"+ee(i,"id");var o="outerHTML";if(e==="true"){}else if(e.indexOf(":")>0){o=e.substr(0,e.indexOf(":"));t=e.substr(e.indexOf(":")+1,e.length)}else{o=e}var r=re().querySelectorAll(t);if(r){oe(r,function(e){var t;var r=i.cloneNode(true);t=re().createDocumentFragment();t.appendChild(r);if(!Se(o,e)){t=r}var n={shouldSwap:true,target:e,fragment:t};if(!ce(e,"htmx:oobBeforeSwap",n))return;e=n.target;if(n["shouldSwap"]){Fe(o,e,e,t,a)}oe(a.elts,function(e){ce(e,"htmx:oobAfterSwap",n)})});i.parentNode.removeChild(i)}else{i.parentNode.removeChild(i);fe(re().body,"htmx:oobErrorNoTarget",{content:i})}return e}function Ce(e,t,r){var n=ne(e,"hx-select-oob");if(n){var i=n.split(",");for(var a=0;a<i.length;a++){var o=i[a].split(":",2);var s=o[0].trim();if(s.indexOf("#")===0){s=s.substring(1)}var l=o[1]||"true";var u=t.querySelector("#"+s);if(u){Ee(l,u,r)}}}oe(f(t,"[hx-swap-oob], [data-hx-swap-oob]"),function(e){var t=te(e,"hx-swap-oob");if(t!=null){Ee(t,e,r)}})}function Re(e){oe(f(e,"[hx-preserve], [data-hx-preserve]"),function(e){var t=te(e,"id");var r=re().getElementById(t);if(r!=null){e.parentNode.replaceChild(r,e)}})}function Te(o,e,s){oe(e.querySelectorAll("[id]"),function(e){var t=ee(e,"id");if(t&&t.length>0){var r=t.replace("'","\\'");var n=e.tagName.replace(":","\\:");var i=o.querySelector(n+"[id='"+r+"']");if(i&&i!==o){var a=e.cloneNode();we(e,i);s.tasks.push(function(){we(e,a)})}}})}function Oe(e){return function(){n(e,Q.config.addedClass);zt(e);Nt(e);qe(e);ce(e,"htmx:load")}}function qe(e){var t="[autofocus]";var r=h(e,t)?e:e.querySelector(t);if(r!=null){r.focus()}}function m(e,t,r,n){Te(e,r,n);while(r.childNodes.length>0){var i=r.firstChild;z(i,Q.config.addedClass);e.insertBefore(i,t);if(i.nodeType!==Node.TEXT_NODE&&i.nodeType!==Node.COMMENT_NODE){n.tasks.push(Oe(i))}}}function He(e,t){var r=0;while(r<e.length){t=(t<<5)-t+e.charCodeAt(r++)|0}return t}function Le(e){var t=0;if(e.attributes){for(var r=0;r<e.attributes.length;r++){var n=e.attributes[r];if(n.value){t=He(n.name,t);t=He(n.value,t)}}}return t}function Ae(e){var t=ae(e);if(t.onHandlers){for(var r=0;r<t.onHandlers.length;r++){const n=t.onHandlers[r];e.removeEventListener(n.event,n.listener)}delete t.onHandlers}}function Ne(e){var t=ae(e);if(t.timeout){clearTimeout(t.timeout)}if(t.webSocket){t.webSocket.close()}if(t.sseEventSource){t.sseEventSource.close()}if(t.listenerInfos){oe(t.listenerInfos,function(e){if(e.on){e.on.removeEventListener(e.trigger,e.listener)}})}Ae(e);oe(Object.keys(t),function(e){delete t[e]})}function p(e){ce(e,"htmx:beforeCleanupElement");Ne(e);if(e.children){oe(e.children,function(e){p(e)})}}function Ie(t,e,r){if(t.tagName==="BODY"){return Ue(t,e,r)}else{var n;var i=t.previousSibling;m(u(t),t,e,r);if(i==null){n=u(t).firstChild}else{n=i.nextSibling}r.elts=r.elts.filter(function(e){return e!=t});while(n&&n!==t){if(n.nodeType===Node.ELEMENT_NODE){r.elts.push(n)}n=n.nextElementSibling}p(t);u(t).removeChild(t)}}function ke(e,t,r){return m(e,e.firstChild,t,r)}function Pe(e,t,r){return m(u(e),e,t,r)}function Me(e,t,r){return m(e,null,t,r)}function Xe(e,t,r){return m(u(e),e.nextSibling,t,r)}function De(e,t,r){p(e);return u(e).removeChild(e)}function Ue(e,t,r){var n=e.firstChild;m(e,n,t,r);if(n){while(n.nextSibling){p(n.nextSibling);e.removeChild(n.nextSibling)}p(n);e.removeChild(n)}}function Be(e,t,r){var n=r||ne(e,"hx-select");if(n){var i=re().createDocumentFragment();oe(t.querySelectorAll(n),function(e){i.appendChild(e)});t=i}return t}function Fe(e,t,r,n,i){switch(e){case"none":return;case"outerHTML":Ie(r,n,i);return;case"afterbegin":ke(r,n,i);return;case"beforebegin":Pe(r,n,i);return;case"beforeend":Me(r,n,i);return;case"afterend":Xe(r,n,i);return;case"delete":De(r,n,i);return;default:var a=Fr(t);for(var o=0;o<a.length;o++){var s=a[o];try{var l=s.handleSwap(e,r,n,i);if(l){if(typeof l.length!=="undefined"){for(var u=0;u<l.length;u++){var f=l[u];if(f.nodeType!==Node.TEXT_NODE&&f.nodeType!==Node.COMMENT_NODE){i.tasks.push(Oe(f))}}}return}}catch(e){b(e)}}if(e==="innerHTML"){Ue(r,n,i)}else{Fe(Q.config.defaultSwapStyle,t,r,n,i)}}}function Ve(e){if(e.indexOf("<title")>-1){var t=e.replace(H,"");var r=t.match(q);if(r){return r[2]}}}function je(e,t,r,n,i,a){i.title=Ve(n);var o=l(n);if(o){Ce(r,o,i);o=Be(r,o,a);Re(o);return Fe(e,r,t,o,i)}}function _e(e,t,r){var n=e.getResponseHeader(t);if(n.indexOf("{")===0){var i=E(n);for(var a in i){if(i.hasOwnProperty(a)){var o=i[a];if(!P(o)){o={value:o}}ce(r,a,o)}}}else{var s=n.split(",");for(var l=0;l<s.length;l++){ce(r,s[l].trim(),[])}}}var ze=/\s/;var x=/[\s,]/;var $e=/[_$a-zA-Z]/;var We=/[_$a-zA-Z0-9]/;var Ge=['"',"'","/"];var Je=/[^\s]/;var Ze=/[{(]/;var Ke=/[})]/;function Ye(e){var t=[];var r=0;while(r<e.length){if($e.exec(e.charAt(r))){var n=r;while(We.exec(e.charAt(r+1))){r++}t.push(e.substr(n,r-n+1))}else if(Ge.indexOf(e.charAt(r))!==-1){var i=e.charAt(r);var n=r;r++;while(r<e.length&&e.charAt(r)!==i){if(e.charAt(r)==="\\"){r++}r++}t.push(e.substr(n,r-n+1))}else{var a=e.charAt(r);t.push(a)}r++}return t}function Qe(e,t,r){return $e.exec(e.charAt(0))&&e!=="true"&&e!=="false"&&e!=="this"&&e!==r&&t!=="."}function et(e,t,r){if(t[0]==="["){t.shift();var n=1;var i=" return (function("+r+"){ return (";var a=null;while(t.length>0){var o=t[0];if(o==="]"){n--;if(n===0){if(a===null){i=i+"true"}t.shift();i+=")})";try{var s=Tr(e,function(){return Function(i)()},function(){return true});s.source=i;return s}catch(e){fe(re().body,"htmx:syntax:error",{error:e,source:i});return null}}}else if(o==="["){n++}if(Qe(o,a,r)){i+="(("+r+"."+o+") ? ("+r+"."+o+") : (window."+o+"))"}else{i=i+o}a=t.shift()}}}function y(e,t){var r="";while(e.length>0&&!t.test(e[0])){r+=e.shift()}return r}function tt(e){var t;if(e.length>0&&Ze.test(e[0])){e.shift();t=y(e,Ke).trim();e.shift()}else{t=y(e,x)}return t}var rt="input, textarea, select";function nt(e,t,r){var n=[];var i=Ye(t);do{y(i,Je);var a=i.length;var o=y(i,/[,\[\s]/);if(o!==""){if(o==="every"){var s={trigger:"every"};y(i,Je);s.pollInterval=d(y(i,/[,\[\s]/));y(i,Je);var l=et(e,i,"event");if(l){s.eventFilter=l}n.push(s)}else if(o.indexOf("sse:")===0){n.push({trigger:"sse",sseEvent:o.substr(4)})}else{var u={trigger:o};var l=et(e,i,"event");if(l){u.eventFilter=l}while(i.length>0&&i[0]!==","){y(i,Je);var f=i.shift();if(f==="changed"){u.changed=true}else if(f==="once"){u.once=true}else if(f==="consume"){u.consume=true}else if(f==="delay"&&i[0]===":"){i.shift();u.delay=d(y(i,x))}else if(f==="from"&&i[0]===":"){i.shift();if(Ze.test(i[0])){var c=tt(i)}else{var c=y(i,x);if(c==="closest"||c==="find"||c==="next"||c==="previous"){i.shift();var h=tt(i);if(h.length>0){c+=" "+h}}}u.from=c}else if(f==="target"&&i[0]===":"){i.shift();u.target=tt(i)}else if(f==="throttle"&&i[0]===":"){i.shift();u.throttle=d(y(i,x))}else if(f==="queue"&&i[0]===":"){i.shift();u.queue=y(i,x)}else if(f==="root"&&i[0]===":"){i.shift();u[f]=tt(i)}else if(f==="threshold"&&i[0]===":"){i.shift();u[f]=y(i,x)}else{fe(e,"htmx:syntax:error",{token:i.shift()})}}n.push(u)}}if(i.length===a){fe(e,"htmx:syntax:error",{token:i.shift()})}y(i,Je)}while(i[0]===","&&i.shift());if(r){r[t]=n}return n}function it(e){var t=te(e,"hx-trigger");var r=[];if(t){var n=Q.config.triggerSpecsCache;r=n&&n[t]||nt(e,t,n)}if(r.length>0){return r}else if(h(e,"form")){return[{trigger:"submit"}]}else if(h(e,'input[type="button"], input[type="submit"]')){return[{trigger:"click"}]}else if(h(e,rt)){return[{trigger:"change"}]}else{return[{trigger:"click"}]}}function at(e){ae(e).cancelled=true}function ot(e,t,r){var n=ae(e);n.timeout=setTimeout(function(){if(se(e)&&n.cancelled!==true){if(!ct(r,e,Wt("hx:poll:trigger",{triggerSpec:r,target:e}))){t(e)}ot(e,t,r)}},r.pollInterval)}function st(e){return location.hostname===e.hostname&&ee(e,"href")&&ee(e,"href").indexOf("#")!==0}function lt(t,r,e){if(t.tagName==="A"&&st(t)&&(t.target===""||t.target==="_self")||t.tagName==="FORM"){r.boosted=true;var n,i;if(t.tagName==="A"){n="get";i=ee(t,"href")}else{var a=ee(t,"method");n=a?a.toLowerCase():"get";if(n==="get"){}i=ee(t,"action")}e.forEach(function(e){ht(t,function(e,t){if(v(e,Q.config.disableSelector)){p(e);return}he(n,i,e,t)},r,e,true)})}}function ut(e,t){if(e.type==="submit"||e.type==="click"){if(t.tagName==="FORM"){return true}if(h(t,'input[type="submit"], button')&&v(t,"form")!==null){return true}if(t.tagName==="A"&&t.href&&(t.getAttribute("href")==="#"||t.getAttribute("href").indexOf("#")!==0)){return true}}return false}function ft(e,t){return ae(e).boosted&&e.tagName==="A"&&t.type==="click"&&(t.ctrlKey||t.metaKey)}function ct(e,t,r){var n=e.eventFilter;if(n){try{return n.call(t,r)!==true}catch(e){fe(re().body,"htmx:eventFilter:error",{error:e,source:n.source});return true}}return false}function ht(a,o,e,s,l){var u=ae(a);var t;if(s.from){t=Z(a,s.from)}else{t=[a]}if(s.changed){t.forEach(function(e){var t=ae(e);t.lastValue=e.value})}oe(t,function(n){var i=function(e){if(!se(a)){n.removeEventListener(s.trigger,i);return}if(ft(a,e)){return}if(l||ut(e,a)){e.preventDefault()}if(ct(s,a,e)){return}var t=ae(e);t.triggerSpec=s;if(t.handledFor==null){t.handledFor=[]}if(t.handledFor.indexOf(a)<0){t.handledFor.push(a);if(s.consume){e.stopPropagation()}if(s.target&&e.target){if(!h(e.target,s.target)){return}}if(s.once){if(u.triggeredOnce){return}else{u.triggeredOnce=true}}if(s.changed){var r=ae(n);if(r.lastValue===n.value){return}r.lastValue=n.value}if(u.delayed){clearTimeout(u.delayed)}if(u.throttle){return}if(s.throttle>0){if(!u.throttle){o(a,e);u.throttle=setTimeout(function(){u.throttle=null},s.throttle)}}else if(s.delay>0){u.delayed=setTimeout(function(){o(a,e)},s.delay)}else{ce(a,"htmx:trigger");o(a,e)}}};if(e.listenerInfos==null){e.listenerInfos=[]}e.listenerInfos.push({trigger:s.trigger,listener:i,on:n});n.addEventListener(s.trigger,i)})}var vt=false;var dt=null;function gt(){if(!dt){dt=function(){vt=true};window.addEventListener("scroll",dt);setInterval(function(){if(vt){vt=false;oe(re().querySelectorAll("[hx-trigger='revealed'],[data-hx-trigger='revealed']"),function(e){mt(e)})}},200)}}function mt(t){if(!o(t,"data-hx-revealed")&&X(t)){t.setAttribute("data-hx-revealed","true");var e=ae(t);if(e.initHash){ce(t,"revealed")}else{t.addEventListener("htmx:afterProcessNode",function(e){ce(t,"revealed")},{once:true})}}}function pt(e,t,r){var n=D(r);for(var i=0;i<n.length;i++){var a=n[i].split(/:(.+)/);if(a[0]==="connect"){xt(e,a[1],0)}if(a[0]==="send"){bt(e)}}}function xt(s,r,n){if(!se(s)){return}if(r.indexOf("/")==0){var e=location.hostname+(location.port?":"+location.port:"");if(location.protocol=="https:"){r="wss://"+e+r}else if(location.protocol=="http:"){r="ws://"+e+r}}var t=Q.createWebSocket(r);t.onerror=function(e){fe(s,"htmx:wsError",{error:e,socket:t});yt(s)};t.onclose=function(e){if([1006,1012,1013].indexOf(e.code)>=0){var t=wt(n);setTimeout(function(){xt(s,r,n+1)},t)}};t.onopen=function(e){n=0};ae(s).webSocket=t;t.addEventListener("message",function(e){if(yt(s)){return}var t=e.data;R(s,function(e){t=e.transformResponse(t,null,s)});var r=T(s);var n=l(t);var i=M(n.children);for(var a=0;a<i.length;a++){var o=i[a];Ee(te(o,"hx-swap-oob")||"true",o,r)}nr(r.tasks)})}function yt(e){if(!se(e)){ae(e).webSocket.close();return true}}function bt(u){var f=c(u,function(e){return ae(e).webSocket!=null});if(f){u.addEventListener(it(u)[0].trigger,function(e){var t=ae(f).webSocket;var r=xr(u,f);var n=dr(u,"post");var i=n.errors;var a=n.values;var o=Hr(u);var s=le(a,o);var l=yr(s,u);l["HEADERS"]=r;if(i&&i.length>0){ce(u,"htmx:validation:halted",i);return}t.send(JSON.stringify(l));if(ut(e,u)){e.preventDefault()}})}else{fe(u,"htmx:noWebSocketSourceError")}}function wt(e){var t=Q.config.wsReconnectDelay;if(typeof t==="function"){return t(e)}if(t==="full-jitter"){var r=Math.min(e,6);var n=1e3*Math.pow(2,r);return n*Math.random()}b('htmx.config.wsReconnectDelay must either be a function or the string "full-jitter"')}function St(e,t,r){var n=D(r);for(var i=0;i<n.length;i++){var a=n[i].split(/:(.+)/);if(a[0]==="connect"){Et(e,a[1])}if(a[0]==="swap"){Ct(e,a[1])}}}function Et(t,e){var r=Q.createEventSource(e);r.onerror=function(e){fe(t,"htmx:sseError",{error:e,source:r});Tt(t)};ae(t).sseEventSource=r}function Ct(a,o){var s=c(a,Ot);if(s){var l=ae(s).sseEventSource;var u=function(e){if(Tt(s)){return}if(!se(a)){l.removeEventListener(o,u);return}var t=e.data;R(a,function(e){t=e.transformResponse(t,null,a)});var r=wr(a);var n=ye(a);var i=T(a);je(r.swapStyle,n,a,t,i);nr(i.tasks);ce(a,"htmx:sseMessage",e)};ae(a).sseListener=u;l.addEventListener(o,u)}else{fe(a,"htmx:noSSESourceError")}}function Rt(e,t,r){var n=c(e,Ot);if(n){var i=ae(n).sseEventSource;var a=function(){if(!Tt(n)){if(se(e)){t(e)}else{i.removeEventListener(r,a)}}};ae(e).sseListener=a;i.addEventListener(r,a)}else{fe(e,"htmx:noSSESourceError")}}function Tt(e){if(!se(e)){ae(e).sseEventSource.close();return true}}function Ot(e){return ae(e).sseEventSource!=null}function qt(e,t,r,n){var i=function(){if(!r.loaded){r.loaded=true;t(e)}};if(n>0){setTimeout(i,n)}else{i()}}function Ht(t,i,e){var a=false;oe(w,function(r){if(o(t,"hx-"+r)){var n=te(t,"hx-"+r);a=true;i.path=n;i.verb=r;e.forEach(function(e){Lt(t,e,i,function(e,t){if(v(e,Q.config.disableSelector)){p(e);return}he(r,n,e,t)})})}});return a}function Lt(n,e,t,r){if(e.sseEvent){Rt(n,r,e.sseEvent)}else if(e.trigger==="revealed"){gt();ht(n,r,t,e);mt(n)}else if(e.trigger==="intersect"){var i={};if(e.root){i.root=ue(n,e.root)}if(e.threshold){i.threshold=parseFloat(e.threshold)}var a=new IntersectionObserver(function(e){for(var t=0;t<e.length;t++){var r=e[t];if(r.isIntersecting){ce(n,"intersect");break}}},i);a.observe(n);ht(n,r,t,e)}else if(e.trigger==="load"){if(!ct(e,n,Wt("load",{elt:n}))){qt(n,r,t,e.delay)}}else if(e.pollInterval>0){t.polling=true;ot(n,r,e)}else{ht(n,r,t,e)}}function At(e){if(Q.config.allowScriptTags&&(e.type==="text/javascript"||e.type==="module"||e.type==="")){var t=re().createElement("script");oe(e.attributes,function(e){t.setAttribute(e.name,e.value)});t.textContent=e.textContent;t.async=false;if(Q.config.inlineScriptNonce){t.nonce=Q.config.inlineScriptNonce}var r=e.parentElement;try{r.insertBefore(t,e)}catch(e){b(e)}finally{if(e.parentElement){e.parentElement.removeChild(e)}}}}function Nt(e){if(h(e,"script")){At(e)}oe(f(e,"script"),function(e){At(e)})}function It(e){var t=e.attributes;for(var r=0;r<t.length;r++){var n=t[r].name;if(s(n,"hx-on:")||s(n,"data-hx-on:")||s(n,"hx-on-")||s(n,"data-hx-on-")){return true}}return false}function kt(e){var t=null;var r=[];if(It(e)){r.push(e)}if(document.evaluate){var n=document.evaluate('.//*[@*[ starts-with(name(), "hx-on:") or starts-with(name(), "data-hx-on:") or'+' starts-with(name(), "hx-on-") or starts-with(name(), "data-hx-on-") ]]',e);while(t=n.iterateNext())r.push(t)}else{var i=e.getElementsByTagName("*");for(var a=0;a<i.length;a++){if(It(i[a])){r.push(i[a])}}}return r}function Pt(e){if(e.querySelectorAll){var t=", [hx-boost] a, [data-hx-boost] a, a[hx-boost], a[data-hx-boost]";var r=e.querySelectorAll(i+t+", form, [type='submit'], [hx-sse], [data-hx-sse], [hx-ws],"+" [data-hx-ws], [hx-ext], [data-hx-ext], [hx-trigger], [data-hx-trigger], [hx-on], [data-hx-on]");return r}else{return[]}}function Mt(e){var t=v(e.target,"button, input[type='submit']");var r=Dt(e);if(r){r.lastButtonClicked=t}}function Xt(e){var t=Dt(e);if(t){t.lastButtonClicked=null}}function Dt(e){var t=v(e.target,"button, input[type='submit']");if(!t){return}var r=g("#"+ee(t,"form"))||v(t,"form");if(!r){return}return ae(r)}function Ut(e){e.addEventListener("click",Mt);e.addEventListener("focusin",Mt);e.addEventListener("focusout",Xt)}function Bt(e){var t=Ye(e);var r=0;for(var n=0;n<t.length;n++){const i=t[n];if(i==="{"){r++}else if(i==="}"){r--}}return r}function Ft(t,e,r){var n=ae(t);if(!Array.isArray(n.onHandlers)){n.onHandlers=[]}var i;var a=function(e){return Tr(t,function(){if(!i){i=new Function("event",r)}i.call(t,e)})};t.addEventListener(e,a);n.onHandlers.push({event:e,listener:a})}function Vt(e){var t=te(e,"hx-on");if(t){var r={};var n=t.split("\n");var i=null;var a=0;while(n.length>0){var o=n.shift();var s=o.match(/^\s*([a-zA-Z:\-\.]+:)(.*)/);if(a===0&&s){o.split(":");i=s[1].slice(0,-1);r[i]=s[2]}else{r[i]+=o}a+=Bt(o)}for(var l in r){Ft(e,l,r[l])}}}function jt(e){Ae(e);for(var t=0;t<e.attributes.length;t++){var r=e.attributes[t].name;var n=e.attributes[t].value;if(s(r,"hx-on")||s(r,"data-hx-on")){var i=r.indexOf("-on")+3;var a=r.slice(i,i+1);if(a==="-"||a===":"){var o=r.slice(i+1);if(s(o,":")){o="htmx"+o}else if(s(o,"-")){o="htmx:"+o.slice(1)}else if(s(o,"htmx-")){o="htmx:"+o.slice(5)}Ft(e,o,n)}}}}function _t(t){if(v(t,Q.config.disableSelector)){p(t);return}var r=ae(t);if(r.initHash!==Le(t)){Ne(t);r.initHash=Le(t);Vt(t);ce(t,"htmx:beforeProcessNode");if(t.value){r.lastValue=t.value}var e=it(t);var n=Ht(t,r,e);if(!n){if(ne(t,"hx-boost")==="true"){lt(t,r,e)}else if(o(t,"hx-trigger")){e.forEach(function(e){Lt(t,e,r,function(){})})}}if(t.tagName==="FORM"||ee(t,"type")==="submit"&&o(t,"form")){Ut(t)}var i=te(t,"hx-sse");if(i){St(t,r,i)}var a=te(t,"hx-ws");if(a){pt(t,r,a)}ce(t,"htmx:afterProcessNode")}}function zt(e){e=g(e);if(v(e,Q.config.disableSelector)){p(e);return}_t(e);oe(Pt(e),function(e){_t(e)});oe(kt(e),jt)}function $t(e){return e.replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase()}function Wt(e,t){var r;if(window.CustomEvent&&typeof window.CustomEvent==="function"){r=new CustomEvent(e,{bubbles:true,cancelable:true,detail:t})}else{r=re().createEvent("CustomEvent");r.initCustomEvent(e,true,true,t)}return r}function fe(e,t,r){ce(e,t,le({error:t},r))}function Gt(e){return e==="htmx:afterProcessNode"}function R(e,t){oe(Fr(e),function(e){try{t(e)}catch(e){b(e)}})}function b(e){if(console.error){console.error(e)}else if(console.log){console.log("ERROR: ",e)}}function ce(e,t,r){e=g(e);if(r==null){r={}}r["elt"]=e;var n=Wt(t,r);if(Q.logger&&!Gt(t)){Q.logger(e,t,r)}if(r.error){b(r.error);ce(e,"htmx:error",{errorInfo:r})}var i=e.dispatchEvent(n);var a=$t(t);if(i&&a!==t){var o=Wt(a,n.detail);i=i&&e.dispatchEvent(o)}R(e,function(e){i=i&&(e.onEvent(t,n)!==false&&!n.defaultPrevented)});return i}var Jt=location.pathname+location.search;function Zt(){var e=re().querySelector("[hx-history-elt],[data-hx-history-elt]");return e||re().body}function Kt(e,t,r,n){if(!U()){return}if(Q.config.historyCacheSize<=0){localStorage.removeItem("htmx-history-cache");return}e=B(e);var i=E(localStorage.getItem("htmx-history-cache"))||[];for(var a=0;a<i.length;a++){if(i[a].url===e){i.splice(a,1);break}}var o={url:e,content:t,title:r,scroll:n};ce(re().body,"htmx:historyItemCreated",{item:o,cache:i});i.push(o);while(i.length>Q.config.historyCacheSize){i.shift()}while(i.length>0){try{localStorage.setItem("htmx-history-cache",JSON.stringify(i));break}catch(e){fe(re().body,"htmx:historyCacheError",{cause:e,cache:i});i.shift()}}}function Yt(e){if(!U()){return null}e=B(e);var t=E(localStorage.getItem("htmx-history-cache"))||[];for(var r=0;r<t.length;r++){if(t[r].url===e){return t[r]}}return null}function Qt(e){var t=Q.config.requestClass;var r=e.cloneNode(true);oe(f(r,"."+t),function(e){n(e,t)});return r.innerHTML}function er(){var e=Zt();var t=Jt||location.pathname+location.search;var r;try{r=re().querySelector('[hx-history="false" i],[data-hx-history="false" i]')}catch(e){r=re().querySelector('[hx-history="false"],[data-hx-history="false"]')}if(!r){ce(re().body,"htmx:beforeHistorySave",{path:t,historyElt:e});Kt(t,Qt(e),re().title,window.scrollY)}if(Q.config.historyEnabled)history.replaceState({htmx:true},re().title,window.location.href)}function tr(e){if(Q.config.getCacheBusterParam){e=e.replace(/org\.htmx\.cache-buster=[^&]*&?/,"");if(G(e,"&")||G(e,"?")){e=e.slice(0,-1)}}if(Q.config.historyEnabled){history.pushState({htmx:true},"",e)}Jt=e}function rr(e){if(Q.config.historyEnabled)history.replaceState({htmx:true},"",e);Jt=e}function nr(e){oe(e,function(e){e.call()})}function ir(a){var e=new XMLHttpRequest;var o={path:a,xhr:e};ce(re().body,"htmx:historyCacheMiss",o);e.open("GET",a,true);e.setRequestHeader("HX-Request","true");e.setRequestHeader("HX-History-Restore-Request","true");e.setRequestHeader("HX-Current-URL",re().location.href);e.onload=function(){if(this.status>=200&&this.status<400){ce(re().body,"htmx:historyCacheMissLoad",o);var e=l(this.response);e=e.querySelector("[hx-history-elt],[data-hx-history-elt]")||e;var t=Zt();var r=T(t);var n=Ve(this.response);if(n){var i=C("title");if(i){i.innerHTML=n}else{window.document.title=n}}Ue(t,e,r);nr(r.tasks);Jt=a;ce(re().body,"htmx:historyRestore",{path:a,cacheMiss:true,serverResponse:this.response})}else{fe(re().body,"htmx:historyCacheMissLoadError",o)}};e.send()}function ar(e){er();e=e||location.pathname+location.search;var t=Yt(e);if(t){var r=l(t.content);var n=Zt();var i=T(n);Ue(n,r,i);nr(i.tasks);document.title=t.title;setTimeout(function(){window.scrollTo(0,t.scroll)},0);Jt=e;ce(re().body,"htmx:historyRestore",{path:e,item:t})}else{if(Q.config.refreshOnHistoryMiss){window.location.reload(true)}else{ir(e)}}}function or(e){var t=pe(e,"hx-indicator");if(t==null){t=[e]}oe(t,function(e){var t=ae(e);t.requestCount=(t.requestCount||0)+1;e.classList["add"].call(e.classList,Q.config.requestClass)});return t}function sr(e){var t=pe(e,"hx-disabled-elt");if(t==null){t=[]}oe(t,function(e){var t=ae(e);t.requestCount=(t.requestCount||0)+1;e.setAttribute("disabled","")});return t}function lr(e,t){oe(e,function(e){var t=ae(e);t.requestCount=(t.requestCount||0)-1;if(t.requestCount===0){e.classList["remove"].call(e.classList,Q.config.requestClass)}});oe(t,function(e){var t=ae(e);t.requestCount=(t.requestCount||0)-1;if(t.requestCount===0){e.removeAttribute("disabled")}})}function ur(e,t){for(var r=0;r<e.length;r++){var n=e[r];if(n.isSameNode(t)){return true}}return false}function fr(e){if(e.name===""||e.name==null||e.disabled||v(e,"fieldset[disabled]")){return false}if(e.type==="button"||e.type==="submit"||e.tagName==="image"||e.tagName==="reset"||e.tagName==="file"){return false}if(e.type==="checkbox"||e.type==="radio"){return e.checked}return true}function cr(e,t,r){if(e!=null&&t!=null){var n=r[e];if(n===undefined){r[e]=t}else if(Array.isArray(n)){if(Array.isArray(t)){r[e]=n.concat(t)}else{n.push(t)}}else{if(Array.isArray(t)){r[e]=[n].concat(t)}else{r[e]=[n,t]}}}}function hr(t,r,n,e,i){if(e==null||ur(t,e)){return}else{t.push(e)}if(fr(e)){var a=ee(e,"name");var o=e.value;if(e.multiple&&e.tagName==="SELECT"){o=M(e.querySelectorAll("option:checked")).map(function(e){return e.value})}if(e.files){o=M(e.files)}cr(a,o,r);if(i){vr(e,n)}}if(h(e,"form")){var s=e.elements;oe(s,function(e){hr(t,r,n,e,i)})}}function vr(e,t){if(e.willValidate){ce(e,"htmx:validation:validate");if(!e.checkValidity()){t.push({elt:e,message:e.validationMessage,validity:e.validity});ce(e,"htmx:validation:failed",{message:e.validationMessage,validity:e.validity})}}}function dr(e,t){var r=[];var n={};var i={};var a=[];var o=ae(e);if(o.lastButtonClicked&&!se(o.lastButtonClicked)){o.lastButtonClicked=null}var s=h(e,"form")&&e.noValidate!==true||te(e,"hx-validate")==="true";if(o.lastButtonClicked){s=s&&o.lastButtonClicked.formNoValidate!==true}if(t!=="get"){hr(r,i,a,v(e,"form"),s)}hr(r,n,a,e,s);if(o.lastButtonClicked||e.tagName==="BUTTON"||e.tagName==="INPUT"&&ee(e,"type")==="submit"){var l=o.lastButtonClicked||e;var u=ee(l,"name");cr(u,l.value,i)}var f=pe(e,"hx-include");oe(f,function(e){hr(r,n,a,e,s);if(!h(e,"form")){oe(e.querySelectorAll(rt),function(e){hr(r,n,a,e,s)})}});n=le(n,i);return{errors:a,values:n}}function gr(e,t,r){if(e!==""){e+="&"}if(String(r)==="[object Object]"){r=JSON.stringify(r)}var n=encodeURIComponent(r);e+=encodeURIComponent(t)+"="+n;return e}function mr(e){var t="";for(var r in e){if(e.hasOwnProperty(r)){var n=e[r];if(Array.isArray(n)){oe(n,function(e){t=gr(t,r,e)})}else{t=gr(t,r,n)}}}return t}function pr(e){var t=new FormData;for(var r in e){if(e.hasOwnProperty(r)){var n=e[r];if(Array.isArray(n)){oe(n,function(e){t.append(r,e)})}else{t.append(r,n)}}}return t}function xr(e,t,r){var n={"HX-Request":"true","HX-Trigger":ee(e,"id"),"HX-Trigger-Name":ee(e,"name"),"HX-Target":te(t,"id"),"HX-Current-URL":re().location.href};Rr(e,"hx-headers",false,n);if(r!==undefined){n["HX-Prompt"]=r}if(ae(e).boosted){n["HX-Boosted"]="true"}return n}function yr(t,e){var r=ne(e,"hx-params");if(r){if(r==="none"){return{}}else if(r==="*"){return t}else if(r.indexOf("not ")===0){oe(r.substr(4).split(","),function(e){e=e.trim();delete t[e]});return t}else{var n={};oe(r.split(","),function(e){e=e.trim();n[e]=t[e]});return n}}else{return t}}function br(e){return ee(e,"href")&&ee(e,"href").indexOf("#")>=0}function wr(e,t){var r=t?t:ne(e,"hx-swap");var n={swapStyle:ae(e).boosted?"innerHTML":Q.config.defaultSwapStyle,swapDelay:Q.config.defaultSwapDelay,settleDelay:Q.config.defaultSettleDelay};if(Q.config.scrollIntoViewOnBoost&&ae(e).boosted&&!br(e)){n["show"]="top"}if(r){var i=D(r);if(i.length>0){for(var a=0;a<i.length;a++){var o=i[a];if(o.indexOf("swap:")===0){n["swapDelay"]=d(o.substr(5))}else if(o.indexOf("settle:")===0){n["settleDelay"]=d(o.substr(7))}else if(o.indexOf("transition:")===0){n["transition"]=o.substr(11)==="true"}else if(o.indexOf("ignoreTitle:")===0){n["ignoreTitle"]=o.substr(12)==="true"}else if(o.indexOf("scroll:")===0){var s=o.substr(7);var l=s.split(":");var u=l.pop();var f=l.length>0?l.join(":"):null;n["scroll"]=u;n["scrollTarget"]=f}else if(o.indexOf("show:")===0){var c=o.substr(5);var l=c.split(":");var h=l.pop();var f=l.length>0?l.join(":"):null;n["show"]=h;n["showTarget"]=f}else if(o.indexOf("focus-scroll:")===0){var v=o.substr("focus-scroll:".length);n["focusScroll"]=v=="true"}else if(a==0){n["swapStyle"]=o}else{b("Unknown modifier in hx-swap: "+o)}}}}return n}function Sr(e){return ne(e,"hx-encoding")==="multipart/form-data"||h(e,"form")&&ee(e,"enctype")==="multipart/form-data"}function Er(t,r,n){var i=null;R(r,function(e){if(i==null){i=e.encodeParameters(t,n,r)}});if(i!=null){return i}else{if(Sr(r)){return pr(n)}else{return mr(n)}}}function T(e){return{tasks:[],elts:[e]}}function Cr(e,t){var r=e[0];var n=e[e.length-1];if(t.scroll){var i=null;if(t.scrollTarget){i=ue(r,t.scrollTarget)}if(t.scroll==="top"&&(r||i)){i=i||r;i.scrollTop=0}if(t.scroll==="bottom"&&(n||i)){i=i||n;i.scrollTop=i.scrollHeight}}if(t.show){var i=null;if(t.showTarget){var a=t.showTarget;if(t.showTarget==="window"){a="body"}i=ue(r,a)}if(t.show==="top"&&(r||i)){i=i||r;i.scrollIntoView({block:"start",behavior:Q.config.scrollBehavior})}if(t.show==="bottom"&&(n||i)){i=i||n;i.scrollIntoView({block:"end",behavior:Q.config.scrollBehavior})}}}function Rr(e,t,r,n){if(n==null){n={}}if(e==null){return n}var i=te(e,t);if(i){var a=i.trim();var o=r;if(a==="unset"){return null}if(a.indexOf("javascript:")===0){a=a.substr(11);o=true}else if(a.indexOf("js:")===0){a=a.substr(3);o=true}if(a.indexOf("{")!==0){a="{"+a+"}"}var s;if(o){s=Tr(e,function(){return Function("return ("+a+")")()},{})}else{s=E(a)}for(var l in s){if(s.hasOwnProperty(l)){if(n[l]==null){n[l]=s[l]}}}}return Rr(u(e),t,r,n)}function Tr(e,t,r){if(Q.config.allowEval){return t()}else{fe(e,"htmx:evalDisallowedError");return r}}function Or(e,t){return Rr(e,"hx-vars",true,t)}function qr(e,t){return Rr(e,"hx-vals",false,t)}function Hr(e){return le(Or(e),qr(e))}function Lr(t,r,n){if(n!==null){try{t.setRequestHeader(r,n)}catch(e){t.setRequestHeader(r,encodeURIComponent(n));t.setRequestHeader(r+"-URI-AutoEncoded","true")}}}function Ar(t){if(t.responseURL&&typeof URL!=="undefined"){try{var e=new URL(t.responseURL);return e.pathname+e.search}catch(e){fe(re().body,"htmx:badResponseUrl",{url:t.responseURL})}}}function O(e,t){return t.test(e.getAllResponseHeaders())}function Nr(e,t,r){e=e.toLowerCase();if(r){if(r instanceof Element||I(r,"String")){return he(e,t,null,null,{targetOverride:g(r),returnPromise:true})}else{return he(e,t,g(r.source),r.event,{handler:r.handler,headers:r.headers,values:r.values,targetOverride:g(r.target),swapOverride:r.swap,select:r.select,returnPromise:true})}}else{return he(e,t,null,null,{returnPromise:true})}}function Ir(e){var t=[];while(e){t.push(e);e=e.parentElement}return t}function kr(e,t,r){var n;var i;if(typeof URL==="function"){i=new URL(t,document.location.href);var a=document.location.origin;n=a===i.origin}else{i=t;n=s(t,document.location.origin)}if(Q.config.selfRequestsOnly){if(!n){return false}}return ce(e,"htmx:validateUrl",le({url:i,sameHost:n},r))}function he(t,r,n,i,a,e){var o=null;var s=null;a=a!=null?a:{};if(a.returnPromise&&typeof Promise!=="undefined"){var l=new Promise(function(e,t){o=e;s=t})}if(n==null){n=re().body}var M=a.handler||Mr;var X=a.select||null;if(!se(n)){ie(o);return l}var u=a.targetOverride||ye(n);if(u==null||u==me){fe(n,"htmx:targetError",{target:te(n,"hx-target")});ie(s);return l}var f=ae(n);var c=f.lastButtonClicked;if(c){var h=ee(c,"formaction");if(h!=null){r=h}var v=ee(c,"formmethod");if(v!=null){if(v.toLowerCase()!=="dialog"){t=v}}}var d=ne(n,"hx-confirm");if(e===undefined){var D=function(e){return he(t,r,n,i,a,!!e)};var U={target:u,elt:n,path:r,verb:t,triggeringEvent:i,etc:a,issueRequest:D,question:d};if(ce(n,"htmx:confirm",U)===false){ie(o);return l}}var g=n;var m=ne(n,"hx-sync");var p=null;var x=false;if(m){var B=m.split(":");var F=B[0].trim();if(F==="this"){g=xe(n,"hx-sync")}else{g=ue(n,F)}m=(B[1]||"drop").trim();f=ae(g);if(m==="drop"&&f.xhr&&f.abortable!==true){ie(o);return l}else if(m==="abort"){if(f.xhr){ie(o);return l}else{x=true}}else if(m==="replace"){ce(g,"htmx:abort")}else if(m.indexOf("queue")===0){var V=m.split(" ");p=(V[1]||"last").trim()}}if(f.xhr){if(f.abortable){ce(g,"htmx:abort")}else{if(p==null){if(i){var y=ae(i);if(y&&y.triggerSpec&&y.triggerSpec.queue){p=y.triggerSpec.queue}}if(p==null){p="last"}}if(f.queuedRequests==null){f.queuedRequests=[]}if(p==="first"&&f.queuedRequests.length===0){f.queuedRequests.push(function(){he(t,r,n,i,a)})}else if(p==="all"){f.queuedRequests.push(function(){he(t,r,n,i,a)})}else if(p==="last"){f.queuedRequests=[];f.queuedRequests.push(function(){he(t,r,n,i,a)})}ie(o);return l}}var b=new XMLHttpRequest;f.xhr=b;f.abortable=x;var w=function(){f.xhr=null;f.abortable=false;if(f.queuedRequests!=null&&f.queuedRequests.length>0){var e=f.queuedRequests.shift();e()}};var j=ne(n,"hx-prompt");if(j){var S=prompt(j);if(S===null||!ce(n,"htmx:prompt",{prompt:S,target:u})){ie(o);w();return l}}if(d&&!e){if(!confirm(d)){ie(o);w();return l}}var E=xr(n,u,S);if(t!=="get"&&!Sr(n)){E["Content-Type"]="application/x-www-form-urlencoded"}if(a.headers){E=le(E,a.headers)}var _=dr(n,t);var C=_.errors;var R=_.values;if(a.values){R=le(R,a.values)}var z=Hr(n);var $=le(R,z);var T=yr($,n);if(Q.config.getCacheBusterParam&&t==="get"){T["org.htmx.cache-buster"]=ee(u,"id")||"true"}if(r==null||r===""){r=re().location.href}var O=Rr(n,"hx-request");var W=ae(n).boosted;var q=Q.config.methodsThatUseUrlParams.indexOf(t)>=0;var H={boosted:W,useUrlParams:q,parameters:T,unfilteredParameters:$,headers:E,target:u,verb:t,errors:C,withCredentials:a.credentials||O.credentials||Q.config.withCredentials,timeout:a.timeout||O.timeout||Q.config.timeout,path:r,triggeringEvent:i};if(!ce(n,"htmx:configRequest",H)){ie(o);w();return l}r=H.path;t=H.verb;E=H.headers;T=H.parameters;C=H.errors;q=H.useUrlParams;if(C&&C.length>0){ce(n,"htmx:validation:halted",H);ie(o);w();return l}var G=r.split("#");var J=G[0];var L=G[1];var A=r;if(q){A=J;var Z=Object.keys(T).length!==0;if(Z){if(A.indexOf("?")<0){A+="?"}else{A+="&"}A+=mr(T);if(L){A+="#"+L}}}if(!kr(n,A,H)){fe(n,"htmx:invalidPath",H);ie(s);return l}b.open(t.toUpperCase(),A,true);b.overrideMimeType("text/html");b.withCredentials=H.withCredentials;b.timeout=H.timeout;if(O.noHeaders){}else{for(var N in E){if(E.hasOwnProperty(N)){var K=E[N];Lr(b,N,K)}}}var I={xhr:b,target:u,requestConfig:H,etc:a,boosted:W,select:X,pathInfo:{requestPath:r,finalRequestPath:A,anchor:L}};b.onload=function(){try{var e=Ir(n);I.pathInfo.responsePath=Ar(b);M(n,I);lr(k,P);ce(n,"htmx:afterRequest",I);ce(n,"htmx:afterOnLoad",I);if(!se(n)){var t=null;while(e.length>0&&t==null){var r=e.shift();if(se(r)){t=r}}if(t){ce(t,"htmx:afterRequest",I);ce(t,"htmx:afterOnLoad",I)}}ie(o);w()}catch(e){fe(n,"htmx:onLoadError",le({error:e},I));throw e}};b.onerror=function(){lr(k,P);fe(n,"htmx:afterRequest",I);fe(n,"htmx:sendError",I);ie(s);w()};b.onabort=function(){lr(k,P);fe(n,"htmx:afterRequest",I);fe(n,"htmx:sendAbort",I);ie(s);w()};b.ontimeout=function(){lr(k,P);fe(n,"htmx:afterRequest",I);fe(n,"htmx:timeout",I);ie(s);w()};if(!ce(n,"htmx:beforeRequest",I)){ie(o);w();return l}var k=or(n);var P=sr(n);oe(["loadstart","loadend","progress","abort"],function(t){oe([b,b.upload],function(e){e.addEventListener(t,function(e){ce(n,"htmx:xhr:"+t,{lengthComputable:e.lengthComputable,loaded:e.loaded,total:e.total})})})});ce(n,"htmx:beforeSend",I);var Y=q?null:Er(b,n,T);b.send(Y);return l}function Pr(e,t){var r=t.xhr;var n=null;var i=null;if(O(r,/HX-Push:/i)){n=r.getResponseHeader("HX-Push");i="push"}else if(O(r,/HX-Push-Url:/i)){n=r.getResponseHeader("HX-Push-Url");i="push"}else if(O(r,/HX-Replace-Url:/i)){n=r.getResponseHeader("HX-Replace-Url");i="replace"}if(n){if(n==="false"){return{}}else{return{type:i,path:n}}}var a=t.pathInfo.finalRequestPath;var o=t.pathInfo.responsePath;var s=ne(e,"hx-push-url");var l=ne(e,"hx-replace-url");var u=ae(e).boosted;var f=null;var c=null;if(s){f="push";c=s}else if(l){f="replace";c=l}else if(u){f="push";c=o||a}if(c){if(c==="false"){return{}}if(c==="true"){c=o||a}if(t.pathInfo.anchor&&c.indexOf("#")===-1){c=c+"#"+t.pathInfo.anchor}return{type:f,path:c}}else{return{}}}function Mr(l,u){var f=u.xhr;var c=u.target;var e=u.etc;var t=u.requestConfig;var h=u.select;if(!ce(l,"htmx:beforeOnLoad",u))return;if(O(f,/HX-Trigger:/i)){_e(f,"HX-Trigger",l)}if(O(f,/HX-Location:/i)){er();var r=f.getResponseHeader("HX-Location");var v;if(r.indexOf("{")===0){v=E(r);r=v["path"];delete v["path"]}Nr("GET",r,v).then(function(){tr(r)});return}var n=O(f,/HX-Refresh:/i)&&"true"===f.getResponseHeader("HX-Refresh");if(O(f,/HX-Redirect:/i)){location.href=f.getResponseHeader("HX-Redirect");n&&location.reload();return}if(n){location.reload();return}if(O(f,/HX-Retarget:/i)){if(f.getResponseHeader("HX-Retarget")==="this"){u.target=l}else{u.target=ue(l,f.getResponseHeader("HX-Retarget"))}}var d=Pr(l,u);var i=f.status>=200&&f.status<400&&f.status!==204;var g=f.response;var a=f.status>=400;var m=Q.config.ignoreTitle;var o=le({shouldSwap:i,serverResponse:g,isError:a,ignoreTitle:m},u);if(!ce(c,"htmx:beforeSwap",o))return;c=o.target;g=o.serverResponse;a=o.isError;m=o.ignoreTitle;u.target=c;u.failed=a;u.successful=!a;if(o.shouldSwap){if(f.status===286){at(l)}R(l,function(e){g=e.transformResponse(g,f,l)});if(d.type){er()}var s=e.swapOverride;if(O(f,/HX-Reswap:/i)){s=f.getResponseHeader("HX-Reswap")}var v=wr(l,s);if(v.hasOwnProperty("ignoreTitle")){m=v.ignoreTitle}c.classList.add(Q.config.swappingClass);var p=null;var x=null;var y=function(){try{var e=document.activeElement;var t={};try{t={elt:e,start:e?e.selectionStart:null,end:e?e.selectionEnd:null}}catch(e){}var r;if(h){r=h}if(O(f,/HX-Reselect:/i)){r=f.getResponseHeader("HX-Reselect")}if(d.type){ce(re().body,"htmx:beforeHistoryUpdate",le({history:d},u));if(d.type==="push"){tr(d.path);ce(re().body,"htmx:pushedIntoHistory",{path:d.path})}else{rr(d.path);ce(re().body,"htmx:replacedInHistory",{path:d.path})}}var n=T(c);je(v.swapStyle,c,l,g,n,r);if(t.elt&&!se(t.elt)&&ee(t.elt,"id")){var i=document.getElementById(ee(t.elt,"id"));var a={preventScroll:v.focusScroll!==undefined?!v.focusScroll:!Q.config.defaultFocusScroll};if(i){if(t.start&&i.setSelectionRange){try{i.setSelectionRange(t.start,t.end)}catch(e){}}i.focus(a)}}c.classList.remove(Q.config.swappingClass);oe(n.elts,function(e){if(e.classList){e.classList.add(Q.config.settlingClass)}ce(e,"htmx:afterSwap",u)});if(O(f,/HX-Trigger-After-Swap:/i)){var o=l;if(!se(l)){o=re().body}_e(f,"HX-Trigger-After-Swap",o)}var s=function(){oe(n.tasks,function(e){e.call()});oe(n.elts,function(e){if(e.classList){e.classList.remove(Q.config.settlingClass)}ce(e,"htmx:afterSettle",u)});if(u.pathInfo.anchor){var e=re().getElementById(u.pathInfo.anchor);if(e){e.scrollIntoView({block:"start",behavior:"auto"})}}if(n.title&&!m){var t=C("title");if(t){t.innerHTML=n.title}else{window.document.title=n.title}}Cr(n.elts,v);if(O(f,/HX-Trigger-After-Settle:/i)){var r=l;if(!se(l)){r=re().body}_e(f,"HX-Trigger-After-Settle",r)}ie(p)};if(v.settleDelay>0){setTimeout(s,v.settleDelay)}else{s()}}catch(e){fe(l,"htmx:swapError",u);ie(x);throw e}};var b=Q.config.globalViewTransitions;if(v.hasOwnProperty("transition")){b=v.transition}if(b&&ce(l,"htmx:beforeTransition",u)&&typeof Promise!=="undefined"&&document.startViewTransition){var w=new Promise(function(e,t){p=e;x=t});var S=y;y=function(){document.startViewTransition(function(){S();return w})}}if(v.swapDelay>0){setTimeout(y,v.swapDelay)}else{y()}}if(a){fe(l,"htmx:responseError",le({error:"Response Status Error Code "+f.status+" from "+u.pathInfo.requestPath},u))}}var Xr={};function Dr(){return{init:function(e){return null},onEvent:function(e,t){return true},transformResponse:function(e,t,r){return e},isInlineSwap:function(e){return false},handleSwap:function(e,t,r,n){return false},encodeParameters:function(e,t,r){return null}}}function Ur(e,t){if(t.init){t.init(r)}Xr[e]=le(Dr(),t)}function Br(e){delete Xr[e]}function Fr(e,r,n){if(e==undefined){return r}if(r==undefined){r=[]}if(n==undefined){n=[]}var t=te(e,"hx-ext");if(t){oe(t.split(","),function(e){e=e.replace(/ /g,"");if(e.slice(0,7)=="ignore:"){n.push(e.slice(7));return}if(n.indexOf(e)<0){var t=Xr[e];if(t&&r.indexOf(t)<0){r.push(t)}}})}return Fr(u(e),r,n)}var Vr=false;re().addEventListener("DOMContentLoaded",function(){Vr=true});function jr(e){if(Vr||re().readyState==="complete"){e()}else{re().addEventListener("DOMContentLoaded",e)}}function _r(){if(Q.config.includeIndicatorStyles!==false){re().head.insertAdjacentHTML("beforeend","<style>                      ."+Q.config.indicatorClass+"{opacity:0}                      ."+Q.config.requestClass+" ."+Q.config.indicatorClass+"{opacity:1; transition: opacity 200ms ease-in;}                      ."+Q.config.requestClass+"."+Q.config.indicatorClass+"{opacity:1; transition: opacity 200ms ease-in;}                    </style>")}}function zr(){var e=re().querySelector('meta[name="htmx-config"]');if(e){return E(e.content)}else{return null}}function $r(){var e=zr();if(e){Q.config=le(Q.config,e)}}jr(function(){$r();_r();var e=re().body;zt(e);var t=re().querySelectorAll("[hx-trigger='restored'],[data-hx-trigger='restored']");e.addEventListener("htmx:abort",function(e){var t=e.target;var r=ae(t);if(r&&r.xhr){r.xhr.abort()}});const r=window.onpopstate?window.onpopstate.bind(window):null;window.onpopstate=function(e){if(e.state&&e.state.htmx){ar();oe(t,function(e){ce(e,"htmx:restored",{document:re(),triggerEvent:ce})})}else{if(r){r(e)}}};setTimeout(function(){ce(e,"htmx:load",{});e=null},0)});return Q}()});
3 3
\ No newline at end of file
4 4
Binary files a/public/htmx.min.js.gz and b/public/htmx.min.js.gz differ