PageSourceSearch

https://www.opava-city.cz/components/_common/combine.jsp?t=js&f=/t…&v=1789732510973&lng=cz

js opava-city.cz collected 2026-10-02 15:01:39 UTC 631,243 bytes, 20,661 lines download raw bytes

1/* =========================================================================== */
2/* /templates/2022/js/ninja.js */
3/* =========================================================================== */
4(function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(require,module,exports){
5(function (process){(function (){
6"use strict";
7
8Object.defineProperty(exports, "__esModule", {
9  value: true
10});
11exports.createPopper = void 0;
12Object.defineProperty(exports, "detectOverflow", {
13  enumerable: true,
14  get: function () {
15    return _detectOverflow.default;
16  }
17});
18exports.popperGenerator = popperGenerator;
19var _getCompositeRect = _interopRequireDefault(require("./dom-utils/getCompositeRect.js"));
20var _getLayoutRect = _interopRequireDefault(require("./dom-utils/getLayoutRect.js"));
21var _listScrollParents = _interopRequireDefault(require("./dom-utils/listScrollParents.js"));
22var _getOffsetParent = _interopRequireDefault(require("./dom-utils/getOffsetParent.js"));
23var _getComputedStyle2 = _interopRequireDefault(require("./dom-utils/getComputedStyle.js"));
24var _orderModifiers = _interopRequireDefault(require("./utils/orderModifiers.js"));
25var _debounce = _interopRequireDefault(require("./utils/debounce.js"));
26var _validateModifiers = _interopRequireDefault(require("./utils/validateModifiers.js"));
27var _uniqueBy = _interopRequireDefault(require("./utils/uniqueBy.js"));
28var _getBasePlacement = _interopRequireDefault(require("./utils/getBasePlacement.js"));
29var _mergeByName = _interopRequireDefault(require("./utils/mergeByName.js"));
30var _detectOverflow = _interopRequireDefault(require("./utils/detectOverflow.js"));
31var _instanceOf = require("./dom-utils/instanceOf.js");
32var _enums = require("./enums.js");
33function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
34var INVALID_ELEMENT_ERROR = 'Popper: Invalid reference or popper argument provided. They must be either a DOM element or virtual element.';
35var INFINITE_LOOP_ERROR = 'Popper: An infinite loop in the modifiers cycle has been detected! The cycle has been interrupted to prevent a browser crash.';
36var DEFAULT_OPTIONS = {
37  placement: 'bottom',
38  modifiers: [],
39  strategy: 'absolute'
40};
41function areValidElements() {
42  for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
43    args[_key] = arguments[_key];
44  }
45  return !args.some(function (element) {
46    return !(element && typeof element.getBoundingClientRect === 'function');
47  });
48}
49function popperGenerator(generatorOptions) {
50  if (generatorOptions === void 0) {
51    generatorOptions = {};
52  }
53  var _generatorOptions = generatorOptions,
54    _generatorOptions$def = _generatorOptions.defaultModifiers,
55    defaultModifiers = _generatorOptions$def === void 0 ? [] : _generatorOptions$def,
56    _generatorOptions$def2 = _generatorOptions.defaultOptions,
57    defaultOptions = _generatorOptions$def2 === void 0 ? DEFAULT_OPTIONS : _generatorOptions$def2;
58  return function createPopper(reference, popper, options) {
59    if (options === void 0) {
60      options = defaultOptions;
61    }
62    var state = {
63      placement: 'bottom',
64      orderedModifiers: [],
65      options: Object.assign({}, DEFAULT_OPTIONS, defaultOptions),
66      modifiersData: {},
67      elements: {
68        reference: reference,
69        popper: popper
70      },
71      attributes: {},
72      styles: {}
73    };
74    var effectCleanupFns = [];
75    var isDestroyed = false;
76    var instance = {
77      state: state,
78      setOptions: function setOptions(setOptionsAction) {
79        var options = typeof setOptionsAction === 'function' ? setOptionsAction(state.options) : setOptionsAction;
80        cleanupModifierEffects();
81        state.options = Object.assign({}, defaultOptions, state.options, options);
82        state.scrollParents = {
83          reference: (0, _instanceOf.isElement)(reference) ? (0, _listScrollParents.default)(reference) : reference.contextElement ? (0, _listScrollParents.default)(reference.contextElement) : [],
84          popper: (0, _listScrollParents.default)(popper)
85        }; // Orders the modifiers based on their dependencies and `phase`
86        // properties
87
88        var orderedModifiers = (0, _orderModifiers.default)((0, _mergeByName.default)([].concat(defaultModifiers, state.options.modifiers))); // Strip out disabled modifiers
89
90        state.orderedModifiers = orderedModifiers.filter(function (m) {
91          return m.enabled;
92        }); // Validate the provided modifiers so that the consumer will get warned
93        // if one of the modifiers is invalid for any reason
94
95        if (process.env.NODE_ENV !== "production") {
96          var modifiers = (0, _uniqueBy.default)([].concat(orderedModifiers, state.options.modifiers), function (_ref) {
97            var name = _ref.name;
98            return name;
99          });
100          (0, _validateModifiers.default)(modifiers);
101          if ((0, _getBasePlacement.default)(state.options.placement) === _enums.auto) {
102            var flipModifier = state.orderedModifiers.find(function (_ref2) {
103              var name = _ref2.name;
104              return name === 'flip';
105            });
106            if (!flipModifier) {
107              console.error(['Popper: "auto" placements require the "flip" modifier be', 'present and enabled to work.'].join(' '));
108            }
109          }
110          var _getComputedStyle = (0, _getComputedStyle2.default)(popper),
111            marginTop = _getComputedStyle.marginTop,
112            marginRight = _getComputedStyle.marginRight,
113            marginBottom = _getComputedStyle.marginBottom,
114            marginLeft = _getComputedStyle.marginLeft; // We no longer take into account `margins` on the popper, and it can
115          // cause bugs with positioning, so we'll warn the consumer
116
117          if ([marginTop, marginRight, marginBottom, marginLeft].some(function (margin) {
118            return parseFloat(margin);
119          })) {
120            console.warn(['Popper: CSS "margin" styles cannot be used to apply padding', 'between the popper and its reference element or boundary.', 'To replicate margin, use the `offset` modifier, as well as', 'the `padding` option in the `preventOverflow` and `flip`', 'modifiers.'].join(' '));
121          }
122        }
123        runModifierEffects();
124        return instance.update();
125      },
126      // Sync update – it will always be executed, even if not necessary. This
127      // is useful for low frequency updates where sync behavior simplifies the
128      // logic.
129      // For high frequency updates (e.g. `resize` and `scroll` events), always
130      // prefer the async Popper#update method
131      forceUpdate: function forceUpdate() {
132        if (isDestroyed) {
133          return;
134        }
135        var _state$elements = state.elements,
136          reference = _state$elements.reference,
137          popper = _state$elements.popper; // Don't proceed if `reference` or `popper` are not valid elements
138        // anymore
139
140        if (!areValidElements(reference, popper)) {
141          if (process.env.NODE_ENV !== "production") {
142            console.error(INVALID_ELEMENT_ERROR);
143          }
144          return;
145        } // Store the reference and popper rects to be read by modifiers
146
147        state.rects = {
148          reference: (0, _getCompositeRect.default)(reference, (0, _getOffsetParent.default)(popper), state.options.strategy === 'fixed'),
149          popper: (0, _getLayoutRect.default)(popper)
150        }; // Modifiers have the ability to reset the current update cycle. The
151        // most common use case for this is the `flip` modifier changing the
152        // placement, which then needs to re-run all the modifiers, because the
153        // logic was previously ran for the previous placement and is therefore
154        // stale/incorrect
155
156        state.reset = false;
157        state.placement = state.options.placement; // On each update cycle, the `modifiersData` property for each modifier
158        // is filled with the initial data specified by the modifier. This means
159        // it doesn't persist and is fresh on each update.
160        // To ensure persistent data, use `${name}#persistent`
161
162        state.orderedModifiers.forEach(function (modifier) {
163          return state.modifiersData[modifier.name] = Object.assign({}, modifier.data);
164        });
165        var __debug_loops__ = 0;
166        for (var index = 0; index < state.orderedModifiers.length; index++) {
167          if (process.env.NODE_ENV !== "production") {
168            __debug_loops__ += 1;
169            if (__debug_loops__ > 100) {
170              console.error(INFINITE_LOOP_ERROR);
171              break;
172            }
173          }
174          if (state.reset === true) {
175            state.reset = false;
176            index = -1;
177            continue;
178          }
179          var _state$orderedModifie = state.orderedModifiers[index],
180            fn = _state$orderedModifie.fn,
181            _state$orderedModifie2 = _state$orderedModifie.options,
182            _options = _state$orderedModifie2 === void 0 ? {} : _state$orderedModifie2,
183            name = _state$orderedModifie.name;
184          if (typeof fn === 'function') {
185            state = fn({
186              state: state,
187              options: _options,
188              name: name,
189              instance: instance
190            }) || state;
191          }
192        }
193      },
194      // Async and optimistically optimized update – it will not be executed if
195      // not necessary (debounced to run at most once-per-tick)
196      update: (0, _debounce.default)(function () {
197        return new Promise(function (resolve) {
198          instance.forceUpdate();
199          resolve(state);
200        });
201      }),
202      destroy: function destroy() {
203        cleanupModifierEffects();
204        isDestroyed = true;
205      }
206    };
207    if (!areValidElements(reference, popper)) {
208      if (process.env.NODE_ENV !== "production") {
209        console.error(INVALID_ELEMENT_ERROR);
210      }
211      return instance;
212    }
213    instance.setOptions(options).then(function (state) {
214      if (!isDestroyed && options.onFirstUpdate) {
215        options.onFirstUpdate(state);
216      }
217    }); // Modifiers have the ability to execute arbitrary code before the first
218    // update cycle runs. They will be executed in the same order as the update
219    // cycle. This is useful when a modifier adds some persistent data that
220    // other modifiers need to use, but the modifier is run after the dependent
221    // one.
222
223    function runModifierEffects() {
224      state.orderedModifiers.forEach(function (_ref3) {
225        var name = _ref3.name,
226          _ref3$options = _ref3.options,
227          options = _ref3$options === void 0 ? {} : _ref3$options,
228          effect = _ref3.effect;
229        if (typeof effect === 'function') {
230          var cleanupFn = effect({
231            state: state,
232            name: name,
233            instance: instance,
234            options: options
235          });
236          var noopFn = function noopFn() {};
237          effectCleanupFns.push(cleanupFn || noopFn);
238        }
239      });
240    }
241    function cleanupModifierEffects() {
242      effectCleanupFns.forEach(function (fn) {
243        return fn();
244      });
245      effectCleanupFns = [];
246    }
247    return instance;
248  };
249}
250var createPopper = /*#__PURE__*/popperGenerator(); // eslint-disable-next-line import/no-unused-modules
251exports.createPopper = createPopper;
252
253}).call(this)}).call(this,require('_process'))
254},{"./dom-utils/getCompositeRect.js":5,"./dom-utils/getComputedStyle.js":6,"./dom-utils/getL
254ayoutRect.js":10,"./dom-utils/getOffsetParent.js":13,"./dom-utils/instanceOf.js":20,"./dom-utils/listScrollParents.js":24,"./enums.js":25,"./utils/debounce.js":41,"./utils/detectOverflow.js":42,"./utils/getBasePlacement.js":46,"./utils/mergeByName.js":53,"./utils/orderModifiers.js":55,"./utils/uniqueBy.js":57,"./utils/validateModifiers.js":59,"_process":64}],2:[function(require,module,exports){
255"use strict";
256
257Object.defineProperty(exports, "__esModule", {
258  value: true
259});
260exports.default = contains;
261var _instanceOf = require("./instanceOf.js");
262function contains(parent, child) {
263  var rootNode = child.getRootNode && child.getRootNode(); // First, attempt with faster native method
264
265  if (parent.contains(child)) {
266    return true;
267  } // then fallback to custom implementation with Shadow DOM support
268  else if (rootNode && (0, _instanceOf.isShadowRoot)(rootNode)) {
269    var next = child;
270    do {
271      if (next && parent.isSameNode(next)) {
272        return true;
273      } // $FlowFixMe[prop-missing]: need a better way to handle this...
274
275      next = next.parentNode || next.host;
276    } while (next);
277  } // Give up, the result is false
278
279  return false;
280}
281
282},{"./instanceOf.js":20}],3:[function(require,module,exports){
283"use strict";
284
285Object.defineProperty(exports, "__esModule", {
286  value: true
287});
288exports.default = getBoundingClientRect;
289var _instanceOf = require("./instanceOf.js");
290var _math = require("../utils/math.js");
291var _getWindow = _interopRequireDefault(require("./getWindow.js"));
292var _isLayoutViewport = _interopRequireDefault(require("./isLayoutViewport.js"));
293function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
294function getBoundingClientRect(element, includeScale, isFixedStrategy) {
295  if (includeScale === void 0) {
296    includeScale = false;
297  }
298  if (isFixedStrategy === void 0) {
299    isFixedStrategy = false;
300  }
301  var clientRect = element.getBoundingClientRect();
302  var scaleX = 1;
303  var scaleY = 1;
304  if (includeScale && (0, _instanceOf.isHTMLElement)(element)) {
305    scaleX = element.offsetWidth > 0 ? (0, _math.round)(clientRect.width) / element.offsetWidth || 1 : 1;
306    scaleY = element.offsetHeight > 0 ? (0, _math.round)(clientRect.height) / element.offsetHeight || 1 : 1;
307  }
308  var _ref = (0, _instanceOf.isElement)(element) ? (0, _getWindow.default)(element) : window,
309    visualViewport = _ref.visualViewport;
310  var addVisualOffsets = !(0, _isLayoutViewport.default)() && isFixedStrategy;
311  var x = (clientRect.left + (addVisualOffsets && visualViewport ? visualViewport.offsetLeft : 0)) / scaleX;
312  var y = (clientRect.top + (addVisualOffsets && visualViewport ? visualViewport.offsetTop : 0)) / scaleY;
313  var width = clientRect.width / scaleX;
314  var height = clientRect.height / scaleY;
315  return {
316    width: width,
317    height: height,
318    top: y,
319    right: x + width,
320    bottom: y + height,
321    left: x,
322    x: x,
323    y: y
324  };
325}
326
327},{"../utils/math.js":52,"./getWindow.js":17,"./instanceOf.js":20,"./isLayoutViewport.js":21}],4:[function(require,module,exports){
328"use strict";
329
330Object.defineProperty(exports, "__esModule", {
331  value: true
332});
333exports.default = getClippingRect;
334var _enums = require("../enums.js");
335var _getViewportRect = _interopRequireDefault(require("./getViewportRect.js"));
336var _getDocumentRect = _interopRequireDefault(require("./getDocumentRect.js"));
337var _listScrollParents = _interopRequireDefault(require("./listScrollParents.js"));
338var _getOffsetParent = _interopRequireDefault(require("./getOffsetParent.js"));
339var _getDocumentElement = _interopRequireDefault(require("./getDocumentElement.js"));
340var _getComputedStyle = _interopRequireDefault(require("./getComputedStyle.js"));
341var _instanceOf = require("./instanceOf.js");
342var _getBoundingClientRect = _interopRequireDefault(require("./getBoundingClientRect.js"));
343var _getParentNode = _interopRequireDefault(require("./getParentNode.js"));
344var _contains = _interopRequireDefault(require("./contains.js"));
345var _getNodeName = _interopRequireDefault(require("./getNodeName.js"));
346var _rectToClientRect = _interopRequireDefault(require("../utils/rectToClientRect.js"));
347var _math = require("../utils/math.js");
348function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
349function getInnerBoundingClientRect(element, strategy) {
350  var rect = (0, _getBoundingClientRect.default)(element, false, strategy === 'fixed');
351  rect.top = rect.top + element.clientTop;
352  rect.left = rect.left + element.clientLeft;
353  rect.bottom = rect.top + element.clientHeight;
354  rect.right = rect.left + element.clientWidth;
355  rect.width = element.clientWidth;
356  rect.height = element.clientHeight;
357  rect.x = rect.left;
358  rect.y = rect.top;
359  return rect;
360}
361function getClientRectFromMixedType(element, clippingParent, strategy) {
362  return clippingParent === _enums.viewport ? (0, _rectToClientRect.default)((0, _getViewportRect.default)(element, strategy)) : (0, _instanceOf.isElement)(clippingParent) ? getInnerBoundingClientRect(clippingParent, strategy) : (0, _rectToClientRect.default)((0, _getDocumentRect.default)((0, _getDocumentElement.default)(element)));
363} // A "clipping parent" is an overflowable container with the characteristic of
364// clipping (or hiding) overflowing elements with a position different from
365// `initial`
366
367function getClippingParents(element) {
368  var clippingParents = (0, _listScrollParents.default)((0, _getParentNode.default)(element));
369  var canEscapeClipping = ['absolute', 'fixed'].indexOf((0, _getComputedStyle.default)(element).position) >= 0;
370  var clipperElement = canEscapeClipping && (0, _instanceOf.isHTMLElement)(element) ? (0, _getOffsetParent.default)(element) : element;
371  if (!(0, _instanceOf.isElement)(clipperElement)) {
372    return [];
373  } // $FlowFixMe[incompatible-return]: https://github.com/facebook/flow/issues/1414
374
375  return clippingParents.filter(function (clippingParent) {
376    return (0, _instanceOf.isElement)(clippingParent) && (0, _contains.default)(clippingParent, clipperElement) && (0, _getNodeName.default)(clippingParent) !== 'body';
377  });
378} // Gets the maximum area that the element is visible in due to any number of
379// clipping parents
380
381function getClippingRect(element, boundary, rootBoundary, strategy) {
382  var mainClippingParents = boundary === 'clippingParents' ? getClippingParents(element) : [].concat(boundary);
383  var clippingParents = [].concat(mainClippingParents, [rootBoundary]);
384  var firstClippingParent = clippingParents[0];
385  var clippingRect = clippingParents.reduce(function (accRect, clippingParent) {
386    var rect = getClientRectFromMixedType(element, clippingParent, strategy);
387    accRect.top = (0, _math.max)(rect.top, accRect.top);
388    accRect.right = (0, _math.min)(rect.right, accRect.right);
389    accRect.bottom = (0, _math.min)(rect.bottom, accRect.bottom);
390    accRect.left = (0, _math.max)(rect.left, accRect.left);
391    return accRect;
392  }, getClientRectFromMixedType(element, firstClippingParent, strategy));
393  clippingRect.width = clippingRect.right - clippingRect.left;
394  clippingRect.height = clippingRect.bottom - clippingRect.top;
395  clippingRect.x = clippingRect.left;
396  clippingRect.y = clippingRect.top;
397  return clippingRect;
398}
399
400},{"../enums.js":25,"../utils/math.js":52,"../utils/rectToClientRect.js":56,"./contains.js":2,"./getBoundingClientRect.js":3,"./getComputedStyle.js":6,"./getDocumentElement.js":7,"./getDocumentRect.js":8,"./getNodeName.js":11,"./getOffsetParent.js":13,"./getParentNode.js":14,"./getViewportRect.js":16,"./instanceOf.js":20,"./listScrollParents.js":24}],5:[function(require,module,exports){
401"use strict";
402
403Object.defineProperty(exports, "__esModule", {
404  value: true
405});
406exports.default = getCompositeRect;
407var _getBoundingClientRect = _interopRequireDefault(require("./getBoundingClientRect.js"));
408var _getNodeScroll = _interopRequireDefault(require("./getNodeScroll.js"));
409var _getNodeName = _interopRequireDefault(require("./getNodeName.js"));
410var _instanceOf = require("./instanceOf.js");
411var _getWindowScrollBarX = _interopRequireDefault(require("./getWindowScrollBarX.js"));
412var _getDocumentElement = _interopRequireDefault(require("./getDocumentElement.js"));
413var _isScrollParent = _interopRequireDefault(require("./isScrollParent.js"));
414var _math = require("../utils/math.js");
415function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
416function isElementScaled(element) {
417  var rect = element.getBoundingClientRect();
418  var scaleX = (0, _math.round)(rect.width) / element.offsetWidth || 1;
419  var scaleY = (0, _math.round)(rect.height) / element.offsetHeight || 1;
420  return scaleX !== 1 || scaleY !== 1;
421} // Returns the composite rect of an element relative to its offsetParent.
422// Composite means it takes into account transforms as well as layout.
423
424function getCompositeRect(elementOrVirtualElement, offsetParent, isFixed) {
425  if (isFixed === void 0) {
426    isFixed = false;
427  }
428  var isOffsetParentAnElement = (0, _instanceOf.isHTMLElement)(offsetParent);
429  var offsetParentIsScaled = (0, _instanceOf.isHTMLElement)(offsetParent) && isElementScaled(offsetParent);
430  var documentElement = (0, _getDocumentElement.default)(offsetParent);
431  var rect = (0, _getBoundingClientRect.default)(elementOrVirtualElement, offsetParentIsScaled, isFixed);
432  var scroll = {
433    scrollLeft: 0,
434    scrollTop: 0
435  };
436  var offsets = {
437    x: 0,
438    y: 0
439  };
440  if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) {
441    if ((0, _getNodeName.default)(offsetParent) !== 'body' ||
442    // https://github.com/popperjs/popper-core/issues/1078
443    (0, _isScrollParent.default)(documentElement)) {
444      scroll = (0, _getNodeScroll.default)(offsetParent);
445    }
446    if ((0, _instanceOf.isHTMLElement)(offsetParent)) {
447      offsets = (0, _getBoundingClientRect.default)(offsetParent, true);
448      offsets.x += offsetParent.clientLeft;
449      offsets.y += offsetParent.clientTop;
450    } else if (documentElement) {
451      offsets.x = (0, _getWindowScrollBarX.default)(documentElement);
452    }
453  }
454  return {
455    x: rect.left + scroll.scrollLeft - offsets.x,
456    y: rect.top + scroll.scrollTop - offsets.y,
457    width: rect.width,
458    height: rect.height
459  };
460}
461
462},{"../utils/math.js":52,"./getBoundingClientRect.js":3,"./getDocumentElement.js":7,"./getNodeName.js":11,"./getNodeScroll.js":12,"./getWindowScrollBarX.js":19,"./instanceOf.js":20,"./isScrollParent.js":22}],6:[function(require,module,exports){
463"use strict";
464
465Object.defineProperty(exports, "__esModule", {
466  value: true
467});
468exports.default = getComputedStyle;
469var _getWindow = _interopRequireDefault(require("./getWindow.js"));
470function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
471function getComputedStyle(element) {
472  return (0, _getWindow.default)(element).getComputedStyle(element);
473}
474
475},{"./getWindow.js":17}],7:[function(require,module,exports){
476"use strict";
477
478Object.defineProperty(exports, "__esModule", {
479  value: true
480});
481exports.default = getDocumentElement;
482var _instanceOf = require("./instanceOf.js");
483function getDocumentElement(element) {
484  // $FlowFixMe[incompatible-return]: assume body is always available
485  return (((0, _instanceOf.isElement)(element) ? element.ownerDocument :
486  // $FlowFixMe[prop-missing]
487  element.document) || window.document).documentElement;
488}
489
490},{"./instanceOf.js":20}],8:[function(require,module,exports){
491"use strict";
492
493Object.defineProperty(exports, "__esModule", {
494  value: true
495});
496exports.default = getDocumentRect;
497var _getDocumentElement = _interopRequireDefault(require("./getDocumentElement.js"));
498var _getComputedStyle = _interopRequireDefault(require("./getComputedStyle.js"));
499var _getWindowScrollBarX = _interopRequireDefault(require("./getWindowScrollBarX.js"));
500var _getWindowScroll = _interopRequireDefault(require("./getWindowScroll.js"));
501var _math = require("../utils/math.js");
502function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
503// Gets the entire size of the scrollable document area, even extending outside
504// of the `<html>` and `<body>` rect bounds if horizontally scrollable
505
506function getDocumentRect(element) {
507  var _element$ownerDocumen;
508  var html = (0, _getDocumentElement.default)(element);
509  var winScroll = (0, _getWindowScroll.default)(element);
510  var body = (_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body;
511  var width = (0, _math.max)(html.scrollWidth, html.clientWidth, body ? body.scrollWidth : 0, body ? body.clientWidth : 0);
512  var height = (0, _math.max)(html.scrollHeight, html.clientHeight, body ? body.scrollHeight : 0, body ? body.clientHeight : 0);
513  var x = -winScroll.scrollLeft + (0, _getWindowScrollBarX.default)(element);
514  var y = -winScroll.scrollTop;
515  if ((0, _getComputedStyle.default)(body || html).direction === 'rtl') {
516    x += (0, _math.max)(html.clientWidth, body ? body.clientWidth : 0) - width;
517  }
518  return {
519    width: width,
520    height: height,
521    x: x,
522    y: y
523  };
524}
525
526},{"../utils/math.js":52,"./getComputedStyle.js":6,"./getDocumentElement.js":7,"./getWindowScroll.js":18,"./getWindowScrollBarX.js":19}],9:[function(require,module,exports){
527"use strict";
528
529Object.defineProperty(exports, "__esModule", {
530  value: true
531});
532exports.default = getHTMLElementScroll;
533function getHTMLElementScroll(element) {
534  return {
535    scrollLeft: element.scrollLeft,
536    scrollTop: element.scrollTop
537  };
538}
539
540},{}],10:[function(require,module,exports){
541"use strict";
542
543Object.defineProperty(exports, "__esModule", {
544  value: true
545});
546exports.default = getLayoutRect;
547var _getBoundingClientRect = _interopRequireDefault(require("./getBoundingClientRect.js"));
548function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
549// Returns the layout rect of an element relative to its offsetParent. Layout
550// means it doesn't take into account transforms.
551
552function getLayoutRect(element) {
553  var clientRect = (0, _getBoundingClientRect.default)(element); // Use the clientRect sizes if it's not been transformed.
554  // Fixes https://github.com/popperjs/popper-core/issues/1223
555
556  var width = element.offsetWidth;
557  var height = element.offsetHeight;
558  if (Math.abs(clientRect.width - width) <= 1) {
559    width = clientRect.width;
560  }
561  if (Math.abs(clientRect.height - height) <= 1) {
562    height = clientRect.height;
563  }
564  return {
565    x: element.offsetLeft,
566    y: element.offsetTop,
567    width: width,
568    height: height
569  };
570}
571
572},{"./getBoundingClientRect.js":3}],11:[function(require,module,exports){
573"use strict";
574
575Object.defineProperty(exports, "__esModule", {
576  value: true
577});
578exports.default = getNodeName;
579function getNodeName(element) {
580  return element ? (element.nodeName || '').toLowerCase() : null;
581}
582
583},{}],12:[function(require,module,exports){
584"use strict";
585
586Object.defineProperty(exports, "__esModule", {
587  value: true
588});
589exports.default = getNodeScroll;
590var _getWindowScroll = _interopRequireDefault(require("./getWindowScroll.js"));
591var _getWindow = _interopRequireDefault(require("./getWindow.js"));
592var _instanceOf = require("./instanceOf.js");
593var _getHTMLElementScroll = _interopRequireDefault(require("./getHTMLElementScroll.js"));
594function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
595function getNodeScroll(node) {
596  if (node === (0, _getWindow.default)(node) || !(0, _instanceOf.isHTMLElement)(node)) {
597    return (0, _getWindowScroll.default)(node);
598  } else {
599    return (0, _getHTMLElementScroll.default)(node);
600  }
601}
602
603},{"./getHTMLElementScroll.js":9,"./getWindow.js":17,"./getWindowScroll.js":18,"./instanceOf.js":20}],13:[function(require,module,exports){
604"use strict";
605
606Object.defineProperty(exports, "__esModule", {
607  value: true
608});
609exports.default = getOffsetParent;
610var _getWindow = _interopRequireDefault(require("./getWindow.js"));
611var _getNodeName = _interopRequireDefault(require("./getNodeName.js"));
612var _getComputedStyle = _interopRequireDefault(require("./getComputedStyle.js"));
613var _instanceOf = require("./instanceOf.js");
614var _isTableElement = _interopRequireDefault(require("./isTableElement.js"));
615var _getParentNode = _interopRequireDefault(require("./getParentNode.js"));
616var _userAgent = _interopRequireDefault(require("../utils/userAgent.js"));
617function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
618function getTrueOffsetParent(element) {
619  if (!(0, _instanceOf.isHTMLElement)(element) ||
620  // https://github.com/popperjs/popper-core/issues/837
621  (0, _getComputedStyle.default)(element).position === 'fixed') {
622    return null;
623  }
624  return element.offsetParent;
625} // `.offsetParent` reports `null` for fixed elements, while absolute elements
626// return the containing block
627
628function getContainingBlock(element) {
629  var isFirefox = /firefox/i.test((0, _userAgent.default)());
630  var isIE = /Trident/i.test((0, _userAgent.default)());
631  if (isIE && (0, _instanceOf.isHTMLElement)(element)) {
632    // In IE 9, 10 and 11 fixed elements containing block is always established by the viewport
633    var elementCss = (0, _getComputedStyle.default)(element);
634    if (elementCss.position === 'fixed') {
635      return null;
636    }
637  }
638  var currentNode = (0, _getParentNode.default)(element);
639  if ((0, _instanceOf.isShadowRoot)(currentNode)) {
640    currentNode = currentNode.host;
641  }
642  while ((0, _instanceOf.isHTMLElement)(currentNode) && ['html', 'body'].indexOf((0, _getNodeName.default)(currentNode)) < 0) {
643    var css = (0, _getComputedStyle.default)(currentNode); // This is non-exhaustive but covers the most common CSS properties that
644    // create a containing block.
645    // https://developer.mozilla.org/en-US/docs/Web/CSS/Containing_block#identifying_the_containing_block
646
647    if (css.transform !== 'none' || css.perspective !== 'none' || css.contain === 'paint' || ['transform', 'perspective'].indexOf(css.willChange) !== -1 || isFirefox && css.willChange === 'filter' || isFirefox && css.filter && css.filter !== 'none') {
648      return currentNode;
649    } else {
650      currentNode = currentNode.parentNode;
651    }
652  }
653  return null;
654} // Gets the closest ancestor positioned element. Handles some edge cases,
655// such as table ancestors and cross browser bugs.
656
657function getOffsetParent(element) {
658  var window = (0, _getWindow.default)(element);
659  var offsetParent = getTrueOffsetParent(element);
660  while (offsetParent && (0, _isTableElement.default)(offsetParent) && (0, _getComputedStyle.default)(offsetParent).position === 'static') {
661    offsetParent = getTrueOffsetParent(offsetParent);
662  }
663  if (offsetParent && ((0, _getNodeName.default)(offsetParent) === 'html' || (0, _getNodeName.default)(offsetParent) === 'body' && (0, _getComputedStyle.default)(offsetParent).position === 'static')) {
664    return window;
665  }
666  return offsetParent || getContainingBlock(element) || window;
667}
668
669},{"../utils/userAgent.js":58,"./getComputedStyle.js":6,"./getNodeName.js":11,"./getParentNode.js":14,"./getWindow.js":17,"./instanceOf.js":20,"./isTableElement.js":23}],14:[function(require,module,exports){
670"use strict";
671
672Object.defineProperty(exports, "__esModule", {
673  value: true
674});
675exports.default = getParentNode;
676var _getNodeName = _interopRequireDefault(require("./getNodeName.js"));
677var _getDocumentElement = _interopRequireDefault(require("./getDocumentElement.js"));
678var _instanceOf = require("./instanceOf.js");
679function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
680function getParentNode(element) {
681  if ((0, _getNodeName.default)(element) === 'html') {
682    return element;
683  }
684  return (
685    // this is a quicker (but less type safe) way to save quite some bytes from the bundle
686    // $FlowFixMe[incompatible-return]
687    // $FlowFixMe[prop-missing]
688    element.assignedSlot ||
689    // step into the shadow DOM of the parent of a slotted node
690    element.parentNode || (
691    // DOM Element detected
692    (0, _instanceOf.isShadowRoot)(element) ? element.host : null) ||
693    // ShadowRoot detected
694    // $FlowFixMe[incompatible-call]: HTMLElement is a Node
695    (0, _getDocumentElement.default)(element) // fallback
696  );
697}
698
699},{"./getDocumentElement.js":7,"./getNodeName.js":11,"./instanceOf.js":20}],15:[function(require,module,exports){
700"use strict";
701
702Object.defineProperty(exports, "__esModule", {
703  value: true
704});
705exports.default = getScrollParent;
706var _getParentNode = _interopRequireDefault(require("./getParentNode.js"));
707var _isScrollParent = _interopRequireDefault(require("./isScrollParent.js"));
708var _getNodeName = _interopRequireDefault(require("./getNodeName.js"));
709var _instanceOf = require("./instanceOf.js");
710function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
711function getScrollParent(node) {
712  if (['html', 'body', '#document'].indexOf((0, _getNodeName.default)(node)) >= 0) {
713    // $FlowFixMe[incompatible-return]: assume body is always available
714    return node.ownerDocument.body;
715  }
716  if ((0, _instanceOf.isHTMLElement)(node) && (0, _isScrollParent.default)(node)) {
717    return node;
718  }
719  return getScrollParent((0, _getParentNode.default)(node));
720}
721
722},{"./getNodeName.js":11,"./getParentNode.js":14,"./instanceOf.js":20,"./isScrollParent.js":22}],16:[function(require,module,exports){
723"use strict";
724
725Object.defineProperty(exports, "__esModule", {
726  value: true
727});
728exports.default = getViewportRect;
729var _getWindow = _interopRequireDefault(require("./getWindow.js"));
730var _getDocumentElement = _interopRequireDefault(require("./getDocumentElement.js"));
731var _getWindowScrollBarX = _interopRequireDefault(require("./getWindowScrollBarX.js"));
732var _isLayoutViewport = _interopRequireDefault(require("./isLayoutViewport.js"));
733function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
734function getViewportRect(element, strategy) {
735  var win = (0, _getWindow.default)(element);
736  var html = (0, _getDocumentElement.default)(element);
737  var visualViewport = win.visualViewport;
738  var width = html.clientWidth;
739  var height = html.clientHeight;
740  var x = 0;
741  var y = 0;
742  if (visualViewport) {
743    width = visualViewport.width;
744    height = visualViewport.height;
745    var layoutViewport = (0, _isLayoutViewport.default)();
746    if (layoutViewport || !layoutViewport && strategy === 'fixed') {
747      x = visualViewport.offsetLeft;
748      y = visualViewport.offsetTop;
749    }
750  }
751  return {
752    width: width,
753    height: height,
754    x: x + (0, _getWindowScrollBarX.default)(element),
755    y: y
756  };
757}
758
759},{"./getDocumentElement.js":7,"./getWindow.js":17,"./getWindowScrollBarX.js":19,"./isLayoutViewport.js":21}],17:[function(require,module,exports){
760"use strict";
761
762Object.defineProperty(exports, "__esModule", {
763  value: true
764});
765exports.default = getWindow;
766function getWindow(node) {
767  if (node == null) {
768    return window;
769  }
770  if (node.toString() !== '[object Window]') {
771    var ownerDocument = node.ownerDocument;
772    return ownerDocument ? ownerDocument.defaultView || window : window;
773  }
774  return node;
775}
776
777},{}],18:[function(require,module,exports){
778"use strict";
779
780Object.defineProperty(exports, "__esModule", {
781  value: true
782});
783exports.default = getWindowScroll;
784var _getWindow = _interopRequireDefault(require("./getWindow.js"));
785function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
786function getWindowScroll(node) {
787  var win = (0, _getWindow.default)(node);
788  var scrollLeft = win.pageXOffset;
789  var scrollTop = win.pageYOffset;
790  return {
791    scrollLeft: scrollLeft,
792    scrollTop: scrollTop
793  };
794}
795
796},{"./getWindow.js":17}],19:[function(require,module,exports){
797"use strict";
798
799Object.defineProperty(exports, "__esModule", {
800  value: true
801});
802exports.default = getWindowScrollBarX;
803var _getBoundingClientRect = _interopRequireDefault(require("./getBoundingClientRect.js"));
804var _getDocumentElement = _interopRequireDefault(require("./getDocumentElement.js"));
805var _getWindowScroll = _interopRequireDefault(require("./getWindowScroll.js"));
806function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
807function getWindowScrollBarX(element) {
808  // If <html> has a CSS width greater than the viewport, then this will be
809  // incorrect for RTL.
810  // Popper 1 is broken in this case and never had a bug report so let's assume
811  // it's not an issue. I don't think anyone ever specifies width on <html>
812  // anyway.
813  // Browsers where the left scrollbar doesn't cause an issue report `0` for
814  // this (e.g. Edge 2019, IE11, Safari)
815  return (0, _getBoundingClientRect.default)((0, _getDocumentElement.default)(element)).left + (0, _getWindowScroll.default)(element).scrollLeft;
816}
817
818},{"./getBoundingClientRect.js":3,"./getDocumentElement.js":7,"./getWindowScroll.js":18}],20:[function(require,module,exports){
819"use strict";
820
821Object.defineProperty(exports, "__esModule", {
822  value: true
823});
824exports.isElement = isElement;
825exports.isHTMLElement = isHTMLElement;
826exports.isShadowRoot = isShadowRoot;
827var _getWindow = _interopRequireDefault(require("./getWindow.js"));
828function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
829function isElement(node) {
830  var OwnElement = (0, _getWindow.default)(node).Element;
831  return node instanceof OwnElement || node instanceof Element;
832}
833function isHTMLElement(node) {
834  var OwnElement = (0, _getWindow.default)(node).HTMLElement;
835  return node instanceof OwnElement || node instanceof HTMLElement;
836}
837function isShadowRoot(node) {
838  // IE 11 has no ShadowRoot
839  if (typeof ShadowRoot === 'undefined') {
840    return false;
841  }
842  var OwnElement = (0, _getWindow.default)(node).ShadowRoot;
843  return node instanceof OwnElement || node instanceof ShadowRoot;
844}
845
846},{"./getWindow.js":17}],21:[function(require,module,exports){
847"use strict";
848
849Object.defineProperty(exports, "__esModule", {
850  value: true
851});
852exports.default = isLayoutViewport;
853var _userAgent = _interopRequireDefault(require("../utils/userAgent.js"));
854function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
855function isLayoutViewport() {
856  return !/^((?!chrome|android).)*safari/i.test((0, _userAgent.default)());
857}
858
859},{"../utils/userAgent.js":58}],22:[function(require,module,exports){
860"use strict";
861
862Object.defineProperty(exports, "__esModule", {
863  value: true
864});
865exports.default = isScrollParent;
866var _getComputedStyle2 = _interopRequireDefault(require("./getComputedStyle.js"));
867function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
868function isScrollParent(element) {
869  // Firefox wants us to check `-x` and `-y` variations as well
870  var _getComputedStyle = (0, _getComputedStyle2.default)(element),
871    overflow = _getComputedStyle.overflow,
872    overflowX = _getComputedStyle.overflowX,
873    overflowY = _getComputedStyle.overflowY;
874  return /auto|scroll|overlay|hidden/.test(overflow + overflowY + overflowX);
875}
876
877},{"./getComputedStyle.js":6}],23:[function(require,module,exports){
878"use strict";
879
880Object.defineProperty(exports, "__esModule", {
881  value: true
882});
883exports.default = isTableElement;
884var _getNodeName = _interopRequireDefault(require("./getNodeName.js"));
885function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
886function isTableElement(element) {
887  return ['table', 'td', 'th'].indexOf((0, _getNodeName.default)(element)) >= 0;
888}
889
890},{"./getNodeName.js":11}],24:[function(require,module,exports){
891"use strict";
892
893Object.defineProperty(exports, "__esModule", {
894  value: true
895});
896exports.default = listScrollParents;
897var _getScrollParent = _interopRequireDefault(require("./getScrollParent.js"));
898var _getParentNode = _interopRequireDefault(require("./getParentNode.js"));
899var _getWindow = _interopRequireDefault(require("./getWindow.js"));
900var _isScrollParent = _interopRequireDefault(require("./isScrollParent.js"));
901function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
902/*
903given a DOM element, return the list of all scroll parents, up the list of ancesors
904until we get to the top window object. This list is what we attach scroll listeners
905to, because if any of these parent elements scroll, we'll need to re-calculate the
906reference element's position.
907*/
908
909function listScrollParents(element, list) {
910  var _element$ownerDocumen;
911  if (list === void 0) {
912    list = [];
913  }
914  var scrollParent = (0, _getScrollParent.default)(element);
915  var isBody = scrollParent === ((_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body);
916  var win = (0, _getWindow.default)(scrollParent);
917  var target = isBody ? [win].concat(win.visualViewport || [], (0, _isScrollParent.default)(scrollParent) ? scrollParent : []) : scrollParent;
918  var updatedList = list.concat(target);
919  return isBody ? updatedList :
920  // $FlowFixMe[incompatible-call]: isBody tells us target will be an HTMLElement here
921  updatedList.concat(listScrollParents((0, _getParentNode.default)(target)));
922}
923
924},{"./getParentNode.js":14,"./getScrollParent.js":15,"./getWindow.js":17,"./isScrollParent.js":22}],25:[function(require,module,exports){
925"use strict";
926
927Object.defineProperty(exports, "__esModule", {
928  value: true
929});
930exports.write = exports.viewport = exports.variationPlacements = exports.top = exports.start = exports.right = exports.reference = exports.read = exports.popper = exports.placements = exports.modifierPhases = exports.main = exports.left = exports.end = exports.clippingParents = exports.bottom = exports.beforeWrite = exports.beforeRead = exports.beforeMain = exports.basePlacements = exports.auto = exports.afterWrite = exports.afterRead = exp
930orts.afterMain = void 0;
931var top = 'top';
932exports.top = top;
933var bottom = 'bottom';
934exports.bottom = bottom;
935var right = 'right';
936exports.right = right;
937var left = 'left';
938exports.left = left;
939var auto = 'auto';
940exports.auto = auto;
941var basePlacements = [top, bottom, right, left];
942exports.basePlacements = basePlacements;
943var start = 'start';
944exports.start = start;
945var end = 'end';
946exports.end = end;
947var clippingParents = 'clippingParents';
948exports.clippingParents = clippingParents;
949var viewport = 'viewport';
950exports.viewport = viewport;
951var popper = 'popper';
952exports.popper = popper;
953var reference = 'reference';
954exports.reference = reference;
955var variationPlacements = /*#__PURE__*/basePlacements.reduce(function (acc, placement) {
956  return acc.concat([placement + "-" + start, placement + "-" + end]);
957}, []);
958exports.variationPlacements = variationPlacements;
959var placements = /*#__PURE__*/[].concat(basePlacements, [auto]).reduce(function (acc, placement) {
960  return acc.concat([placement, placement + "-" + start, placement + "-" + end]);
961}, []); // modifiers that need to read the DOM
962exports.placements = placements;
963var beforeRead = 'beforeRead';
964exports.beforeRead = beforeRead;
965var read = 'read';
966exports.read = read;
967var afterRead = 'afterRead'; // pure-logic modifiers
968exports.afterRead = afterRead;
969var beforeMain = 'beforeMain';
970exports.beforeMain = beforeMain;
971var main = 'main';
972exports.main = main;
973var afterMain = 'afterMain'; // modifier with the purpose to write to the DOM (or write into a framework state)
974exports.afterMain = afterMain;
975var beforeWrite = 'beforeWrite';
976exports.beforeWrite = beforeWrite;
977var write = 'write';
978exports.write = write;
979var afterWrite = 'afterWrite';
980exports.afterWrite = afterWrite;
981var modifierPhases = [beforeRead, read, afterRead, beforeMain, main, afterMain, beforeWrite, write, afterWrite];
982exports.modifierPhases = modifierPhases;
983
984},{}],26:[function(require,module,exports){
985"use strict";
986
987Object.defineProperty(exports, "__esModule", {
988  value: true
989});
990var _exportNames = {
991  popperGenerator: true,
992  detectOverflow: true,
993  createPopperBase: true,
994  createPopper: true,
995  createPopperLite: true
996};
997Object.defineProperty(exports, "createPopper", {
998  enumerable: true,
999  get: function () {
1000    return _popper.createPopper;
1001  }
1002});
1003Object.defineProperty(exports, "createPopperBase", {
1004  enumerable: true,
1005  get: function () {
1006    return _createPopper.createPopper;
1007  }
1008});
1009Object.defineProperty(exports, "createPopperLite", {
1010  enumerable: true,
1011  get: function () {
1012    return _popperLite.createPopper;
1013  }
1014});
1015Object.defineProperty(exports, "detectOverflow", {
1016  enumerable: true,
1017  get: function () {
1018    return _createPopper.detectOverflow;
1019  }
1020});
1021Object.defineProperty(exports, "popperGenerator", {
1022  enumerable: true,
1023  get: function () {
1024    return _createPopper.popperGenerator;
1025  }
1026});
1027var _enums = require("./enums.js");
1028Object.keys(_enums).forEach(function (key) {
1029  if (key === "default" || key === "__esModule") return;
1030  if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
1031  if (key in exports && exports[key] === _enums[key]) return;
1032  Object.defineProperty(exports, key, {
1033    enumerable: true,
1034    get: function () {
1035      return _enums[key];
1036    }
1037  });
1038});
1039var _index = require("./modifiers/index.js");
1040Object.keys(_index).forEach(function (key) {
1041  if (key === "default" || key === "__esModule") return;
1042  if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
1043  if (key in exports && exports[key] === _index[key]) return;
1044  Object.defineProperty(exports, key, {
1045    enumerable: true,
1046    get: function () {
1047      return _index[key];
1048    }
1049  });
1050});
1051var _createPopper = require("./createPopper.js");
1052var _popper = require("./popper.js");
1053var _popperLite = require("./popper-lite.js");
1054
1055},{"./createPopper.js":1,"./enums.js":25,"./modifiers/index.js":33,"./popper-lite.js":37,"./popper.js":38}],27:[function(require,module,exports){
1056"use strict";
1057
1058Object.defineProperty(exports, "__esModule", {
1059  value: true
1060});
1061exports.default = void 0;
1062var _getNodeName = _interopRequireDefault(require("../dom-utils/getNodeName.js"));
1063var _instanceOf = require("../dom-utils/instanceOf.js");
1064function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
1065// This modifier takes the styles prepared by the `computeStyles` modifier
1066// and applies them to the HTMLElements such as popper and arrow
1067
1068function applyStyles(_ref) {
1069  var state = _ref.state;
1070  Object.keys(state.elements).forEach(function (name) {
1071    var style = state.styles[name] || {};
1072    var attributes = state.attributes[name] || {};
1073    var element = state.elements[name]; // arrow is optional + virtual elements
1074
1075    if (!(0, _instanceOf.isHTMLElement)(element) || !(0, _getNodeName.default)(element)) {
1076      return;
1077    } // Flow doesn't support to extend this property, but it's the most
1078    // effective way to apply styles to an HTMLElement
1079    // $FlowFixMe[cannot-write]
1080
1081    Object.assign(element.style, style);
1082    Object.keys(attributes).forEach(function (name) {
1083      var value = attributes[name];
1084      if (value === false) {
1085        element.removeAttribute(name);
1086      } else {
1087        element.setAttribute(name, value === true ? '' : value);
1088      }
1089    });
1090  });
1091}
1092function effect(_ref2) {
1093  var state = _ref2.state;
1094  var initialStyles = {
1095    popper: {
1096      position: state.options.strategy,
1097      left: '0',
1098      top: '0',
1099      margin: '0'
1100    },
1101    arrow: {
1102      position: 'absolute'
1103    },
1104    reference: {}
1105  };
1106  Object.assign(state.elements.popper.style, initialStyles.popper);
1107  state.styles = initialStyles;
1108  if (state.elements.arrow) {
1109    Object.assign(state.elements.arrow.style, initialStyles.arrow);
1110  }
1111  return function () {
1112    Object.keys(state.elements).forEach(function (name) {
1113      var element = state.elements[name];
1114      var attributes = state.attributes[name] || {};
1115      var styleProperties = Object.keys(state.styles.hasOwnProperty(name) ? state.styles[name] : initialStyles[name]); // Set all values to an empty string to unset them
1116
1117      var style = styleProperties.reduce(function (style, property) {
1118        style[property] = '';
1119        return style;
1120      }, {}); // arrow is optional + virtual elements
1121
1122      if (!(0, _instanceOf.isHTMLElement)(element) || !(0, _getNodeName.default)(element)) {
1123        return;
1124      }
1125      Object.assign(element.style, style);
1126      Object.keys(attributes).forEach(function (attribute) {
1127        element.removeAttribute(attribute);
1128      });
1129    });
1130  };
1131} // eslint-disable-next-line import/no-unused-modules
1132var _default = {
1133  name: 'applyStyles',
1134  enabled: true,
1135  phase: 'write',
1136  fn: applyStyles,
1137  effect: effect,
1138  requires: ['computeStyles']
1139};
1140exports.default = _default;
1141
1142},{"../dom-utils/getNodeName.js":11,"../dom-utils/instanceOf.js":20}],28:[function(require,module,exports){
1143(function (process){(function (){
1144"use strict";
1145
1146Object.defineProperty(exports, "__esModule", {
1147  value: true
1148});
1149exports.default = void 0;
1150var _getBasePlacement = _interopRequireDefault(require("../utils/getBasePlacement.js"));
1151var _getLayoutRect = _interopRequireDefault(require("../dom-utils/getLayoutRect.js"));
1152var _contains = _interopRequireDefault(require("../dom-utils/contains.js"));
1153var _getOffsetParent = _interopRequireDefault(require("../dom-utils/getOffsetParent.js"));
1154var _getMainAxisFromPlacement = _interopRequireDefault(require("../utils/getMainAxisFromPlacement.js"));
1155var _within = require("../utils/within.js");
1156var _mergePaddingObject = _interopRequireDefault(require("../utils/mergePaddingObject.js"));
1157var _expandToHashMap = _interopRequireDefault(require("../utils/expandToHashMap.js"));
1158var _enums = require("../enums.js");
1159var _instanceOf = require("../dom-utils/instanceOf.js");
1160function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
1161// eslint-disable-next-line import/no-unused-modules
1162
1163var toPaddingObject = function toPaddingObject(padding, state) {
1164  padding = typeof padding === 'function' ? padding(Object.assign({}, state.rects, {
1165    placement: state.placement
1166  })) : padding;
1167  return (0, _mergePaddingObject.default)(typeof padding !== 'number' ? padding : (0, _expandToHashMap.default)(padding, _enums.basePlacements));
1168};
1169function arrow(_ref) {
1170  var _state$modifiersData$;
1171  var state = _ref.state,
1172    name = _ref.name,
1173    options = _ref.options;
1174  var arrowElement = state.elements.arrow;
1175  var popperOffsets = state.modifiersData.popperOffsets;
1176  var basePlacement = (0, _getBasePlacement.default)(state.placement);
1177  var axis = (0, _getMainAxisFromPlacement.default)(basePlacement);
1178  var isVertical = [_enums.left, _enums.right].indexOf(basePlacement) >= 0;
1179  var len = isVertical ? 'height' : 'width';
1180  if (!arrowElement || !popperOffsets) {
1181    return;
1182  }
1183  var paddingObject = toPaddingObject(options.padding, state);
1184  var arrowRect = (0, _getLayoutRect.default)(arrowElement);
1185  var minProp = axis === 'y' ? _enums.top : _enums.left;
1186  var maxProp = axis === 'y' ? _enums.bottom : _enums.right;
1187  var endDiff = state.rects.reference[len] + state.rects.reference[axis] - popperOffsets[axis] - state.rects.popper[len];
1188  var startDiff = popperOffsets[axis] - state.rects.reference[axis];
1189  var arrowOffsetParent = (0, _getOffsetParent.default)(arrowElement);
1190  var clientSize = arrowOffsetParent ? axis === 'y' ? arrowOffsetParent.clientHeight || 0 : arrowOffsetParent.clientWidth || 0 : 0;
1191  var centerToReference = endDiff / 2 - startDiff / 2; // Make sure the arrow doesn't overflow the popper if the center point is
1192  // outside of the popper bounds
1193
1194  var min = paddingObject[minProp];
1195  var max = clientSize - arrowRect[len] - paddingObject[maxProp];
1196  var center = clientSize / 2 - arrowRect[len] / 2 + centerToReference;
1197  var offset = (0, _within.within)(min, center, max); // Prevents breaking syntax highlighting...
1198
1199  var axisProp = axis;
1200  state.modifiersData[name] = (_state$modifiersData$ = {}, _state$modifiersData$[axisProp] = offset, _state$modifiersData$.centerOffset = offset - center, _state$modifiersData$);
1201}
1202function effect(_ref2) {
1203  var state = _ref2.state,
1204    options = _ref2.options;
1205  var _options$element = options.element,
1206    arrowElement = _options$element === void 0 ? '[data-popper-arrow]' : _options$element;
1207  if (arrowElement == null) {
1208    return;
1209  } // CSS selector
1210
1211  if (typeof arrowElement === 'string') {
1212    arrowElement = state.elements.popper.querySelector(arrowElement);
1213    if (!arrowElement) {
1214      return;
1215    }
1216  }
1217  if (process.env.NODE_ENV !== "production") {
1218    if (!(0, _instanceOf.isHTMLElement)(arrowElement)) {
1219      console.error(['Popper: "arrow" element must be an HTMLElement (not an SVGElement).', 'To use an SVG arrow, wrap it in an HTMLElement that will be used as', 'the arrow.'].join(' '));
1220    }
1221  }
1222  if (!(0, _contains.default)(state.elements.popper, arrowElement)) {
1223    if (process.env.NODE_ENV !== "production") {
1224      console.error(['Popper: "arrow" modifier\'s `element` must be a child of the popper', 'element.'].join(' '));
1225    }
1226    return;
1227  }
1228  state.elements.arrow = arrowElement;
1229} // eslint-disable-next-line import/no-unused-modules
1230var _default = {
1231  name: 'arrow',
1232  enabled: true,
1233  phase: 'main',
1234  fn: arrow,
1235  effect: effect,
1236  requires: ['popperOffsets'],
1237  requiresIfExists: ['preventOverflow']
1238};
1239exports.default = _default;
1240
1241}).call(this)}).call(this,require('_process'))
1242},{"../dom-utils/contains.js":2,"../dom-utils/getLayoutRect.js":10,"../dom-utils/getOffsetParent.js":13,"../dom-utils/instanceOf.js":20,"../enums.js":25,"../utils/expandToHashMap.js":43,"../utils/getBasePlacement.js":46,"../utils/getMainAxisFromPlacement.js":48,"../utils/mergePaddingObject.js":54,"../utils/within.js":60,"_process":64}],29:[function(require,module,exports){
1243(function (process){(function (){
1244"use strict";
1245
1246Object.defineProperty(exports, "__esModule", {
1247  value: true
1248});
1249exports.default = void 0;
1250exports.mapToStyles = mapToStyles;
1251var _enums = require("../enums.js");
1252var _getOffsetParent = _interopRequireDefault(require("../dom-utils/getOffsetParent.js"));
1253var _getWindow = _interopRequireDefault(require("../dom-utils/getWindow.js"));
1254var _getDocumentElement = _interopRequireDefault(require("../dom-utils/getDocumentElement.js"));
1255var _getComputedStyle = _interopRequireDefault(require("../dom-utils/getComputedStyle.js"));
1256var _getBasePlacement = _interopRequireDefault(require("../utils/getBasePlacement.js"));
1257var _getVariation = _interopRequireDefault(require("../utils/getVariation.js"));
1258var _math = require("../utils/math.js");
1259function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
1260// eslint-disable-next-line import/no-unused-modules
1261
1262var unsetSides = {
1263  top: 'auto',
1264  right: 'auto',
1265  bottom: 'auto',
1266  left: 'auto'
1267}; // Round the offsets to the nearest suitable subpixel based on the DPR.
1268// Zooming can change the DPR, but it seems to report a value that will
1269// cleanly divide the values into the appropriate subpixels.
1270
1271function roundOffsetsByDPR(_ref) {
1272  var x = _ref.x,
1273    y = _ref.y;
1274  var win = window;
1275  var dpr = win.devicePixelRatio || 1;
1276  return {
1277    x: (0, _math.round)(x * dpr) / dpr || 0,
1278    y: (0, _math.round)(y * dpr) / dpr || 0
1279  };
1280}
1281function mapToStyles(_ref2) {
1282  var _Object$assign2;
1283  var popper = _ref2.popper,
1284    popperRect = _ref2.popperRect,
1285    placement = _ref2.placement,
1286    variation = _ref2.variation,
1287    offsets = _ref2.offsets,
1288    position = _ref2.position,
1289    gpuAcceleration = _ref2.gpuAcceleration,
1290    adaptive = _ref2.adaptive,
1291    roundOffsets = _ref2.roundOffsets,
1292    isFixed = _ref2.isFixed;
1293  var _offsets$x = offsets.x,
1294    x = _offsets$x === void 0 ? 0 : _offsets$x,
1295    _offsets$y = offsets.y,
1296    y = _offsets$y === void 0 ? 0 : _offsets$y;
1297  var _ref3 = typeof roundOffsets === 'function' ? roundOffsets({
1298    x: x,
1299    y: y
1300  }) : {
1301    x: x,
1302    y: y
1303  };
1304  x = _ref3.x;
1305  y = _ref3.y;
1306  var hasX = offsets.hasOwnProperty('x');
1307  var hasY = offsets.hasOwnProperty('y');
1308  var sideX = _enums.left;
1309  var sideY = _enums.top;
1310  var win = window;
1311  if (adaptive) {
1312    var offsetParent = (0, _getOffsetParent.default)(popper);
1313    var heightProp = 'clientHeight';
1314    var widthProp = 'clientWidth';
1315    if (offsetParent === (0, _getWindow.default)(popper)) {
1316      offsetParent = (0, _getDocumentElement.default)(popper);
1317      if ((0, _getComputedStyle.default)(offsetParent).position !== 'static' && position === 'absolute') {
1318        heightProp = 'scrollHeight';
1319        widthProp = 'scrollWidth';
1320      }
1321    } // $FlowFixMe[incompatible-cast]: force type refinement, we compare offsetParent with window above, but Flow doesn't detect it
1322
1323    offsetParent = offsetParent;
1324    if (placement === _enums.top || (placement === _enums.left || placement === _enums.right) && variation === _enums.end) {
1325      sideY = _enums.bottom;
1326      var offsetY = isFixed && offsetParent === win && win.visualViewport ? win.visualViewport.height :
1327      // $FlowFixMe[prop-missing]
1328      offsetParent[heightProp];
1329      y -= offsetY - popperRect.height;
1330      y *= gpuAcceleration ? 1 : -1;
1331    }
1332    if (placement === _enums.left || (placement === _enums.top || placement === _enums.bottom) && variation === _enums.end) {
1333      sideX = _enums.right;
1334      var offsetX = isFixed && offsetParent === win && win.visualViewport ? win.visualViewport.width :
1335      // $FlowFixMe[prop-missing]
1336      offsetParent[widthProp];
1337      x -= offsetX - popperRect.width;
1338      x *= gpuAcceleration ? 1 : -1;
1339    }
1340  }
1341  var commonStyles = Object.assign({
1342    position: position
1343  }, adaptive && unsetSides);
1344  var _ref4 = roundOffsets === true ? roundOffsetsByDPR({
1345    x: x,
1346    y: y
1347  }) : {
1348    x: x,
1349    y: y
1350  };
1351  x = _ref4.x;
1352  y = _ref4.y;
1353  if (gpuAcceleration) {
1354    var _Object$assign;
1355    return Object.assign({}, commonStyles, (_Object$assign = {}, _Object$assign[sideY] = hasY ? '0' : '', _Object$assign[sideX] = hasX ? '0' : '', _Object$assign.transform = (win.devicePixelRatio || 1) <= 1 ? "translate(" + x + "px, " + y + "px)" : "translate3d(" + x + "px, " + y + "px, 0)", _Object$assign));
1356  }
1357  return Object.assign({}, commonStyles, (_Object$assign2 = {}, _Object$assign2[sideY] = hasY ? y + "px" : '', _Object$assign2[sideX] = hasX ? x + "px" : '', _Object$assign2.transform = '', _Object$assign2));
1358}
1359function computeStyles(_ref5) {
1360  var state = _ref5.state,
1361    options = _ref5.options;
1362  var _options$gpuAccelerat = options.gpuAcceleration,
1363    gpuAcceleration = _options$gpuAccelerat === void 0 ? true : _options$gpuAccelerat,
1364    _options$adaptive = options.adaptive,
1365    adaptive = _options$adaptive === void 0 ? true : _options$adaptive,
1366    _options$roundOffsets = options.roundOffsets,
1367    roundOffsets = _options$roundOffsets === void 0 ? true : _options$roundOffsets;
1368  if (process.env.NODE_ENV !== "production") {
1369    var transitionProperty = (0, _getComputedStyle.default)(state.elements.popper).transitionProperty || '';
1370    if (adaptive && ['transform', 'top', 'right', 'bottom', 'left'].some(function (property) {
1371      return transitionProperty.indexOf(property) >= 0;
1372    })) {
1373      console.warn(['Popper: Detected CSS transitions on at least one of the following', 'CSS properties: "transform", "top", "right", "bottom", "left".', '\n\n', 'Disable the "computeStyles" modifier\'s `adaptive` option to allow', 'for smooth transitions, or remove these properties from the CSS', 'transition declaration on the popper element if only transitioning', 'opacity or background-color for example.', '\n\n', 'We recommend using the popper element as a wrapper around an inner', 'element that can have any CSS property transitioned for animations.'].join(' '));
1374    }
1375  }
1376  var commonStyles = {
1377    placement: (0, _getBasePlacement.default)(state.placement),
1378    variation: (0, _getVariation.default)(state.placement),
1379    popper: state.elements.popper,
1380    popperRect: state.rects.popper,
1381    gpuAcceleration: gpuAcceleration,
1382    isFixed: state.options.strategy === 'fixed'
1383  };
1384  if (state.modifiersData.popperOffsets != null) {
1385    state.styles.popper = Object.assign({}, state.styles.popper, mapToStyles(Object.assign({}, commonStyles, {
1386      offsets: state.modifiersData.popperOffsets,
1387      position: state.options.strategy,
1388      adaptive: adaptive,
1389      roundOffsets: roundOffsets
1390    })));
1391  }
1392  if (state.modifiersData.arrow != null) {
1393    state.styles.arrow = Object.assign({}, state.styles.arrow, mapToStyles(Object.assign({}, commonStyles, {
1394      offsets: state.modifiersData.arrow,
1395      position: 'absolute',
1396      adaptive: false,
1397      roundOffsets: roundOffsets
1398    })));
1399  }
1400  state.attributes.popper = Object.assign({}, state.attributes.popper, {
1401    'data-popper-placement': state.placement
1402  });
1403} // eslint-disable-next-line import/no-unused-modules
1404var _default = {
1405  name: 'computeStyles',
1406  enabled: true,
1407  phase: 'beforeWrite',
1408  fn: computeStyles,
1409  data: {}
1410};
1411exports.default = _default;
1412
1413}).call(this)}).call(this,require('_process'))
1414},{"../dom-utils/getComputedStyle.js":6,"../dom-utils/getDocumentElement.js":7,"../dom-utils/getOffsetParent.
1414js":13,"../dom-utils/getWindow.js":17,"../enums.js":25,"../utils/getBasePlacement.js":46,"../utils/getVariation.js":51,"../utils/math.js":52,"_process":64}],30:[function(require,module,exports){
1415"use strict";
1416
1417Object.defineProperty(exports, "__esModule", {
1418  value: true
1419});
1420exports.default = void 0;
1421var _getWindow = _interopRequireDefault(require("../dom-utils/getWindow.js"));
1422function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
1423// eslint-disable-next-line import/no-unused-modules
1424
1425var passive = {
1426  passive: true
1427};
1428function effect(_ref) {
1429  var state = _ref.state,
1430    instance = _ref.instance,
1431    options = _ref.options;
1432  var _options$scroll = options.scroll,
1433    scroll = _options$scroll === void 0 ? true : _options$scroll,
1434    _options$resize = options.resize,
1435    resize = _options$resize === void 0 ? true : _options$resize;
1436  var window = (0, _getWindow.default)(state.elements.popper);
1437  var scrollParents = [].concat(state.scrollParents.reference, state.scrollParents.popper);
1438  if (scroll) {
1439    scrollParents.forEach(function (scrollParent) {
1440      scrollParent.addEventListener('scroll', instance.update, passive);
1441    });
1442  }
1443  if (resize) {
1444    window.addEventListener('resize', instance.update, passive);
1445  }
1446  return function () {
1447    if (scroll) {
1448      scrollParents.forEach(function (scrollParent) {
1449        scrollParent.removeEventListener('scroll', instance.update, passive);
1450      });
1451    }
1452    if (resize) {
1453      window.removeEventListener('resize', instance.update, passive);
1454    }
1455  };
1456} // eslint-disable-next-line import/no-unused-modules
1457var _default = {
1458  name: 'eventListeners',
1459  enabled: true,
1460  phase: 'write',
1461  fn: function fn() {},
1462  effect: effect,
1463  data: {}
1464};
1465exports.default = _default;
1466
1467},{"../dom-utils/getWindow.js":17}],31:[function(require,module,exports){
1468"use strict";
1469
1470Object.defineProperty(exports, "__esModule", {
1471  value: true
1472});
1473exports.default = void 0;
1474var _getOppositePlacement = _interopRequireDefault(require("../utils/getOppositePlacement.js"));
1475var _getBasePlacement = _interopRequireDefault(require("../utils/getBasePlacement.js"));
1476var _getOppositeVariationPlacement = _interopRequireDefault(require("../utils/getOppositeVariationPlacement.js"));
1477var _detectOverflow = _interopRequireDefault(require("../utils/detectOverflow.js"));
1478var _computeAutoPlacement = _interopRequireDefault(require("../utils/computeAutoPlacement.js"));
1479var _enums = require("../enums.js");
1480var _getVariation = _interopRequireDefault(require("../utils/getVariation.js"));
1481function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
1482// eslint-disable-next-line import/no-unused-modules
1483
1484function getExpandedFallbackPlacements(placement) {
1485  if ((0, _getBasePlacement.default)(placement) === _enums.auto) {
1486    return [];
1487  }
1488  var oppositePlacement = (0, _getOppositePlacement.default)(placement);
1489  return [(0, _getOppositeVariationPlacement.default)(placement), oppositePlacement, (0, _getOppositeVariationPlacement.default)(oppositePlacement)];
1490}
1491function flip(_ref) {
1492  var state = _ref.state,
1493    options = _ref.options,
1494    name = _ref.name;
1495  if (state.modifiersData[name]._skip) {
1496    return;
1497  }
1498  var _options$mainAxis = options.mainAxis,
1499    checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis,
1500    _options$altAxis = options.altAxis,
1501    checkAltAxis = _options$altAxis === void 0 ? true : _options$altAxis,
1502    specifiedFallbackPlacements = options.fallbackPlacements,
1503    padding = options.padding,
1504    boundary = options.boundary,
1505    rootBoundary = options.rootBoundary,
1506    altBoundary = options.altBoundary,
1507    _options$flipVariatio = options.flipVariations,
1508    flipVariations = _options$flipVariatio === void 0 ? true : _options$flipVariatio,
1509    allowedAutoPlacements = options.allowedAutoPlacements;
1510  var preferredPlacement = state.options.placement;
1511  var basePlacement = (0, _getBasePlacement.default)(preferredPlacement);
1512  var isBasePlacement = basePlacement === preferredPlacement;
1513  var fallbackPlacements = specifiedFallbackPlacements || (isBasePlacement || !flipVariations ? [(0, _getOppositePlacement.default)(preferredPlacement)] : getExpandedFallbackPlacements(preferredPlacement));
1514  var placements = [preferredPlacement].concat(fallbackPlacements).reduce(function (acc, placement) {
1515    return acc.concat((0, _getBasePlacement.default)(placement) === _enums.auto ? (0, _computeAutoPlacement.default)(state, {
1516      placement: placement,
1517      boundary: boundary,
1518      rootBoundary: rootBoundary,
1519      padding: padding,
1520      flipVariations: flipVariations,
1521      allowedAutoPlacements: allowedAutoPlacements
1522    }) : placement);
1523  }, []);
1524  var referenceRect = state.rects.reference;
1525  var popperRect = state.rects.popper;
1526  var checksMap = new Map();
1527  var makeFallbackChecks = true;
1528  var firstFittingPlacement = placements[0];
1529  for (var i = 0; i < placements.length; i++) {
1530    var placement = placements[i];
1531    var _basePlacement = (0, _getBasePlacement.default)(placement);
1532    var isStartVariation = (0, _getVariation.default)(placement) === _enums.start;
1533    var isVertical = [_enums.top, _enums.bottom].indexOf(_basePlacement) >= 0;
1534    var len = isVertical ? 'width' : 'height';
1535    var overflow = (0, _detectOverflow.default)(state, {
1536      placement: placement,
1537      boundary: boundary,
1538      rootBoundary: rootBoundary,
1539      altBoundary: altBoundary,
1540      padding: padding
1541    });
1542    var mainVariationSide = isVertical ? isStartVariation ? _enums.right : _enums.left : isStartVariation ? _enums.bottom : _enums.top;
1543    if (referenceRect[len] > popperRect[len]) {
1544      mainVariationSide = (0, _getOppositePlacement.default)(mainVariationSide);
1545    }
1546    var altVariationSide = (0, _getOppositePlacement.default)(mainVariationSide);
1547    var checks = [];
1548    if (checkMainAxis) {
1549      checks.push(overflow[_basePlacement] <= 0);
1550    }
1551    if (checkAltAxis) {
1552      checks.push(overflow[mainVariationSide] <= 0, overflow[altVariationSide] <= 0);
1553    }
1554    if (checks.every(function (check) {
1555      return check;
1556    })) {
1557      firstFittingPlacement = placement;
1558      makeFallbackChecks = false;
1559      break;
1560    }
1561    checksMap.set(placement, checks);
1562  }
1563  if (makeFallbackChecks) {
1564    // `2` may be desired in some cases – research later
1565    var numberOfChecks = flipVariations ? 3 : 1;
1566    var _loop = function _loop(_i) {
1567      var fittingPlacement = placements.find(function (placement) {
1568        var checks = checksMap.get(placement);
1569        if (checks) {
1570          return checks.slice(0, _i).every(function (check) {
1571            return check;
1572          });
1573        }
1574      });
1575      if (fittingPlacement) {
1576        firstFittingPlacement = fittingPlacement;
1577        return "break";
1578      }
1579    };
1580    for (var _i = numberOfChecks; _i > 0; _i--) {
1581      var _ret = _loop(_i);
1582      if (_ret === "break") break;
1583    }
1584  }
1585  if (state.placement !== firstFittingPlacement) {
1586    state.modifiersData[name]._skip = true;
1587    state.placement = firstFittingPlacement;
1588    state.reset = true;
1589  }
1590} // eslint-disable-next-line import/no-unused-modules
1591var _default = {
1592  name: 'flip',
1593  enabled: true,
1594  phase: 'main',
1595  fn: flip,
1596  requiresIfExists: ['offset'],
1597  data: {
1598    _skip: false
1599  }
1600};
1601exports.default = _default;
1602
1603},{"../enums.js":25,"../utils/computeAutoPlacement.js":39,"../utils/detectOverflow.js":42,"../utils/getBasePlacement.js":46,"../utils/getOppositePlacement.js":49,"../utils/getOppositeVariationPlacement.js":50,"../utils/getVariation.js":51}],32:[function(require,module,exports){
1604"use strict";
1605
1606Object.defineProperty(exports, "__esModule", {
1607  value: true
1608});
1609exports.default = void 0;
1610var _enums = require("../enums.js");
1611var _detectOverflow = _interopRequireDefault(require("../utils/detectOverflow.js"));
1612function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
1613function getSideOffsets(overflow, rect, preventedOffsets) {
1614  if (preventedOffsets === void 0) {
1615    preventedOffsets = {
1616      x: 0,
1617      y: 0
1618    };
1619  }
1620  return {
1621    top: overflow.top - rect.height - preventedOffsets.y,
1622    right: overflow.right - rect.width + preventedOffsets.x,
1623    bottom: overflow.bottom - rect.height + preventedOffsets.y,
1624    left: overflow.left - rect.width - preventedOffsets.x
1625  };
1626}
1627function isAnySideFullyClipped(overflow) {
1628  return [_enums.top, _enums.right, _enums.bottom, _enums.left].some(function (side) {
1629    return overflow[side] >= 0;
1630  });
1631}
1632function hide(_ref) {
1633  var state = _ref.state,
1634    name = _ref.name;
1635  var referenceRect = state.rects.reference;
1636  var popperRect = state.rects.popper;
1637  var preventedOffsets = state.modifiersData.preventOverflow;
1638  var referenceOverflow = (0, _detectOverflow.default)(state, {
1639    elementContext: 'reference'
1640  });
1641  var popperAltOverflow = (0, _detectOverflow.default)(state, {
1642    altBoundary: true
1643  });
1644  var referenceClippingOffsets = getSideOffsets(referenceOverflow, referenceRect);
1645  var popperEscapeOffsets = getSideOffsets(popperAltOverflow, popperRect, preventedOffsets);
1646  var isReferenceHidden = isAnySideFullyClipped(referenceClippingOffsets);
1647  var hasPopperEscaped = isAnySideFullyClipped(popperEscapeOffsets);
1648  state.modifiersData[name] = {
1649    referenceClippingOffsets: referenceClippingOffsets,
1650    popperEscapeOffsets: popperEscapeOffsets,
1651    isReferenceHidden: isReferenceHidden,
1652    hasPopperEscaped: hasPopperEscaped
1653  };
1654  state.attributes.popper = Object.assign({}, state.attributes.popper, {
1655    'data-popper-reference-hidden': isReferenceHidden,
1656    'data-popper-escaped': hasPopperEscaped
1657  });
1658} // eslint-disable-next-line import/no-unused-modules
1659var _default = {
1660  name: 'hide',
1661  enabled: true,
1662  phase: 'main',
1663  requiresIfExists: ['preventOverflow'],
1664  fn: hide
1665};
1666exports.default = _default;
1667
1668},{"../enums.js":25,"../utils/detectOverflow.js":42}],33:[function(require,module,exports){
1669"use strict";
1670
1671Object.defineProperty(exports, "__esModule", {
1672  value: true
1673});
1674Object.defineProperty(exports, "applyStyles", {
1675  enumerable: true,
1676  get: function () {
1677    return _applyStyles.default;
1678  }
1679});
1680Object.defineProperty(exports, "arrow", {
1681  enumerable: true,
1682  get: function () {
1683    return _arrow.default;
1684  }
1685});
1686Object.defineProperty(exports, "computeStyles", {
1687  enumerable: true,
1688  get: function () {
1689    return _computeStyles.default;
1690  }
1691});
1692Object.defineProperty(exports, "eventListeners", {
1693  enumerable: true,
1694  get: function () {
1695    return _eventListeners.default;
1696  }
1697});
1698Object.defineProperty(exports, "flip", {
1699  enumerable: true,
1700  get: function () {
1701    return _flip.default;
1702  }
1703});
1704Object.defineProperty(exports, "hide", {
1705  enumerable: true,
1706  get: function () {
1707    return _hide.default;
1708  }
1709});
1710Object.defineProperty(exports, "offset", {
1711  enumerable: true,
1712  get: function () {
1713    return _offset.default;
1714  }
1715});
1716Object.defineProperty(exports, "popperOffsets", {
1717  enumerable: true,
1718  get: function () {
1719    return _popperOffsets.default;
1720  }
1721});
1722Object.defineProperty(exports, "preventOverflow", {
1723  enumerable: true,
1724  get: function () {
1725    return _preventOverflow.default;
1726  }
1727});
1728var _applyStyles = _interopRequireDefault(require("./applyStyles.js"));
1729var _arrow = _interopRequireDefault(require("./arrow.js"));
1730var _computeStyles = _interopRequireDefault(require("./computeStyles.js"));
1731var _eventListeners = _interopRequireDefault(require("./eventListeners.js"));
1732var _flip = _interopRequireDefault(require("./flip.js"));
1733var _hide = _interopRequireDefault(require("./hide.js"));
1734var _offset = _interopRequireDefault(require("./offset.js"));
1735var _popperOffsets = _interopRequireDefault(require("./popperOffsets.js"));
1736var _preventOverflow = _interopRequireDefault(require("./preventOverflow.js"));
1737function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
1738
1739},{"./applyStyles.js":27,"./arrow.js":28,"./computeStyles.js":29,"./eventListeners.js":30,"./flip.js":31,"./hide.js":32,"./offset.js":34,"./popperOffsets.js":35,"./preventOverflow.js":36}],34:[function(require,module,exports){
1740"use strict";
1741
1742Object.defineProperty(exports, "__esModule", {
1743  value: true
1744});
1745exports.default = void 0;
1746exports.distanceAndSkiddingToXY = distanceAndSkiddingToXY;
1747var _getBasePlacement = _interopRequireDefault(require("../utils/getBasePlacement.js"));
1748var _enums = require("../enums.js");
1749function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
1750// eslint-disable-next-line import/no-unused-modules
1751
1752function distanceAndSkiddingToXY(placement, rects, offset) {
1753  var basePlacement = (0, _getBasePlacement.default)(placement);
1754  var invertDistance = [_enums.left, _enums.top].indexOf(basePlacement) >= 0 ? -1 : 1;
1755  var _ref = typeof offset === 'function' ? offset(Object.assign({}, rects, {
1756      placement: placement
1757    })) : offset,
1758    skidding = _ref[0],
1759    distance = _ref[1];
1760  skidding = skidding || 0;
1761  distance = (distance || 0) * invertDistance;
1762  return [_enums.left, _enums.right].indexOf(basePlacement) >= 0 ? {
1763    x: distance,
1764    y: skidding
1765  }
1765 : {
1766    x: skidding,
1767    y: distance
1768  };
1769}
1770function offset(_ref2) {
1771  var state = _ref2.state,
1772    options = _ref2.options,
1773    name = _ref2.name;
1774  var _options$offset = options.offset,
1775    offset = _options$offset === void 0 ? [0, 0] : _options$offset;
1776  var data = _enums.placements.reduce(function (acc, placement) {
1777    acc[placement] = distanceAndSkiddingToXY(placement, state.rects, offset);
1778    return acc;
1779  }, {});
1780  var _data$state$placement = data[state.placement],
1781    x = _data$state$placement.x,
1782    y = _data$state$placement.y;
1783  if (state.modifiersData.popperOffsets != null) {
1784    state.modifiersData.popperOffsets.x += x;
1785    state.modifiersData.popperOffsets.y += y;
1786  }
1787  state.modifiersData[name] = data;
1788} // eslint-disable-next-line import/no-unused-modules
1789var _default = {
1790  name: 'offset',
1791  enabled: true,
1792  phase: 'main',
1793  requires: ['popperOffsets'],
1794  fn: offset
1795};
1796exports.default = _default;
1797
1798},{"../enums.js":25,"../utils/getBasePlacement.js":46}],35:[function(require,module,exports){
1799"use strict";
1800
1801Object.defineProperty(exports, "__esModule", {
1802  value: true
1803});
1804exports.default = void 0;
1805var _computeOffsets = _interopRequireDefault(require("../utils/computeOffsets.js"));
1806function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
1807function popperOffsets(_ref) {
1808  var state = _ref.state,
1809    name = _ref.name;
1810  // Offsets are the actual position the popper needs to have to be
1811  // properly positioned near its reference element
1812  // This is the most basic placement, and will be adjusted by
1813  // the modifiers in the next step
1814  state.modifiersData[name] = (0, _computeOffsets.default)({
1815    reference: state.rects.reference,
1816    element: state.rects.popper,
1817    strategy: 'absolute',
1818    placement: state.placement
1819  });
1820} // eslint-disable-next-line import/no-unused-modules
1821var _default = {
1822  name: 'popperOffsets',
1823  enabled: true,
1824  phase: 'read',
1825  fn: popperOffsets,
1826  data: {}
1827};
1828exports.default = _default;
1829
1830},{"../utils/computeOffsets.js":40}],36:[function(require,module,exports){
1831"use strict";
1832
1833Object.defineProperty(exports, "__esModule", {
1834  value: true
1835});
1836exports.default = void 0;
1837var _enums = require("../enums.js");
1838var _getBasePlacement = _interopRequireDefault(require("../utils/getBasePlacement.js"));
1839var _getMainAxisFromPlacement = _interopRequireDefault(require("../utils/getMainAxisFromPlacement.js"));
1840var _getAltAxis = _interopRequireDefault(require("../utils/getAltAxis.js"));
1841var _within = require("../utils/within.js");
1842var _getLayoutRect = _interopRequireDefault(require("../dom-utils/getLayoutRect.js"));
1843var _getOffsetParent = _interopRequireDefault(require("../dom-utils/getOffsetParent.js"));
1844var _detectOverflow = _interopRequireDefault(require("../utils/detectOverflow.js"));
1845var _getVariation = _interopRequireDefault(require("../utils/getVariation.js"));
1846var _getFreshSideObject = _interopRequireDefault(require("../utils/getFreshSideObject.js"));
1847var _math = require("../utils/math.js");
1848function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
1849function preventOverflow(_ref) {
1850  var state = _ref.state,
1851    options = _ref.options,
1852    name = _ref.name;
1853  var _options$mainAxis = options.mainAxis,
1854    checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis,
1855    _options$altAxis = options.altAxis,
1856    checkAltAxis = _options$altAxis === void 0 ? false : _options$altAxis,
1857    boundary = options.boundary,
1858    rootBoundary = options.rootBoundary,
1859    altBoundary = options.altBoundary,
1860    padding = options.padding,
1861    _options$tether = options.tether,
1862    tether = _options$tether === void 0 ? true : _options$tether,
1863    _options$tetherOffset = options.tetherOffset,
1864    tetherOffset = _options$tetherOffset === void 0 ? 0 : _options$tetherOffset;
1865  var overflow = (0, _detectOverflow.default)(state, {
1866    boundary: boundary,
1867    rootBoundary: rootBoundary,
1868    padding: padding,
1869    altBoundary: altBoundary
1870  });
1871  var basePlacement = (0, _getBasePlacement.default)(state.placement);
1872  var variation = (0, _getVariation.default)(state.placement);
1873  var isBasePlacement = !variation;
1874  var mainAxis = (0, _getMainAxisFromPlacement.default)(basePlacement);
1875  var altAxis = (0, _getAltAxis.default)(mainAxis);
1876  var popperOffsets = state.modifiersData.popperOffsets;
1877  var referenceRect = state.rects.reference;
1878  var popperRect = state.rects.popper;
1879  var tetherOffsetValue = typeof tetherOffset === 'function' ? tetherOffset(Object.assign({}, state.rects, {
1880    placement: state.placement
1881  })) : tetherOffset;
1882  var normalizedTetherOffsetValue = typeof tetherOffsetValue === 'number' ? {
1883    mainAxis: tetherOffsetValue,
1884    altAxis: tetherOffsetValue
1885  } : Object.assign({
1886    mainAxis: 0,
1887    altAxis: 0
1888  }, tetherOffsetValue);
1889  var offsetModifierState = state.modifiersData.offset ? state.modifiersData.offset[state.placement] : null;
1890  var data = {
1891    x: 0,
1892    y: 0
1893  };
1894  if (!popperOffsets) {
1895    return;
1896  }
1897  if (checkMainAxis) {
1898    var _offsetModifierState$;
1899    var mainSide = mainAxis === 'y' ? _enums.top : _enums.left;
1900    var altSide = mainAxis === 'y' ? _enums.bottom : _enums.right;
1901    var len = mainAxis === 'y' ? 'height' : 'width';
1902    var offset = popperOffsets[mainAxis];
1903    var min = offset + overflow[mainSide];
1904    var max = offset - overflow[altSide];
1905    var additive = tether ? -popperRect[len] / 2 : 0;
1906    var minLen = variation === _enums.start ? referenceRect[len] : popperRect[len];
1907    var maxLen = variation === _enums.start ? -popperRect[len] : -referenceRect[len]; // We need to include the arrow in the calculation so the arrow doesn't go
1908    // outside the reference bounds
1909
1910    var arrowElement = state.elements.arrow;
1911    var arrowRect = tether && arrowElement ? (0, _getLayoutRect.default)(arrowElement) : {
1912      width: 0,
1913      height: 0
1914    };
1915    var arrowPaddingObject = state.modifiersData['arrow#persistent'] ? state.modifiersData['arrow#persistent'].padding : (0, _getFreshSideObject.default)();
1916    var arrowPaddingMin = arrowPaddingObject[mainSide];
1917    var arrowPaddingMax = arrowPaddingObject[altSide]; // If the reference length is smaller than the arrow length, we don't want
1918    // to include its full size in the calculation. If the reference is small
1919    // and near the edge of a boundary, the popper can overflow even if the
1920    // reference is not overflowing as well (e.g. virtual elements with no
1921    // width or height)
1922
1923    var arrowLen = (0, _within.within)(0, referenceRect[len], arrowRect[len]);
1924    var minOffset = isBasePlacement ? referenceRect[len] / 2 - additive - arrowLen - arrowPaddingMin - normalizedTetherOffsetValue.mainAxis : minLen - arrowLen - arrowPaddingMin - normalizedTetherOffsetValue.mainAxis;
1925    var maxOffset = isBasePlacement ? -referenceRect[len] / 2 + additive + arrowLen + arrowPaddingMax + normalizedTetherOffsetValue.mainAxis : maxLen + arrowLen + arrowPaddingMax + normalizedTetherOffsetValue.mainAxis;
1926    var arrowOffsetParent = state.elements.arrow && (0, _getOffsetParent.default)(state.elements.arrow);
1927    var clientOffset = arrowOffsetParent ? mainAxis === 'y' ? arrowOffsetParent.clientTop || 0 : arrowOffsetParent.clientLeft || 0 : 0;
1928    var offsetModifierValue = (_offsetModifierState$ = offsetModifierState == null ? void 0 : offsetModifierState[mainAxis]) != null ? _offsetModifierState$ : 0;
1929    var tetherMin = offset + minOffset - offsetModifierValue - clientOffset;
1930    var tetherMax = offset + maxOffset - offsetModifierValue;
1931    var preventedOffset = (0, _within.within)(tether ? (0, _math.min)(min, tetherMin) : min, offset, tether ? (0, _math.max)(max, tetherMax) : max);
1932    popperOffsets[mainAxis] = preventedOffset;
1933    data[mainAxis] = preventedOffset - offset;
1934  }
1935  if (checkAltAxis) {
1936    var _offsetModifierState$2;
1937    var _mainSide = mainAxis === 'x' ? _enums.top : _enums.left;
1938    var _altSide = mainAxis === 'x' ? _enums.bottom : _enums.right;
1939    var _offset = popperOffsets[altAxis];
1940    var _len = altAxis === 'y' ? 'height' : 'width';
1941    var _min = _offset + overflow[_mainSide];
1942    var _max = _offset - overflow[_altSide];
1943    var isOriginSide = [_enums.top, _enums.left].indexOf(basePlacement) !== -1;
1944    var _offsetModifierValue = (_offsetModifierState$2 = offsetModifierState == null ? void 0 : offsetModifierState[altAxis]) != null ? _offsetModifierState$2 : 0;
1945    var _tetherMin = isOriginSide ? _min : _offset - referenceRect[_len] - popperRect[_len] - _offsetModifierValue + normalizedTetherOffsetValue.altAxis;
1946    var _tetherMax = isOriginSide ? _offset + referenceRect[_len] + popperRect[_len] - _offsetModifierValue - normalizedTetherOffsetValue.altAxis : _max;
1947    var _preventedOffset = tether && isOriginSide ? (0, _within.withinMaxClamp)(_tetherMin, _offset, _tetherMax) : (0, _within.within)(tether ? _tetherMin : _min, _offset, tether ? _tetherMax : _max);
1948    popperOffsets[altAxis] = _preventedOffset;
1949    data[altAxis] = _preventedOffset - _offset;
1950  }
1951  state.modifiersData[name] = data;
1952} // eslint-disable-next-line import/no-unused-modules
1953var _default = {
1954  name: 'preventOverflow',
1955  enabled: true,
1956  phase: 'main',
1957  fn: preventOverflow,
1958  requiresIfExists: ['offset']
1959};
1960exports.default = _default;
1961
1962},{"../dom-utils/getLayoutRect.js":10,"../dom-utils/getOffsetParent.js":13,"../enums.js":25,"../utils/detectOverflow.js":42,"../utils/getAltAxis.js":45,"../utils/getBasePlacement.js":46,"../utils/getFreshSideObject.js":47,"../utils/getMainAxisFromPlacement.js":48,"../utils/getVariation.js":51,"../utils/math.js":52,"../utils/within.js":60}],37:[function(require,module,exports){
1963"use strict";
1964
1965Object.defineProperty(exports, "__esModule", {
1966  value: true
1967});
1968exports.defaultModifiers = exports.createPopper = void 0;
1969Object.defineProperty(exports, "detectOverflow", {
1970  enumerable: true,
1971  get: function () {
1972    return _createPopper.detectOverflow;
1973  }
1974});
1975Object.defineProperty(exports, "popperGenerator", {
1976  enumerable: true,
1977  get: function () {
1978    return _createPopper.popperGenerator;
1979  }
1980});
1981var _createPopper = require("./createPopper.js");
1982var _eventListeners = _interopRequireDefault(require("./modifiers/eventListeners.js"));
1983var _popperOffsets = _interopRequireDefault(require("./modifiers/popperOffsets.js"));
1984var _computeStyles = _interopRequireDefault(require("./modifiers/computeStyles.js"));
1985var _applyStyles = _interopRequireDefault(require("./modifiers/applyStyles.js"));
1986function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
1987var defaultModifiers = [_eventListeners.default, _popperOffsets.default, _computeStyles.default, _applyStyles.default];
1988exports.defaultModifiers = defaultModifiers;
1989var createPopper = /*#__PURE__*/(0, _createPopper.popperGenerator)({
1990  defaultModifiers: defaultModifiers
1991}); // eslint-disable-next-line import/no-unused-modules
1992exports.createPopper = createPopper;
1993
1994},{"./createPopper.js":1,"./modifiers/applyStyles.js":27,"./modifiers/computeStyles.js":29,"./modifiers/eventListeners.js":30,"./modifiers/popperOffsets.js":35}],38:[function(require,module,exports){
1995"use strict";
1996
1997Object.defineProperty(exports, "__esModule", {
1998  value: true
1999});
2000var _exportNames = {
2001  createPopper: true,
2002  defaultModifiers: true,
2003  popperGenerator: true,
2004  detectOverflow: true,
2005  createPopperLite: true
2006};
2007exports.createPopper = void 0;
2008Object.defineProperty(exports, "createPopperLite", {
2009  enumerable: true,
2010  get: function () {
2011    return _popperLite.createPopper;
2012  }
2013});
2014exports.defaultModifiers = void 0;
2015Object.defineProperty(exports, "detectOverflow", {
2016  enumerable: true,
2017  get: function () {
2018    return _createPopper.detectOverflow;
2019  }
2020});
2021Object.defineProperty(exports, "popperGenerator", {
2022  enumerable: true,
2023  get: function () {
2024    return _createPopper.popperGenerator;
2025  }
2026});
2027var _createPopper = require("./createPopper.js");
2028var _eventListeners = _interopRequireDefault(require("./modifiers/eventListeners.js"));
2029var _popperOffsets = _interopRequireDefault(require("./modifiers/popperOffsets.js"));
2030var _computeStyles = _interopRequireDefault(require("./modifiers/computeStyles.js"));
2031var _applyStyles = _interopRequireDefault(require("./modifiers/applyStyles.js"));
2032var _offset = _interopRequireDefault(require("./modifiers/offset.js"));
2033var _flip = _interopRequireDefault(require("./modifiers/flip.js"));
2034var _preventOverflow = _interopRequireDefault(require("./modifiers/preventOverflow.js"));
2035var _arrow = _interopRequireDefault(require("./modifiers/arrow.js"));
2036var _hide = _interopRequireDefault(require("./modifiers/hide.js"));
2037var _popperLite = require("./popper-lite.js");
2038var _index = require("./modifiers/index.js");
2039Object.keys(_index).forEach(function (key) {
2040  if (key === "default" || key === "__esModule") return;
2041  if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
2042  if (key in exports && exports[key] === _index[key]) return;
2043  Object.defineProperty(exports, key, {
2044    enumerable: true,
2045    get: function () {
2046      return _index[key];
2047    }
2048  });
2049});
2050function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
2051var defaultModifiers = [_eventListeners.default, _popperOffsets.default, _computeStyles.default, _applyStyles.default, _offset.default, _flip.default, _preventOverflow.default, _arrow.default, _hide.default];
2052exports.defaultModifiers = defaultModifiers;
2053var createPopper = /*#__PURE__*/(0, _createPopper.popperGenerator)({
2054  defaultModifiers: defaultModifiers
2055}); // eslint-disable-next-line import/no-unused-modules
2056exports.createPopper = createPopper;
2057
2058},{"./createPopper.js":1,"./modifiers/applyStyles.js":27,"./modifiers/arrow.js":28,"./modifiers/computeStyles.js":29,"./modifiers/eventListeners.js":30,"./modifiers/flip.js":31,"./modifiers/hide.js":32,"./modifiers/index.js":33,"./modifiers/offset.js":34,"./modifiers/popperOffsets.js":35,"./modifiers/preventOverflow.js":36,"./popper-lite.js":37}],39:[function(require,module,exports){
2059(function (process){(function (){
2060"use strict";
2061
2062Object.defineProperty(exports, "__esModule", {
2063  value: true
2064});
2065exports.default = computeAutoPlacement;
2066var _getVariation = _interopRequireDefault(require("./getVariation.js"));
2067var _enums = require("../enums.js");
2068var _detectOverflow = _interopRequireDefault(require("./detectOverflow.js"));
2069var _getBasePlacement = _interopRequireDefault(require("./getBasePlacement.js"));
2070function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
2071function computeAutoPlacement(state, options) {
2072  if (options === void 0) {
2073    options = {};
2074  }
2075  var _options = options,
2076    placement = _options.placement,
2077    boundary = _options.boundary,
2078    rootBoundary = _options.rootBoundary,
2079    padding = _options.padding,
2080    flipVariations = _options.flipVariations,
2081    _options$allowedAutoP = _options.allowedAutoPlacements,
2082    allowedAutoPlacements = _options$allowedAutoP === void 0 ? _enums.placements : _options$allowedAutoP;
2083  var variation = (0, _getVariation.default)(placement);
2084  var placements = variation ? flipVariations ? _enums.variationPlacements : _enums.variationPlacements.filter(function (placement) {
2085    return (0, _getVariation.default)(placement) === variation;
2086  }) : _enums.basePlacements;
2087  var allowedPlacements = placements.filter(function (placement) {
2088    return allowedAutoPlacements.indexOf(placement) >= 0;
2089  });
2090  if (allowedPlacements.length === 0) {
2091    allowedPlacements = placements;
2092    if (process.env.NODE_ENV !== "production") {
2093      console.error(['Popper: The `allowedAutoPlacements` option did not allow any', 'placements. Ensure the `placement` option matches the variation', 'of the allowed placements.', 'For example, "auto" cannot be used to allow "bottom-start".', 'Use "auto-start" instead.'].join(' '));
2094    }
2095  } // $FlowFixMe[incompatible-type]: Flow seems to have problems with two array unions...
2096
2097  var overflows = allowedPlacements.reduce(function (acc, placement) {
2098    acc[placement] = (0, _detectOverflow.default)(state, {
2099      placement: placement,
2100      boundary: boundary,
2101      rootBoundary: rootBoundary,
2102      padding: padding
2103    })[(0, _getBasePlacement.default)(placement)];
2104    return acc;
2105  }, {});
2106  return Object.keys(overflows).sort(function (a, b) {
2107    return overflows[a] - overflows[b];
2108  });
2109}
2110
2111}).call(this)}).call(this,require('_process'))
2112},{"../enums.js":25,"./detectOverflow.js":42,"./getBasePlacement.js":46,"./getVariation.js":51,"_process":64}],40:[function(require,module,exports){
2113"use strict";
2114
2115Object.defineProperty(exports, "__esModule", {
2116  value: true
2117});
2118exports.default = computeOffsets;
2119var _getBasePlacement = _interopRequireDefault(require("./getBasePlacement.js"));
2120var _getVariation = _interopRequireDefault(require("./getVariation.js"));
2121var _getMainAxisFromPlacement = _interopRequireDefault(require("./getMainAxisFromPlacement.js"));
2122var _enums = require("../enums.js");
2123function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
2124function computeOffsets(_ref) {
2125  var reference = _ref.reference,
2126    element = _ref.element,
2127    placement = _ref.placement;
2128  var basePlacement = placement ? (0, _getBasePlacement.default)(placement) : null;
2129  var variation = placement ? (0, _getVariation.default)(placement) : null;
2130  var commonX = reference.x + reference.width / 2 - element.width / 2;
2131  var commonY = reference.y + reference.height / 2 - element.height / 2;
2132  var offsets;
2133  switch (basePlacement) {
2134    case _enums.top:
2135      offsets = {
2136        x: commonX,
2137        y: reference.y - element.height
2138      };
2139      break;
2140    case _enums.bottom:
2141      offsets = {
2142        x: commonX,
2143        y: reference.y + reference.height
2144      };
2145      break;
2146    case _enums.right:
2147      offsets = {
2148        x: reference.x + reference.width,
2149        y: commonY
2150      };
2151      break;
2152    case _enums.left:
2153      offsets = {
2154        x: reference.x - element.width,
2155        y: commonY
2156      };
2157      break;
2158    default:
2159      offsets = {
2160        x: reference.x,
2161        y: reference.y
2162      };
2163  }
2164  var mainAxis = basePlacement ? (0, _getMainAxisFromPlacement.default)(basePlacement) : null;
2165  if (mainAxis != null) {
2166    var len = mainAxis === 'y' ? 'height' : 'width';
2167    switch (variation) {
2168      case _enums.start:
2169        offsets[mainAxis] = offsets[mainAxis] - (reference[len] / 2 - element[len] / 2);
2170        break;
2171      case _enums.end:
2172        offsets[mainAxis] = offsets[mainAxis] + (reference[len] / 2 - element[len] / 2);
2173        break;
2174      default:
2175    }
2176  }
2177  return offsets;
2178}
2179
2180},{"../enums.js":25,"./getBasePlacement.js":46,"./getMainAxisFromPlacement.js":48,"./getVariation.js":51}],41:[function(require,module,exports){
2181"use strict";
2182
2183Object.defineProperty(exports, "__esModule", {
2184  value: true
2185});
2186exports.default = debounce;
2187function debounce(fn) {
2188  var pending;
2189  return function () {
2190    if (!pending) {
2191      pending = new Promise(function (resolve) {
2192        Promise.resolve().then(function () {
2193          pending = undefined;
2194          resolve(fn());
2195        });
2196      });
2197    }
2198    return pending;
2199  };
2200}
2201
2202},{}],42:[function(require,module,exports){
2203"use strict";
2204
2205Object.defineProperty(exports, "__esModule", {
2206  value: true
2207});
2208exports.default = detectOverflow;
2209var _getClippingRect = _interopRequireDefault(require("../dom-utils/getClippingRect.js"));
2210var _getDocumentElement = _interopRequireDefault(require("../dom-utils/getDocumentElement.js"));
2211var _getBoundingClientRect = _interopRequireDefault(require("../dom-utils/getBoundingClientRect.js"));
2212var _computeOffsets = _interopRequireDefault(require("./computeOffsets.js"));
2213var _rectToClientRect = _interopRequireDefault(require("./rectToClientRect.js"));
2214var _enums = require("../enums.js");
2215var _instanceOf = require("../dom-utils/instanceOf.js");
2216var _mergePaddingObject = _interopRequireDefault(require("./mergePaddingObject.js"));
2217var _expandToHashMap = _interopRequireDefault(require("./expandToHashMap.js"));
2218function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
2219// eslint-disable-next-line import/no-unused-modules
2220
2221function detectOverflow(state, options) {
2222  if (options === void 0) {
2223    options = {};
2224  }
2225  var _options = options,
2226    _options$placement = _options.placement,
2227    placement = _options$placement === void 0 ? state.placement : _options$placement,
2228    _options$strategy = _options.strategy,
2229    strategy = _options$strategy === void 0 ? state.strategy : _options$strategy,
2230    _options$boundary = _options.boundary,
2231    boundary = _options$boundary === void 0 ? _enums.clippingParents : _options$boundary,
2232    _options$rootBoundary = _options.rootBoundary,
2233    rootBoundary = _options$rootBoundary === void 0 ? _enums.viewport : _options$rootBoundary,
2234    _options$elementConte = _options.elementContext,
2235    elementContext = _options$elementConte === void 0 ? _enums.popper : _options$elementConte,
2236    _options$altBoundary = _options.altBoundary,
2237    altBoundary = _options$altBoundary === void 0 ? false : _options$altBoundary,
2238    _options$padding = _options.padding,
2239    padding = _options$padding === void 0 ? 0 : _options$padding;
2240  var paddingObject = (0, _mergePaddingObject.default)(typeof padding !== 'number' ? padding : (0, _expandToHashMap.default)(padding, _enums.basePlacements));
2241  var altContext = elementContext === _enums.popper ? _enums.reference : _enums.popper;
2242  var popperRect = state.rects.popper;
2243  var element = state.elements[altBoundary ? altContext : elementContext];
2244  var clippingClientRect = (0, _getClippingRect.default)((0, _instanceOf.isElement)(element) ? element : element.contextElement || (0, _getDocumentElement.default)(state.elements.popper), boundary, rootBoundary, strategy);
2245  var referenceClientRect = (0, _getBoundingClientRect.default)(state.elements.reference);
2246  var popperOffsets = (0, _computeOffsets.default)({
2247    reference: referenceClientRect,
2248    element: popperRect,
2249    strategy: 'absolute',
2250    placement: placement
2251  });
2252  var popperClientRect = (0, _rectToClientRect.default)(Object.assign({}, popperRect, popperOffsets));
2253  var elementClientRect = elementContext === _enums.popper ? popperClientRect : referenceClientRect; // positive = overflowing the clipping rect
2254  // 0 or negative = within the clipping rect
2255
2256  var overflowOffsets = {
2257    top: clippingClientRect.top - elementClientRect.top + paddingObject.top,
2258    bottom: elementClientRect.bottom - clippingClientRect.bottom + paddingObject.bottom,
2259    left: clippingClientRect.left - elementClientRect.left + paddingObject.left,
2260    right: elementClientRect.right - clippingClientRect.right + paddingObject.right
2261  };
2262  var offsetData = state.modifiersData.offset; // Offsets can be applied only to the popper element
2263
2264  if (elementContext === _enums.popper && offsetData) {
2265    var offset = offsetData[placement];
2266    Object.keys(overflowOffsets).forEach(function (key) {
2267      var multiply = [_enums.right, _enums.bottom].indexOf(key) >= 0 ? 1 : -1;
2268      var axis = [_enums.top, _enums.bottom].indexOf(key) >= 0 ? 'y' : 'x';
2269      overflowOffsets[key] += offset[axis] * multiply;
2270    });
2271  }
2272  return overflowOffsets;
2273}
2274
2275},{"../dom-utils/getBoundingClientRect.js":3,"../dom-utils/getClippingRect.js":4,"../dom-utils/getDocumentElement.js":7,"../dom-utils/instanceOf.js":20,"../enums.js":25,"./computeOffsets.js":40,"./expandToHashMap.js":43,"./mergePaddingOb
2275ject.js":54,"./rectToClientRect.js":56}],43:[function(require,module,exports){
2276"use strict";
2277
2278Object.defineProperty(exports, "__esModule", {
2279  value: true
2280});
2281exports.default = expandToHashMap;
2282function expandToHashMap(value, keys) {
2283  return keys.reduce(function (hashMap, key) {
2284    hashMap[key] = value;
2285    return hashMap;
2286  }, {});
2287}
2288
2289},{}],44:[function(require,module,exports){
2290"use strict";
2291
2292Object.defineProperty(exports, "__esModule", {
2293  value: true
2294});
2295exports.default = format;
2296function format(str) {
2297  for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
2298    args[_key - 1] = arguments[_key];
2299  }
2300  return [].concat(args).reduce(function (p, c) {
2301    return p.replace(/%s/, c);
2302  }, str);
2303}
2304
2305},{}],45:[function(require,module,exports){
2306"use strict";
2307
2308Object.defineProperty(exports, "__esModule", {
2309  value: true
2310});
2311exports.default = getAltAxis;
2312function getAltAxis(axis) {
2313  return axis === 'x' ? 'y' : 'x';
2314}
2315
2316},{}],46:[function(require,module,exports){
2317"use strict";
2318
2319Object.defineProperty(exports, "__esModule", {
2320  value: true
2321});
2322exports.default = getBasePlacement;
2323var _enums = require("../enums.js");
2324function getBasePlacement(placement) {
2325  return placement.split('-')[0];
2326}
2327
2328},{"../enums.js":25}],47:[function(require,module,exports){
2329"use strict";
2330
2331Object.defineProperty(exports, "__esModule", {
2332  value: true
2333});
2334exports.default = getFreshSideObject;
2335function getFreshSideObject() {
2336  return {
2337    top: 0,
2338    right: 0,
2339    bottom: 0,
2340    left: 0
2341  };
2342}
2343
2344},{}],48:[function(require,module,exports){
2345"use strict";
2346
2347Object.defineProperty(exports, "__esModule", {
2348  value: true
2349});
2350exports.default = getMainAxisFromPlacement;
2351function getMainAxisFromPlacement(placement) {
2352  return ['top', 'bottom'].indexOf(placement) >= 0 ? 'x' : 'y';
2353}
2354
2355},{}],49:[function(require,module,exports){
2356"use strict";
2357
2358Object.defineProperty(exports, "__esModule", {
2359  value: true
2360});
2361exports.default = getOppositePlacement;
2362var hash = {
2363  left: 'right',
2364  right: 'left',
2365  bottom: 'top',
2366  top: 'bottom'
2367};
2368function getOppositePlacement(placement) {
2369  return placement.replace(/left|right|bottom|top/g, function (matched) {
2370    return hash[matched];
2371  });
2372}
2373
2374},{}],50:[function(require,module,exports){
2375"use strict";
2376
2377Object.defineProperty(exports, "__esModule", {
2378  value: true
2379});
2380exports.default = getOppositeVariationPlacement;
2381var hash = {
2382  start: 'end',
2383  end: 'start'
2384};
2385function getOppositeVariationPlacement(placement) {
2386  return placement.replace(/start|end/g, function (matched) {
2387    return hash[matched];
2388  });
2389}
2390
2391},{}],51:[function(require,module,exports){
2392"use strict";
2393
2394Object.defineProperty(exports, "__esModule", {
2395  value: true
2396});
2397exports.default = getVariation;
2398function getVariation(placement) {
2399  return placement.split('-')[1];
2400}
2401
2402},{}],52:[function(require,module,exports){
2403"use strict";
2404
2405Object.defineProperty(exports, "__esModule", {
2406  value: true
2407});
2408exports.round = exports.min = exports.max = void 0;
2409var max = Math.max;
2410exports.max = max;
2411var min = Math.min;
2412exports.min = min;
2413var round = Math.round;
2414exports.round = round;
2415
2416},{}],53:[function(require,module,exports){
2417"use strict";
2418
2419Object.defineProperty(exports, "__esModule", {
2420  value: true
2421});
2422exports.default = mergeByName;
2423function mergeByName(modifiers) {
2424  var merged = modifiers.reduce(function (merged, current) {
2425    var existing = merged[current.name];
2426    merged[current.name] = existing ? Object.assign({}, existing, current, {
2427      options: Object.assign({}, existing.options, current.options),
2428      data: Object.assign({}, existing.data, current.data)
2429    }) : current;
2430    return merged;
2431  }, {}); // IE11 does not support Object.values
2432
2433  return Object.keys(merged).map(function (key) {
2434    return merged[key];
2435  });
2436}
2437
2438},{}],54:[function(require,module,exports){
2439"use strict";
2440
2441Object.defineProperty(exports, "__esModule", {
2442  value: true
2443});
2444exports.default = mergePaddingObject;
2445var _getFreshSideObject = _interopRequireDefault(require("./getFreshSideObject.js"));
2446function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
2447function mergePaddingObject(paddingObject) {
2448  return Object.assign({}, (0, _getFreshSideObject.default)(), paddingObject);
2449}
2450
2451},{"./getFreshSideObject.js":47}],55:[function(require,module,exports){
2452"use strict";
2453
2454Object.defineProperty(exports, "__esModule", {
2455  value: true
2456});
2457exports.default = orderModifiers;
2458var _enums = require("../enums.js");
2459// source: https://stackoverflow.com/questions/49875255
2460
2461function order(modifiers) {
2462  var map = new Map();
2463  var visited = new Set();
2464  var result = [];
2465  modifiers.forEach(function (modifier) {
2466    map.set(modifier.name, modifier);
2467  }); // On visiting object, check for its dependencies and visit them recursively
2468
2469  function sort(modifier) {
2470    visited.add(modifier.name);
2471    var requires = [].concat(modifier.requires || [], modifier.requiresIfExists || []);
2472    requires.forEach(function (dep) {
2473      if (!visited.has(dep)) {
2474        var depModifier = map.get(dep);
2475        if (depModifier) {
2476          sort(depModifier);
2477        }
2478      }
2479    });
2480    result.push(modifier);
2481  }
2482  modifiers.forEach(function (modifier) {
2483    if (!visited.has(modifier.name)) {
2484      // check for visited object
2485      sort(modifier);
2486    }
2487  });
2488  return result;
2489}
2490function orderModifiers(modifiers) {
2491  // order based on dependencies
2492  var orderedModifiers = order(modifiers); // order based on phase
2493
2494  return _enums.modifierPhases.reduce(function (acc, phase) {
2495    return acc.concat(orderedModifiers.filter(function (modifier) {
2496      return modifier.phase === phase;
2497    }));
2498  }, []);
2499}
2500
2501},{"../enums.js":25}],56:[function(require,module,exports){
2502"use strict";
2503
2504Object.defineProperty(exports, "__esModule", {
2505  value: true
2506});
2507exports.default = rectToClientRect;
2508function rectToClientRect(rect) {
2509  return Object.assign({}, rect, {
2510    left: rect.x,
2511    top: rect.y,
2512    right: rect.x + rect.width,
2513    bottom: rect.y + rect.height
2514  });
2515}
2516
2517},{}],57:[function(require,module,exports){
2518"use strict";
2519
2520Object.defineProperty(exports, "__esModule", {
2521  value: true
2522});
2523exports.default = uniqueBy;
2524function uniqueBy(arr, fn) {
2525  var identifiers = new Set();
2526  return arr.filter(function (item) {
2527    var identifier = fn(item);
2528    if (!identifiers.has(identifier)) {
2529      identifiers.add(identifier);
2530      return true;
2531    }
2532  });
2533}
2534
2535},{}],58:[function(require,module,exports){
2536"use strict";
2537
2538Object.defineProperty(exports, "__esModule", {
2539  value: true
2540});
2541exports.default = getUAString;
2542function getUAString() {
2543  var uaData = navigator.userAgentData;
2544  if (uaData != null && uaData.brands) {
2545    return uaData.brands.map(function (item) {
2546      return item.brand + "/" + item.version;
2547    }).join(' ');
2548  }
2549  return navigator.userAgent;
2550}
2551
2552},{}],59:[function(require,module,exports){
2553"use strict";
2554
2555Object.defineProperty(exports, "__esModule", {
2556  value: true
2557});
2558exports.default = validateModifiers;
2559var _format = _interopRequireDefault(require("./format.js"));
2560var _enums = require("../enums.js");
2561function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
2562var INVALID_MODIFIER_ERROR = 'Popper: modifier "%s" provided an invalid %s property, expected %s but got %s';
2563var MISSING_DEPENDENCY_ERROR = 'Popper: modifier "%s" requires "%s", but "%s" modifier is not available';
2564var VALID_PROPERTIES = ['name', 'enabled', 'phase', 'fn', 'effect', 'requires', 'options'];
2565function validateModifiers(modifiers) {
2566  modifiers.forEach(function (modifier) {
2567    [].concat(Object.keys(modifier), VALID_PROPERTIES) // IE11-compatible replacement for `new Set(iterable)`
2568    .filter(function (value, index, self) {
2569      return self.indexOf(value) === index;
2570    }
2570).forEach(function (key) {
2571      switch (key) {
2572        case 'name':
2573          if (typeof modifier.name !== 'string') {
2574            console.error((0, _format.default)(INVALID_MODIFIER_ERROR, String(modifier.name), '"name"', '"string"', "\"" + String(modifier.name) + "\""));
2575          }
2576          break;
2577        case 'enabled':
2578          if (typeof modifier.enabled !== 'boolean') {
2579            console.error((0, _format.default)(INVALID_MODIFIER_ERROR, modifier.name, '"enabled"', '"boolean"', "\"" + String(modifier.enabled) + "\""));
2580          }
2581          break;
2582        case 'phase':
2583          if (_enums.modifierPhases.indexOf(modifier.phase) < 0) {
2584            console.error((0, _format.default)(INVALID_MODIFIER_ERROR, modifier.name, '"phase"', "either " + _enums.modifierPhases.join(', '), "\"" + String(modifier.phase) + "\""));
2585          }
2586          break;
2587        case 'fn':
2588          if (typeof modifier.fn !== 'function') {
2589            console.error((0, _format.default)(INVALID_MODIFIER_ERROR, modifier.name, '"fn"', '"function"', "\"" + String(modifier.fn) + "\""));
2590          }
2591          break;
2592        case 'effect':
2593          if (modifier.effect != null && typeof modifier.effect !== 'function') {
2594            console.error((0, _format.default)(INVALID_MODIFIER_ERROR, modifier.name, '"effect"', '"function"', "\"" + String(modifier.fn) + "\""));
2595          }
2596          break;
2597        case 'requires':
2598          if (modifier.requires != null && !Array.isArray(modifier.requires)) {
2599            console.error((0, _format.default)(INVALID_MODIFIER_ERROR, modifier.name, '"requires"', '"array"', "\"" + String(modifier.requires) + "\""));
2600          }
2601          break;
2602        case 'requiresIfExists':
2603          if (!Array.isArray(modifier.requiresIfExists)) {
2604            console.error((0, _format.default)(INVALID_MODIFIER_ERROR, modifier.name, '"requiresIfExists"', '"array"', "\"" + String(modifier.requiresIfExists) + "\""));
2605          }
2606          break;
2607        case 'options':
2608        case 'data':
2609          break;
2610        default:
2611          console.error("PopperJS: an invalid property has been provided to the \"" + modifier.name + "\" modifier, valid properties are " + VALID_PROPERTIES.map(function (s) {
2612            return "\"" + s + "\"";
2613          }).join(', ') + "; but \"" + key + "\" was provided.");
2614      }
2615      modifier.requires && modifier.requires.forEach(function (requirement) {
2616        if (modifiers.find(function (mod) {
2617          return mod.name === requirement;
2618        }) == null) {
2619          console.error((0, _format.default)(MISSING_DEPENDENCY_ERROR, String(modifier.name), requirement, requirement));
2620        }
2621      });
2622    });
2623  });
2624}
2625
2626},{"../enums.js":25,"./format.js":44}],60:[function(require,module,exports){
2627"use strict";
2628
2629Object.defineProperty(exports, "__esModule", {
2630  value: true
2631});
2632exports.within = within;
2633exports.withinMaxClamp = withinMaxClamp;
2634var _math = require("./math.js");
2635function within(min, value, max) {
2636  return (0, _math.max)(min, (0, _math.min)(value, max));
2637}
2638function withinMaxClamp(min, value, max) {
2639  var v = within(min, value, max);
2640  return v > max ? max : v;
2641}
2642
2643},{"./math.js":52}],61:[function(require,module,exports){
2644"use strict";
2645
2646Object.defineProperty(exports, "__esModule", {
2647  value: true
2648});
2649exports.Tooltip = exports.Toast = exports.Tab = exports.ScrollSpy = exports.Popover = exports.Offcanvas = exports.Modal = exports.Dropdown = exports.Collapse = exports.Carousel = exports.Button = exports.Alert = void 0;
2650var Popper = _interopRequireWildcard(require("@popperjs/core"));
2651function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
2652function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;
vendor: 9,062 bytes, lines 2652-2933
2652 if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
2653/*!
2654  * Bootstrap v5.2.2 (https://getbootstrap.com/)
2655  * Copyright 2011-2022 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
2656  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
2657  */
2658
2659/**
2660 * --------------------------------------------------------------------------
2661 * Bootstrap (v5.2.2): util/index.js
2662 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
2663 * --------------------------------------------------------------------------
2664 */
2665const MAX_UID = 1000000;
2666const MILLISECONDS_MULTIPLIER = 1000;
2667const TRANSITION_END = 'transitionend'; // Shout-out Angus Croll (https://goo.gl/pxwQGp)
2668
2669const toType = object => {
2670  if (object === null || object === undefined) {
2671    return `${object}`;
2672  }
2673  return Object.prototype.toString.call(object).match(/\s([a-z]+)/i)[1].toLowerCase();
2674};
2675/**
2676 * Public Util API
2677 */
2678
2679const getUID = prefix => {
2680  do {
2681    prefix += Math.floor(Math.random() * MAX_UID);
2682  } while (document.getElementById(prefix));
2683  return prefix;
2684};
2685const getSelector = element => {
2686  let selector = element.getAttribute('data-bs-target');
2687  if (!selector || selector === '#') {
2688    let hrefAttribute = element.getAttribute('href'); // The only valid content that could double as a selector are IDs or classes,
2689    // so everything starting with `#` or `.`. If a "real" URL is used as the selector,
2690    // `document.querySelector` will rightfully complain it is invalid.
2691    // See https://github.com/twbs/bootstrap/issues/32273
2692
2693    if (!hrefAttribute || !hrefAttribute.includes('#') && !hrefAttribute.startsWith('.')) {
2694      return null;
2695    } // Just in case some CMS puts out a full URL with the anchor appended
2696
2697    if (hrefAttribute.includes('#') && !hrefAttribute.startsWith('#')) {
2698      hrefAttribute = `#${hrefAttribute.split('#')[1]}`;
2699    }
2700    selector = hrefAttribute && hrefAttribute !== '#' ? hrefAttribute.trim() : null;
2701  }
2702  return selector;
2703};
2704const getSelectorFromElement = element => {
2705  const selector = getSelector(element);
2706  if (selector) {
2707    return document.querySelector(selector) ? selector : null;
2708  }
2709  return null;
2710};
2711const getElementFromSelector = element => {
2712  const selector = getSelector(element);
2713  return selector ? document.querySelector(selector) : null;
2714};
2715const getTransitionDurationFromElement = element => {
2716  if (!element) {
2717    return 0;
2718  } // Get transition-duration of the element
2719
2720  let {
2721    transitionDuration,
2722    transitionDelay
2723  } = window.getComputedStyle(element);
2724  const floatTransitionDuration = Number.parseFloat(transitionDuration);
2725  const floatTransitionDelay = Number.parseFloat(transitionDelay); // Return 0 if element or transition duration is not found
2726
2727  if (!floatTransitionDuration && !floatTransitionDelay) {
2728    return 0;
2729  } // If multiple durations are defined, take the first
2730
2731  transitionDuration = transitionDuration.split(',')[0];
2732  transitionDelay = transitionDelay.split(',')[0];
2733  return (Number.parseFloat(transitionDuration) + Number.parseFloat(transitionDelay)) * MILLISECONDS_MULTIPLIER;
2734};
2735const triggerTransitionEnd = element => {
2736  element.dispatchEvent(new Event(TRANSITION_END));
2737};
2738const isElement = object => {
2739  if (!object || typeof object !== 'object') {
2740    return false;
2741  }
2742  if (typeof object.jquery !== 'undefined') {
2743    object = object[0];
2744  }
2745  return typeof object.nodeType !== 'undefined';
2746};
2747const getElement = object => {
2748  // it's a jQuery object or a node element
2749  if (isElement(object)) {
2750    return object.jquery ? object[0] : object;
2751  }
2752  if (typeof object === 'string' && object.length > 0) {
2753    return document.querySelector(object);
2754  }
2755  return null;
2756};
2757const isVisible = element => {
2758  if (!isElement(element) || element.getClientRects().length === 0) {
2759    return false;
2760  }
2761  const elementIsVisible = getComputedStyle(element).getPropertyValue('visibility') === 'visible'; // Handle `details` element as its content may falsie appear visible when it is closed
2762
2763  const closedDetails = element.closest('details:not([open])');
2764  if (!closedDetails) {
2765    return elementIsVisible;
2766  }
2767  if (closedDetails !== element) {
2768    const summary = element.closest('summary');
2769    if (summary && summary.parentNode !== closedDetails) {
2770      return false;
2771    }
2772    if (summary === null) {
2773      return false;
2774    }
2775  }
2776  return elementIsVisible;
2777};
2778const isDisabled = element => {
2779  if (!element || element.nodeType !== Node.ELEMENT_NODE) {
2780    return true;
2781  }
2782  if (element.classList.contains('disabled')) {
2783    return true;
2784  }
2785  if (typeof element.disabled !== 'undefined') {
2786    return element.disabled;
2787  }
2788  return element.hasAttribute('disabled') && element.getAttribute('disabled') !== 'false';
2789};
2790const findShadowRoot = element => {
2791  if (!document.documentElement.attachShadow) {
2792    return null;
2793  } // Can find the shadow root otherwise it'll return the document
2794
2795  if (typeof element.getRootNode === 'function') {
2796    const root = element.getRootNode();
2797    return root instanceof ShadowRoot ? root : null;
2798  }
2799  if (element instanceof ShadowRoot) {
2800    return element;
2801  } // when we don't find a shadow root
2802
2803  if (!element.parentNode) {
2804    return null;
2805  }
2806  return findShadowRoot(element.parentNode);
2807};
2808const noop = () => {};
2809/**
2810 * Trick to restart an element's animation
2811 *
2812 * @param {HTMLElement} element
2813 * @return void
2814 *
2815 * @see https://www.charistheo.io/blog/2021/02/restart-a-css-animation-with-javascript/#restarting-a-css-animation
2816 */
2817
2818const reflow = element => {
2819  element.offsetHeight; // eslint-disable-line no-unused-expressions
2820};
2821
2822const getjQuery = () => {
2823  if (window.jQuery && !document.body.hasAttribute('data-bs-no-jquery')) {
2824    return window.jQuery;
2825  }
2826  return null;
2827};
2828const DOMContentLoadedCallbacks = [];
2829const onDOMContentLoaded = callback => {
2830  if (document.readyState === 'loading') {
2831    // add listener on the first call when the document is in loading state
2832    if (!DOMContentLoadedCallbacks.length) {
2833      document.addEventListener('DOMContentLoaded', () => {
2834        for (const callback of DOMContentLoadedCallbacks) {
2835          callback();
2836        }
2837      });
2838    }
2839    DOMContentLoadedCallbacks.push(callback);
2840  } else {
2841    callback();
2842  }
2843};
2844const isRTL = () => document.documentElement.dir === 'rtl';
2845const defineJQueryPlugin = plugin => {
2846  onDOMContentLoaded(() => {
2847    const $ = getjQuery();
2848    /* istanbul ignore if */
2849
2850    if ($) {
2851      const name = plugin.NAME;
2852      const JQUERY_NO_CONFLICT = $.fn[name];
2853      $.fn[name] = plugin.jQueryInterface;
2854      $.fn[name].Constructor = plugin;
2855      $.fn[name].noConflict = () => {
2856        $.fn[name] = JQUERY_NO_CONFLICT;
2857        return plugin.jQueryInterface;
2858      };
2859    }
2860  });
2861};
2862const execute = callback => {
2863  if (typeof callback === 'function') {
2864    callback();
2865  }
2866};
2867const executeAfterTransition = (callback, transitionElement, waitForTransition = true) => {
2868  if (!waitForTransition) {
2869    execute(callback);
2870    return;
2871  }
2872  const durationPadding = 5;
2873  const emulatedDuration = getTransitionDurationFromElement(transitionElement) + durationPadding;
2874  let called = false;
2875  const handler = ({
2876    target
2877  }) => {
2878    if (target !== transitionElement) {
2879      return;
2880    }
2881    called = true;
2882    transitionElement.removeEventListener(TRANSITION_END, handler);
2883    execute(callback);
2884  };
2885  transitionElement.addEventListener(TRANSITION_END, handler);
2886  setTimeout(() => {
2887    if (!called) {
2888      triggerTransitionEnd(transitionElement);
2889    }
2890  }, emulatedDuration);
2891};
2892/**
2893 * Return the previous/next element of a list.
2894 *
2895 * @param {array} list    The list of elements
2896 * @param activeElement   The active element
2897 * @param shouldGetNext   Choose to get next or previous element
2898 * @param isCycleAllowed
2899 * @return {Element|elem} The proper element
2900 */
2901
2902const getNextActiveElement = (list, activeElement, shouldGetNext, isCycleAllowed) => {
2903  const listLength = list.length;
2904  let index = list.indexOf(activeElement); // if the element does not exist in the list return an element
2905  // depending on the direction and if cycle is allowed
2906
2907  if (index === -1) {
2908    return !shouldGetNext && isCycleAllowed ? list[listLength - 1] : list[0];
2909  }
2910  index += shouldGetNext ? 1 : -1;
2911  if (isCycleAllowed) {
2912    index = (index + listLength) % listLength;
2913  }
2914  return list[Math.max(0, Math.min(index, listLength - 1))];
2915};
2916
2917/**
2918 * --------------------------------------------------------------------------
2919 * Bootstrap (v5.2.2): dom/event-handler.js
2920 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
2921 * --------------------------------------------------------------------------
2922 */
2923/**
2924 * Constants
2925 */
2926
2927const namespaceRegex = /[^.]*(?=\..*)\.|.*/;
2928const stripNameRegex = /\..*/;
2929const stripUidRegex = /::\d+$/;
2930const eventRegistry = {}; // Events storage
2931
2932let uidEvent = 1;
2933const customEvents = {
vendor: 6,050 bytes, lines 2934-3075
2934  mouseenter: 'mouseover',
2935  mouseleave: 'mouseout'
2936};
2937const nativeEvents = new Set(['click', 'dblclick', 'mouseup', 'mousedown', 'contextmenu', 'mousewheel', 'DOMMouseScroll', 'mouseover', 'mouseout', 'mousemove', 'selectstart', 'selectend', 'keydown', 'keypress', 'keyup', 'orientationchange', 'touchstart', 'touchmove', 'touchend', 'touchcancel', 'pointerdown', 'pointermove', 'pointerup', 'pointerleave', 'pointercancel', 'gesturestart', 'gesturechange', 'gestureend', 'focus', 'blur', 'change', 'reset', 'select', 'submit', 'focusin', 'focusout', 'load', 'unload', 'beforeunload', 'resize', 'move', 'DOMContentLoaded', 'readystatechange', 'error', 'abort', 'scroll']);
2938/**
2939 * Private methods
2940 */
2941
2942function makeEventUid(element, uid) {
2943  return uid && `${uid}::${uidEvent++}` || element.uidEvent || uidEvent++;
2944}
2945function getElementEvents(element) {
2946  const uid = makeEventUid(element);
2947  element.uidEvent = uid;
2948  eventRegistry[uid] = eventRegistry[uid] || {};
2949  return eventRegistry[uid];
2950}
2951function bootstrapHandler(element, fn) {
2952  return function handler(event) {
2953    hydrateObj(event, {
2954      delegateTarget: element
2955    });
2956    if (handler.oneOff) {
2957      EventHandler.off(element, event.type, fn);
2958    }
2959    return fn.apply(element, [event]);
2960  };
2961}
2962function bootstrapDelegationHandler(element, selector, fn) {
2963  return function handler(event) {
2964    const domElements = element.querySelectorAll(selector);
2965    for (let {
2966      target
2967    } = event; target && target !== this; target = target.parentNode) {
2968      for (const domElement of domElements) {
2969        if (domElement !== target) {
2970          continue;
2971        }
2972        hydrateObj(event, {
2973          delegateTarget: target
2974        });
2975        if (handler.oneOff) {
2976          EventHandler.off(element, event.type, selector, fn);
2977        }
2978        return fn.apply(target, [event]);
2979      }
2980    }
2981  };
2982}
2983function findHandler(events, callable, delegationSelector = null) {
2984  return Object.values(events).find(event => event.callable === callable && event.delegationSelector === delegationSelector);
2985}
2986function normalizeParameters(originalTypeEvent, handler, delegationFunction) {
2987  const isDelegated = typeof handler === 'string'; // todo: tooltip passes `false` instead of selector, so we need to check
2988
2989  const callable = isDelegated ? delegationFunction : handler || delegationFunction;
2990  let typeEvent = getTypeEvent(originalTypeEvent);
2991  if (!nativeEvents.has(typeEvent)) {
2992    typeEvent = originalTypeEvent;
2993  }
2994  return [isDelegated, callable, typeEvent];
2995}
2996function addHandler(element, originalTypeEvent, handler, delegationFunction, oneOff) {
2997  if (typeof originalTypeEvent !== 'string' || !element) {
2998    return;
2999  }
3000  let [isDelegated, callable, typeEvent] = normalizeParameters(originalTypeEvent, handler, delegationFunction); // in case of mouseenter or mouseleave wrap the handler within a function that checks for its DOM position
3001  // this prevents the handler from being dispatched the same way as mouseover or mouseout does
3002
3003  if (originalTypeEvent in customEvents) {
3004    const wrapFunction = fn => {
3005      return function (event) {
3006        if (!event.relatedTarget || event.relatedTarget !== event.delegateTarget && !event.delegateTarget.contains(event.relatedTarget)) {
3007          return fn.call(this, event);
3008        }
3009      };
3010    };
3011    callable = wrapFunction(callable);
3012  }
3013  const events = getElementEvents(element);
3014  const handlers = events[typeEvent] || (events[typeEvent] = {});
3015  const previousFunction = findHandler(handlers, callable, isDelegated ? handler : null);
3016  if (previousFunction) {
3017    previousFunction.oneOff = previousFunction.oneOff && oneOff;
3018    return;
3019  }
3020  const uid = makeEventUid(callable, originalTypeEvent.replace(namespaceRegex, ''));
3021  const fn = isDelegated ? bootstrapDelegationHandler(element, handler, callable) : bootstrapHandler(element, callable);
3022  fn.delegationSelector = isDelegated ? handler : null;
3023  fn.callable = callable;
3024  fn.oneOff = oneOff;
3025  fn.uidEvent = uid;
3026  handlers[uid] = fn;
3027  element.addEventListener(typeEvent, fn, isDelegated);
3028}
3029function removeHandler(element, events, typeEvent, handler, delegationSelector) {
3030  const fn = findHandler(events[typeEvent], handler, delegationSelector);
3031  if (!fn) {
3032    return;
3033  }
3034  element.removeEventListener(typeEvent, fn, Boolean(delegationSelector));
3035  delete events[typeEvent][fn.uidEvent];
3036}
3037function removeNamespacedHandlers(element, events, typeEvent, namespace) {
3038  const storeElementEvent = events[typeEvent] || {};
3039  for (const handlerKey of Object.keys(storeElementEvent)) {
3040    if (handlerKey.includes(namespace)) {
3041      const event = storeElementEvent[handlerKey];
3042      removeHandler(element, events, typeEvent, event.callable, event.delegationSelector);
3043    }
3044  }
3045}
3046function getTypeEvent(event) {
3047  // allow to get the native events from namespaced events ('click.bs.button' --> 'click')
3048  event = event.replace(stripNameRegex, '');
3049  return customEvents[event] || event;
3050}
3051const EventHandler = {
3052  on(element, event, handler, delegationFunction) {
3053    addHandler(element, event, handler, delegationFunction, false);
3054  },
3055  one(element, event, handler, delegationFunction) {
3056    addHandler(element, event, handler, delegationFunction, true);
3057  },
3058  off(element, originalTypeEvent, handler, delegationFunction) {
3059    if (typeof originalTypeEvent !== 'string' || !element) {
3060      return;
3061    }
3062    const [isDelegated, callable, typeEvent] = normalizeParameters(originalTypeEvent, handler, delegationFunction);
3063    const inNamespace = typeEvent !== originalTypeEvent;
3064    const events = getElementEvents(element);
3065    const storeElementEvent = events[typeEvent] || {};
3066    const isNamespace = originalTypeEvent.startsWith('.');
3067    if (typeof callable !== 'undefined') {
3068      // Simplest case: handler is passed, remove that listener ONLY.
3069      if (!Object.keys(storeElementEvent).length) {
3070        return;
3071      }
3072      removeHandler(element, events, typeEvent, callable, isDelegated ? handler : null);
3073      return;
3074    }
3075    if (isNamespace) {
vendor: 7,370 bytes, lines 3076-3321
3076      for (const elementEvent of Object.keys(events)) {
3077        removeNamespacedHandlers(element, events, elementEvent, originalTypeEvent.slice(1));
3078      }
3079    }
3080    for (const keyHandlers of Object.keys(storeElementEvent)) {
3081      const handlerKey = keyHandlers.replace(stripUidRegex, '');
3082      if (!inNamespace || originalTypeEvent.includes(handlerKey)) {
3083        const event = storeElementEvent[keyHandlers];
3084        removeHandler(element, events, typeEvent, event.callable, event.delegationSelector);
3085      }
3086    }
3087  },
3088  trigger(element, event, args) {
3089    if (typeof event !== 'string' || !element) {
3090      return null;
3091    }
3092    const $ = getjQuery();
3093    const typeEvent = getTypeEvent(event);
3094    const inNamespace = event !== typeEvent;
3095    let jQueryEvent = null;
3096    let bubbles = true;
3097    let nativeDispatch = true;
3098    let defaultPrevented = false;
3099    if (inNamespace && $) {
3100      jQueryEvent = $.Event(event, args);
3101      $(element).trigger(jQueryEvent);
3102      bubbles = !jQueryEvent.isPropagationStopped();
3103      nativeDispatch = !jQueryEvent.isImmediatePropagationStopped();
3104      defaultPrevented = jQueryEvent.isDefaultPrevented();
3105    }
3106    let evt = new Event(event, {
3107      bubbles,
3108      cancelable: true
3109    });
3110    evt = hydrateObj(evt, args);
3111    if (defaultPrevented) {
3112      evt.preventDefault();
3113    }
3114    if (nativeDispatch) {
3115      element.dispatchEvent(evt);
3116    }
3117    if (evt.defaultPrevented && jQueryEvent) {
3118      jQueryEvent.preventDefault();
3119    }
3120    return evt;
3121  }
3122};
3123function hydrateObj(obj, meta) {
3124  for (const [key, value] of Object.entries(meta || {})) {
3125    try {
3126      obj[key] = value;
3127    } catch (_unused) {
3128      Object.defineProperty(obj, key, {
3129        configurable: true,
3130        get() {
3131          return value;
3132        }
3133      });
3134    }
3135  }
3136  return obj;
3137}
3138
3139/**
3140 * --------------------------------------------------------------------------
3141 * Bootstrap (v5.2.2): dom/data.js
3142 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
3143 * --------------------------------------------------------------------------
3144 */
3145
3146/**
3147 * Constants
3148 */
3149const elementMap = new Map();
3150const Data = {
3151  set(element, key, instance) {
3152    if (!elementMap.has(element)) {
3153      elementMap.set(element, new Map());
3154    }
3155    const instanceMap = elementMap.get(element); // make it clear we only want one instance per element
3156    // can be removed later when multiple key/instances are fine to be used
3157
3158    if (!instanceMap.has(key) && instanceMap.size !== 0) {
3159      // eslint-disable-next-line no-console
3160      console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(instanceMap.keys())[0]}.`);
3161      return;
3162    }
3163    instanceMap.set(key, instance);
3164  },
3165  get(element, key) {
3166    if (elementMap.has(element)) {
3167      return elementMap.get(element).get(key) || null;
3168    }
3169    return null;
3170  },
3171  remove(element, key) {
3172    if (!elementMap.has(element)) {
3173      return;
3174    }
3175    const instanceMap = elementMap.get(element);
3176    instanceMap.delete(key); // free up element references if there are no instances left for an element
3177
3178    if (instanceMap.size === 0) {
3179      elementMap.delete(element);
3180    }
3181  }
3182};
3183
3184/**
3185 * --------------------------------------------------------------------------
3186 * Bootstrap (v5.2.2): dom/manipulator.js
3187 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
3188 * --------------------------------------------------------------------------
3189 */
3190function normalizeData(value) {
3191  if (value === 'true') {
3192    return true;
3193  }
3194  if (value === 'false') {
3195    return false;
3196  }
3197  if (value === Number(value).toString()) {
3198    return Number(value);
3199  }
3200  if (value === '' || value === 'null') {
3201    return null;
3202  }
3203  if (typeof value !== 'string') {
3204    return value;
3205  }
3206  try {
3207    return JSON.parse(decodeURIComponent(value));
3208  } catch (_unused) {
3209    return value;
3210  }
3211}
3212function normalizeDataKey(key) {
3213  return key.replace(/[A-Z]/g, chr => `-${chr.toLowerCase()}`);
3214}
3215const Manipulator = {
3216  setDataAttribute(element, key, value) {
3217    element.setAttribute(`data-bs-${normalizeDataKey(key)}`, value);
3218  },
3219  removeDataAttribute(element, key) {
3220    element.removeAttribute(`data-bs-${normalizeDataKey(key)}`);
3221  },
3222  getDataAttributes(element) {
3223    if (!element) {
3224      return {};
3225    }
3226    const attributes = {};
3227    const bsKeys = Object.keys(element.dataset).filter(key => key.startsWith('bs') && !key.startsWith('bsConfig'));
3228    for (const key of bsKeys) {
3229      let pureKey = key.replace(/^bs/, '');
3230      pureKey = pureKey.charAt(0).toLowerCase() + pureKey.slice(1, pureKey.length);
3231      attributes[pureKey] = normalizeData(element.dataset[key]);
3232    }
3233    return attributes;
3234  },
3235  getDataAttribute(element, key) {
3236    return normalizeData(element.getAttribute(`data-bs-${normalizeDataKey(key)}`));
3237  }
3238};
3239
3240/**
3241 * --------------------------------------------------------------------------
3242 * Bootstrap (v5.2.2): util/config.js
3243 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
3244 * --------------------------------------------------------------------------
3245 */
3246/**
3247 * Class definition
3248 */
3249
3250class Config {
3251  // Getters
3252  static get Default() {
3253    return {};
3254  }
3255  static get DefaultType() {
3256    return {};
3257  }
3258  static get NAME() {
3259    throw new Error('You have to implement the static method "NAME", for each component!');
3260  }
3261  _getConfig(config) {
3262    config = this._mergeConfigObj(config);
3263    config = this._configAfterMerge(config);
3264    this._typeCheckConfig(config);
3265    return config;
3266  }
3267  _configAfterMerge(config) {
3268    return config;
3269  }
3270  _mergeConfigObj(config, element) {
3271    const jsonConfig = isElement(element) ? Manipulator.getDataAttribute(element, 'config') : {}; // try to parse
3272
3273    return {
3274      ...this.constructor.Default,
3275      ...(typeof jsonConfig === 'object' ? jsonConfig : {}),
3276      ...(isElement(element) ? Manipulator.getDataAttributes(element) : {}),
3277      ...(typeof config === 'object' ? config : {})
3278    };
3279  }
3280  _typeCheckConfig(config, configTypes = this.constructor.DefaultType) {
3281    for (const property of Object.keys(configTypes)) {
3282      const expectedTypes = configTypes[property];
3283      const value = config[property];
3284      const valueType = isElement(value) ? 'element' : toType(value);
3285      if (!new RegExp(expectedTypes).test(valueType)) {
3286        throw new TypeError(`${this.constructor.NAME.toUpperCase()}: Option "${property}" provided type "${valueType}" but expected type "${expectedTypes}".`);
3287      }
3288    }
3289  }
3290}
3291
3292/**
3293 * --------------------------------------------------------------------------
3294 * Bootstrap (v5.2.2): base-component.js
3295 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
3296 * --------------------------------------------------------------------------
3297 */
3298/**
3299 * Constants
3300 */
3301
3302const VERSION = '5.2.2';
3303/**
3304 * Class definition
3305 */
3306
3307class BaseComponent extends Config {
3308  constructor(element, config) {
3309    super();
3310    element = getElement(element);
3311    if (!element) {
3312      return;
3313    }
3314    this._element = element;
3315    this._config = this._getConfig(config);
3316    Data.set(this._element, this.constructor.DATA_KEY, this);
3317  } // Public
3318
3319  dispose() {
3320    Data.remove(this._element, this.constructor.DATA_KEY);
3321    EventHandler.off(this._element, this.constructor.EVENT_KEY);
vendor: 4,413 bytes, lines 3322-3475
3322    for (const propertyName of Object.getOwnPropertyNames(this)) {
3323      this[propertyName] = null;
3324    }
3325  }
3326  _queueCallback(callback, element, isAnimated = true) {
3327    executeAfterTransition(callback, element, isAnimated);
3328  }
3329  _getConfig(config) {
3330    config = this._mergeConfigObj(config, this._element);
3331    config = this._configAfterMerge(config);
3332    this._typeCheckConfig(config);
3333    return config;
3334  } // Static
3335
3336  static getInstance(element) {
3337    return Data.get(getElement(element), this.DATA_KEY);
3338  }
3339  static getOrCreateInstance(element, config = {}) {
3340    return this.getInstance(element) || new this(element, typeof config === 'object' ? config : null);
3341  }
3342  static get VERSION() {
3343    return VERSION;
3344  }
3345  static get DATA_KEY() {
3346    return `bs.${this.NAME}`;
3347  }
3348  static get EVENT_KEY() {
3349    return `.${this.DATA_KEY}`;
3350  }
3351  static eventName(name) {
3352    return `${name}${this.EVENT_KEY}`;
3353  }
3354}
3355
3356/**
3357 * --------------------------------------------------------------------------
3358 * Bootstrap (v5.2.2): util/component-functions.js
3359 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
3360 * --------------------------------------------------------------------------
3361 */
3362
3363const enableDismissTrigger = (component, method = 'hide') => {
3364  const clickEvent = `click.dismiss${component.EVENT_KEY}`;
3365  const name = component.NAME;
3366  EventHandler.on(document, clickEvent, `[data-bs-dismiss="${name}"]`, function (event) {
3367    if (['A', 'AREA'].includes(this.tagName)) {
3368      event.preventDefault();
3369    }
3370    if (isDisabled(this)) {
3371      return;
3372    }
3373    const target = getElementFromSelector(this) || this.closest(`.${name}`);
3374    const instance = component.getOrCreateInstance(target); // Method argument is left, for Alert and only, as it doesn't implement the 'hide' method
3375
3376    instance[method]();
3377  });
3378};
3379
3380/**
3381 * --------------------------------------------------------------------------
3382 * Bootstrap (v5.2.2): alert.js
3383 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
3384 * --------------------------------------------------------------------------
3385 */
3386/**
3387 * Constants
3388 */
3389
3390const NAME$f = 'alert';
3391const DATA_KEY$a = 'bs.alert';
3392const EVENT_KEY$b = `.${DATA_KEY$a}`;
3393const EVENT_CLOSE = `close${EVENT_KEY$b}`;
3394const EVENT_CLOSED = `closed${EVENT_KEY$b}`;
3395const CLASS_NAME_FADE$5 = 'fade';
3396const CLASS_NAME_SHOW$8 = 'show';
3397/**
3398 * Class definition
3399 */
3400
3401class Alert extends BaseComponent {
3402  // Getters
3403  static get NAME() {
3404    return NAME$f;
3405  } // Public
3406
3407  close() {
3408    const closeEvent = EventHandler.trigger(this._element, EVENT_CLOSE);
3409    if (closeEvent.defaultPrevented) {
3410      return;
3411    }
3412    this._element.classList.remove(CLASS_NAME_SHOW$8);
3413    const isAnimated = this._element.classList.contains(CLASS_NAME_FADE$5);
3414    this._queueCallback(() => this._destroyElement(), this._element, isAnimated);
3415  } // Private
3416
3417  _destroyElement() {
3418    this._element.remove();
3419    EventHandler.trigger(this._element, EVENT_CLOSED);
3420    this.dispose();
3421  } // Static
3422
3423  static jQueryInterface(config) {
3424    return this.each(function () {
3425      const data = Alert.getOrCreateInstance(this);
3426      if (typeof config !== 'string') {
3427        return;
3428      }
3429      if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {
3430        throw new TypeError(`No method named "${config}"`);
3431      }
3432      data[config](this);
3433    });
3434  }
3435}
3436/**
3437 * Data API implementation
3438 */
3439exports.Alert = Alert;
3440enableDismissTrigger(Alert, 'close');
3441/**
3442 * jQuery
3443 */
3444
3445defineJQueryPlugin(Alert);
3446
3447/**
3448 * --------------------------------------------------------------------------
3449 * Bootstrap (v5.2.2): button.js
3450 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
3451 * --------------------------------------------------------------------------
3452 */
3453/**
3454 * Constants
3455 */
3456
3457const NAME$e = 'button';
3458const DATA_KEY$9 = 'bs.button';
3459const EVENT_KEY$a = `.${DATA_KEY$9}`;
3460const DATA_API_KEY$6 = '.data-api';
3461const CLASS_NAME_ACTIVE$3 = 'active';
3462const SELECTOR_DATA_TOGGLE$5 = '[data-bs-toggle="button"]';
3463const EVENT_CLICK_DATA_API$6 = `click${EVENT_KEY$a}${DATA_API_KEY$6}`;
3464/**
3465 * Class definition
3466 */
3467
3468class Button extends BaseComponent {
3469  // Getters
3470  static get NAME() {
3471    return NAME$e;
3472  } // Public
3473
3474  toggle() {
3475    // Toggle class and sync the `aria-pressed` attribute with the return value of the `.toggle(
3475)` method
3476    this._element.setAttribute('aria-pressed', this._element.classList.toggle(CLASS_NAME_ACTIVE$3));
3477  } // Static
3478
3479  static jQueryInterface(config) {
3480    return this.each(function () {
3481      const data = Button.getOrCreateInstance(this);
3482      if (config === 'toggle') {
3483        data[config]();
3484      }
3485    });
3486  }
3487}
3488/**
3489 * Data API implementation
3490 */
3491exports.Button = Button;
3492EventHandler.on(document, EVENT_CLICK_DATA_API$6, SELECTOR_DATA_TOGGLE$5, event => {
3493  event.preventDefault();
3494  const button = event.target.closest(SELECTOR_DATA_TOGGLE$5);
3495  const data = Button.getOrCreateInstance(button);
3496  data.toggle();
3497});
3498/**
3499 * jQuery
3500 */
3501
3502defineJQueryPlugin(Button);
3503
3504/**
3505 * --------------------------------------------------------------------------
3506 * Bootstrap (v5.2.2): dom/selector-engine.js
3507 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
3508 * --------------------------------------------------------------------------
3509 */
3510/**
3511 * Constants
3512 */
3513
3514const SelectorEngine = {
3515  find(selector, element = document.documentElement) {
3516    return [].concat(...Element.prototype.querySelectorAll.call(element, selector));
3517  },
3518  findOne(selector, element = document.documentElement) {
3519    return Element.prototype.querySelector.call(element, selector);
3520  },
3521  children(element, selector) {
3522    return [].concat(...element.children).filter(child => child.matches(selector));
3523  },
3524  parents(element, selector) {
3525    const parents = [];
3526    let ancestor = element.parentNode.closest(selector);
3527    while (ancestor) {
3528      parents.push(ancestor);
3529      ancestor = ancestor.parentNode.closest(selector);
3530    }
3531    return parents;
3532  },
3533  prev(element, selector) {
3534    let previous = element.previousElementSibling;
3535    while (previous) {
3536      if (previous.matches(selector)) {
3537        return [previous];
3538      }
3539      previous = previous.previousElementSibling;
3540    }
3541    return [];
3542  },
3543  // TODO: this is now unused; remove later along with prev()
3544  next(element, selector) {
3545    let next = element.nextElementSibling;
3546    while (next) {
3547      if (next.matches(selector)) {
3548        return [next];
3549      }
3550      next = next.nextElementSibling;
3551    }
3552    return [];
3553  },
3554  focusableChildren(element) {
3555    const focusables = ['a', 'button', 'input', 'textarea', 'select', 'details', '[tabindex]', '[contenteditable="true"]'].map(selector => `${selector}:not([tabindex^="-"])`).join(',');
3556    return this.find(focusables, element).filter(el => !isDisabled(el) && isVisible(el));
3557  }
3558};
3559
3560/**
3561 * --------------------------------------------------------------------------
3562 * Bootstrap (v5.2.2): util/swipe.js
3563 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
3564 * --------------------------------------------------------------------------
3565 */
3566/**
3567 * Constants
3568 */
3569
3570const NAME$d = 'swipe';
3571const EVENT_KEY$9 = '.bs.swipe';
3572const EVENT_TOUCHSTART = `touchstart${EVENT_KEY$9}`;
3573const EVENT_TOUCHMOVE = `touchmove${EVENT_KEY$9}`;
3574const EVENT_TOUCHEND = `touchend${EVENT_KEY$9}`;
3575const EVENT_POINTERDOWN = `pointerdown${EVENT_KEY$9}`;
3576const EVENT_POINTERUP = `pointerup${EVENT_KEY$9}`;
3577const POINTER_TYPE_TOUCH = 'touch';
3578const POINTER_TYPE_PEN = 'pen';
3579const CLASS_NAME_POINTER_EVENT = 'pointer-event';
3580const SWIPE_THRESHOLD = 40;
3581const Default$c = {
3582  endCallback: null,
3583  leftCallback: null,
3584  rightCallback: null
3585};
3586const DefaultType$c = {
3587  endCallback: '(function|null)',
3588  leftCallback: '(function|null)',
3589  rightCallback: '(function|null)'
3590};
3591/**
3592 * Class definition
3593 */
3594
3595class Swipe extends Config {
3596  constructor(element, config) {
3597    super();
3598    this._element = element;
3599    if (!element || !Swipe.isSupported()) {
3600      return;
3601    }
3602    this._config = this._getConfig(config);
3603    this._deltaX = 0;
3604    this._supportPointerEvents = Boolean(window.PointerEvent);
3605    this._initEvents();
3606  } // Getters
3607
3608  static get Default() {
3609    return Default$c;
3610  }
3611  static get DefaultType() {
3612    return DefaultType$c;
3613  }
3614  static get NAME() {
3615    return NAME$d;
3616  } // Public
3617
3618  dispose() {
3619    EventHandler.off(this._element, EVENT_KEY$9);
3620  } // Private
3621
3622  _start(event) {
3623    if (!this._supportPointerEvents) {
3624      this._deltaX = event.touches[0].clientX;
3625      return;
3626    }
3627    if (this._eventIsPointerPenTouch(event)) {
3628      this._deltaX = event.clientX;
3629    }
3630  }
3631  _end(event) {
3632    if (this._eventIsPointerPenTouch(event)) {
3633      this._deltaX = event.clientX - this._deltaX;
3634    }
3635    this._handleSwipe();
3636    execute(this._config.endCallback);
3637  }
3638  _move(event) {
3639    this._deltaX = event.touches && event.touches.length > 1 ? 0 : event.touches[0].clientX - this._deltaX;
3640  }
3641  _handleSwipe() {
3642    const absDeltaX = Math.abs(this._deltaX);
3643    if (absDeltaX <= SWIPE_THRESHOLD) {
3644      return;
3645    }
3646    const direction = absDeltaX / this._deltaX;
3647    this._deltaX = 0;
3648    if (!direction) {
3649      return;
3650    }
3651    execute(direction > 0 ? this._config.rightCallback : this._config.leftCallback);
3652  }
3653  _initEvents() {
3654    if (this._supportPointerEvents) {
3655      EventHandler.on(this._element, EVENT_POINTERDOWN, event => this._start(event));
3656      EventHandler.on(this._element, EVENT_POINTERUP, event => this._end(event));
3657      this._element.classList.add(CLASS_NAME_POINTER_EVENT);
3658    } else {
3659      EventHandler.on(this._element, EVENT_TOUCHSTART, event => this._start(event));
3660      EventHandler.on(this._element, EVENT_TOUCHMOVE, event => this._move(event));
3661      EventHandler.on(this._element, EVENT_TOUCHEND, event => this._end(event));
3662    }
3663  }
3664  _eventIsPointerPenTouch(event) {
3665    return this._supportPointerEvents && (event.pointerType === POINTER_TYPE_PEN || event.pointerType === POINTER_TYPE_TOUCH);
3666  } // Static
3667
3668  static isSupported() {
3669    return 'ontouchstart' in document.documentElement || navigator.maxTouchPoints > 0;
3670  }
3671}
3672
3673/**
3674 * --------------------------------------------------------------------------
3675 * Bootstrap (v5.2.2): carousel.js
3676 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
3677 * --------------------------------------------------------------------------
3678 */
3679/**
3680 * Constants
3681 */
3682
3683const NAME$c = 'carousel';
3684const DATA_KEY$8 = 'bs.carousel';
3685const EVENT_KEY$8 = `.${DATA_KEY$8}`;
3686const DATA_API_KEY$5 = '.data-api';
3687const ARROW_LEFT_KEY$1 = 'ArrowLeft';
3688const ARROW_RIGHT_KEY$1 = 'ArrowRight';
3689const TOUCHEVENT_COMPAT_WAIT = 500; // Time for mouse compat events to fire after touch
3690
3691const ORDER_NEXT = 'next';
3692const ORDER_PREV = 'prev';
3693const DIRECTION_LEFT = 'left';
3694const DIRECTION_RIGHT = 'right';
3695const EVENT_SLIDE = `slide${EVENT_KEY$8}`;
3696const EVENT_SLID = `slid${EVENT_KEY$8}`;
3697const EVENT_KEYDOWN$1 = `keydown${EVENT_KEY$8}`;
3698const EVENT_MOUSEENTER$1 = `mouseenter${EVENT_KEY$8}`;
3699const EVENT_MOUSELEAVE$1 = `mouseleave${EVENT_KEY$8}`;
3700const EVENT_DRAG_START = `dragstart${EVENT_KEY$8}`;
3701const EVENT_LOAD_DATA_API$3 = `load${EVENT_KEY$8}${DATA_API_KEY$5}`;
3702const EVENT_CLICK_DATA_API$5 = `click${EVENT_KEY$8}${DATA_API_KEY$5}`;
3703const CLASS_NAME_CAROUSEL = 'carousel';
3704const CLASS_NAME_ACTIVE$2 = 'active';
3705const CLASS_NAME_SLIDE = 'slide';
3706const CLASS_NAME_END = 'carousel-item-end';
3707const CLASS_NAME_START = 'carousel-item-start';
3708const CLASS_NAME_NEXT = 'carousel-item-next';
3709const CLASS_NAME_PREV = 'carousel-item-prev';
3710const SELECTOR_ACTIVE = '.active';
3711const SELECTOR_ITEM = '.carousel-item';
vendor: 7,653 bytes, lines 3712-3946
3712const SELECTOR_ACTIVE_ITEM = SELECTOR_ACTIVE + SELECTOR_ITEM;
3713const SELECTOR_ITEM_IMG = '.carousel-item img';
3714const SELECTOR_INDICATORS = '.carousel-indicators';
3715const SELECTOR_DATA_SLIDE = '[data-bs-slide], [data-bs-slide-to]';
3716const SELECTOR_DATA_RIDE = '[data-bs-ride="carousel"]';
3717const KEY_TO_DIRECTION = {
3718  [ARROW_LEFT_KEY$1]: DIRECTION_RIGHT,
3719  [ARROW_RIGHT_KEY$1]: DIRECTION_LEFT
3720};
3721const Default$b = {
3722  interval: 5000,
3723  keyboard: true,
3724  pause: 'hover',
3725  ride: false,
3726  touch: true,
3727  wrap: true
3728};
3729const DefaultType$b = {
3730  interval: '(number|boolean)',
3731  // TODO:v6 remove boolean support
3732  keyboard: 'boolean',
3733  pause: '(string|boolean)',
3734  ride: '(boolean|string)',
3735  touch: 'boolean',
3736  wrap: 'boolean'
3737};
3738/**
3739 * Class definition
3740 */
3741
3742class Carousel extends BaseComponent {
3743  constructor(element, config) {
3744    super(element, config);
3745    this._interval = null;
3746    this._activeElement = null;
3747    this._isSliding = false;
3748    this.touchTimeout = null;
3749    this._swipeHelper = null;
3750    this._indicatorsElement = SelectorEngine.findOne(SELECTOR_INDICATORS, this._element);
3751    this._addEventListeners();
3752    if (this._config.ride === CLASS_NAME_CAROUSEL) {
3753      this.cycle();
3754    }
3755  } // Getters
3756
3757  static get Default() {
3758    return Default$b;
3759  }
3760  static get DefaultType() {
3761    return DefaultType$b;
3762  }
3763  static get NAME() {
3764    return NAME$c;
3765  } // Public
3766
3767  next() {
3768    this._slide(ORDER_NEXT);
3769  }
3770  nextWhenVisible() {
3771    // FIXME TODO use `document.visibilityState`
3772    // Don't call next when the page isn't visible
3773    // or the carousel or its parent isn't visible
3774    if (!document.hidden && isVisible(this._element)) {
3775      this.next();
3776    }
3777  }
3778  prev() {
3779    this._slide(ORDER_PREV);
3780  }
3781  pause() {
3782    if (this._isSliding) {
3783      triggerTransitionEnd(this._element);
3784    }
3785    this._clearInterval();
3786  }
3787  cycle() {
3788    this._clearInterval();
3789    this._updateInterval();
3790    this._interval = setInterval(() => this.nextWhenVisible(), this._config.interval);
3791  }
3792  _maybeEnableCycle() {
3793    if (!this._config.ride) {
3794      return;
3795    }
3796    if (this._isSliding) {
3797      EventHandler.one(this._element, EVENT_SLID, () => this.cycle());
3798      return;
3799    }
3800    this.cycle();
3801  }
3802  to(index) {
3803    const items = this._getItems();
3804    if (index > items.length - 1 || index < 0) {
3805      return;
3806    }
3807    if (this._isSliding) {
3808      EventHandler.one(this._element, EVENT_SLID, () => this.to(index));
3809      return;
3810    }
3811    const activeIndex = this._getItemIndex(this._getActive());
3812    if (activeIndex === index) {
3813      return;
3814    }
3815    const order = index > activeIndex ? ORDER_NEXT : ORDER_PREV;
3816    this._slide(order, items[index]);
3817  }
3818  dispose() {
3819    if (this._swipeHelper) {
3820      this._swipeHelper.dispose();
3821    }
3822    super.dispose();
3823  } // Private
3824
3825  _configAfterMerge(config) {
3826    config.defaultInterval = config.interval;
3827    return config;
3828  }
3829  _addEventListeners() {
3830    if (this._config.keyboard) {
3831      EventHandler.on(this._element, EVENT_KEYDOWN$1, event => this._keydown(event));
3832    }
3833    if (this._config.pause === 'hover') {
3834      EventHandler.on(this._element, EVENT_MOUSEENTER$1, () => this.pause());
3835      EventHandler.on(this._element, EVENT_MOUSELEAVE$1, () => this._maybeEnableCycle());
3836    }
3837    if (this._config.touch && Swipe.isSupported()) {
3838      this._addTouchEventListeners();
3839    }
3840  }
3841  _addTouchEventListeners() {
3842    for (const img of SelectorEngine.find(SELECTOR_ITEM_IMG, this._element)) {
3843      EventHandler.on(img, EVENT_DRAG_START, event => event.preventDefault());
3844    }
3845    const endCallBack = () => {
3846      if (this._config.pause !== 'hover') {
3847        return;
3848      } // If it's a touch-enabled device, mouseenter/leave are fired as
3849      // part of the mouse compatibility events on first tap - the carousel
3850      // would stop cycling until user tapped out of it;
3851      // here, we listen for touchend, explicitly pause the carousel
3852      // (as if it's the second time we tap on it, mouseenter compat event
3853      // is NOT fired) and after a timeout (to allow for mouse compatibility
3854      // events to fire) we explicitly restart cycling
3855
3856      this.pause();
3857      if (this.touchTimeout) {
3858        clearTimeout(this.touchTimeout);
3859      }
3860      this.touchTimeout = setTimeout(() => this._maybeEnableCycle(), TOUCHEVENT_COMPAT_WAIT + this._config.interval);
3861    };
3862    const swipeConfig = {
3863      leftCallback: () => this._slide(this._directionToOrder(DIRECTION_LEFT)),
3864      rightCallback: () => this._slide(this._directionToOrder(DIRECTION_RIGHT)),
3865      endCallback: endCallBack
3866    };
3867    this._swipeHelper = new Swipe(this._element, swipeConfig);
3868  }
3869  _keydown(event) {
3870    if (/input|textarea/i.test(event.target.tagName)) {
3871      return;
3872    }
3873    const direction = KEY_TO_DIRECTION[event.key];
3874    if (direction) {
3875      event.preventDefault();
3876      this._slide(this._directionToOrder(direction));
3877    }
3878  }
3879  _getItemIndex(element) {
3880    return this._getItems().indexOf(element);
3881  }
3882  _setActiveIndicatorElement(index) {
3883    if (!this._indicatorsElement) {
3884      return;
3885    }
3886    const activeIndicator = SelectorEngine.findOne(SELECTOR_ACTIVE, this._indicatorsElement);
3887    activeIndicator.classList.remove(CLASS_NAME_ACTIVE$2);
3888    activeIndicator.removeAttribute('aria-current');
3889    const newActiveIndicator = SelectorEngine.findOne(`[data-bs-slide-to="${index}"]`, this._indicatorsElement);
3890    if (newActiveIndicator) {
3891      newActiveIndicator.classList.add(CLASS_NAME_ACTIVE$2);
3892      newActiveIndicator.setAttribute('aria-current', 'true');
3893    }
3894  }
3895  _updateInterval() {
3896    const element = this._activeElement || this._getActive();
3897    if (!element) {
3898      return;
3899    }
3900    const elementInterval = Number.parseInt(element.getAttribute('data-bs-interval'), 10);
3901    this._config.interval = elementInterval || this._config.defaultInterval;
3902  }
3903  _slide(order, element = null) {
3904    if (this._isSliding) {
3905      return;
3906    }
3907    const activeElement = this._getActive();
3908    const isNext = order === ORDER_NEXT;
3909    const nextElement = element || getNextActiveElement(this._getItems(), activeElement, isNext, this._config.wrap);
3910    if (nextElement === activeElement) {
3911      return;
3912    }
3913    const nextElementIndex = this._getItemIndex(nextElement);
3914    const triggerEvent = eventName => {
3915      return EventHandler.trigger(this._element, eventName, {
3916        relatedTarget: nextElement,
3917        direction: this._orderToDirection(order),
3918        from: this._getItemIndex(activeElement),
3919        to: nextElementIndex
3920      });
3921    };
3922    const slideEvent = triggerEvent(EVENT_SLIDE);
3923    if (slideEvent.defaultPrevented) {
3924      return;
3925    }
3926    if (!activeElement || !nextElement) {
3927      // Some weirdness is happening, so we bail
3928      // todo: change tests that use empty divs to avoid this check
3929      return;
3930    }
3931    const isCycling = Boolean(this._interval);
3932    this.pause();
3933    this._isSliding = true;
3934    this._setActiveIndicatorElement(nextElementIndex);
3935    this._activeElement = nextElement;
3936    const directionalClassName = isNext ? CLASS_NAME_START : CLASS_NAME_END;
3937    const orderClassName = isNext ? CLASS_NAME_NEXT : CLASS_NAME_PREV;
3938    nextElement.classList.add(orderClassName);
3939    reflow(nextElement);
3940    activeElement.classList.add(directionalClassName);
3941    nextElement.classList.add(directionalClassName);
3942    const completeCallBack = () => {
3943      nextElement.classList.remove(directionalClassName, orderClassName);
3944      nextElement.classList.add(CLASS_NAME_ACTIVE$2);
3945      activeElement.classList.remove(CLASS_NAME_ACTIVE$2, orderClassName, directionalClassName);
3946      this._isSliding = false;
vendor: 2,303 bytes, lines 3947-4025
3947      triggerEvent(EVENT_SLID);
3948    };
3949    this._queueCallback(completeCallBack, activeElement, this._isAnimated());
3950    if (isCycling) {
3951      this.cycle();
3952    }
3953  }
3954  _isAnimated() {
3955    return this._element.classList.contains(CLASS_NAME_SLIDE);
3956  }
3957  _getActive() {
3958    return SelectorEngine.findOne(SELECTOR_ACTIVE_ITEM, this._element);
3959  }
3960  _getItems() {
3961    return SelectorEngine.find(SELECTOR_ITEM, this._element);
3962  }
3963  _clearInterval() {
3964    if (this._interval) {
3965      clearInterval(this._interval);
3966      this._interval = null;
3967    }
3968  }
3969  _directionToOrder(direction) {
3970    if (isRTL()) {
3971      return direction === DIRECTION_LEFT ? ORDER_PREV : ORDER_NEXT;
3972    }
3973    return direction === DIRECTION_LEFT ? ORDER_NEXT : ORDER_PREV;
3974  }
3975  _orderToDirection(order) {
3976    if (isRTL()) {
3977      return order === ORDER_PREV ? DIRECTION_LEFT : DIRECTION_RIGHT;
3978    }
3979    return order === ORDER_PREV ? DIRECTION_RIGHT : DIRECTION_LEFT;
3980  } // Static
3981
3982  static jQueryInterface(config) {
3983    return this.each(function () {
3984      const data = Carousel.getOrCreateInstance(this, config);
3985      if (typeof config === 'number') {
3986        data.to(config);
3987        return;
3988      }
3989      if (typeof config === 'string') {
3990        if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {
3991          throw new TypeError(`No method named "${config}"`);
3992        }
3993        data[config]();
3994      }
3995    });
3996  }
3997}
3998/**
3999 * Data API implementation
4000 */
4001exports.Carousel = Carousel;
4002EventHandler.on(document, EVENT_CLICK_DATA_API$5, SELECTOR_DATA_SLIDE, function (event) {
4003  const target = getElementFromSelector(this);
4004  if (!target || !target.classList.contains(CLASS_NAME_CAROUSEL)) {
4005    return;
4006  }
4007  event.preventDefault();
4008  const carousel = Carousel.getOrCreateInstance(target);
4009  const slideIndex = this.getAttribute('data-bs-slide-to');
4010  if (slideIndex) {
4011    carousel.to(slideIndex);
4012    carousel._maybeEnableCycle();
4013    return;
4014  }
4015  if (Manipulator.getDataAttribute(this, 'slide') === 'next') {
4016    carousel.next();
4017    carousel._maybeEnableCycle();
4018    return;
4019  }
4020  carousel.prev();
4021  carousel._maybeEnableCycle();
4022});
4023EventHandler.on(window, EVENT_LOAD_DATA_API$3, () => {
4024  const carousels = SelectorEngine.find(SELECTOR_DATA_RIDE);
4025  for (const carousel of carousels) {
vendor: 4,847 bytes, lines 4026-4175
4026    Carousel.getOrCreateInstance(carousel);
4027  }
4028});
4029/**
4030 * jQuery
4031 */
4032
4033defineJQueryPlugin(Carousel);
4034
4035/**
4036 * --------------------------------------------------------------------------
4037 * Bootstrap (v5.2.2): collapse.js
4038 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
4039 * --------------------------------------------------------------------------
4040 */
4041/**
4042 * Constants
4043 */
4044
4045const NAME$b = 'collapse';
4046const DATA_KEY$7 = 'bs.collapse';
4047const EVENT_KEY$7 = `.${DATA_KEY$7}`;
4048const DATA_API_KEY$4 = '.data-api';
4049const EVENT_SHOW$6 = `show${EVENT_KEY$7}`;
4050const EVENT_SHOWN$6 = `shown${EVENT_KEY$7}`;
4051const EVENT_HIDE$6 = `hide${EVENT_KEY$7}`;
4052const EVENT_HIDDEN$6 = `hidden${EVENT_KEY$7}`;
4053const EVENT_CLICK_DATA_API$4 = `click${EVENT_KEY$7}${DATA_API_KEY$4}`;
4054const CLASS_NAME_SHOW$7 = 'show';
4055const CLASS_NAME_COLLAPSE = 'collapse';
4056const CLASS_NAME_COLLAPSING = 'collapsing';
4057const CLASS_NAME_COLLAPSED = 'collapsed';
4058const CLASS_NAME_DEEPER_CHILDREN = `:scope .${CLASS_NAME_COLLAPSE} .${CLASS_NAME_COLLAPSE}`;
4059const CLASS_NAME_HORIZONTAL = 'collapse-horizontal';
4060const WIDTH = 'width';
4061const HEIGHT = 'height';
4062const SELECTOR_ACTIVES = '.collapse.show, .collapse.collapsing';
4063const SELECTOR_DATA_TOGGLE$4 = '[data-bs-toggle="collapse"]';
4064const Default$a = {
4065  parent: null,
4066  toggle: true
4067};
4068const DefaultType$a = {
4069  parent: '(null|element)',
4070  toggle: 'boolean'
4071};
4072/**
4073 * Class definition
4074 */
4075
4076class Collapse extends BaseComponent {
4077  constructor(element, config) {
4078    super(element, config);
4079    this._isTransitioning = false;
4080    this._triggerArray = [];
4081    const toggleList = SelectorEngine.find(SELECTOR_DATA_TOGGLE$4);
4082    for (const elem of toggleList) {
4083      const selector = getSelectorFromElement(elem);
4084      const filterElement = SelectorEngine.find(selector).filter(foundElement => foundElement === this._element);
4085      if (selector !== null && filterElement.length) {
4086        this._triggerArray.push(elem);
4087      }
4088    }
4089    this._initializeChildren();
4090    if (!this._config.parent) {
4091      this._addAriaAndCollapsedClass(this._triggerArray, this._isShown());
4092    }
4093    if (this._config.toggle) {
4094      this.toggle();
4095    }
4096  } // Getters
4097
4098  static get Default() {
4099    return Default$a;
4100  }
4101  static get DefaultType() {
4102    return DefaultType$a;
4103  }
4104  static get NAME() {
4105    return NAME$b;
4106  } // Public
4107
4108  toggle() {
4109    if (this._isShown()) {
4110      this.hide();
4111    } else {
4112      this.show();
4113    }
4114  }
4115  show() {
4116    if (this._isTransitioning || this._isShown()) {
4117      return;
4118    }
4119    let activeChildren = []; // find active children
4120
4121    if (this._config.parent) {
4122      activeChildren = this._getFirstLevelChildren(SELECTOR_ACTIVES).filter(element => element !== this._element).map(element => Collapse.getOrCreateInstance(element, {
4123        toggle: false
4124      }));
4125    }
4126    if (activeChildren.length && activeChildren[0]._isTransitioning) {
4127      return;
4128    }
4129    const startEvent = EventHandler.trigger(this._element, EVENT_SHOW$6);
4130    if (startEvent.defaultPrevented) {
4131      return;
4132    }
4133    for (const activeInstance of activeChildren) {
4134      activeInstance.hide();
4135    }
4136    const dimension = this._getDimension();
4137    this._element.classList.remove(CLASS_NAME_COLLAPSE);
4138    this._element.classList.add(CLASS_NAME_COLLAPSING);
4139    this._element.style[dimension] = 0;
4140    this._addAriaAndCollapsedClass(this._triggerArray, true);
4141    this._isTransitioning = true;
4142    const complete = () => {
4143      this._isTransitioning = false;
4144      this._element.classList.remove(CLASS_NAME_COLLAPSING);
4145      this._element.classList.add(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW$7);
4146      this._element.style[dimension] = '';
4147      EventHandler.trigger(this._element, EVENT_SHOWN$6);
4148    };
4149    const capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1);
4150    const scrollSize = `scroll${capitalizedDimension}`;
4151    this._queueCallback(complete, this._element, true);
4152    this._element.style[dimension] = `${this._element[scrollSize]}px`;
4153  }
4154  hide() {
4155    if (this._isTransitioning || !this._isShown()) {
4156      return;
4157    }
4158    const startEvent = EventHandler.trigger(this._element, EVENT_HIDE$6);
4159    if (startEvent.defaultPrevented) {
4160      return;
4161    }
4162    const dimension = this._getDimension();
4163    this._element.style[dimension] = `${this._element.getBoundingClientRect()[dimension]}px`;
4164    reflow(this._element);
4165    this._element.classList.add(CLASS_NAME_COLLAPSING);
4166    this._element.classList.remove(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW$7);
4167    for (const trigger of this._triggerArray) {
4168      const element = getElementFromSelector(trigger);
4169      if (element && !this._isShown(element)) {
4170        this._addAriaAndCollapsedClass([trigger], false);
4171      }
4172    }
4173    this._isTransitioning = true;
4174    const complete = () => {
4175      this._isTransitioning = false;
vendor: 7,551 bytes, lines 4176-4397
4176      this._element.classList.remove(CLASS_NAME_COLLAPSING);
4177      this._element.classList.add(CLASS_NAME_COLLAPSE);
4178      EventHandler.trigger(this._element, EVENT_HIDDEN$6);
4179    };
4180    this._element.style[dimension] = '';
4181    this._queueCallback(complete, this._element, true);
4182  }
4183  _isShown(element = this._element) {
4184    return element.classList.contains(CLASS_NAME_SHOW$7);
4185  } // Private
4186
4187  _configAfterMerge(config) {
4188    config.toggle = Boolean(config.toggle); // Coerce string values
4189
4190    config.parent = getElement(config.parent);
4191    return config;
4192  }
4193  _getDimension() {
4194    return this._element.classList.contains(CLASS_NAME_HORIZONTAL) ? WIDTH : HEIGHT;
4195  }
4196  _initializeChildren() {
4197    if (!this._config.parent) {
4198      return;
4199    }
4200    const children = this._getFirstLevelChildren(SELECTOR_DATA_TOGGLE$4);
4201    for (const element of children) {
4202      const selected = getElementFromSelector(element);
4203      if (selected) {
4204        this._addAriaAndCollapsedClass([element], this._isShown(selected));
4205      }
4206    }
4207  }
4208  _getFirstLevelChildren(selector) {
4209    const children = SelectorEngine.find(CLASS_NAME_DEEPER_CHILDREN, this._config.parent); // remove children if greater depth
4210
4211    return SelectorEngine.find(selector, this._config.parent).filter(element => !children.includes(element));
4212  }
4213  _addAriaAndCollapsedClass(triggerArray, isOpen) {
4214    if (!triggerArray.length) {
4215      return;
4216    }
4217    for (const element of triggerArray) {
4218      element.classList.toggle(CLASS_NAME_COLLAPSED, !isOpen);
4219      element.setAttribute('aria-expanded', isOpen);
4220    }
4221  } // Static
4222
4223  static jQueryInterface(config) {
4224    const _config = {};
4225    if (typeof config === 'string' && /show|hide/.test(config)) {
4226      _config.toggle = false;
4227    }
4228    return this.each(function () {
4229      const data = Collapse.getOrCreateInstance(this, _config);
4230      if (typeof config === 'string') {
4231        if (typeof data[config] === 'undefined') {
4232          throw new TypeError(`No method named "${config}"`);
4233        }
4234        data[config]();
4235      }
4236    });
4237  }
4238}
4239/**
4240 * Data API implementation
4241 */
4242exports.Collapse = Collapse;
4243EventHandler.on(document, EVENT_CLICK_DATA_API$4, SELECTOR_DATA_TOGGLE$4, function (event) {
4244  // preventDefault only for <a> elements (which change the URL) not inside the collapsible element
4245  if (event.target.tagName === 'A' || event.delegateTarget && event.delegateTarget.tagName === 'A') {
4246    event.preventDefault();
4247  }
4248  const selector = getSelectorFromElement(this);
4249  const selectorElements = SelectorEngine.find(selector);
4250  for (const element of selectorElements) {
4251    Collapse.getOrCreateInstance(element, {
4252      toggle: false
4253    }).toggle();
4254  }
4255});
4256/**
4257 * jQuery
4258 */
4259
4260defineJQueryPlugin(Collapse);
4261
4262/**
4263 * --------------------------------------------------------------------------
4264 * Bootstrap (v5.2.2): dropdown.js
4265 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
4266 * --------------------------------------------------------------------------
4267 */
4268/**
4269 * Constants
4270 */
4271
4272const NAME$a = 'dropdown';
4273const DATA_KEY$6 = 'bs.dropdown';
4274const EVENT_KEY$6 = `.${DATA_KEY$6}`;
4275const DATA_API_KEY$3 = '.data-api';
4276const ESCAPE_KEY$2 = 'Escape';
4277const TAB_KEY$1 = 'Tab';
4278const ARROW_UP_KEY$1 = 'ArrowUp';
4279const ARROW_DOWN_KEY$1 = 'ArrowDown';
4280const RIGHT_MOUSE_BUTTON = 2; // MouseEvent.button value for the secondary button, usually the right button
4281
4282const EVENT_HIDE$5 = `hide${EVENT_KEY$6}`;
4283const EVENT_HIDDEN$5 = `hidden${EVENT_KEY$6}`;
4284const EVENT_SHOW$5 = `show${EVENT_KEY$6}`;
4285const EVENT_SHOWN$5 = `shown${EVENT_KEY$6}`;
4286const EVENT_CLICK_DATA_API$3 = `click${EVENT_KEY$6}${DATA_API_KEY$3}`;
4287const EVENT_KEYDOWN_DATA_API = `keydown${EVENT_KEY$6}${DATA_API_KEY$3}`;
4288const EVENT_KEYUP_DATA_API = `keyup${EVENT_KEY$6}${DATA_API_KEY$3}`;
4289const CLASS_NAME_SHOW$6 = 'show';
4290const CLASS_NAME_DROPUP = 'dropup';
4291const CLASS_NAME_DROPEND = 'dropend';
4292const CLASS_NAME_DROPSTART = 'dropstart';
4293const CLASS_NAME_DROPUP_CENTER = 'dropup-center';
4294const CLASS_NAME_DROPDOWN_CENTER = 'dropdown-center';
4295const SELECTOR_DATA_TOGGLE$3 = '[data-bs-toggle="dropdown"]:not(.disabled):not(:disabled)';
4296const SELECTOR_DATA_TOGGLE_SHOWN = `${SELECTOR_DATA_TOGGLE$3}.${CLASS_NAME_SHOW$6}`;
4297const SELECTOR_MENU = '.dropdown-menu';
4298const SELECTOR_NAVBAR = '.navbar';
4299const SELECTOR_NAVBAR_NAV = '.navbar-nav';
4300const SELECTOR_VISIBLE_ITEMS = '.dropdown-menu .dropdown-item:not(.disabled):not(:disabled)';
4301const PLACEMENT_TOP = isRTL() ? 'top-end' : 'top-start';
4302const PLACEMENT_TOPEND = isRTL() ? 'top-start' : 'top-end';
4303const PLACEMENT_BOTTOM = isRTL() ? 'bottom-end' : 'bottom-start';
4304const PLACEMENT_BOTTOMEND = isRTL() ? 'bottom-start' : 'bottom-end';
4305const PLACEMENT_RIGHT = isRTL() ? 'left-start' : 'right-start';
4306const PLACEMENT_LEFT = isRTL() ? 'right-start' : 'left-start';
4307const PLACEMENT_TOPCENTER = 'top';
4308const PLACEMENT_BOTTOMCENTER = 'bottom';
4309const Default$9 = {
4310  autoClose: true,
4311  boundary: 'clippingParents',
4312  display: 'dynamic',
4313  offset: [0, 2],
4314  popperConfig: null,
4315  reference: 'toggle'
4316};
4317const DefaultType$9 = {
4318  autoClose: '(boolean|string)',
4319  boundary: '(string|element)',
4320  display: 'string',
4321  offset: '(array|string|function)',
4322  popperConfig: '(null|object|function)',
4323  reference: '(string|element|object)'
4324};
4325/**
4326 * Class definition
4327 */
4328
4329class Dropdown extends BaseComponent {
4330  constructor(element, config) {
4331    super(element, config);
4332    this._popper = null;
4333    this._parent = this._element.parentNode; // dropdown wrapper
4334    // todo: v6 revert #37011 & change markup https://getbootstrap.com/docs/5.2/forms/input-group/
4335
4336    this._menu = SelectorEngine.next(this._element, SELECTOR_MENU)[0] || SelectorEngine.prev(this._element, SELECTOR_MENU)[0] || SelectorEngine.findOne(SELECTOR_MENU, this._parent);
4337    this._inNavbar = this._detectNavbar();
4338  } // Getters
4339
4340  static get Default() {
4341    return Default$9;
4342  }
4343  static get DefaultType() {
4344    return DefaultType$9;
4345  }
4346  static get NAME() {
4347    return NAME$a;
4348  } // Public
4349
4350  toggle() {
4351    return this._isShown() ? this.hide() : this.show();
4352  }
4353  show() {
4354    if (isDisabled(this._element) || this._isShown()) {
4355      return;
4356    }
4357    const relatedTarget = {
4358      relatedTarget: this._element
4359    };
4360    const showEvent = EventHandler.trigger(this._element, EVENT_SHOW$5, relatedTarget);
4361    if (showEvent.defaultPrevented) {
4362      return;
4363    }
4364    this._createPopper(); // If this is a touch-enabled device we add extra
4365    // empty mouseover listeners to the body's immediate children;
4366    // only needed because of broken event delegation on iOS
4367    // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html
4368
4369    if ('ontouchstart' in document.documentElement && !this._parent.closest(SELECTOR_NAVBAR_NAV)) {
4370      for (const element of [].concat(...document.body.children)) {
4371        EventHandler.on(element, 'mouseover', noop);
4372      }
4373    }
4374    this._element.focus();
4375    this._element.setAttribute('aria-expanded', true);
4376    this._menu.classList.add(CLASS_NAME_SHOW$6);
4377    this._element.classList.add(CLASS_NAME_SHOW$6);
4378    EventHandler.trigger(this._element, EVENT_SHOWN$5, relatedTarget);
4379  }
4380  hide() {
4381    if (isDisabled(this._element) || !this._isShown()) {
4382      return;
4383    }
4384    const relatedTarget = {
4385      relatedTarget: this._element
4386    };
4387    this._completeHide(relatedTarget);
4388  }
4389  dispose() {
4390    if (this._popper) {
4391      this._popper.destroy();
4392    }
4393    super.dispose();
4394  }
4395  update() {
4396    this._inNavbar = this._detectNavbar();
4397    if (this._popper) {
vendor: 4,917 bytes, lines 4398-4533
4398      this._popper.update();
4399    }
4400  } // Private
4401
4402  _completeHide(relatedTarget) {
4403    const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE$5, relatedTarget);
4404    if (hideEvent.defaultPrevented) {
4405      return;
4406    } // If this is a touch-enabled device we remove the extra
4407    // empty mouseover listeners we added for iOS support
4408
4409    if ('ontouchstart' in document.documentElement) {
4410      for (const element of [].concat(...document.body.children)) {
4411        EventHandler.off(element, 'mouseover', noop);
4412      }
4413    }
4414    if (this._popper) {
4415      this._popper.destroy();
4416    }
4417    this._menu.classList.remove(CLASS_NAME_SHOW$6);
4418    this._element.classList.remove(CLASS_NAME_SHOW$6);
4419    this._element.setAttribute('aria-expanded', 'false');
4420    Manipulator.removeDataAttribute(this._menu, 'popper');
4421    EventHandler.trigger(this._element, EVENT_HIDDEN$5, relatedTarget);
4422  }
4423  _getConfig(config) {
4424    config = super._getConfig(config);
4425    if (typeof config.reference === 'object' && !isElement(config.reference) && typeof config.reference.getBoundingClientRect !== 'function') {
4426      // Popper virtual elements require a getBoundingClientRect method
4427      throw new TypeError(`${NAME$a.toUpperCase()}: Option "reference" provided type "object" without a required "getBoundingClientRect" method.`);
4428    }
4429    return config;
4430  }
4431  _createPopper() {
4432    if (typeof Popper === 'undefined') {
4433      throw new TypeError('Bootstrap\'s dropdowns require Popper (https://popper.js.org)');
4434    }
4435    let referenceElement = this._element;
4436    if (this._config.reference === 'parent') {
4437      referenceElement = this._parent;
4438    } else if (isElement(this._config.reference)) {
4439      referenceElement = getElement(this._config.reference);
4440    } else if (typeof this._config.reference === 'object') {
4441      referenceElement = this._config.reference;
4442    }
4443    const popperConfig = this._getPopperConfig();
4444    this._popper = Popper.createPopper(referenceElement, this._menu, popperConfig);
4445  }
4446  _isShown() {
4447    return this._menu.classList.contains(CLASS_NAME_SHOW$6);
4448  }
4449  _getPlacement() {
4450    const parentDropdown = this._parent;
4451    if (parentDropdown.classList.contains(CLASS_NAME_DROPEND)) {
4452      return PLACEMENT_RIGHT;
4453    }
4454    if (parentDropdown.classList.contains(CLASS_NAME_DROPSTART)) {
4455      return PLACEMENT_LEFT;
4456    }
4457    if (parentDropdown.classList.contains(CLASS_NAME_DROPUP_CENTER)) {
4458      return PLACEMENT_TOPCENTER;
4459    }
4460    if (parentDropdown.classList.contains(CLASS_NAME_DROPDOWN_CENTER)) {
4461      return PLACEMENT_BOTTOMCENTER;
4462    } // We need to trim the value because custom properties can also include spaces
4463
4464    const isEnd = getComputedStyle(this._menu).getPropertyValue('--bs-position').trim() === 'end';
4465    if (parentDropdown.classList.contains(CLASS_NAME_DROPUP)) {
4466      return isEnd ? PLACEMENT_TOPEND : PLACEMENT_TOP;
4467    }
4468    return isEnd ? PLACEMENT_BOTTOMEND : PLACEMENT_BOTTOM;
4469  }
4470  _detectNavbar() {
4471    return this._element.closest(SELECTOR_NAVBAR) !== null;
4472  }
4473  _getOffset() {
4474    const {
4475      offset
4476    } = this._config;
4477    if (typeof offset === 'string') {
4478      return offset.split(',').map(value => Number.parseInt(value, 10));
4479    }
4480    if (typeof offset === 'function') {
4481      return popperData => offset(popperData, this._element);
4482    }
4483    return offset;
4484  }
4485  _getPopperConfig() {
4486    const defaultBsPopperConfig = {
4487      placement: this._getPlacement(),
4488      modifiers: [{
4489        name: 'preventOverflow',
4490        options: {
4491          boundary: this._config.boundary
4492        }
4493      }, {
4494        name: 'offset',
4495        options: {
4496          offset: this._getOffset()
4497        }
4498      }]
4499    }; // Disable Popper if we have a static display or Dropdown is in Navbar
4500
4501    if (this._inNavbar || this._config.display === 'static') {
4502      Manipulator.setDataAttribute(this._menu, 'popper', 'static'); // todo:v6 remove
4503
4504      defaultBsPopperConfig.modifiers = [{
4505        name: 'applyStyles',
4506        enabled: false
4507      }];
4508    }
4509    return {
4510      ...defaultBsPopperConfig,
4511      ...(typeof this._config.popperConfig === 'function' ? this._config.popperConfig(defaultBsPopperConfig) : this._config.popperConfig)
4512    };
4513  }
4514  _selectMenuItem({
4515    key,
4516    target
4517  }) {
4518    const items = SelectorEngine.find(SELECTOR_VISIBLE_ITEMS, this._menu).filter(element => isVisible(element));
4519    if (!items.length) {
4520      return;
4521    } // if target isn't included in items (e.g. when expanding the dropdown)
4522    // allow cycling to get the last item in case key equals ARROW_UP_KEY
4523
4524    getNextActiveElement(items, target, key === ARROW_DOWN_KEY$1, !items.includes(target)).focus();
4525  } // Static
4526
4527  static jQueryInterface(config) {
4528    return this.each(function () {
4529      const data = Dropdown.getOrCreateInstance(this, config);
4530      if (typeof config !== 'string') {
4531        return;
4532      }
4533      if (typeof data[config] === 'undefined') {
vendor: 23,169 bytes, lines 4534-5264
4534        throw new TypeError(`No method named "${config}"`);
4535      }
4536      data[config]();
4537    });
4538  }
4539  static clearMenus(event) {
4540    if (event.button === RIGHT_MOUSE_BUTTON || event.type === 'keyup' && event.key !== TAB_KEY$1) {
4541      return;
4542    }
4543    const openToggles = SelectorEngine.find(SELECTOR_DATA_TOGGLE_SHOWN);
4544    for (const toggle of openToggles) {
4545      const context = Dropdown.getInstance(toggle);
4546      if (!context || context._config.autoClose === false) {
4547        continue;
4548      }
4549      const composedPath = event.composedPath();
4550      const isMenuTarget = composedPath.includes(context._menu);
4551      if (composedPath.includes(context._element) || context._config.autoClose === 'inside' && !isMenuTarget || context._config.autoClose === 'outside' && isMenuTarget) {
4552        continue;
4553      } // Tab navigation through the dropdown menu or events from contained inputs shouldn't close the menu
4554
4555      if (context._menu.contains(event.target) && (event.type === 'keyup' && event.key === TAB_KEY$1 || /input|select|option|textarea|form/i.test(event.target.tagName))) {
4556        continue;
4557      }
4558      const relatedTarget = {
4559        relatedTarget: context._element
4560      };
4561      if (event.type === 'click') {
4562        relatedTarget.clickEvent = event;
4563      }
4564      context._completeHide(relatedTarget);
4565    }
4566  }
4567  static dataApiKeydownHandler(event) {
4568    // If not an UP | DOWN | ESCAPE key => not a dropdown command
4569    // If input/textarea && if key is other than ESCAPE => not a dropdown command
4570    const isInput = /input|textarea/i.test(event.target.tagName);
4571    const isEscapeEvent = event.key === ESCAPE_KEY$2;
4572    const isUpOrDownEvent = [ARROW_UP_KEY$1, ARROW_DOWN_KEY$1].includes(event.key);
4573    if (!isUpOrDownEvent && !isEscapeEvent) {
4574      return;
4575    }
4576    if (isInput && !isEscapeEvent) {
4577      return;
4578    }
4579    event.preventDefault(); // todo: v6 revert #37011 & change markup https://getbootstrap.com/docs/5.2/forms/input-group/
4580
4581    const getToggleButton = this.matches(SELECTOR_DATA_TOGGLE$3) ? this : SelectorEngine.prev(this, SELECTOR_DATA_TOGGLE$3)[0] || SelectorEngine.next(this, SELECTOR_DATA_TOGGLE$3)[0] || SelectorEngine.findOne(SELECTOR_DATA_TOGGLE$3, event.delegateTarget.parentNode);
4582    const instance = Dropdown.getOrCreateInstance(getToggleButton);
4583    if (isUpOrDownEvent) {
4584      event.stopPropagation();
4585      instance.show();
4586      instance._selectMenuItem(event);
4587      return;
4588    }
4589    if (instance._isShown()) {
4590      // else is escape and we check if it is shown
4591      event.stopPropagation();
4592      instance.hide();
4593      getToggleButton.focus();
4594    }
4595  }
4596}
4597/**
4598 * Data API implementation
4599 */
4600exports.Dropdown = Dropdown;
4601EventHandler.on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_DATA_TOGGLE$3, Dropdown.dataApiKeydownHandler);
4602EventHandler.on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_MENU, Dropdown.dataApiKeydownHandler);
4603EventHandler.on(document, EVENT_CLICK_DATA_API$3, Dropdown.clearMenus);
4604EventHandler.on(document, EVENT_KEYUP_DATA_API, Dropdown.clearMenus);
4605EventHandler.on(document, EVENT_CLICK_DATA_API$3, SELECTOR_DATA_TOGGLE$3, function (event) {
4606  event.preventDefault();
4607  Dropdown.getOrCreateInstance(this).toggle();
4608});
4609/**
4610 * jQuery
4611 */
4612
4613defineJQueryPlugin(Dropdown);
4614
4615/**
4616 * --------------------------------------------------------------------------
4617 * Bootstrap (v5.2.2): util/scrollBar.js
4618 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
4619 * --------------------------------------------------------------------------
4620 */
4621/**
4622 * Constants
4623 */
4624
4625const SELECTOR_FIXED_CONTENT = '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top';
4626const SELECTOR_STICKY_CONTENT = '.sticky-top';
4627const PROPERTY_PADDING = 'padding-right';
4628const PROPERTY_MARGIN = 'margin-right';
4629/**
4630 * Class definition
4631 */
4632
4633class ScrollBarHelper {
4634  constructor() {
4635    this._element = document.body;
4636  } // Public
4637
4638  getWidth() {
4639    // https://developer.mozilla.org/en-US/docs/Web/API/Window/innerWidth#usage_notes
4640    const documentWidth = document.documentElement.clientWidth;
4641    return Math.abs(window.innerWidth - documentWidth);
4642  }
4643  hide() {
4644    const width = this.getWidth();
4645    this._disableOverFlow(); // give padding to element to balance the hidden scrollbar width
4646
4647    this._setElementAttributes(this._element, PROPERTY_PADDING, calculatedValue => calculatedValue + width); // trick: We adjust positive paddingRight and negative marginRight to sticky-top elements to keep showing fullwidth
4648
4649    this._setElementAttributes(SELECTOR_FIXED_CONTENT, PROPERTY_PADDING, calculatedValue => calculatedValue + width);
4650    this._setElementAttributes(SELECTOR_STICKY_CONTENT, PROPERTY_MARGIN, calculatedValue => calculatedValue - width);
4651  }
4652  reset() {
4653    this._resetElementAttributes(this._element, 'overflow');
4654    this._resetElementAttributes(this._element, PROPERTY_PADDING);
4655    this._resetElementAttributes(SELECTOR_FIXED_CONTENT, PROPERTY_PADDING);
4656    this._resetElementAttributes(SELECTOR_STICKY_CONTENT, PROPERTY_MARGIN);
4657  }
4658  isOverflowing() {
4659    return this.getWidth() > 0;
4660  } // Private
4661
4662  _disableOverFlow() {
4663    this._saveInitialAttribute(this._element, 'overflow');
4664    this._element.style.overflow = 'hidden';
4665  }
4666  _setElementAttributes(selector, styleProperty, callback) {
4667    const scrollbarWidth = this.getWidth();
4668    const manipulationCallBack = element => {
4669      if (element !== this._element && window.innerWidth > element.clientWidth + scrollbarWidth) {
4670        return;
4671      }
4672      this._saveInitialAttribute(element, styleProperty);
4673      const calculatedValue = window.getComputedStyle(element).getPropertyValue(styleProperty);
4674      element.style.setProperty(styleProperty, `${callback(Number.parseFloat(calculatedValue))}px`);
4675    };
4676    this._applyManipulationCallback(selector, manipulationCallBack);
4677  }
4678  _saveInitialAttribute(element, styleProperty) {
4679    const actualValue = element.style.getPropertyValue(styleProperty);
4680    if (actualValue) {
4681      Manipulator.setDataAttribute(element, styleProperty, actualValue);
4682    }
4683  }
4684  _resetElementAttributes(selector, styleProperty) {
4685    const manipulationCallBack = element => {
4686      const value = Manipulator.getDataAttribute(element, styleProperty); // We only want to remove the property if the value is `null`; the value can also be zero
4687
4688      if (value === null) {
4689        element.style.removeProperty(styleProperty);
4690        return;
4691      }
4692      Manipulator.removeDataAttribute(element, styleProperty);
4693      element.style.setProperty(styleProperty, value);
4694    };
4695    this._applyManipulationCallback(selector, manipulationCallBack);
4696  }
4697  _applyManipulationCallback(selector, callBack) {
4698    if (isElement(selector)) {
4699      callBack(selector);
4700      return;
4701    }
4702    for (const sel of SelectorEngine.find(selector, this._element)) {
4703      callBack(sel);
4704    }
4705  }
4706}
4707
4708/**
4709 * --------------------------------------------------------------------------
4710 * Bootstrap (v5.2.2): util/backdrop.js
4711 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
4712 * --------------------------------------------------------------------------
4713 */
4714/**
4715 * Constants
4716 */
4717
4718const NAME$9 = 'backdrop';
4719const CLASS_NAME_FADE$4 = 'fade';
4720const CLASS_NAME_SHOW$5 = 'show';
4721const EVENT_MOUSEDOWN = `mousedown.bs.${NAME$9}`;
4722const Default$8 = {
4723  className: 'modal-backdrop',
4724  clickCallback: null,
4725  isAnimated: false,
4726  isVisible: true,
4727  // if false, we use the backdrop helper without adding any element to the dom
4728  rootElement: 'body' // give the choice to place backdrop under different elements
4729};
4730
4731const DefaultType$8 = {
4732  className: 'string',
4733  clickCallback: '(function|null)',
4734  isAnimated: 'boolean',
4735  isVisible: 'boolean',
4736  rootElement: '(element|string)'
4737};
4738/**
4739 * Class definition
4740 */
4741
4742class Backdrop extends Config {
4743  constructor(config) {
4744    super();
4745    this._config = this._getConfig(config);
4746    this._isAppended = false;
4747    this._element = null;
4748  } // Getters
4749
4750  static get Default() {
4751    return Default$8;
4752  }
4753  static get DefaultType() {
4754    return DefaultType$8;
4755  }
4756  static get NAME() {
4757    return NAME$9;
4758  } // Public
4759
4760  show(callback) {
4761    if (!this._config.isVisible) {
4762      execute(callback);
4763      return;
4764    }
4765    this._append();
4766    const element = this._getElement();
4767    if (this._config.isAnimated) {
4768      reflow(element);
4769    }
4770    element.classList.add(CLASS_NAME_SHOW$5);
4771    this._emulateAnimation(() => {
4772      execute(callback);
4773    });
4774  }
4775  hide(callback) {
4776    if (!this._config.isVisible) {
4777      execute(callback);
4778      return;
4779    }
4780    this._getElement().classList.remove(CLASS_NAME_SHOW$5);
4781    this._emulateAnimation(() => {
4782      this.dispose();
4783      execute(callback);
4784    });
4785  }
4786  dispose() {
4787    if (!this._isAppended) {
4788      return;
4789    }
4790    EventHandler.off(this._element, EVENT_MOUSEDOWN);
4791    this._element.remove();
4792    this._isAppended = false;
4793  } // Private
4794
4795  _getElement() {
4796    if (!this._element) {
4797      const backdrop = document.createElement('div');
4798      backdrop.className = this._config.className;
4799      if (this._config.isAnimated) {
4800        backdrop.classList.add(CLASS_NAME_FADE$4);
4801      }
4802      this._element = backdrop;
4803    }
4804    return this._element;
4805  }
4806  _configAfterMerge(config) {
4807    // use getElement() with the default "body" to get a fresh Element on each instantiation
4808    config.rootElement = getElement(config.rootElement);
4809    return config;
4810  }
4811  _append() {
4812    if (this._isAppended) {
4813      return;
4814    }
4815    const element = this._getElement();
4816    this._config.rootElement.append(element);
4817    EventHandler.on(element, EVENT_MOUSEDOWN, () => {
4818      execute(this._config.clickCallback);
4819    });
4820    this._isAppended = true;
4821  }
4822  _emulateAnimation(callback) {
4823    executeAfterTransition(callback, this._getElement(), this._config.isAnimated);
4824  }
4825}
4826
4827/**
4828 * --------------------------------------------------------------------------
4829 * Bootstrap (v5.2.2): util/focustrap.js
4830 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
4831 * --------------------------------------------------------------------------
4832 */
4833/**
4834 * Constants
4835 */
4836
4837const NAME$8 = 'focustrap';
4838const DATA_KEY$5 = 'bs.focustrap';
4839const EVENT_KEY$5 = `.${DATA_KEY$5}`;
4840const EVENT_FOCUSIN$2 = `focusin${EVENT_KEY$5}`;
4841const EVENT_KEYDOWN_TAB = `keydown.tab${EVENT_KEY$5}`;
4842const TAB_KEY = 'Tab';
4843const TAB_NAV_FORWARD = 'forward';
4844const TAB_NAV_BACKWARD = 'backward';
4845const Default$7 = {
4846  autofocus: true,
4847  trapElement: null // The element to trap focus inside of
4848};
4849
4850const DefaultType$7 = {
4851  autofocus: 'boolean',
4852  trapElement: 'element'
4853};
4854/**
4855 * Class definition
4856 */
4857
4858class FocusTrap extends Config {
4859  constructor(config) {
4860    super();
4861    this._config = this._getConfig(config);
4862    this._isActive = false;
4863    this._lastTabNavDirection = null;
4864  } // Getters
4865
4866  static get Default() {
4867    return Default$7;
4868  }
4869  static get DefaultType() {
4870    return DefaultType$7;
4871  }
4872  static get NAME() {
4873    return NAME$8;
4874  } // Public
4875
4876  activate() {
4877    if (this._isActive) {
4878      return;
4879    }
4880    if (this._config.autofocus) {
4881      this._config.trapElement.focus();
4882    }
4883    EventHandler.off(document, EVENT_KEY$5); // guard against infinite focus loop
4884
4885    EventHandler.on(document, EVENT_FOCUSIN$2, event => this._handleFocusin(event));
4886    EventHandler.on(document, EVENT_KEYDOWN_TAB, event => this._handleKeydown(event));
4887    this._isActive = true;
4888  }
4889  deactivate() {
4890    if (!this._isActive) {
4891      return;
4892    }
4893    this._isActive = false;
4894    EventHandler.off(document, EVENT_KEY$5);
4895  } // Private
4896
4897  _handleFocusin(event) {
4898    const {
4899      trapElement
4900    } = this._config;
4901    if (event.target === document || event.target === trapElement || trapElement.contains(event.target)) {
4902      return;
4903    }
4904    const elements = SelectorEngine.focusableChildren(trapElement);
4905    if (elements.length === 0) {
4906      trapElement.focus();
4907    } else if (this._lastTabNavDirection === TAB_NAV_BACKWARD) {
4908      elements[elements.length - 1].focus();
4909    } else {
4910      elements[0].focus();
4911    }
4912  }
4913  _handleKeydown(event) {
4914    if (event.key !== TAB_KEY) {
4915      return;
4916    }
4917    this._lastTabNavDirection = event.shiftKey ? TAB_NAV_BACKWARD : TAB_NAV_FORWARD;
4918  }
4919}
4920
4921/**
4922 * --------------------------------------------------------------------------
4923 * Bootstrap (v5.2.2): modal.js
4924 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
4925 * --------------------------------------------------------------------------
4926 */
4927/**
4928 * Constants
4929 */
4930
4931const NAME$7 = 'modal';
4932const DATA_KEY$4 = 'bs.modal';
4933const EVENT_KEY$4 = `.${DATA_KEY$4}`;
4934const DATA_API_KEY$2 = '.data-api';
4935const ESCAPE_KEY$1 = 'Escape';
4936const EVENT_HIDE$4 = `hide${EVENT_KEY$4}`;
4937const EVENT_HIDE_PREVENTED$1 = `hidePrevented${EVENT_KEY$4}`;
4938const EVENT_HIDDEN$4 = `hidden${EVENT_KEY$4}`;
4939const EVENT_SHOW$4 = `show${EVENT_KEY$4}`;
4940const EVENT_SHOWN$4 = `shown${EVENT_KEY$4}`;
4941const EVENT_RESIZE$1 = `resize${EVENT_KEY$4}`;
4942const EVENT_CLICK_DISMISS = `click.dismiss${EVENT_KEY$4}`;
4943const EVENT_MOUSEDOWN_DISMISS = `mousedown.dismiss${EVENT_KEY$4}`;
4944const EVENT_KEYDOWN_DISMISS$1 = `keydown.dismiss${EVENT_KEY$4}`;
4945const EVENT_CLICK_DATA_API$2 = `click${EVENT_KEY$4}${DATA_API_KEY$2}`;
4946const CLASS_NAME_OPEN = 'modal-open';
4947const CLASS_NAME_FADE$3 = 'fade';
4948const CLASS_NAME_SHOW$4 = 'show';
4949const CLASS_NAME_STATIC = 'modal-static';
4950const OPEN_SELECTOR$1 = '.modal.show';
4951const SELECTOR_DIALOG = '.modal-dialog';
4952const SELECTOR_MODAL_BODY = '.modal-body';
4953const SELECTOR_DATA_TOGGLE$2 = '[data-bs-toggle="modal"]';
4954const Default$6 = {
4955  backdrop: true,
4956  focus: true,
4957  keyboard: true
4958};
4959const DefaultType$6 = {
4960  backdrop: '(boolean|string)',
4961  focus: 'boolean',
4962  keyboard: 'boolean'
4963};
4964/**
4965 * Class definition
4966 */
4967
4968class Modal extends BaseComponent {
4969  constructor(element, config) {
4970    super(element, config);
4971    this._dialog = SelectorEngine.findOne(SELECTOR_DIALOG, this._element);
4972    this._backdrop = this._initializeBackDrop();
4973    this._focustrap = this._initializeFocusTrap();
4974    this._isShown = false;
4975    this._isTransitioning = false;
4976    this._scrollBar = new ScrollBarHelper();
4977    this._addEventListeners();
4978  } // Getters
4979
4980  static get Default() {
4981    return Default$6;
4982  }
4983  static get DefaultType() {
4984    return DefaultType$6;
4985  }
4986  static get NAME() {
4987    return NAME$7;
4988  } // Public
4989
4990  toggle(relatedTarget) {
4991    return this._isShown ? this.hide() : this.show(relatedTarget);
4992  }
4993  show(relatedTarget) {
4994    if (this._isShown || this._isTransitioning) {
4995      return;
4996    }
4997    const showEvent = EventHandler.trigger(this._element, EVENT_SHOW$4, {
4998      relatedTarget
4999    });
5000    if (showEvent.defaultPrevented) {
5001      return;
5002    }
5003    this._isShown = true;
5004    this._isTransitioning = true;
5005    this._scrollBar.hide();
5006    document.body.classList.add(CLASS_NAME_OPEN);
5007    this._adjustDialog();
5008    this._backdrop.show(() => this._showElement(relatedTarget));
5009  }
5010  hide() {
5011    if (!this._isShown || this._isTransitioning) {
5012      return;
5013    }
5014    const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE$4);
5015    if (hideEvent.defaultPrevented) {
5016      return;
5017    }
5018    this._isShown = false;
5019    this._isTransitioning = true;
5020    this._focustrap.deactivate();
5021    this._element.classList.remove(CLASS_NAME_SHOW$4);
5022    this._queueCallback(() => this._hideModal(), this._element, this._isAnimated());
5023  }
5024  dispose() {
5025    for (const htmlElement of [window, this._dialog]) {
5026      EventHandler.off(htmlElement, EVENT_KEY$4);
5027    }
5028    this._backdrop.dispose();
5029    this._focustrap.deactivate();
5030    super.dispose();
5031  }
5032  handleUpdate() {
5033    this._adjustDialog();
5034  } // Private
5035
5036  _initializeBackDrop() {
5037    return new Backdrop({
5038      isVisible: Boolean(this._config.backdrop),
5039      // 'static' option will be translated to true, and booleans will keep their value,
5040      isAnimated: this._isAnimated()
5041    });
5042  }
5043  _initializeFocusTrap() {
5044    return new FocusTrap({
5045      trapElement: this._element
5046    });
5047  }
5048  _showElement(relatedTarget) {
5049    // try to append dynamic modal
5050    if (!document.body.contains(this._element)) {
5051      document.body.append(this._element);
5052    }
5053    this._element.style.display = 'block';
5054    this._element.removeAttribute('aria-hidden');
5055    this._element.setAttribute('aria-modal', true);
5056    this._element.setAttribute('role', 'dialog');
5057    this._element.scrollTop = 0;
5058    const modalBody = SelectorEngine.findOne(SELECTOR_MODAL_BODY, this._dialog);
5059    if (modalBody) {
5060      modalBody.scrollTop = 0;
5061    }
5062    reflow(this._element);
5063    this._element.classList.add(CLASS_NAME_SHOW$4);
5064    const transitionComplete = () => {
5065      if (this._config.focus) {
5066        this._focustrap.activate();
5067      }
5068      this._isTransitioning = false;
5069      EventHandler.trigger(this._element, EVENT_SHOWN$4, {
5070        relatedTarget
5071      });
5072    };
5073    this._queueCallback(transitionComplete, this._dialog, this._isAnimated());
5074  }
5075  _addEventListeners() {
5076    EventHandler.on(this._element, EVENT_KEYDOWN_DISMISS$1, event => {
5077      if (event.key !== ESCAPE_KEY$1) {
5078        return;
5079      }
5080      if (this._config.keyboard) {
5081        event.preventDefault();
5082        this.hide();
5083        return;
5084      }
5085      this._triggerBackdropTransition();
5086    });
5087    EventHandler.on(window, EVENT_RESIZE$1, () => {
5088      if (this._isShown && !this._isTransitioning) {
5089        this._adjustDialog();
5090      }
5091    });
5092    EventHandler.on(this._element, EVENT_MOUSEDOWN_DISMISS, event => {
5093      // a bad trick to segregate clicks that may start inside dialog but end outside, and avoid listen to scrollbar clicks
5094      EventHandler.one(this._element, EVENT_CLICK_DISMISS, event2 => {
5095        if (this._element !== event.target || this._element !== event2.target) {
5096          return;
5097        }
5098        if (this._config.backdrop === 'static') {
5099          this._triggerBackdropTransition();
5100          return;
5101        }
5102        if (this._config.backdrop) {
5103          this.hide();
5104        }
5105      });
5106    });
5107  }
5108  _hideModal() {
5109    this._element.style.display = 'none';
5110    this._element.setAttribute('aria-hidden', true);
5111    this._element.removeAttribute('aria-modal');
5112    this._element.removeAttribute('role');
5113    this._isTransitioning = false;
5114    this._backdrop.hide(() => {
5115      document.body.classList.remove(CLASS_NAME_OPEN);
5116      this._resetAdjustments();
5117      this._scrollBar.reset();
5118      EventHandler.trigger(this._element, EVENT_HIDDEN$4);
5119    });
5120  }
5121  _isAnimated() {
5122    return this._element.classList.contains(CLASS_NAME_FADE$3);
5123  }
5124  _triggerBackdropTransition() {
5125    const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED$1);
5126    if (hideEvent.defaultPrevented) {
5127      return;
5128    }
5129    const isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight;
5130    const initialOverflowY = this._element.style.overflowY; // return if the following background transition hasn't yet completed
5131
5132    if (initialOverflowY === 'hidden' || this._element.classList.contains(CLASS_NAME_STATIC)) {
5133      return;
5134    }
5135    if (!isModalOverflowing) {
5136      this._element.style.overflowY = 'hidden';
5137    }
5138    this._element.classList.add(CLASS_NAME_STATIC);
5139    this._queueCallback(() => {
5140      this._element.classList.remove(CLASS_NAME_STATIC);
5141      this._queueCallback(() => {
5142        this._element.style.overflowY = initialOverflowY;
5143      }, this._dialog);
5144    }, this._dialog);
5145    this._element.focus();
5146  }
5147  /**
5148   * The following methods are used to handle overflowing modals
5149   */
5150
5151  _adjustDialog() {
5152    const isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight;
5153    const scrollbarWidth = this._scrollBar.getWidth();
5154    const isBodyOverflowing = scrollbarWidth > 0;
5155    if (isBodyOverflowing && !isModalOverflowing) {
5156      const property = isRTL() ? 'paddingLeft' : 'paddingRight';
5157      this._element.style[property] = `${scrollbarWidth}px`;
5158    }
5159    if (!isBodyOverflowing && isModalOverflowing) {
5160      const property = isRTL() ? 'paddingRight' : 'paddingLeft';
5161      this._element.style[property] = `${scrollbarWidth}px`;
5162    }
5163  }
5164  _resetAdjustments() {
5165    this._element.style.paddingLeft = '';
5166    this._element.style.paddingRight = '';
5167  } // Static
5168
5169  static jQueryInterface(config, relatedTarget) {
5170    return this.each(function () {
5171      const data = Modal.getOrCreateInstance(this, config);
5172      if (typeof config !== 'string') {
5173        return;
5174      }
5175      if (typeof data[config] === 'undefined') {
5176        throw new TypeError(`No method named "${config}"`);
5177      }
5178      data[config](relatedTarget);
5179    });
5180  }
5181}
5182/**
5183 * Data API implementation
5184 */
5185exports.Modal = Modal;
5186EventHandler.on(document, EVENT_CLICK_DATA_API$2, SELECTOR_DATA_TOGGLE$2, function (event) {
5187  const target = getElementFromSelector(this);
5188  if (['A', 'AREA'].includes(this.tagName)) {
5189    event.preventDefault();
5190  }
5191  EventHandler.one(target, EVENT_SHOW$4, showEvent => {
5192    if (showEvent.defaultPrevented) {
5193      // only register focus restorer if modal will actually get shown
5194      return;
5195    }
5196    EventHandler.one(target, EVENT_HIDDEN$4, () => {
5197      if (isVisible(this)) {
5198        this.focus();
5199      }
5200    });
5201  }); // avoid conflict when clicking modal toggler while another one is open
5202
5203  const alreadyOpen = SelectorEngine.findOne(OPEN_SELECTOR$1);
5204  if (alreadyOpen) {
5205    Modal.getInstance(alreadyOpen).hide();
5206  }
5207  const data = Modal.getOrCreateInstance(target);
5208  data.toggle(this);
5209});
5210enableDismissTrigger(Modal);
5211/**
5212 * jQuery
5213 */
5214
5215defineJQueryPlugin(Modal);
5216
5217/**
5218 * --------------------------------------------------------------------------
5219 * Bootstrap (v5.2.2): offcanvas.js
5220 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
5221 * --------------------------------------------------------------------------
5222 */
5223/**
5224 * Constants
5225 */
5226
5227const NAME$6 = 'offcanvas';
5228const DATA_KEY$3 = 'bs.offcanvas';
5229const EVENT_KEY$3 = `.${DATA_KEY$3}`;
5230const DATA_API_KEY$1 = '.data-api';
5231const EVENT_LOAD_DATA_API$2 = `load${EVENT_KEY$3}${DATA_API_KEY$1}`;
5232const ESCAPE_KEY = 'Escape';
5233const CLASS_NAME_SHOW$3 = 'show';
5234const CLASS_NAME_SHOWING$1 = 'showing';
5235const CLASS_NAME_HIDING = 'hiding';
5236const CLASS_NAME_BACKDROP = 'offcanvas-backdrop';
5237const OPEN_SELECTOR = '.offcanvas.show';
5238const EVENT_SHOW$3 = `show${EVENT_KEY$3}`;
5239const EVENT_SHOWN$3 = `shown${EVENT_KEY$3}`;
5240const EVENT_HIDE$3 = `hide${EVENT_KEY$3}`;
5241const EVENT_HIDE_PREVENTED = `hidePrevented${EVENT_KEY$3}`;
5242const EVENT_HIDDEN$3 = `hidden${EVENT_KEY$3}`;
5243const EVENT_RESIZE = `resize${EVENT_KEY$3}`;
5244const EVENT_CLICK_DATA_API$1 = `click${EVENT_KEY$3}${DATA_API_KEY$1}`;
5245const EVENT_KEYDOWN_DISMISS = `keydown.dismiss${EVENT_KEY$3}`;
5246const SELECTOR_DATA_TOGGLE$1 = '[data-bs-toggle="offcanvas"]';
5247const Default$5 = {
5248  backdrop: true,
5249  keyboard: true,
5250  scroll: false
5251};
5252const DefaultType$5 = {
5253  backdrop: '(boolean|string)',
5254  keyboard: 'boolean',
5255  scroll: 'boolean'
5256};
5257/**
5258 * Class definition
5259 */
5260
5261class Offcanvas extends BaseComponent {
5262  constructor(element, config) {
5263    super(element, config);
5264    this._isShown = false;
vendor: 6,150 bytes, lines 5265-5459
5265    this._backdrop = this._initializeBackDrop();
5266    this._focustrap = this._initializeFocusTrap();
5267    this._addEventListeners();
5268  } // Getters
5269
5270  static get Default() {
5271    return Default$5;
5272  }
5273  static get DefaultType() {
5274    return DefaultType$5;
5275  }
5276  static get NAME() {
5277    return NAME$6;
5278  } // Public
5279
5280  toggle(relatedTarget) {
5281    return this._isShown ? this.hide() : this.show(relatedTarget);
5282  }
5283  show(relatedTarget) {
5284    if (this._isShown) {
5285      return;
5286    }
5287    const showEvent = EventHandler.trigger(this._element, EVENT_SHOW$3, {
5288      relatedTarget
5289    });
5290    if (showEvent.defaultPrevented) {
5291      return;
5292    }
5293    this._isShown = true;
5294    this._backdrop.show();
5295    if (!this._config.scroll) {
5296      new ScrollBarHelper().hide();
5297    }
5298    this._element.setAttribute('aria-modal', true);
5299    this._element.setAttribute('role', 'dialog');
5300    this._element.classList.add(CLASS_NAME_SHOWING$1);
5301    const completeCallBack = () => {
5302      if (!this._config.scroll || this._config.backdrop) {
5303        this._focustrap.activate();
5304      }
5305      this._element.classList.add(CLASS_NAME_SHOW$3);
5306      this._element.classList.remove(CLASS_NAME_SHOWING$1);
5307      EventHandler.trigger(this._element, EVENT_SHOWN$3, {
5308        relatedTarget
5309      });
5310    };
5311    this._queueCallback(completeCallBack, this._element, true);
5312  }
5313  hide() {
5314    if (!this._isShown) {
5315      return;
5316    }
5317    const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE$3);
5318    if (hideEvent.defaultPrevented) {
5319      return;
5320    }
5321    this._focustrap.deactivate();
5322    this._element.blur();
5323    this._isShown = false;
5324    this._element.classList.add(CLASS_NAME_HIDING);
5325    this._backdrop.hide();
5326    const completeCallback = () => {
5327      this._element.classList.remove(CLASS_NAME_SHOW$3, CLASS_NAME_HIDING);
5328      this._element.removeAttribute('aria-modal');
5329      this._element.removeAttribute('role');
5330      if (!this._config.scroll) {
5331        new ScrollBarHelper().reset();
5332      }
5333      EventHandler.trigger(this._element, EVENT_HIDDEN$3);
5334    };
5335    this._queueCallback(completeCallback, this._element, true);
5336  }
5337  dispose() {
5338    this._backdrop.dispose();
5339    this._focustrap.deactivate();
5340    super.dispose();
5341  } // Private
5342
5343  _initializeBackDrop() {
5344    const clickCallback = () => {
5345      if (this._config.backdrop === 'static') {
5346        EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED);
5347        return;
5348      }
5349      this.hide();
5350    }; // 'static' option will be translated to true, and booleans will keep their value
5351
5352    const isVisible = Boolean(this._config.backdrop);
5353    return new Backdrop({
5354      className: CLASS_NAME_BACKDROP,
5355      isVisible,
5356      isAnimated: true,
5357      rootElement: this._element.parentNode,
5358      clickCallback: isVisible ? clickCallback : null
5359    });
5360  }
5361  _initializeFocusTrap() {
5362    return new FocusTrap({
5363      trapElement: this._element
5364    });
5365  }
5366  _addEventListeners() {
5367    EventHandler.on(this._element, EVENT_KEYDOWN_DISMISS, event => {
5368      if (event.key !== ESCAPE_KEY) {
5369        return;
5370      }
5371      if (!this._config.keyboard) {
5372        EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED);
5373        return;
5374      }
5375      this.hide();
5376    });
5377  } // Static
5378
5379  static jQueryInterface(config) {
5380    return this.each(function () {
5381      const data = Offcanvas.getOrCreateInstance(this, config);
5382      if (typeof config !== 'string') {
5383        return;
5384      }
5385      if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {
5386        throw new TypeError(`No method named "${config}"`);
5387      }
5388      data[config](this);
5389    });
5390  }
5391}
5392/**
5393 * Data API implementation
5394 */
5395exports.Offcanvas = Offcanvas;
5396EventHandler.on(document, EVENT_CLICK_DATA_API$1, SELECTOR_DATA_TOGGLE$1, function (event) {
5397  const target = getElementFromSelector(this);
5398  if (['A', 'AREA'].includes(this.tagName)) {
5399    event.preventDefault();
5400  }
5401  if (isDisabled(this)) {
5402    return;
5403  }
5404  EventHandler.one(target, EVENT_HIDDEN$3, () => {
5405    // focus on trigger when it is closed
5406    if (isVisible(this)) {
5407      this.focus();
5408    }
5409  }); // avoid conflict when clicking a toggler of an offcanvas, while another is open
5410
5411  const alreadyOpen = SelectorEngine.findOne(OPEN_SELECTOR);
5412  if (alreadyOpen && alreadyOpen !== target) {
5413    Offcanvas.getInstance(alreadyOpen).hide();
5414  }
5415  const data = Offcanvas.getOrCreateInstance(target);
5416  data.toggle(this);
5417});
5418EventHandler.on(window, EVENT_LOAD_DATA_API$2, () => {
5419  for (const selector of SelectorEngine.find(OPEN_SELECTOR)) {
5420    Offcanvas.getOrCreateInstance(selector).show();
5421  }
5422});
5423EventHandler.on(window, EVENT_RESIZE, () => {
5424  for (const element of SelectorEngine.find('[aria-modal][class*=show][class*=offcanvas-]')) {
5425    if (getComputedStyle(element).position !== 'fixed') {
5426      Offcanvas.getOrCreateInstance(element).hide();
5427    }
5428  }
5429});
5430enableDismissTrigger(Offcanvas);
5431/**
5432 * jQuery
5433 */
5434
5435defineJQueryPlugin(Offcanvas);
5436
5437/**
5438 * --------------------------------------------------------------------------
5439 * Bootstrap (v5.2.2): util/sanitizer.js
5440 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
5441 * --------------------------------------------------------------------------
5442 */
5443const uriAttributes = new Set(['background', 'cite', 'href', 'itemtype', 'longdesc', 'poster', 'src', 'xlink:href']);
5444const ARIA_ATTRIBUTE_PATTERN = /^aria-[\w-]*$/i;
5445/**
5446 * A pattern that recognizes a commonly useful subset of URLs that are safe.
5447 *
5448 * Shout-out to Angular https://github.com/angular/angular/blob/12.2.x/packages/core/src/sanitization/url_sanitizer.ts
5449 */
5450
5451const SAFE_URL_PATTERN = /^(?:(?:https?|mailto|ftp|tel|file|sms):|[^#&/:?]*(?:[#/?]|$))/i;
5452/**
5453 * A pattern that matches safe data URLs. Only matches image, video and audio types.
5454 *
5455 * Shout-out to Angular https://github.com/angular/angular/blob/12.2.x/packages/core/src/sanitization/url_sanitizer.ts
5456 */
5457
5458const DATA_URL_PATTERN = /^data:(?:image\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\/(?:mpeg|mp4|ogg|webm)|audio\/(?:mp3|oga|ogg|opus));base64,[\d+/a-z]+=*$/i;
5459const allowedAttribute = (attribute, allowedAttributeList) => {
vendor: 5,145 bytes, lines 5460-5645
5460  const attributeName = attribute.nodeName.toLowerCase();
5461  if (allowedAttributeList.includes(attributeName)) {
5462    if (uriAttributes.has(attributeName)) {
5463      return Boolean(SAFE_URL_PATTERN.test(attribute.nodeValue) || DATA_URL_PATTERN.test(attribute.nodeValue));
5464    }
5465    return true;
5466  } // Check if a regular expression validates the attribute.
5467
5468  return allowedAttributeList.filter(attributeRegex => attributeRegex instanceof RegExp).some(regex => regex.test(attributeName));
5469};
5470const DefaultAllowlist = {
5471  // Global attributes allowed on any supplied element below.
5472  '*': ['class', 'dir', 'id', 'lang', 'role', ARIA_ATTRIBUTE_PATTERN],
5473  a: ['target', 'href', 'title', 'rel'],
5474  area: [],
5475  b: [],
5476  br: [],
5477  col: [],
5478  code: [],
5479  div: [],
5480  em: [],
5481  hr: [],
5482  h1: [],
5483  h2: [],
5484  h3: [],
5485  h4: [],
5486  h5: [],
5487  h6: [],
5488  i: [],
5489  img: ['src', 'srcset', 'alt', 'title', 'width', 'height'],
5490  li: [],
5491  ol: [],
5492  p: [],
5493  pre: [],
5494  s: [],
5495  small: [],
5496  span: [],
5497  sub: [],
5498  sup: [],
5499  strong: [],
5500  u: [],
5501  ul: []
5502};
5503function sanitizeHtml(unsafeHtml, allowList, sanitizeFunction) {
5504  if (!unsafeHtml.length) {
5505    return unsafeHtml;
5506  }
5507  if (sanitizeFunction && typeof sanitizeFunction === 'function') {
5508    return sanitizeFunction(unsafeHtml);
5509  }
5510  const domParser = new window.DOMParser();
5511  const createdDocument = domParser.parseFromString(unsafeHtml, 'text/html');
5512  const elements = [].concat(...createdDocument.body.querySelectorAll('*'));
5513  for (const element of elements) {
5514    const elementName = element.nodeName.toLowerCase();
5515    if (!Object.keys(allowList).includes(elementName)) {
5516      element.remove();
5517      continue;
5518    }
5519    const attributeList = [].concat(...element.attributes);
5520    const allowedAttributes = [].concat(allowList['*'] || [], allowList[elementName] || []);
5521    for (const attribute of attributeList) {
5522      if (!allowedAttribute(attribute, allowedAttributes)) {
5523        element.removeAttribute(attribute.nodeName);
5524      }
5525    }
5526  }
5527  return createdDocument.body.innerHTML;
5528}
5529
5530/**
5531 * --------------------------------------------------------------------------
5532 * Bootstrap (v5.2.2): util/template-factory.js
5533 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
5534 * --------------------------------------------------------------------------
5535 */
5536/**
5537 * Constants
5538 */
5539
5540const NAME$5 = 'TemplateFactory';
5541const Default$4 = {
5542  allowList: DefaultAllowlist,
5543  content: {},
5544  // { selector : text ,  selector2 : text2 , }
5545  extraClass: '',
5546  html: false,
5547  sanitize: true,
5548  sanitizeFn: null,
5549  template: '<div></div>'
5550};
5551const DefaultType$4 = {
5552  allowList: 'object',
5553  content: 'object',
5554  extraClass: '(string|function)',
5555  html: 'boolean',
5556  sanitize: 'boolean',
5557  sanitizeFn: '(null|function)',
5558  template: 'string'
5559};
5560const DefaultContentType = {
5561  entry: '(string|element|function|null)',
5562  selector: '(string|element)'
5563};
5564/**
5565 * Class definition
5566 */
5567
5568class TemplateFactory extends Config {
5569  constructor(config) {
5570    super();
5571    this._config = this._getConfig(config);
5572  } // Getters
5573
5574  static get Default() {
5575    return Default$4;
5576  }
5577  static get DefaultType() {
5578    return DefaultType$4;
5579  }
5580  static get NAME() {
5581    return NAME$5;
5582  } // Public
5583
5584  getContent() {
5585    return Object.values(this._config.content).map(config => this._resolvePossibleFunction(config)).filter(Boolean);
5586  }
5587  hasContent() {
5588    return this.getContent().length > 0;
5589  }
5590  changeContent(content) {
5591    this._checkContent(content);
5592    this._config.content = {
5593      ...this._config.content,
5594      ...content
5595    };
5596    return this;
5597  }
5598  toHtml() {
5599    const templateWrapper = document.createElement('div');
5600    templateWrapper.innerHTML = this._maybeSanitize(this._config.template);
5601    for (const [selector, text] of Object.entries(this._config.content)) {
5602      this._setContent(templateWrapper, text, selector);
5603    }
5604    const template = templateWrapper.children[0];
5605    const extraClass = this._resolvePossibleFunction(this._config.extraClass);
5606    if (extraClass) {
5607      template.classList.add(...extraClass.split(' '));
5608    }
5609    return template;
5610  } // Private
5611
5612  _typeCheckConfig(config) {
5613    super._typeCheckConfig(config);
5614    this._checkContent(config.content);
5615  }
5616  _checkContent(arg) {
5617    for (const [selector, content] of Object.entries(arg)) {
5618      super._typeCheckConfig({
5619        selector,
5620        entry: content
5621      }, DefaultContentType);
5622    }
5623  }
5624  _setContent(template, content, selector) {
5625    const templateElement = SelectorEngine.findOne(selector, template);
5626    if (!templateElement) {
5627      return;
5628    }
5629    content = this._resolvePossibleFunction(content);
5630    if (!content) {
5631      templateElement.remove();
5632      return;
5633    }
5634    if (isElement(content)) {
5635      this._putElementInTemplate(getElement(content), templateElement);
5636      return;
5637    }
5638    if (this._config.html) {
5639      templateElement.innerHTML = this._maybeSanitize(content);
5640      return;
5641    }
5642    templateElement.textContent = content;
5643  }
5644  _maybeSanitize(arg) {
5645    return this._config.sanitize ? sanitizeHtml(arg, this._config.allowList, this._config.sanitizeFn) : arg;
vendor: 5,271 bytes, lines 5646-5832
5646  }
5647  _resolvePossibleFunction(arg) {
5648    return typeof arg === 'function' ? arg(this) : arg;
5649  }
5650  _putElementInTemplate(element, templateElement) {
5651    if (this._config.html) {
5652      templateElement.innerHTML = '';
5653      templateElement.append(element);
5654      return;
5655    }
5656    templateElement.textContent = element.textContent;
5657  }
5658}
5659
5660/**
5661 * --------------------------------------------------------------------------
5662 * Bootstrap (v5.2.2): tooltip.js
5663 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
5664 * --------------------------------------------------------------------------
5665 */
5666/**
5667 * Constants
5668 */
5669
5670const NAME$4 = 'tooltip';
5671const DISALLOWED_ATTRIBUTES = new Set(['sanitize', 'allowList', 'sanitizeFn']);
5672const CLASS_NAME_FADE$2 = 'fade';
5673const CLASS_NAME_MODAL = 'modal';
5674const CLASS_NAME_SHOW$2 = 'show';
5675const SELECTOR_TOOLTIP_INNER = '.tooltip-inner';
5676const SELECTOR_MODAL = `.${CLASS_NAME_MODAL}`;
5677const EVENT_MODAL_HIDE = 'hide.bs.modal';
5678const TRIGGER_HOVER = 'hover';
5679const TRIGGER_FOCUS = 'focus';
5680const TRIGGER_CLICK = 'click';
5681const TRIGGER_MANUAL = 'manual';
5682const EVENT_HIDE$2 = 'hide';
5683const EVENT_HIDDEN$2 = 'hidden';
5684const EVENT_SHOW$2 = 'show';
5685const EVENT_SHOWN$2 = 'shown';
5686const EVENT_INSERTED = 'inserted';
5687const EVENT_CLICK$1 = 'click';
5688const EVENT_FOCUSIN$1 = 'focusin';
5689const EVENT_FOCUSOUT$1 = 'focusout';
5690const EVENT_MOUSEENTER = 'mouseenter';
5691const EVENT_MOUSELEAVE = 'mouseleave';
5692const AttachmentMap = {
5693  AUTO: 'auto',
5694  TOP: 'top',
5695  RIGHT: isRTL() ? 'left' : 'right',
5696  BOTTOM: 'bottom',
5697  LEFT: isRTL() ? 'right' : 'left'
5698};
5699const Default$3 = {
5700  allowList: DefaultAllowlist,
5701  animation: true,
5702  boundary: 'clippingParents',
5703  container: false,
5704  customClass: '',
5705  delay: 0,
5706  fallbackPlacements: ['top', 'right', 'bottom', 'left'],
5707  html: false,
5708  offset: [0, 0],
5709  placement: 'top',
5710  popperConfig: null,
5711  sanitize: true,
5712  sanitizeFn: null,
5713  selector: false,
5714  template: '<div class="tooltip" role="tooltip">' + '<div class="tooltip-arrow"></div>' + '<div class="tooltip-inner"></div>' + '</div>',
5715  title: '',
5716  trigger: 'hover focus'
5717};
5718const DefaultType$3 = {
5719  allowList: 'object',
5720  animation: 'boolean',
5721  boundary: '(string|element)',
5722  container: '(string|element|boolean)',
5723  customClass: '(string|function)',
5724  delay: '(number|object)',
5725  fallbackPlacements: 'array',
5726  html: 'boolean',
5727  offset: '(array|string|function)',
5728  placement: '(string|function)',
5729  popperConfig: '(null|object|function)',
5730  sanitize: 'boolean',
5731  sanitizeFn: '(null|function)',
5732  selector: '(string|boolean)',
5733  template: 'string',
5734  title: '(string|element|function)',
5735  trigger: 'string'
5736};
5737/**
5738 * Class definition
5739 */
5740
5741class Tooltip extends BaseComponent {
5742  constructor(element, config) {
5743    if (typeof Popper === 'undefined') {
5744      throw new TypeError('Bootstrap\'s tooltips require Popper (https://popper.js.org)');
5745    }
5746    super(element, config); // Private
5747
5748    this._isEnabled = true;
5749    this._timeout = 0;
5750    this._isHovered = null;
5751    this._activeTrigger = {};
5752    this._popper = null;
5753    this._templateFactory = null;
5754    this._newContent = null; // Protected
5755
5756    this.tip = null;
5757    this._setListeners();
5758    if (!this._config.selector) {
5759      this._fixTitle();
5760    }
5761  } // Getters
5762
5763  static get Default() {
5764    return Default$3;
5765  }
5766  static get DefaultType() {
5767    return DefaultType$3;
5768  }
5769  static get NAME() {
5770    return NAME$4;
5771  } // Public
5772
5773  enable() {
5774    this._isEnabled = true;
5775  }
5776  disable() {
5777    this._isEnabled = false;
5778  }
5779  toggleEnabled() {
5780    this._isEnabled = !this._isEnabled;
5781  }
5782  toggle() {
5783    if (!this._isEnabled) {
5784      return;
5785    }
5786    this._activeTrigger.click = !this._activeTrigger.click;
5787    if (this._isShown()) {
5788      this._leave();
5789      return;
5790    }
5791    this._enter();
5792  }
5793  dispose() {
5794    clearTimeout(this._timeout);
5795    EventHandler.off(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler);
5796    if (this.tip) {
5797      this.tip.remove();
5798    }
5799    if (this._element.getAttribute('data-bs-original-title')) {
5800      this._element.setAttribute('title', this._element.getAttribute('data-bs-original-title'));
5801    }
5802    this._disposePopper();
5803    super.dispose();
5804  }
5805  show() {
5806    if (this._element.style.display === 'none') {
5807      throw new Error('Please use show on visible elements');
5808    }
5809    if (!(this._isWithContent() && this._isEnabled)) {
5810      return;
5811    }
5812    const showEvent = EventHandler.trigger(this._element, this.constructor.eventName(EVENT_SHOW$2));
5813    const shadowRoot = findShadowRoot(this._element);
5814    const isInTheDom = (shadowRoot || this._element.ownerDocument.documentElement).contains(this._element);
5815    if (showEvent.defaultPrevented || !isInTheDom) {
5816      return;
5817    } // todo v6 remove this OR make it optional
5818
5819    if (this.tip) {
5820      this.tip.remove();
5821      this.tip = null;
5822    }
5823    const tip = this._getTipElement();
5824    this._element.setAttribute('aria-describedby', tip.getAttribute('id'));
5825    const {
5826      container
5827    } = this._config;
5828    if (!this._element.ownerDocument.documentElement.contains(this.tip)) {
5829      container.append(tip);
5830      EventHandler.trigger(this._element, this.constructor.eventName(EVENT_INSERTED));
5831    }
5832    if (this._popper) {
vendor: 2,830 bytes, lines 5833-5915
5833      this._popper.update();
5834    } else {
5835      this._popper = this._createPopper(tip);
5836    }
5837    tip.classList.add(CLASS_NAME_SHOW$2); // If this is a touch-enabled device we add extra
5838    // empty mouseover listeners to the body's immediate children;
5839    // only needed because of broken event delegation on iOS
5840    // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html
5841
5842    if ('ontouchstart' in document.documentElement) {
5843      for (const element of [].concat(...document.body.children)) {
5844        EventHandler.on(element, 'mouseover', noop);
5845      }
5846    }
5847    const complete = () => {
5848      EventHandler.trigger(this._element, this.constructor.eventName(EVENT_SHOWN$2));
5849      if (this._isHovered === false) {
5850        this._leave();
5851      }
5852      this._isHovered = false;
5853    };
5854    this._queueCallback(complete, this.tip, this._isAnimated());
5855  }
5856  hide() {
5857    if (!this._isShown()) {
5858      return;
5859    }
5860    const hideEvent = EventHandler.trigger(this._element, this.constructor.eventName(EVENT_HIDE$2));
5861    if (hideEvent.defaultPrevented) {
5862      return;
5863    }
5864    const tip = this._getTipElement();
5865    tip.classList.remove(CLASS_NAME_SHOW$2); // If this is a touch-enabled device we remove the extra
5866    // empty mouseover listeners we added for iOS support
5867
5868    if ('ontouchstart' in document.documentElement) {
5869      for (const element of [].concat(...document.body.children)) {
5870        EventHandler.off(element, 'mouseover', noop);
5871      }
5872    }
5873    this._activeTrigger[TRIGGER_CLICK] = false;
5874    this._activeTrigger[TRIGGER_FOCUS] = false;
5875    this._activeTrigger[TRIGGER_HOVER] = false;
5876    this._isHovered = null; // it is a trick to support manual triggering
5877
5878    const complete = () => {
5879      if (this._isWithActiveTrigger()) {
5880        return;
5881      }
5882      if (!this._isHovered) {
5883        tip.remove();
5884      }
5885      this._element.removeAttribute('aria-describedby');
5886      EventHandler.trigger(this._element, this.constructor.eventName(EVENT_HIDDEN$2));
5887      this._disposePopper();
5888    };
5889    this._queueCallback(complete, this.tip, this._isAnimated());
5890  }
5891  update() {
5892    if (this._popper) {
5893      this._popper.update();
5894    }
5895  } // Protected
5896
5897  _isWithContent() {
5898    return Boolean(this._getTitle());
5899  }
5900  _getTipElement() {
5901    if (!this.tip) {
5902      this.tip = this._createTipElement(this._newContent || this._getContentForTemplate());
5903    }
5904    return this.tip;
5905  }
5906  _createTipElement(content) {
5907    const tip = this._getTemplateFactory(content).toHtml(); // todo: remove this check on v6
5908
5909    if (!tip) {
5910      return null;
5911    }
5912    tip.classList.remove(CLASS_NAME_FADE$2, CLASS_NAME_SHOW$2); // todo: on v6 the following can be achieved with CSS only
5913
5914    tip.classList.add(`bs-${this.constructor.NAME}-auto`);
5915    const tipId = getUID(this.constructor.NAME).toString();
vendor: 5,644 bytes, lines 5916-6078
5916    tip.setAttribute('id', tipId);
5917    if (this._isAnimated()) {
5918      tip.classList.add(CLASS_NAME_FADE$2);
5919    }
5920    return tip;
5921  }
5922  setContent(content) {
5923    this._newContent = content;
5924    if (this._isShown()) {
5925      this._disposePopper();
5926      this.show();
5927    }
5928  }
5929  _getTemplateFactory(content) {
5930    if (this._templateFactory) {
5931      this._templateFactory.changeContent(content);
5932    } else {
5933      this._templateFactory = new TemplateFactory({
5934        ...this._config,
5935        // the `content` var has to be after `this._config`
5936        // to override config.content in case of popover
5937        content,
5938        extraClass: this._resolvePossibleFunction(this._config.customClass)
5939      });
5940    }
5941    return this._templateFactory;
5942  }
5943  _getContentForTemplate() {
5944    return {
5945      [SELECTOR_TOOLTIP_INNER]: this._getTitle()
5946    };
5947  }
5948  _getTitle() {
5949    return this._resolvePossibleFunction(this._config.title) || this._element.getAttribute('data-bs-original-title');
5950  } // Private
5951
5952  _initializeOnDelegatedTarget(event) {
5953    return this.constructor.getOrCreateInstance(event.delegateTarget, this._getDelegateConfig());
5954  }
5955  _isAnimated() {
5956    return this._config.animation || this.tip && this.tip.classList.contains(CLASS_NAME_FADE$2);
5957  }
5958  _isShown() {
5959    return this.tip && this.tip.classList.contains(CLASS_NAME_SHOW$2);
5960  }
5961  _createPopper(tip) {
5962    const placement = typeof this._config.placement === 'function' ? this._config.placement.call(this, tip, this._element) : this._config.placement;
5963    const attachment = AttachmentMap[placement.toUpperCase()];
5964    return Popper.createPopper(this._element, tip, this._getPopperConfig(attachment));
5965  }
5966  _getOffset() {
5967    const {
5968      offset
5969    } = this._config;
5970    if (typeof offset === 'string') {
5971      return offset.split(',').map(value => Number.parseInt(value, 10));
5972    }
5973    if (typeof offset === 'function') {
5974      return popperData => offset(popperData, this._element);
5975    }
5976    return offset;
5977  }
5978  _resolvePossibleFunction(arg) {
5979    return typeof arg === 'function' ? arg.call(this._element) : arg;
5980  }
5981  _getPopperConfig(attachment) {
5982    const defaultBsPopperConfig = {
5983      placement: attachment,
5984      modifiers: [{
5985        name: 'flip',
5986        options: {
5987          fallbackPlacements: this._config.fallbackPlacements
5988        }
5989      }, {
5990        name: 'offset',
5991        options: {
5992          offset: this._getOffset()
5993        }
5994      }, {
5995        name: 'preventOverflow',
5996        options: {
5997          boundary: this._config.boundary
5998        }
5999      }, {
6000        name: 'arrow',
6001        options: {
6002          element: `.${this.constructor.NAME}-arrow`
6003        }
6004      }, {
6005        name: 'preSetPlacement',
6006        enabled: true,
6007        phase: 'beforeMain',
6008        fn: data => {
6009          // Pre-set Popper's placement attribute in order to read the arrow sizes properly.
6010          // Otherwise, Popper mixes up the width and height dimensions since the initial arrow style is for top placement
6011          this._getTipElement().setAttribute('data-popper-placement', data.state.placement);
6012        }
6013      }]
6014    };
6015    return {
6016      ...defaultBsPopperConfig,
6017      ...(typeof this._config.popperConfig === 'function' ? this._config.popperConfig(defaultBsPopperConfig) : this._config.popperConfig)
6018    };
6019  }
6020  _setListeners() {
6021    const triggers = this._config.trigger.split(' ');
6022    for (const trigger of triggers) {
6023      if (trigger === 'click') {
6024        EventHandler.on(this._element, this.constructor.eventName(EVENT_CLICK$1), this._config.selector, event => {
6025          const context = this._initializeOnDelegatedTarget(event);
6026          context.toggle();
6027        });
6028      } else if (trigger !== TRIGGER_MANUAL) {
6029        const eventIn = trigger === TRIGGER_HOVER ? this.constructor.eventName(EVENT_MOUSEENTER) : this.constructor.eventName(EVENT_FOCUSIN$1);
6030        const eventOut = trigger === TRIGGER_HOVER ? this.constructor.eventName(EVENT_MOUSELEAVE) : this.constructor.eventName(EVENT_FOCUSOUT$1);
6031        EventHandler.on(this._element, eventIn, this._config.selector, event => {
6032          const context = this._initializeOnDelegatedTarget(event);
6033          context._activeTrigger[event.type === 'focusin' ? TRIGGER_FOCUS : TRIGGER_HOVER] = true;
6034          context._enter();
6035        });
6036        EventHandler.on(this._element, eventOut, this._config.selector, event => {
6037          const context = this._initializeOnDelegatedTarget(event);
6038          context._activeTrigger[event.type === 'focusout' ? TRIGGER_FOCUS : TRIGGER_HOVER] = context._element.contains(event.relatedTarget);
6039          context._leave();
6040        });
6041      }
6042    }
6043    this._hideModalHandler = () => {
6044      if (this._element) {
6045        this.hide();
6046      }
6047    };
6048    EventHandler.on(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler);
6049  }
6050  _fixTitle() {
6051    const title = this._element.getAttribute('title');
6052    if (!title) {
6053      return;
6054    }
6055    if (!this._element.getAttribute('aria-label') && !this._element.textContent.trim()) {
6056      this._element.setAttribute('aria-label', title);
6057    }
6058    this._element.setAttribute('data-bs-original-title', title); // DO NOT USE IT. Is only for backwards compatibility
6059
6060    this._element.removeAttribute('title');
6061  }
6062  _enter() {
6063    if (this._isShown() || this._isHovered) {
6064      this._isHovered = true;
6065      return;
6066    }
6067    this._isHovered = true;
6068    this._setTimeout(() => {
6069      if (this._isHovered) {
6070        this.show();
6071      }
6072    }, this._config.delay.show);
6073  }
6074  _leave() {
6075    if (this._isWithActiveTrigger()) {
6076      return;
6077    }
6078    this._isHovered = false;
vendor: 14,864 bytes, lines 6079-6534
6079    this._setTimeout(() => {
6080      if (!this._isHovered) {
6081        this.hide();
6082      }
6083    }, this._config.delay.hide);
6084  }
6085  _setTimeout(handler, timeout) {
6086    clearTimeout(this._timeout);
6087    this._timeout = setTimeout(handler, timeout);
6088  }
6089  _isWithActiveTrigger() {
6090    return Object.values(this._activeTrigger).includes(true);
6091  }
6092  _getConfig(config) {
6093    const dataAttributes = Manipulator.getDataAttributes(this._element);
6094    for (const dataAttribute of Object.keys(dataAttributes)) {
6095      if (DISALLOWED_ATTRIBUTES.has(dataAttribute)) {
6096        delete dataAttributes[dataAttribute];
6097      }
6098    }
6099    config = {
6100      ...dataAttributes,
6101      ...(typeof config === 'object' && config ? config : {})
6102    };
6103    config = this._mergeConfigObj(config);
6104    config = this._configAfterMerge(config);
6105    this._typeCheckConfig(config);
6106    return config;
6107  }
6108  _configAfterMerge(config) {
6109    config.container = config.container === false ? document.body : getElement(config.container);
6110    if (typeof config.delay === 'number') {
6111      config.delay = {
6112        show: config.delay,
6113        hide: config.delay
6114      };
6115    }
6116    if (typeof config.title === 'number') {
6117      config.title = config.title.toString();
6118    }
6119    if (typeof config.content === 'number') {
6120      config.content = config.content.toString();
6121    }
6122    return config;
6123  }
6124  _getDelegateConfig() {
6125    const config = {};
6126    for (const key in this._config) {
6127      if (this.constructor.Default[key] !== this._config[key]) {
6128        config[key] = this._config[key];
6129      }
6130    }
6131    config.selector = false;
6132    config.trigger = 'manual'; // In the future can be replaced with:
6133    // const keysWithDifferentValues = Object.entries(this._config).filter(entry => this.constructor.Default[entry[0]] !== this._config[entry[0]])
6134    // `Object.fromEntries(keysWithDifferentValues)`
6135
6136    return config;
6137  }
6138  _disposePopper() {
6139    if (this._popper) {
6140      this._popper.destroy();
6141      this._popper = null;
6142    }
6143  } // Static
6144
6145  static jQueryInterface(config) {
6146    return this.each(function () {
6147      const data = Tooltip.getOrCreateInstance(this, config);
6148      if (typeof config !== 'string') {
6149        return;
6150      }
6151      if (typeof data[config] === 'undefined') {
6152        throw new TypeError(`No method named "${config}"`);
6153      }
6154      data[config]();
6155    });
6156  }
6157}
6158/**
6159 * jQuery
6160 */
6161exports.Tooltip = Tooltip;
6162defineJQueryPlugin(Tooltip);
6163
6164/**
6165 * --------------------------------------------------------------------------
6166 * Bootstrap (v5.2.2): popover.js
6167 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
6168 * --------------------------------------------------------------------------
6169 */
6170/**
6171 * Constants
6172 */
6173
6174const NAME$3 = 'popover';
6175const SELECTOR_TITLE = '.popover-header';
6176const SELECTOR_CONTENT = '.popover-body';
6177const Default$2 = {
6178  ...Tooltip.Default,
6179  content: '',
6180  offset: [0, 8],
6181  placement: 'right',
6182  template: '<div class="popover" role="tooltip">' + '<div class="popover-arrow"></div>' + '<h3 class="popover-header"></h3>' + '<div class="popover-body"></div>' + '</div>',
6183  trigger: 'click'
6184};
6185const DefaultType$2 = {
6186  ...Tooltip.DefaultType,
6187  content: '(null|string|element|function)'
6188};
6189/**
6190 * Class definition
6191 */
6192
6193class Popover extends Tooltip {
6194  // Getters
6195  static get Default() {
6196    return Default$2;
6197  }
6198  static get DefaultType() {
6199    return DefaultType$2;
6200  }
6201  static get NAME() {
6202    return NAME$3;
6203  } // Overrides
6204
6205  _isWithContent() {
6206    return this._getTitle() || this._getContent();
6207  } // Private
6208
6209  _getContentForTemplate() {
6210    return {
6211      [SELECTOR_TITLE]: this._getTitle(),
6212      [SELECTOR_CONTENT]: this._getContent()
6213    };
6214  }
6215  _getContent() {
6216    return this._resolvePossibleFunction(this._config.content);
6217  } // Static
6218
6219  static jQueryInterface(config) {
6220    return this.each(function () {
6221      const data = Popover.getOrCreateInstance(this, config);
6222      if (typeof config !== 'string') {
6223        return;
6224      }
6225      if (typeof data[config] === 'undefined') {
6226        throw new TypeError(`No method named "${config}"`);
6227      }
6228      data[config]();
6229    });
6230  }
6231}
6232/**
6233 * jQuery
6234 */
6235exports.Popover = Popover;
6236defineJQueryPlugin(Popover);
6237
6238/**
6239 * --------------------------------------------------------------------------
6240 * Bootstrap (v5.2.2): scrollspy.js
6241 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
6242 * --------------------------------------------------------------------------
6243 */
6244/**
6245 * Constants
6246 */
6247
6248const NAME$2 = 'scrollspy';
6249const DATA_KEY$2 = 'bs.scrollspy';
6250const EVENT_KEY$2 = `.${DATA_KEY$2}`;
6251const DATA_API_KEY = '.data-api';
6252const EVENT_ACTIVATE = `activate${EVENT_KEY$2}`;
6253const EVENT_CLICK = `click${EVENT_KEY$2}`;
6254const EVENT_LOAD_DATA_API$1 = `load${EVENT_KEY$2}${DATA_API_KEY}`;
6255const CLASS_NAME_DROPDOWN_ITEM = 'dropdown-item';
6256const CLASS_NAME_ACTIVE$1 = 'active';
6257const SELECTOR_DATA_SPY = '[data-bs-spy="scroll"]';
6258const SELECTOR_TARGET_LINKS = '[href]';
6259const SELECTOR_NAV_LIST_GROUP = '.nav, .list-group';
6260const SELECTOR_NAV_LINKS = '.nav-link';
6261const SELECTOR_NAV_ITEMS = '.nav-item';
6262const SELECTOR_LIST_ITEMS = '.list-group-item';
6263const SELECTOR_LINK_ITEMS = `${SELECTOR_NAV_LINKS}, ${SELECTOR_NAV_ITEMS} > ${SELECTOR_NAV_LINKS}, ${SELECTOR_LIST_ITEMS}`;
6264const SELECTOR_DROPDOWN = '.dropdown';
6265const SELECTOR_DROPDOWN_TOGGLE$1 = '.dropdown-toggle';
6266const Default$1 = {
6267  offset: null,
6268  // TODO: v6 @deprecated, keep it for backwards compatibility reasons
6269  rootMargin: '0px 0px -25%',
6270  smoothScroll: false,
6271  target: null,
6272  threshold: [0.1, 0.5, 1]
6273};
6274const DefaultType$1 = {
6275  offset: '(number|null)',
6276  // TODO v6 @deprecated, keep it for backwards compatibility reasons
6277  rootMargin: 'string',
6278  smoothScroll: 'boolean',
6279  target: 'element',
6280  threshold: 'array'
6281};
6282/**
6283 * Class definition
6284 */
6285
6286class ScrollSpy extends BaseComponent {
6287  constructor(element, config) {
6288    super(element, config); // this._element is the observablesContainer and config.target the menu links wrapper
6289
6290    this._targetLinks = new Map();
6291    this._observableSections = new Map();
6292    this._rootElement = getComputedStyle(this._element).overflowY === 'visible' ? null : this._element;
6293    this._activeTarget = null;
6294    this._observer = null;
6295    this._previousScrollData = {
6296      visibleEntryTop: 0,
6297      parentScrollTop: 0
6298    };
6299    this.refresh(); // initialize
6300  } // Getters
6301
6302  static get Default() {
6303    return Default$1;
6304  }
6305  static get DefaultType() {
6306    return DefaultType$1;
6307  }
6308  static get NAME() {
6309    return NAME$2;
6310  } // Public
6311
6312  refresh() {
6313    this._initializeTargetsAndObservables();
6314    this._maybeEnableSmoothScroll();
6315    if (this._observer) {
6316      this._observer.disconnect();
6317    } else {
6318      this._observer = this._getNewObserver();
6319    }
6320    for (const section of this._observableSections.values()) {
6321      this._observer.observe(section);
6322    }
6323  }
6324  dispose() {
6325    this._observer.disconnect();
6326    super.dispose();
6327  } // Private
6328
6329  _configAfterMerge(config) {
6330    // TODO: on v6 target should be given explicitly & remove the {target: 'ss-target'} case
6331    config.target = getElement(config.target) || document.body; // TODO: v6 Only for backwards compatibility reasons. Use rootMargin only
6332
6333    config.rootMargin = config.offset ? `${config.offset}px 0px -30%` : config.rootMargin;
6334    if (typeof config.threshold === 'string') {
6335      config.threshold = config.threshold.split(',').map(value => Number.parseFloat(value));
6336    }
6337    return config;
6338  }
6339  _maybeEnableSmoothScroll() {
6340    if (!this._config.smoothScroll) {
6341      return;
6342    } // unregister any previous listeners
6343
6344    EventHandler.off(this._config.target, EVENT_CLICK);
6345    EventHandler.on(this._config.target, EVENT_CLICK, SELECTOR_TARGET_LINKS, event => {
6346      const observableSection = this._observableSections.get(event.target.hash);
6347      if (observableSection) {
6348        event.preventDefault();
6349        const root = this._rootElement || window;
6350        const height = observableSection.offsetTop - this._element.offsetTop;
6351        if (root.scrollTo) {
6352          root.scrollTo({
6353            top: height,
6354            behavior: 'smooth'
6355          });
6356          return;
6357        } // Chrome 60 doesn't support `scrollTo`
6358
6359        root.scrollTop = height;
6360      }
6361    });
6362  }
6363  _getNewObserver() {
6364    const options = {
6365      root: this._rootElement,
6366      threshold: this._config.threshold,
6367      rootMargin: this._config.rootMargin
6368    };
6369    return new IntersectionObserver(entries => this._observerCallback(entries), options);
6370  } // The logic of selection
6371
6372  _observerCallback(entries) {
6373    const targetElement = entry => this._targetLinks.get(`#${entry.target.id}`);
6374    const activate = entry => {
6375      this._previousScrollData.visibleEntryTop = entry.target.offsetTop;
6376      this._process(targetElement(entry));
6377    };
6378    const parentScrollTop = (this._rootElement || document.documentElement).scrollTop;
6379    const userScrollsDown = parentScrollTop >= this._previousScrollData.parentScrollTop;
6380    this._previousScrollData.parentScrollTop = parentScrollTop;
6381    for (const entry of entries) {
6382      if (!entry.isIntersecting) {
6383        this._activeTarget = null;
6384        this._clearActiveClass(targetElement(entry));
6385        continue;
6386      }
6387      const entryIsLowerThanPrevious = entry.target.offsetTop >= this._previousScrollData.visibleEntryTop; // if we are scrolling down, pick the bigger offsetTop
6388
6389      if (userScrollsDown && entryIsLowerThanPrevious) {
6390        activate(entry); // if parent isn't scrolled, let's keep the first visible item, breaking the iteration
6391
6392        if (!parentScrollTop) {
6393          return;
6394        }
6395        continue;
6396      } // if we are scrolling up, pick the smallest offsetTop
6397
6398      if (!userScrollsDown && !entryIsLowerThanPrevious) {
6399        activate(entry);
6400      }
6401    }
6402  }
6403  _initializeTargetsAndObservables() {
6404    this._targetLinks = new Map();
6405    this._observableSections = new Map();
6406    const targetLinks = SelectorEngine.find(SELECTOR_TARGET_LINKS, this._config.target);
6407    for (const anchor of targetLinks) {
6408      // ensure that the anchor has an id and is not disabled
6409      if (!anchor.hash || isDisabled(anchor)) {
6410        continue;
6411      }
6412      const observableSection = SelectorEngine.findOne(anchor.hash, this._element); // ensure that the observableSection exists & is visible
6413
6414      if (isVisible(observableSection)) {
6415        this._targetLinks.set(anchor.hash, anchor);
6416        this._observableSections.set(anchor.hash, observableSection);
6417      }
6418    }
6419  }
6420  _process(target) {
6421    if (this._activeTarget === target) {
6422      return;
6423    }
6424    this._clearActiveClass(this._config.target);
6425    this._activeTarget = target;
6426    target.classList.add(CLASS_NAME_ACTIVE$1);
6427    this._activateParents(target);
6428    EventHandler.trigger(this._element, EVENT_ACTIVATE, {
6429      relatedTarget: target
6430    });
6431  }
6432  _activateParents(target) {
6433    // Activate dropdown parents
6434    if (target.classList.contains(CLASS_NAME_DROPDOWN_ITEM)) {
6435      SelectorEngine.findOne(SELECTOR_DROPDOWN_TOGGLE$1, target.closest(SELECTOR_DROPDOWN)).classList.add(CLASS_NAME_ACTIVE$1);
6436      return;
6437    }
6438    for (const listGroup of SelectorEngine.parents(target, SELECTOR_NAV_LIST_GROUP)) {
6439      // Set triggered links parents as active
6440      // With both <ul> and <nav> markup a parent is the previous sibling of any nav ancestor
6441      for (const item of SelectorEngine.prev(listGroup, SELECTOR_LINK_ITEMS)) {
6442        item.classList.add(CLASS_NAME_ACTIVE$1);
6443      }
6444    }
6445  }
6446  _clearActiveClass(parent) {
6447    parent.classList.remove(CLASS_NAME_ACTIVE$1);
6448    const activeNodes = SelectorEngine.find(`${SELECTOR_TARGET_LINKS}.${CLASS_NAME_ACTIVE$1}`, parent);
6449    for (const node of activeNodes) {
6450      node.classList.remove(CLASS_NAME_ACTIVE$1);
6451    }
6452  } // Static
6453
6454  static jQueryInterface(config) {
6455    return this.each(function () {
6456      const data = ScrollSpy.getOrCreateInstance(this, config);
6457      if (typeof config !== 'string') {
6458        return;
6459      }
6460      if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {
6461        throw new TypeError(`No method named "${config}"`);
6462      }
6463      data[config]();
6464    });
6465  }
6466}
6467/**
6468 * Data API implementation
6469 */
6470exports.ScrollSpy = ScrollSpy;
6471EventHandler.on(window, EVENT_LOAD_DATA_API$1, () => {
6472  for (const spy of SelectorEngine.find(SELECTOR_DATA_SPY)) {
6473    ScrollSpy.getOrCreateInstance(spy);
6474  }
6475});
6476/**
6477 * jQuery
6478 */
6479
6480defineJQueryPlugin(ScrollSpy);
6481
6482/**
6483 * --------------------------------------------------------------------------
6484 * Bootstrap (v5.2.2): tab.js
6485 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
6486 * --------------------------------------------------------------------------
6487 */
6488/**
6489 * Constants
6490 */
6491
6492const NAME$1 = 'tab';
6493const DATA_KEY$1 = 'bs.tab';
6494const EVENT_KEY$1 = `.${DATA_KEY$1}`;
6495const EVENT_HIDE$1 = `hide${EVENT_KEY$1}`;
6496const EVENT_HIDDEN$1 = `hidden${EVENT_KEY$1}`;
6497const EVENT_SHOW$1 = `show${EVENT_KEY$1}`;
6498const EVENT_SHOWN$1 = `shown${EVENT_KEY$1}`;
6499const EVENT_CLICK_DATA_API = `click${EVENT_KEY$1}`;
6500const EVENT_KEYDOWN = `keydown${EVENT_KEY$1}`;
6501const EVENT_LOAD_DATA_API = `load${EVENT_KEY$1}`;
6502const ARROW_LEFT_KEY = 'ArrowLeft';
6503const ARROW_RIGHT_KEY = 'ArrowRight';
6504const ARROW_UP_KEY = 'ArrowUp';
6505const ARROW_DOWN_KEY = 'ArrowDown';
6506const CLASS_NAME_ACTIVE = 'active';
6507const CLASS_NAME_FADE$1 = 'fade';
6508const CLASS_NAME_SHOW$1 = 'show';
6509const CLASS_DROPDOWN = 'dropdown';
6510const SELECTOR_DROPDOWN_TOGGLE = '.dropdown-toggle';
6511const SELECTOR_DROPDOWN_MENU = '.dropdown-menu';
6512const NOT_SELECTOR_DROPDOWN_TOGGLE = ':not(.dropdown-toggle)';
6513const SELECTOR_TAB_PANEL = '.list-group, .nav, [role="tablist"]';
6514const SELECTOR_OUTER = '.nav-item, .list-group-item';
6515const SELECTOR_INNER = `.nav-link${NOT_SELECTOR_DROPDOWN_TOGGLE}, .list-group-item${NOT_SELECTOR_DROPDOWN_TOGGLE}, [role="tab"]${NOT_SELECTOR_DROPDOWN_TOGGLE}`;
6516const SELECTOR_DATA_TOGGLE = '[data-bs-toggle="tab"], [data-bs-toggle="pill"], [data-bs-toggle="list"]'; // todo:v6: could be only `tab`
6517
6518const SELECTOR_INNER_ELEM = `${SELECTOR_INNER}, ${SELECTOR_DATA_TOGGLE}`;
6519const SELECTOR_DATA_TOGGLE_ACTIVE = `.${CLASS_NAME_ACTIVE}[data-bs-toggle="tab"], .${CLASS_NAME_ACTIVE}[data-bs-toggle="pill"], .${CLASS_NAME_ACTIVE}[data-bs-toggle="list"]`;
6520/**
6521 * Class definition
6522 */
6523
6524class Tab extends BaseComponent {
6525  constructor(element) {
6526    super(element);
6527    this._parent = this._element.closest(SELECTOR_TAB_PANEL);
6528    if (!this._parent) {
6529      return; // todo: should Throw exception on v6
6530      // throw new TypeError(`${element.outerHTML} has not a valid parent ${SELECTOR_INNER_ELEM}`)
6531    } // Set up initial aria attributes
6532
6533    this._setInitialAttributes(this._parent, this._getChildren());
6534    EventHandler.on(this._element, EVENT_KEYDOWN, event =>
vendor: 4,244 bytes, lines 6534-6658
6534 this._keydown(event));
6535  } // Getters
6536
6537  static get NAME() {
6538    return NAME$1;
6539  } // Public
6540
6541  show() {
6542    // Shows this elem and deactivate the active sibling if exists
6543    const innerElem = this._element;
6544    if (this._elemIsActive(innerElem)) {
6545      return;
6546    } // Search for active tab on same parent to deactivate it
6547
6548    const active = this._getActiveElem();
6549    const hideEvent = active ? EventHandler.trigger(active, EVENT_HIDE$1, {
6550      relatedTarget: innerElem
6551    }) : null;
6552    const showEvent = EventHandler.trigger(innerElem, EVENT_SHOW$1, {
6553      relatedTarget: active
6554    });
6555    if (showEvent.defaultPrevented || hideEvent && hideEvent.defaultPrevented) {
6556      return;
6557    }
6558    this._deactivate(active, innerElem);
6559    this._activate(innerElem, active);
6560  } // Private
6561
6562  _activate(element, relatedElem) {
6563    if (!element) {
6564      return;
6565    }
6566    element.classList.add(CLASS_NAME_ACTIVE);
6567    this._activate(getElementFromSelector(element)); // Search and activate/show the proper section
6568
6569    const complete = () => {
6570      if (element.getAttribute('role') !== 'tab') {
6571        element.classList.add(CLASS_NAME_SHOW$1);
6572        return;
6573      }
6574      element.removeAttribute('tabindex');
6575      element.setAttribute('aria-selected', true);
6576      this._toggleDropDown(element, true);
6577      EventHandler.trigger(element, EVENT_SHOWN$1, {
6578        relatedTarget: relatedElem
6579      });
6580    };
6581    this._queueCallback(complete, element, element.classList.contains(CLASS_NAME_FADE$1));
6582  }
6583  _deactivate(element, relatedElem) {
6584    if (!element) {
6585      return;
6586    }
6587    element.classList.remove(CLASS_NAME_ACTIVE);
6588    element.blur();
6589    this._deactivate(getElementFromSelector(element)); // Search and deactivate the shown section too
6590
6591    const complete = () => {
6592      if (element.getAttribute('role') !== 'tab') {
6593        element.classList.remove(CLASS_NAME_SHOW$1);
6594        return;
6595      }
6596      element.setAttribute('aria-selected', false);
6597      element.setAttribute('tabindex', '-1');
6598      this._toggleDropDown(element, false);
6599      EventHandler.trigger(element, EVENT_HIDDEN$1, {
6600        relatedTarget: relatedElem
6601      });
6602    };
6603    this._queueCallback(complete, element, element.classList.contains(CLASS_NAME_FADE$1));
6604  }
6605  _keydown(event) {
6606    if (![ARROW_LEFT_KEY, ARROW_RIGHT_KEY, ARROW_UP_KEY, ARROW_DOWN_KEY].includes(event.key)) {
6607      return;
6608    }
6609    event.stopPropagation(); // stopPropagation/preventDefault both added to support up/down keys without scrolling the page
6610
6611    event.preventDefault();
6612    const isNext = [ARROW_RIGHT_KEY, ARROW_DOWN_KEY].includes(event.key);
6613    const nextActiveElement = getNextActiveElement(this._getChildren().filter(element => !isDisabled(element)), event.target, isNext, true);
6614    if (nextActiveElement) {
6615      nextActiveElement.focus({
6616        preventScroll: true
6617      });
6618      Tab.getOrCreateInstance(nextActiveElement).show();
6619    }
6620  }
6621  _getChildren() {
6622    // collection of inner elements
6623    return SelectorEngine.find(SELECTOR_INNER_ELEM, this._parent);
6624  }
6625  _getActiveElem() {
6626    return this._getChildren().find(child => this._elemIsActive(child)) || null;
6627  }
6628  _setInitialAttributes(parent, children) {
6629    this._setAttributeIfNotExists(parent, 'role', 'tablist');
6630    for (const child of children) {
6631      this._setInitialAttributesOnChild(child);
6632    }
6633  }
6634  _setInitialAttributesOnChild(child) {
6635    child = this._getInnerElement(child);
6636    const isActive = this._elemIsActive(child);
6637    const outerElem = this._getOuterElement(child);
6638    child.setAttribute('aria-selected', isActive);
6639    if (outerElem !== child) {
6640      this._setAttributeIfNotExists(outerElem, 'role', 'presentation');
6641    }
6642    if (!isActive) {
6643      child.setAttribute('tabindex', '-1');
6644    }
6645    this._setAttributeIfNotExists(child, 'role', 'tab'); // set attributes to the related panel too
6646
6647    this._setInitialAttributesOnTargetPanel(child);
6648  }
6649  _setInitialAttributesOnTargetPanel(child) {
6650    const target = getElementFromSelector(child);
6651    if (!target) {
6652      return;
6653    }
6654    this._setAttributeIfNotExists(target, 'role', 'tabpanel');
6655    if (child.id) {
6656      this._setAttributeIfNotExists(target, 'aria-labelledby', `#${child.id}`);
6657    }
6658  }
vendor: 6,638 bytes, lines 6659-6890
6659  _toggleDropDown(element, open) {
6660    const outerElem = this._getOuterElement(element);
6661    if (!outerElem.classList.contains(CLASS_DROPDOWN)) {
6662      return;
6663    }
6664    const toggle = (selector, className) => {
6665      const element = SelectorEngine.findOne(selector, outerElem);
6666      if (element) {
6667        element.classList.toggle(className, open);
6668      }
6669    };
6670    toggle(SELECTOR_DROPDOWN_TOGGLE, CLASS_NAME_ACTIVE);
6671    toggle(SELECTOR_DROPDOWN_MENU, CLASS_NAME_SHOW$1);
6672    outerElem.setAttribute('aria-expanded', open);
6673  }
6674  _setAttributeIfNotExists(element, attribute, value) {
6675    if (!element.hasAttribute(attribute)) {
6676      element.setAttribute(attribute, value);
6677    }
6678  }
6679  _elemIsActive(elem) {
6680    return elem.classList.contains(CLASS_NAME_ACTIVE);
6681  } // Try to get the inner element (usually the .nav-link)
6682
6683  _getInnerElement(elem) {
6684    return elem.matches(SELECTOR_INNER_ELEM) ? elem : SelectorEngine.findOne(SELECTOR_INNER_ELEM, elem);
6685  } // Try to get the outer element (usually the .nav-item)
6686
6687  _getOuterElement(elem) {
6688    return elem.closest(SELECTOR_OUTER) || elem;
6689  } // Static
6690
6691  static jQueryInterface(config) {
6692    return this.each(function () {
6693      const data = Tab.getOrCreateInstance(this);
6694      if (typeof config !== 'string') {
6695        return;
6696      }
6697      if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {
6698        throw new TypeError(`No method named "${config}"`);
6699      }
6700      data[config]();
6701    });
6702  }
6703}
6704/**
6705 * Data API implementation
6706 */
6707exports.Tab = Tab;
6708EventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {
6709  if (['A', 'AREA'].includes(this.tagName)) {
6710    event.preventDefault();
6711  }
6712  if (isDisabled(this)) {
6713    return;
6714  }
6715  Tab.getOrCreateInstance(this).show();
6716});
6717/**
6718 * Initialize on focus
6719 */
6720
6721EventHandler.on(window, EVENT_LOAD_DATA_API, () => {
6722  for (const element of SelectorEngine.find(SELECTOR_DATA_TOGGLE_ACTIVE)) {
6723    Tab.getOrCreateInstance(element);
6724  }
6725});
6726/**
6727 * jQuery
6728 */
6729
6730defineJQueryPlugin(Tab);
6731
6732/**
6733 * --------------------------------------------------------------------------
6734 * Bootstrap (v5.2.2): toast.js
6735 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
6736 * --------------------------------------------------------------------------
6737 */
6738/**
6739 * Constants
6740 */
6741
6742const NAME = 'toast';
6743const DATA_KEY = 'bs.toast';
6744const EVENT_KEY = `.${DATA_KEY}`;
6745const EVENT_MOUSEOVER = `mouseover${EVENT_KEY}`;
6746const EVENT_MOUSEOUT = `mouseout${EVENT_KEY}`;
6747const EVENT_FOCUSIN = `focusin${EVENT_KEY}`;
6748const EVENT_FOCUSOUT = `focusout${EVENT_KEY}`;
6749const EVENT_HIDE = `hide${EVENT_KEY}`;
6750const EVENT_HIDDEN = `hidden${EVENT_KEY}`;
6751const EVENT_SHOW = `show${EVENT_KEY}`;
6752const EVENT_SHOWN = `shown${EVENT_KEY}`;
6753const CLASS_NAME_FADE = 'fade';
6754const CLASS_NAME_HIDE = 'hide'; // @deprecated - kept here only for backwards compatibility
6755
6756const CLASS_NAME_SHOW = 'show';
6757const CLASS_NAME_SHOWING = 'showing';
6758const DefaultType = {
6759  animation: 'boolean',
6760  autohide: 'boolean',
6761  delay: 'number'
6762};
6763const Default = {
6764  animation: true,
6765  autohide: true,
6766  delay: 5000
6767};
6768/**
6769 * Class definition
6770 */
6771
6772class Toast extends BaseComponent {
6773  constructor(element, config) {
6774    super(element, config);
6775    this._timeout = null;
6776    this._hasMouseInteraction = false;
6777    this._hasKeyboardInteraction = false;
6778    this._setListeners();
6779  } // Getters
6780
6781  static get Default() {
6782    return Default;
6783  }
6784  static get DefaultType() {
6785    return DefaultType;
6786  }
6787  static get NAME() {
6788    return NAME;
6789  } // Public
6790
6791  show() {
6792    const showEvent = EventHandler.trigger(this._element, EVENT_SHOW);
6793    if (showEvent.defaultPrevented) {
6794      return;
6795    }
6796    this._clearTimeout();
6797    if (this._config.animation) {
6798      this._element.classList.add(CLASS_NAME_FADE);
6799    }
6800    const complete = () => {
6801      this._element.classList.remove(CLASS_NAME_SHOWING);
6802      EventHandler.trigger(this._element, EVENT_SHOWN);
6803      this._maybeScheduleHide();
6804    };
6805    this._element.classList.remove(CLASS_NAME_HIDE); // @deprecated
6806
6807    reflow(this._element);
6808    this._element.classList.add(CLASS_NAME_SHOW, CLASS_NAME_SHOWING);
6809    this._queueCallback(complete, this._element, this._config.animation);
6810  }
6811  hide() {
6812    if (!this.isShown()) {
6813      return;
6814    }
6815    const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE);
6816    if (hideEvent.defaultPrevented) {
6817      return;
6818    }
6819    const complete = () => {
6820      this._element.classList.add(CLASS_NAME_HIDE); // @deprecated
6821
6822      this._element.classList.remove(CLASS_NAME_SHOWING, CLASS_NAME_SHOW);
6823      EventHandler.trigger(this._element, EVENT_HIDDEN);
6824    };
6825    this._element.classList.add(CLASS_NAME_SHOWING);
6826    this._queueCallback(complete, this._element, this._config.animation);
6827  }
6828  dispose() {
6829    this._clearTimeout();
6830    if (this.isShown()) {
6831      this._element.classList.remove(CLASS_NAME_SHOW);
6832    }
6833    super.dispose();
6834  }
6835  isShown() {
6836    return this._element.classList.contains(CLASS_NAME_SHOW);
6837  } // Private
6838
6839  _maybeScheduleHide() {
6840    if (!this._config.autohide) {
6841      return;
6842    }
6843    if (this._hasMouseInteraction || this._hasKeyboardInteraction) {
6844      return;
6845    }
6846    this._timeout = setTimeout(() => {
6847      this.hide();
6848    }, this._config.delay);
6849  }
6850  _onInteraction(event, isInteracting) {
6851    switch (event.type) {
6852      case 'mouseover':
6853      case 'mouseout':
6854        {
6855          this._hasMouseInteraction = isInteracting;
6856          break;
6857        }
6858      case 'focusin':
6859      case 'focusout':
6860        {
6861          this._hasKeyboardInteraction = isInteracting;
6862          break;
6863        }
6864    }
6865    if (isInteracting) {
6866      this._clearTimeout();
6867      return;
6868    }
6869    const nextElement = event.relatedTarget;
6870    if (this._element === nextElement || this._element.contains(nextElement)) {
6871      return;
6872    }
6873    this._maybeScheduleHide();
6874  }
6875  _setListeners() {
6876    EventHandler.on(this._element, EVENT_MOUSEOVER, event => this._onInteraction(event, true));
6877    EventHandler.on(this._element, EVENT_MOUSEOUT, event => this._onInteraction(event, false));
6878    EventHandler.on(this._element, EVENT_FOCUSIN, event => this._onInteraction(event, true));
6879    EventHandler.on(this._element, EVENT_FOCUSOUT, event => this._onInteraction(event, false));
6880  }
6881  _clearTimeout() {
6882    clearTimeout(this._timeout);
6883    this._timeout = null;
6884  } // Static
6885
6886  static jQueryInterface(config) {
6887    return this.each(function () {
6888      const data = Toast.getOrCreateInstance(this, config);
6889      if (typeof config === 'string') {
6890        if (typeof data[config] === 'undefined') {
vendor: 4,916 bytes, lines 6891-7072
6891          throw new TypeError(`No method named "${config}"`);
6892        }
6893        data[config](this);
6894      }
6895    });
6896  }
6897}
6898/**
6899 * Data API implementation
6900 */
6901exports.Toast = Toast;
6902enableDismissTrigger(Toast);
6903/**
6904 * jQuery
6905 */
6906
6907defineJQueryPlugin(Toast);
6908
6909},{"@popperjs/core":26}],62:[function(require,module,exports){
6910/*!
6911 * jQuery Cookie Plugin v1.4.1
6912 * https://github.com/carhartl/jquery-cookie
6913 *
6914 * Copyright 2013 Klaus Hartl
6915 * Released under the MIT license
6916 */
6917(function (factory) {
6918	if (typeof define === 'function' && define.amd) {
6919		// AMD
6920		define(['jquery'], factory);
6921	} else if (typeof exports === 'object') {
6922		// CommonJS
6923		factory(require('jquery'));
6924	} else {
6925		// Browser globals
6926		factory(jQuery);
6927	}
6928}(function ($) {
6929
6930	var pluses = /\+/g;
6931
6932	function encode(s) {
6933		return config.raw ? s : encodeURIComponent(s);
6934	}
6935
6936	function decode(s) {
6937		return config.raw ? s : decodeURIComponent(s);
6938	}
6939
6940	function stringifyCookieValue(value) {
6941		return encode(config.json ? JSON.stringify(value) : String(value));
6942	}
6943
6944	function parseCookieValue(s) {
6945		if (s.indexOf('"') === 0) {
6946			// This is a quoted cookie as according to RFC2068, unescape...
6947			s = s.slice(1, -1).replace(/\\"/g, '"').replace(/\\\\/g, '\\');
6948		}
6949
6950		try {
6951			// Replace server-side written pluses with spaces.
6952			// If we can't decode the cookie, ignore it, it's unusable.
6953			// If we can't parse the cookie, ignore it, it's unusable.
6954			s = decodeURIComponent(s.replace(pluses, ' '));
6955			return config.json ? JSON.parse(s) : s;
6956		} catch(e) {}
6957	}
6958
6959	function read(s, converter) {
6960		var value = config.raw ? s : parseCookieValue(s);
6961		return $.isFunction(converter) ? converter(value) : value;
6962	}
6963
6964	var config = $.cookie = function (key, value, options) {
6965
6966		// Write
6967
6968		if (value !== undefined && !$.isFunction(value)) {
6969			options = $.extend({}, config.defaults, options);
6970
6971			if (typeof options.expires === 'number') {
6972				var days = options.expires, t = options.expires = new Date();
6973				t.setTime(+t + days * 864e+5);
6974			}
6975
6976			return (document.cookie = [
6977				encode(key), '=', stringifyCookieValue(value),
6978				options.expires ? '; expires=' + options.expires.toUTCString() : '', // use expires attribute, max-age is not supported by IE
6979				options.path    ? '; path=' + options.path : '',
6980				options.domain  ? '; domain=' + options.domain : '',
6981				options.secure  ? '; secure' : ''
6982			].join(''));
6983		}
6984
6985		// Read
6986
6987		var result = key ? undefined : {};
6988
6989		// To prevent the for loop in the first place assign an empty array
6990		// in case there are no cookies at all. Also prevents odd result when
6991		// calling $.cookie().
6992		var cookies = document.cookie ? document.cookie.split('; ') : [];
6993
6994		for (var i = 0, l = cookies.length; i < l; i++) {
6995			var parts = cookies[i].split('=');
6996			var name = decode(parts.shift());
6997			var cookie = parts.join('=');
6998
6999			if (key && key === name) {
7000				// If second argument (value) is a function it's a converter...
7001				result = read(cookie, value);
7002				break;
7003			}
7004
7005			// Prevent storing a cookie that we couldn't decode.
7006			if (!key && (cookie = read(cookie)) !== undefined) {
7007				result[name] = cookie;
7008			}
7009		}
7010
7011		return result;
7012	};
7013
7014	config.defaults = {};
7015
7016	$.removeCookie = function (key, options) {
7017		if ($.cookie(key) === undefined) {
7018			return false;
7019		}
7020
7021		// Must not alter options, thus extending a fresh object...
7022		$.cookie(key, '', $.extend({}, options, { expires: -1 }));
7023		return !$.cookie(key);
7024	};
7025
7026}));
7027
7028},{"jquery":63}],63:[function(require,module,exports){
7029/*!
7030 * jQuery JavaScript Library v3.6.1
7031 * https://jquery.com/
7032 *
7033 * Includes Sizzle.js
7034 * https://sizzlejs.com/
7035 *
7036 * Copyright OpenJS Foundation and other contributors
7037 * Released under the MIT license
7038 * https://jquery.org/license
7039 *
7040 * Date: 2022-08-26T17:52Z
7041 */
7042( function( global, factory ) {
7043
7044	"use strict";
7045
7046	if ( typeof module === "object" && typeof module.exports === "object" ) {
7047
7048		// For CommonJS and CommonJS-like environments where a proper `window`
7049		// is present, execute the factory and get jQuery.
7050		// For environments that do not have a `window` with a `document`
7051		// (such as Node.js), expose a factory as module.exports.
7052		// This accentuates the need for the creation of a real `window`.
7053		// e.g. var jQuery = require("jquery")(window);
7054		// See ticket trac-14549 for more info.
7055		module.exports = global.document ?
7056			factory( global, true ) :
7057			function( w ) {
7058				if ( !w.document ) {
7059					throw new Error( "jQuery requires a window with a document" );
7060				}
7061				return factory( w );
7062			};
7063	} else {
7064		factory( global );
7065	}
7066
7067// Pass this if window is not defined yet
7068} )( typeof window !== "undefined" ? window : this, function( window, noGlobal ) {
7069
7070// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1
7071// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode
7072// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), str
vendor: 2,883 bytes, lines 7072-7182
7072ict mode should be common
7073// enough that all such attempts are guarded in a try block.
7074"use strict";
7075
7076var arr = [];
7077
7078var getProto = Object.getPrototypeOf;
7079
7080var slice = arr.slice;
7081
7082var flat = arr.flat ? function( array ) {
7083	return arr.flat.call( array );
7084} : function( array ) {
7085	return arr.concat.apply( [], array );
7086};
7087
7088
7089var push = arr.push;
7090
7091var indexOf = arr.indexOf;
7092
7093var class2type = {};
7094
7095var toString = class2type.toString;
7096
7097var hasOwn = class2type.hasOwnProperty;
7098
7099var fnToString = hasOwn.toString;
7100
7101var ObjectFunctionString = fnToString.call( Object );
7102
7103var support = {};
7104
7105var isFunction = function isFunction( obj ) {
7106
7107		// Support: Chrome <=57, Firefox <=52
7108		// In some browsers, typeof returns "function" for HTML <object> elements
7109		// (i.e., `typeof document.createElement( "object" ) === "function"`).
7110		// We don't want to classify *any* DOM node as a function.
7111		// Support: QtWeb <=3.8.5, WebKit <=534.34, wkhtmltopdf tool <=0.12.5
7112		// Plus for old WebKit, typeof returns "function" for HTML collections
7113		// (e.g., `typeof document.getElementsByTagName("div") === "function"`). (gh-4756)
7114		return typeof obj === "function" && typeof obj.nodeType !== "number" &&
7115			typeof obj.item !== "function";
7116	};
7117
7118
7119var isWindow = function isWindow( obj ) {
7120		return obj != null && obj === obj.window;
7121	};
7122
7123
7124var document = window.document;
7125
7126
7127
7128	var preservedScriptAttributes = {
7129		type: true,
7130		src: true,
7131		nonce: true,
7132		noModule: true
7133	};
7134
7135	function DOMEval( code, node, doc ) {
7136		doc = doc || document;
7137
7138		var i, val,
7139			script = doc.createElement( "script" );
7140
7141		script.text = code;
7142		if ( node ) {
7143			for ( i in preservedScriptAttributes ) {
7144
7145				// Support: Firefox 64+, Edge 18+
7146				// Some browsers don't support the "nonce" property on scripts.
7147				// On the other hand, just using `getAttribute` is not enough as
7148				// the `nonce` attribute is reset to an empty string whenever it
7149				// becomes browsing-context connected.
7150				// See https://github.com/whatwg/html/issues/2369
7151				// See https://html.spec.whatwg.org/#nonce-attributes
7152				// The `node.getAttribute` check was added for the sake of
7153				// `jQuery.globalEval` so that it can fake a nonce-containing node
7154				// via an object.
7155				val = node[ i ] || node.getAttribute && node.getAttribute( i );
7156				if ( val ) {
7157					script.setAttribute( i, val );
7158				}
7159			}
7160		}
7161		doc.head.appendChild( script ).parentNode.removeChild( script );
7162	}
7163
7164
7165function toType( obj ) {
7166	if ( obj == null ) {
7167		return obj + "";
7168	}
7169
7170	// Support: Android <=2.3 only (functionish RegExp)
7171	return typeof obj === "object" || typeof obj === "function" ?
7172		class2type[ toString.call( obj ) ] || "object" :
7173		typeof obj;
7174}
7175/* global Symbol */
7176// Defining this global in .eslintrc.json would create a danger of using the global
7177// unguarded in another place, it seems safer to define global only for this module
7178
7179
7180
7181var
7182	version = "3.6.1
vendor: 80,866 bytes, lines 7182-10114
7182",
7183
7184	// Define a local copy of jQuery
7185	jQuery = function( selector, context ) {
7186
7187		// The jQuery object is actually just the init constructor 'enhanced'
7188		// Need init if jQuery is called (just allow error to be thrown if not included)
7189		return new jQuery.fn.init( selector, context );
7190	};
7191
7192jQuery.fn = jQuery.prototype = {
7193
7194	// The current version of jQuery being used
7195	jquery: version,
7196
7197	constructor: jQuery,
7198
7199	// The default length of a jQuery object is 0
7200	length: 0,
7201
7202	toArray: function() {
7203		return slice.call( this );
7204	},
7205
7206	// Get the Nth element in the matched element set OR
7207	// Get the whole matched element set as a clean array
7208	get: function( num ) {
7209
7210		// Return all the elements in a clean array
7211		if ( num == null ) {
7212			return slice.call( this );
7213		}
7214
7215		// Return just the one element from the set
7216		return num < 0 ? this[ num + this.length ] : this[ num ];
7217	},
7218
7219	// Take an array of elements and push it onto the stack
7220	// (returning the new matched element set)
7221	pushStack: function( elems ) {
7222
7223		// Build a new jQuery matched element set
7224		var ret = jQuery.merge( this.constructor(), elems );
7225
7226		// Add the old object onto the stack (as a reference)
7227		ret.prevObject = this;
7228
7229		// Return the newly-formed element set
7230		return ret;
7231	},
7232
7233	// Execute a callback for every element in the matched set.
7234	each: function( callback ) {
7235		return jQuery.each( this, callback );
7236	},
7237
7238	map: function( callback ) {
7239		return this.pushStack( jQuery.map( this, function( elem, i ) {
7240			return callback.call( elem, i, elem );
7241		} ) );
7242	},
7243
7244	slice: function() {
7245		return this.pushStack( slice.apply( this, arguments ) );
7246	},
7247
7248	first: function() {
7249		return this.eq( 0 );
7250	},
7251
7252	last: function() {
7253		return this.eq( -1 );
7254	},
7255
7256	even: function() {
7257		return this.pushStack( jQuery.grep( this, function( _elem, i ) {
7258			return ( i + 1 ) % 2;
7259		} ) );
7260	},
7261
7262	odd: function() {
7263		return this.pushStack( jQuery.grep( this, function( _elem, i ) {
7264			return i % 2;
7265		} ) );
7266	},
7267
7268	eq: function( i ) {
7269		var len = this.length,
7270			j = +i + ( i < 0 ? len : 0 );
7271		return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] );
7272	},
7273
7274	end: function() {
7275		return this.prevObject || this.constructor();
7276	},
7277
7278	// For internal use only.
7279	// Behaves like an Array's method, not like a jQuery method.
7280	push: push,
7281	sort: arr.sort,
7282	splice: arr.splice
7283};
7284
7285jQuery.extend = jQuery.fn.extend = function() {
7286	var options, name, src, copy, copyIsArray, clone,
7287		target = arguments[ 0 ] || {},
7288		i = 1,
7289		length = arguments.length,
7290		deep = false;
7291
7292	// Handle a deep copy situation
7293	if ( typeof target === "boolean" ) {
7294		deep = target;
7295
7296		// Skip the boolean and the target
7297		target = arguments[ i ] || {};
7298		i++;
7299	}
7300
7301	// Handle case when target is a string or something (possible in deep copy)
7302	if ( typeof target !== "object" && !isFunction( target ) ) {
7303		target = {};
7304	}
7305
7306	// Extend jQuery itself if only one argument is passed
7307	if ( i === length ) {
7308		target = this;
7309		i--;
7310	}
7311
7312	for ( ; i < length; i++ ) {
7313
7314		// Only deal with non-null/undefined values
7315		if ( ( options = arguments[ i ] ) != null ) {
7316
7317			// Extend the base object
7318			for ( name in options ) {
7319				copy = options[ name ];
7320
7321				// Prevent Object.prototype pollution
7322				// Prevent never-ending loop
7323				if ( name === "__proto__" || target === copy ) {
7324					continue;
7325				}
7326
7327				// Recurse if we're merging plain objects or arrays
7328				if ( deep && copy && ( jQuery.isPlainObject( copy ) ||
7329					( copyIsArray = Array.isArray( copy ) ) ) ) {
7330					src = target[ name ];
7331
7332					// Ensure proper type for the source value
7333					if ( copyIsArray && !Array.isArray( src ) ) {
7334						clone = [];
7335					} else if ( !copyIsArray && !jQuery.isPlainObject( src ) ) {
7336						clone = {};
7337					} else {
7338						clone = src;
7339					}
7340					copyIsArray = false;
7341
7342					// Never move original objects, clone them
7343					target[ name ] = jQuery.extend( deep, clone, copy );
7344
7345				// Don't bring in undefined values
7346				} else if ( copy !== undefined ) {
7347					target[ name ] = copy;
7348				}
7349			}
7350		}
7351	}
7352
7353	// Return the modified object
7354	return target;
7355};
7356
7357jQuery.extend( {
7358
7359	// Unique for each copy of jQuery on the page
7360	expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ),
7361
7362	// Assume jQuery is ready without the ready module
7363	isReady: true,
7364
7365	error: function( msg ) {
7366		throw new Error( msg );
7367	},
7368
7369	noop: function() {},
7370
7371	isPlainObject: function( obj ) {
7372		var proto, Ctor;
7373
7374		// Detect obvious negatives
7375		// Use toString instead of jQuery.type to catch host objects
7376		if ( !obj || toString.call( obj ) !== "[object Object]" ) {
7377			return false;
7378		}
7379
7380		proto = getProto( obj );
7381
7382		// Objects with no prototype (e.g., `Object.create( null )`) are plain
7383		if ( !proto ) {
7384			return true;
7385		}
7386
7387		// Objects with prototype are plain iff they were constructed by a global Object function
7388		Ctor = hasOwn.call( proto, "constructor" ) && proto.constructor;
7389		return typeof Ctor === "function" && fnToString.call( Ctor ) === ObjectFunctionString;
7390	},
7391
7392	isEmptyObject: function( obj ) {
7393		var name;
7394
7395		for ( name in obj ) {
7396			return false;
7397		}
7398		return true;
7399	},
7400
7401	// Evaluates a script in a provided context; falls back to the global one
7402	// if not specified.
7403	globalEval: function( code, options, doc ) {
7404		DOMEval( code, { nonce: options && options.nonce }, doc );
7405	},
7406
7407	each: function( obj, callback ) {
7408		var length, i = 0;
7409
7410		if ( isArrayLike( obj ) ) {
7411			length = obj.length;
7412			for ( ; i < length; i++ ) {
7413				if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
7414					break;
7415				}
7416			}
7417		} else {
7418			for ( i in obj ) {
7419				if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
7420					break;
7421				}
7422			}
7423		}
7424
7425		return obj;
7426	},
7427
7428	// results is for internal usage only
7429	makeArray: function( arr, results ) {
7430		var ret = results || [];
7431
7432		if ( arr != null ) {
7433			if ( isArrayLike( Object( arr ) ) ) {
7434				jQuery.merge( ret,
7435					typeof arr === "string" ?
7436						[ arr ] : arr
7437				);
7438			} else {
7439				push.call( ret, arr );
7440			}
7441		}
7442
7443		return ret;
7444	},
7445
7446	inArray: function( elem, arr, i ) {
7447		return arr == null ? -1 : indexOf.call( arr, elem, i );
7448	},
7449
7450	// Support: Android <=4.0 only, PhantomJS 1 only
7451	// push.apply(_, arraylike) throws on ancient WebKit
7452	merge: function( first, second ) {
7453		var len = +second.length,
7454			j = 0,
7455			i = first.length;
7456
7457		for ( ; j < len; j++ ) {
7458			first[ i++ ] = second[ j ];
7459		}
7460
7461		first.length = i;
7462
7463		return first;
7464	},
7465
7466	grep: function( elems, callback, invert ) {
7467		var callbackInverse,
7468			matches = [],
7469			i = 0,
7470			length = elems.length,
7471			callbackExpect = !invert;
7472
7473		// Go through the array, only saving the items
7474		// that pass the validator function
7475		for ( ; i < length; i++ ) {
7476			callbackInverse = !callback( elems[ i ], i );
7477			if ( callbackInverse !== callbackExpect ) {
7478				matches.push( elems[ i ] );
7479			}
7480		}
7481
7482		return matches;
7483	},
7484
7485	// arg is for internal usage only
7486	map: function( elems, callback, arg ) {
7487		var length, value,
7488			i = 0,
7489			ret = [];
7490
7491		// Go through the array, translating each of the items to their new values
7492		if ( isArrayLike( elems ) ) {
7493			length = elems.length;
7494			for ( ; i < length; i++ ) {
7495				value = callback( elems[ i ], i, arg );
7496
7497				if ( value != null ) {
7498					ret.push( value );
7499				}
7500			}
7501
7502		// Go through every key on the object,
7503		} else {
7504			for ( i in elems ) {
7505				value = callback( elems[ i ], i, arg );
7506
7507				if ( value != null ) {
7508					ret.push( value );
7509				}
7510			}
7511		}
7512
7513		// Flatten any nested arrays
7514		return flat( ret );
7515	},
7516
7517	// A global GUID counter for objects
7518	guid: 1,
7519
7520	// jQuery.support is not used in Core but other projects attach their
7521	// properties to it so it needs to exist.
7522	support: support
7523} );
7524
7525if ( typeof Symbol === "function" ) {
7526	jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ];
7527}
7528
7529// Populate the class2type map
7530jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ),
7531	function( _i, name ) {
7532		class2type[ "[object " + name + "]" ] = name.toLowerCase();
7533	} );
7534
7535function isArrayLike( obj ) {
7536
7537	// Support: real iOS 8.2 only (not reproducible in simulator)
7538	// `in` check used to prevent JIT error (gh-2145)
7539	// hasOwn isn't used here due to false negatives
7540	// regarding Nodelist length in IE
7541	var length = !!obj && "length" in obj && obj.length,
7542		type = toType( obj );
7543
7544	if ( isFunction( obj ) || isWindow( obj ) ) {
7545		return false;
7546	}
7547
7548	return type === "array" || length === 0 ||
7549		typeof length === "number" && length > 0 && ( length - 1 ) in obj;
7550}
7551var Sizzle =
7552/*!
7553 * Sizzle CSS Selector Engine v2.3.6
7554 * https://sizzlejs.com/
7555 *
7556 * Copyright JS Foundation and other contributors
7557 * Released under the MIT license
7558 * https://js.foundation/
7559 *
7560 * Date: 2021-02-16
7561 */
7562( function( window ) {
7563var i,
7564	support,
7565	Expr,
7566	getText,
7567	isXML,
7568	tokenize,
7569	compile,
7570	select,
7571	outermostContext,
7572	sortInput,
7573	hasDuplicate,
7574
7575	// Local document vars
7576	setDocument,
7577	document,
7578	docElem,
7579	documentIsHTML,
7580	rbuggyQSA,
7581	rbuggyMatches,
7582	matches,
7583	contains,
7584
7585	// Instance-specific data
7586	expando = "sizzle" + 1 * new Date(),
7587	preferredDoc = window.document,
7588	dirruns = 0,
7589	done = 0,
7590	classCache = createCache(),
7591	tokenCache = createCache(),
7592	compilerCache = createCache(),
7593	nonnativeSelectorCache = createCache(),
7594	sortOrder = function( a, b ) {
7595		if ( a === b ) {
7596			hasDuplicate = true;
7597		}
7598		return 0;
7599	},
7600
7601	// Instance methods
7602	hasOwn = ( {} ).hasOwnProperty,
7603	arr = [],
7604	pop = arr.pop,
7605	pushNative = arr.push,
7606	push = arr.push,
7607	slice = arr.slice,
7608
7609	// Use a stripped-down indexOf as it's faster than native
7610	// https://jsperf.com/thor-indexof-vs-for/5
7611	indexOf = function( list, elem ) {
7612		var i = 0,
7613			len = list.length;
7614		for ( ; i < len; i++ ) {
7615			if ( list[ i ] === elem ) {
7616				return i;
7617			}
7618		}
7619		return -1;
7620	},
7621
7622	booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|" +
7623		"ismap|loop|multiple|open|readonly|required|scoped",
7624
7625	// Regular expressions
7626
7627	// http://www.w3.org/TR/css3-selectors/#whitespace
7628	whitespace = "[\\x20\\t\\r\\n\\f]",
7629
7630	// https://www.w3.org/TR/css-syntax-3/#ident-token-diagram
7631	identifier = "(?:\\\\[\\da-fA-F]{1,6}" + whitespace +
7632		"?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+",
7633
7634	// Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors
7635	attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace +
7636
7637		// Operator (capture 2)
7638		"*([*^$|!~]?=)" + whitespace +
7639
7640		// "Attribute values must be CSS identifiers [capture 5]
7641		// or strings [capture 3 or capture 4]"
7642		"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" +
7643		whitespace + "*\\]",
7644
7645	pseudos = ":(" + identifier + ")(?:\\((" +
7646
7647		// To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:
7648		// 1. quoted (capture 3; capture 4 or capture 5)
7649		"('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" +
7650
7651		// 2. simple (capture 6)
7652		"((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" +
7653
7654		// 3. anything else (capture 2)
7655		".*" +
7656		")\\)|)",
7657
7658	// Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter
7659	rwhitespace = new RegExp( whitespace + "+", "g" ),
7660	rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" +
7661		whitespace + "+$", "g" ),
7662
7663	rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ),
7664	rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace +
7665		"*" ),
7666	rdescend = new RegExp( whitespace + "|>" ),
7667
7668	rpseudo = new RegExp( pseudos ),
7669	ridentifier = new RegExp( "^" + identifier + "$" ),
7670
7671	matchExpr = {
7672		"ID": new RegExp( "^#(" + identifier + ")" ),
7673		"CLASS": new RegExp( "^\\.(" + identifier + ")" ),
7674		"TAG": new RegExp( "^(" + identifier + "|[*])" ),
7675		"ATTR": new RegExp( "^" + attributes ),
7676		"PSEUDO": new RegExp( "^" + pseudos ),
7677		"CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" +
7678			whitespace + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" +
7679			whitespace + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ),
7680		"bool": new RegExp( "^(?:" + booleans + ")$", "i" ),
7681
7682		// For use in libraries implementing .is()
7683		// We use this for POS matching in `select`
7684		"needsContext": new RegExp( "^" + whitespace +
7685			"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + whitespace +
7686			"*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" )
7687	},
7688
7689	rhtml = /HTML$/i,
7690	rinputs = /^(?:input|select|textarea|button)$/i,
7691	rheader = /^h\d$/i,
7692
7693	rnative = /^[^{]+\{\s*\[native \w/,
7694
7695	// Easily-parseable/retrievable ID or TAG or CLASS selectors
7696	rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,
7697
7698	rsibling = /[+~]/,
7699
7700	// CSS escapes
7701	// http://www.w3.org/TR/CSS21/syndata.html#escaped-characters
7702	runescape = new RegExp( "\\\\[\\da-fA-F]{1,6}" + whitespace + "?|\\\\([^\\r\\n\\f])", "g" ),
7703	funescape = function( escape, nonHex ) {
7704		var high = "0x" + escape.slice( 1 ) - 0x10000;
7705
7706		return nonHex ?
7707
7708			// Strip the backslash prefix from a non-hex escape sequence
7709			nonHex :
7710
7711			// Replace a hexadecimal escape sequence with the encoded Unicode code point
7712			// Support: IE <=11+
7713			// For values outside the Basic Multilingual Plane (BMP), manually construct a
7714			// surrogate pair
7715			high < 0 ?
7716				String.fromCharCode( high + 0x10000 ) :
7717				String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );
7718	},
7719
7720	// CSS string/identifier serialization
7721	// https://drafts.csswg.org/cssom/#common-serializing-idioms
7722	rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,
7723	fcssescape = function( ch, asCodePoint ) {
7724		if ( asCodePoint ) {
7725
7726			// U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER
7727			if ( ch === "\0" ) {
7728				return "\uFFFD";
7729			}
7730
7731			// Control characters and (dependent upon position) numbers get escaped as code points
7732			return ch.slice( 0, -1 ) + "\\" +
7733				ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " ";
7734		}
7735
7736		// Other potentially-special ASCII characters get backslash-escaped
7737		return "\\" + ch;
7738	},
7739
7740	// Used for iframes
7741	// See setDocument()
7742	// Removing the function wrapper causes a "Permission Denied"
7743	// error in IE
7744	unloadHandler = function() {
7745		setDocument();
7746	},
7747
7748	inDisabledFieldset = addCombinator(
7749		function( elem ) {
7750			return elem.disabled === true && elem.nodeName.toLowerCase() === "fieldset";
7751		},
7752		{ dir: "parentNode", next: "legend" }
7753	);
7754
7755// Optimize for push.apply( _, NodeList )
7756try {
7757	push.apply(
7758		( arr = slice.call( preferredDoc.childNodes ) ),
7759		preferredDoc.childNodes
7760	);
7761
7762	// Support: Android<4.0
7763	// Detect silently failing push.apply
7764	// eslint-disable-next-line no-unused-expressions
7765	arr[ preferredDoc.childNodes.length ].nodeType;
7766} catch ( e ) {
7767	push = { apply: arr.length ?
7768
7769		// Leverage slice if possible
7770		function( target, els ) {
7771			pushNative.apply( target, slice.call( els ) );
7772		} :
7773
7774		// Support: IE<9
7775		// Otherwise append directly
7776		function( target, els ) {
7777			var j = target.length,
7778				i = 0;
7779
7780			// Can't trust NodeList.length
7781			while ( ( target[ j++ ] = els[ i++ ] ) ) {}
7782			target.length = j - 1;
7783		}
7784	};
7785}
7786
7787function Sizzle( selector, context, results, seed ) {
7788	var m, i, elem, nid, match, groups, newSelector,
7789		newContext = context && context.ownerDocument,
7790
7791		// nodeType defaults to 9, since context defaults to document
7792		nodeType = context ? context.nodeType : 9;
7793
7794	results = results || [];
7795
7796	// Return early from calls with invalid selector or context
7797	if ( typeof selector !== "string" || !selector ||
7798		nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) {
7799
7800		return results;
7801	}
7802
7803	// Try to shortcut find operations (as opposed to filters) in HTML documents
7804	if ( !seed ) {
7805		setDocument( context );
7806		context = context || document;
7807
7808		if ( documentIsHTML ) {
7809
7810			// If the selector is sufficiently simple, try using a "get*By*" DOM method
7811			// (excepting DocumentFragment context, where the methods don't exist)
7812			if ( nodeType !== 11 && ( match = rquickExpr.exec( selector ) ) ) {
7813
7814				// ID selector
7815				if ( ( m = match[ 1 ] ) ) {
7816
7817					// Document context
7818					if ( nodeType === 9 ) {
7819						if ( ( elem = context.getElementById( m ) ) ) {
7820
7821							// Support: IE, Opera, Webkit
7822							// TODO: identify versions
7823							// getElementById can match elements by name instead of ID
7824							if ( elem.id === m ) {
7825								results.push( elem );
7826								return results;
7827							}
7828						} else {
7829							return results;
7830						}
7831
7832					// Element context
7833					} else {
7834
7835						// Support: IE, Opera, Webkit
7836						// TODO: identify versions
7837						// getElementById can match elements by name instead of ID
7838						if ( newContext && ( elem = newContext.getElementById( m ) ) &&
7839							contains( context, elem ) &&
7840							elem.id === m ) {
7841
7842							results.push( elem );
7843							return results;
7844						}
7845					}
7846
7847				// Type selector
7848				} else if ( match[ 2 ] ) {
7849					push.apply( results, context.getElementsByTagName( selector ) );
7850					return results;
7851
7852				// Class selector
7853				} else if ( ( m = match[ 3 ] ) && support.getElementsByClassName &&
7854					context.getElementsByClassName ) {
7855
7856					push.apply( results, context.getElementsByClassName( m ) );
7857					return results;
7858				}
7859			}
7860
7861			// Take advantage of querySelectorAll
7862			if ( support.qsa &&
7863				!nonnativeSelectorCache[ selector + " " ] &&
7864				( !rbuggyQSA || !rbuggyQSA.test( selector ) ) &&
7865
7866				// Support: IE 8 only
7867				// Exclude object elements
7868				( nodeType !== 1 || context.nodeName.toLowerCase() !== "object" ) ) {
7869
7870				newSelector = selector;
7871				newContext = context;
7872
7873				// qSA considers elements outside a scoping root when evaluating child or
7874				// descendant combinators, which is not what we want.
7875				// In such cases, we work around the behavior by prefixing every selector in the
7876				// list with an ID selector referencing the scope context.
7877				// The technique has to be used as well when a leading combinator is used
7878				// as such selectors are not recognized by querySelectorAll.
7879				// Thanks to Andrew Dupont for this technique.
7880				if ( nodeType === 1 &&
7881					( rdescend.test( selector ) || rcombinators.test( selector ) ) ) {
7882
7883					// Expand context for sibling selectors
7884					newContext = rsibling.test( selector ) && testContext( context.parentNode ) ||
7885						context;
7886
7887					// We can use :scope instead of the ID hack if the browser
7888					// supports it & if we're not changing the context.
7889					if ( newContext !== context || !support.scope ) {
7890
7891						// Capture the context ID, setting it first if necessary
7892						if ( ( nid = context.getAttribute( "id" ) ) ) {
7893							nid = nid.replace( rcssescape, fcssescape );
7894						} else {
7895							context.setAttribute( "id", ( nid = expando ) );
7896						}
7897					}
7898
7899					// Prefix every selector in the list
7900					groups = tokenize( selector );
7901					i = groups.length;
7902					while ( i-- ) {
7903						groups[ i ] = ( nid ? "#" + nid : ":scope" ) + " " +
7904							toSelector( groups[ i ] );
7905					}
7906					newSelector = groups.join( "," );
7907				}
7908
7909				try {
7910					push.apply( results,
7911						newContext.querySelectorAll( newSelector )
7912					);
7913					return results;
7914				} catch ( qsaError ) {
7915					nonnativeSelectorCache( selector, true );
7916				} finally {
7917					if ( nid === expando ) {
7918						context.removeAttribute( "id" );
7919					}
7920				}
7921			}
7922		}
7923	}
7924
7925	// All others
7926	return select( selector.replace( rtrim, "$1" ), context, results, seed );
7927}
7928
7929/**
7930 * Create key-value caches of limited size
7931 * @returns {function(string, object)} Returns the Object data after storing it on itself with
7932 *	property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)
7933 *	deleting the oldest entry
7934 */
7935function createCache() {
7936	var keys = [];
7937
7938	function cache( key, value ) {
7939
7940		// Use (key + " ") to avoid collision with native prototype properties (see Issue #157)
7941		if ( keys.push( key + " " ) > Expr.cacheLength ) {
7942
7943			// Only keep the most recent entries
7944			delete cache[ keys.shift() ];
7945		}
7946		return ( cache[ key + " " ] = value );
7947	}
7948	return cache;
7949}
7950
7951/**
7952 * Mark a function for special use by Sizzle
7953 * @param {Function} fn The function to mark
7954 */
7955function markFunction( fn ) {
7956	fn[ expando ] = true;
7957	return fn;
7958}
7959
7960/**
7961 * Support testing using an element
7962 * @param {Function} fn Passed the created element and returns a boolean result
7963 */
7964function assert( fn ) {
7965	var el = document.createElement( "fieldset" );
7966
7967	try {
7968		return !!fn( el );
7969	} catch ( e ) {
7970		return false;
7971	} finally {
7972
7973		// Remove from its parent by default
7974		if ( el.parentNode ) {
7975			el.parentNode.removeChild( el );
7976		}
7977
7978		// release memory in IE
7979		el = null;
7980	}
7981}
7982
7983/**
7984 * Adds the same handler for all of the specified attrs
7985 * @param {String} attrs Pipe-separated list of attributes
7986 * @param {Function} handler The method that will be applied
7987 */
7988function addHandle( attrs, handler ) {
7989	var arr = attrs.split( "|" ),
7990		i = arr.length;
7991
7992	while ( i-- ) {
7993		Expr.attrHandle[ arr[ i ] ] = handler;
7994	}
7995}
7996
7997/**
7998 * Checks document order of two siblings
7999 * @param {Element} a
8000 * @param {Element} b
8001 * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b
8002 */
8003function siblingCheck( a, b ) {
8004	var cur = b && a,
8005		diff = cur && a.nodeType === 1 && b.nodeType === 1 &&
8006			a.sourceIndex - b.sourceIndex;
8007
8008	// Use IE sourceIndex if available on both nodes
8009	if ( diff ) {
8010		return diff;
8011	}
8012
8013	// Check if b follows a
8014	if ( cur ) {
8015		while ( ( cur = cur.nextSibling ) ) {
8016			if ( cur === b ) {
8017				return -1;
8018			}
8019		}
8020	}
8021
8022	return a ? 1 : -1;
8023}
8024
8025/**
8026 * Returns a function to use in pseudos for input types
8027 * @param {String} type
8028 */
8029function createInputPseudo( type ) {
8030	return function( elem ) {
8031		var name = elem.nodeName.toLowerCase();
8032		return name === "input" && elem.type === type;
8033	};
8034}
8035
8036/**
8037 * Returns a function to use in pseudos for buttons
8038 * @param {String} type
8039 */
8040function createButtonPseudo( type ) {
8041	return function( elem ) {
8042		var name = elem.nodeName.toLowerCase();
8043		return ( name === "input" || name === "button" ) && elem.type === type;
8044	};
8045}
8046
8047/**
8048 * Returns a function to use in pseudos for :enabled/:disabled
8049 * @param {Boolean} disabled true for :disabled; false for :enabled
8050 */
8051function createDisabledPseudo( disabled ) {
8052
8053	// Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable
8054	return function( elem ) {
8055
8056		// Only certain elements can match :enabled or :disabled
8057		// https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled
8058		// https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled
8059		if ( "form" in elem ) {
8060
8061			// Check for inherited disabledness on relevant non-disabled elements:
8062			// * listed form-associated elements in a disabled fieldset
8063			//   https://html.spec.whatwg.org/multipage/forms.html#category-listed
8064			//   https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled
8065			// * option elements in a disabled optgroup
8066			//   https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled
8067			// All such elements have a "form" property.
8068			if ( elem.parentNode && elem.disabled === false ) {
8069
8070				// Option elements defer to a parent optgroup if present
8071				if ( "label" in elem ) {
8072					if ( "label" in elem.parentNode ) {
8073						return elem.parentNode.disabled === disabled;
8074					} else {
8075						return elem.disabled === disabled;
8076					}
8077				}
8078
8079				// Support: IE 6 - 11
8080				// Use the isDisabled shortcut property to check for disabled fieldset ancestors
8081				return elem.isDisabled === disabled ||
8082
8083					// Where there is no isDisabled, check manually
8084					/* jshint -W018 */
8085					elem.isDisabled !== !disabled &&
8086					inDisabledFieldset( elem ) === disabled;
8087			}
8088
8089			return elem.disabled === disabled;
8090
8091		// Try to winnow out elements that can't be disabled before trusting the disabled property.
8092		// Some victims get caught in our net (label, legend, menu, track), but it shouldn't
8093		// even exist on them, let alone have a boolean value.
8094		} else if ( "label" in elem ) {
8095			return elem.disabled === disabled;
8096		}
8097
8098		// Remaining elements are neither :enabled nor :disabled
8099		return false;
8100	};
8101}
8102
8103/**
8104 * Returns a function to use in pseudos for positionals
8105 * @param {Function} fn
8106 */
8107function createPositionalPseudo( fn ) {
8108	return markFunction( function( argument ) {
8109		argument = +argument;
8110		return markFunction( function( seed, matches ) {
8111			var j,
8112				matchIndexes = fn( [], seed.length, argument ),
8113				i = matchIndexes.length;
8114
8115			// Match elements found at the specified indexes
8116			while ( i-- ) {
8117				if ( seed[ ( j = matchIndexes[ i ] ) ] ) {
8118					seed[ j ] = !( matches[ j ] = seed[ j ] );
8119				}
8120			}
8121		} );
8122	} );
8123}
8124
8125/**
8126 * Checks a node for validity as a Sizzle context
8127 * @param {Element|Object=} context
8128 * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value
8129 */
8130function testContext( context ) {
8131	return context && typeof context.getElementsByTagName !== "undefined" && context;
8132}
8133
8134// Expose support vars for convenience
8135support = Sizzle.support = {};
8136
8137/**
8138 * Detects XML nodes
8139 * @param {Element|Object} elem An element or a document
8140 * @returns {Boolean} True iff elem is a non-HTML XML node
8141 */
8142isXML = Sizzle.isXML = function( elem ) {
8143	var namespace = elem && elem.namespaceURI,
8144		docElem = elem && ( elem.ownerDocument || elem ).documentElement;
8145
8146	// Support: IE <=8
8147	// Assume HTML when documentElement doesn't yet exist, such as inside loading iframes
8148	// https://bugs.jquery.com/ticket/4833
8149	return !rhtml.test( namespace || docElem && docElem.nodeName || "HTML" );
8150};
8151
8152/**
8153 * Sets document-related variables once based on the current document
8154 * @param {Element|Object} [doc] An element or document object to use to set the document
8155 * @returns {Object} Returns the current document
8156 */
8157setDocument = Sizzle.setDocument = function( node ) {
8158	var hasCompare, subWindow,
8159		doc = node ? node.ownerDocument || node : preferredDoc;
8160
8161	// Return early if doc is invalid or already selected
8162	// Support: IE 11+, Edge 17 - 18+
8163	// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
8164	// two documents; shallow comparisons work.
8165	// eslint-disable-next-line eqeqeq
8166	if ( doc == document || doc.nodeType !== 9 || !doc.documentElement ) {
8167		return document;
8168	}
8169
8170	// Update global variables
8171	document = doc;
8172	docElem = document.documentElement;
8173	documentIsHTML = !isXML( document );
8174
8175	// Support: IE 9 - 11+, Edge 12 - 18+
8176	// Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936)
8177	// Support: IE 11+, Edge 17 - 18+
8178	// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
8179	// two documents; shallow comparisons work.
8180	// eslint-disable-next-line eqeqeq
8181	if ( preferredDoc != document &&
8182		( subWindow = document.defaultView ) && subWindow.top !== subWindow ) {
8183
8184		// Support: IE 11, Edge
8185		if ( subWindow.addEventListener ) {
8186			subWindow.addEventListener( "unload", unloadHandler, false );
8187
8188		// Support: IE 9 - 10 only
8189		} else if ( subWindow.attachEvent ) {
8190			subWindow.attachEvent( "onunload", unloadHandler );
8191		}
8192	}
8193
8194	// Support: IE 8 - 11+, Edge 12 - 18+, Chrome <=16 - 25 only, Firefox <=3.6 - 31 only,
8195	// Safari 4 - 5 only, Opera <=11.6 - 12.x only
8196	// IE/Edge & older browsers don't support the :scope pseudo-class.
8197	// Support: Safari 6.0 only
8198	// Safari 6.0 supports :scope but it's an alias of :root there.
8199	support.scope = assert( function( el ) {
8200		docElem.appendChild( el ).appendChild( document.createElement( "div" ) );
8201		return typeof el.querySelectorAll !== "undefined" &&
8202			!el.querySelectorAll( ":scope fieldset div" ).length;
8203	} );
8204
8205	/* Attributes
8206	---------------------------------------------------------------------- */
8207
8208	// Support: IE<8
8209	// Verify that getAttribute really returns attributes and not properties
8210	// (excepting IE8 booleans)
8211	support.attributes = assert( function( el ) {
8212		el.className = "i";
8213		return !el.getAttribute( "className" );
8214	} );
8215
8216	/* getElement(s)By*
8217	---------------------------------------------------------------------- */
8218
8219	// Check if getElementsByTagName("*") returns only elements
8220	support.getElementsByTagName = assert( function( el ) {
8221		el.appendChild( document.createComment( "" ) );
8222		return !el.getElementsByTagName( "*" ).length;
8223	} );
8224
8225	// Support: IE<9
8226	support.getElementsByClassName = rnative.test( document.getElementsByClassName );
8227
8228	// Support: IE<10
8229	// Check if getElementById returns elements by name
8230	// The broken getElementById methods don't pick up programmatically-set names,
8231	// so use a roundabout getElementsByName test
8232	support.getById = assert( function( el ) {
8233		docElem.appendChild( el ).id = expando;
8234		return !document.getElementsByName || !document.getElementsByName( expando ).length;
8235	} );
8236
8237	// ID filter and find
8238	if ( support.getById ) {
8239		Expr.filter[ "ID" ] = function( id ) {
8240			var attrId = id.replace( runescape, funescape );
8241			return function( elem ) {
8242				return elem.getAttribute( "id" ) === attrId;
8243			};
8244		};
8245		Expr.find[ "ID" ] = function( id, context ) {
8246			if ( typeof context.getElementById !== "undefined" && documentIsHTML ) {
8247				var elem = context.getElementById( id );
8248				return elem ? [ elem ] : [];
8249			}
8250		};
8251	} else {
8252		Expr.filter[ "ID" ] =  function( id ) {
8253			var attrId = id.replace( runescape, funescape );
8254			return function( elem ) {
8255				var node = typeof elem.getAttributeNode !== "undefined" &&
8256					elem.getAttributeNode( "id" );
8257				return node && node.value === attrId;
8258			};
8259		};
8260
8261		// Support: IE 6 - 7 only
8262		// getElementById is not reliable as a find shortcut
8263		Expr.find[ "ID" ] = function( id, context ) {
8264			if ( typeof context.getElementById !== "undefined" && documentIsHTML ) {
8265				var node, i, elems,
8266					elem = context.getElementById( id );
8267
8268				if ( elem ) {
8269
8270					// Verify the id attribute
8271					node = elem.getAttributeNode( "id" );
8272					if ( node && node.value === id ) {
8273						return [ elem ];
8274					}
8275
8276					// Fall back on getElementsByName
8277					elems = context.getElementsByName( id );
8278					i = 0;
8279					while ( ( elem = elems[ i++ ] ) ) {
8280						node = elem.getAttributeNode( "id" );
8281						if ( node && node.value === id ) {
8282							return [ elem ];
8283						}
8284					}
8285				}
8286
8287				return [];
8288			}
8289		};
8290	}
8291
8292	// Tag
8293	Expr.find[ "TAG" ] = support.getElementsByTagName ?
8294		function( tag, context ) {
8295			if ( typeof context.getElementsByTagName !== "undefined" ) {
8296				return context.getElementsByTagName( tag );
8297
8298			// DocumentFragment nodes don't have gEBTN
8299			} else if ( support.qsa ) {
8300				return context.querySelectorAll( tag );
8301			}
8302		} :
8303
8304		function( tag, context ) {
8305			var elem,
8306				tmp = [],
8307				i = 0,
8308
8309				// By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too
8310				results = context.getElementsByTagName( tag );
8311
8312			// Filter out possible comments
8313			if ( tag === "*" ) {
8314				while ( ( elem = results[ i++ ] ) ) {
8315					if ( elem.nodeType === 1 ) {
8316						tmp.push( elem );
8317					}
8318				}
8319
8320				return tmp;
8321			}
8322			return results;
8323		};
8324
8325	// Class
8326	Expr.find[ "CLASS" ] = support.getElementsByClassName && function( className, context ) {
8327		if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) {
8328			return context.getElementsByClassName( className );
8329		}
8330	};
8331
8332	/* QSA/matchesSelector
8333	---------------------------------------------------------------------- */
8334
8335	// QSA and matchesSelector support
8336
8337	// matchesSelector(:active) reports false when true (IE9/Opera 11.5)
8338	rbuggyMatches = [];
8339
8340	// qSa(:focus) reports false when true (Chrome 21)
8341	// We allow this because of a bug in IE8/9 that throws an error
8342	// whenever `document.activeElement` is accessed on an iframe
8343	// So, we allow :focus to pass through QSA all the time to avoid the IE error
8344	// See https://bugs.jquery.com/ticket/13378
8345	rbuggyQSA = [];
8346
8347	if ( ( support.qsa = rnative.test( document.querySelectorAll ) ) ) {
8348
8349		// Build QSA regex
8350		// Regex strategy adopted from Diego Perini
8351		assert( function( el ) {
8352
8353			var input;
8354
8355			// Select is set to empty string on purpose
8356			// This is to test IE's treatment of not explicitly
8357			// setting a boolean content attribute,
8358			// since its presence should be enough
8359			// https://bugs.jquery.com/ticket/12359
8360			docElem.appendChild( el ).innerHTML = "<a id='" + expando + "'></a>" +
8361				"<select id='" + expando + "-\r\\' msallowcapture=''>" +
8362				"<option selected=''></option></select>";
8363
8364			// Support: IE8, Opera 11-12.16
8365			// Nothing should be selected when empty strings follow ^= or $= or *=
8366			// The test attribute must be unknown in Opera but "safe" for WinRT
8367			// https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section
8368			if ( el.querySelectorAll( "[msallowcapture^='']" ).length ) {
8369				rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" );
8370			}
8371
8372			// Support: IE8
8373			// Boolean attributes and "value" are not treated correctly
8374			if ( !el.querySelectorAll( "[selected]" ).length ) {
8375				rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" );
8376			}
8377
8378			// Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+
8379			if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) {
8380				rbuggyQSA.push( "~=" );
8381			}
8382
8383			// Support: IE 11+, Edge 15 - 18+
8384			// IE 11/Edge don't find elements on a `[name='']` query in some cases.
8385			// Adding a temporary attribute to the document before the selection works
8386			// around the issue.
8387			// Interestingly, IE 10 & older don't seem to have the issue.
8388			input = document.createElement( "input" );
8389			input.setAttribute( "name", "" );
8390			el.appendChild( input );
8391			if ( !el.querySelectorAll( "[name='']" ).length ) {
8392				rbuggyQSA.push( "\\[" + whitespace + "*name" + whitespace + "*=" +
8393					whitespace + "*(?:''|\"\")" );
8394			}
8395
8396			// Webkit/Opera - :checked should return selected option elements
8397			// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
8398			// IE8 throws error here and will not see later tests
8399			if ( !el.querySelectorAll( ":checked" ).length ) {
8400				rbuggyQSA.push( ":checked" );
8401			}
8402
8403			// Support: Safari 8+, iOS 8+
8404			// https://bugs.webkit.org/show_bug.cgi?id=136851
8405			// In-page `selector#id sibling-combinator selector` fails
8406			if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) {
8407				rbuggyQSA.push( ".#.+[+~]" );
8408			}
8409
8410			// Support: Firefox <=3.6 - 5 only
8411			// Old Firefox doesn't throw on a badly-escaped identifier.
8412			el.querySelectorAll( "\\\f" );
8413			rbuggyQSA.push( "[\\r\\n\\f]" );
8414		} );
8415
8416		assert( function( el ) {
8417			el.innerHTML = "<a href='' disabled='disabled'></a>" +
8418				"<select disabled='disabled'><option/></select>";
8419
8420			// Support: Windows 8 Native Apps
8421			// The type and name attributes are restricted during .innerHTML assignment
8422			var input = document.createElement( "input" );
8423			input.setAttribute( "type", "hidden" );
8424			el.appendChild( input ).setAttribute( "name", "D" );
8425
8426			// Support: IE8
8427			// Enforce case-sensitivity of name attribute
8428			if ( el.querySelectorAll( "[name=d]" ).length ) {
8429				rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" );
8430			}
8431
8432			// FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)
8433			// IE8 throws error here and will not see later tests
8434			if ( el.querySelectorAll( ":enabled" ).length !== 2 ) {
8435				rbuggyQSA.push( ":enabled", ":disabled" );
8436			}
8437
8438			// Support: IE9-11+
8439			// IE's :disabled selector does not pick up the children of disabled fieldsets
8440			docElem.appendChild( el ).disabled = true;
8441			if ( el.querySelectorAll( ":disabled" ).length !== 2 ) {
8442				rbuggyQSA.push( ":enabled", ":disabled" );
8443			}
8444
8445			// Support: Opera 10 - 11 only
8446			// Opera 10-11 does not throw on post-comma invalid pseudos
8447			el.querySelectorAll( "*,:x" );
8448			rbuggyQSA.push( ",.*:" );
8449		} );
8450	}
8451
8452	if ( ( support.matchesSelector = rnative.test( ( matches = docElem.matches ||
8453		docElem.webkitMatchesSelector ||
8454		docElem.mozMatchesSelector ||
8455		docElem.oMatchesSelector ||
8456		docElem.msMatchesSelector ) ) ) ) {
8457
8458		assert( function( el ) {
8459
8460			// Check to see if it's possible to do matchesSelector
8461			// on a disconnected node (IE 9)
8462			support.disconnectedMatch = matches.call( el, "*" );
8463
8464			// This should fail with an exception
8465			// Gecko does not error, returns false instead
8466			matches.call( el, "[s!='']:x" );
8467			rbuggyMatches.push( "!=", pseudos );
8468		} );
8469	}
8470
8471	rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join( "|" ) );
8472	rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join( "|" ) );
8473
8474	/* Contains
8475	---------------------------------------------------------------------- */
8476	hasCompare = rnative.test( docElem.compareDocumentPosition );
8477
8478	// Element contains another
8479	// Purposefully self-exclusive
8480	// As in, an element does not contain itself
8481	contains = hasCompare || rnative.test( docElem.contains ) ?
8482		function( a, b ) {
8483			var adown = a.nodeType === 9 ? a.documentElement : a,
8484				bup = b && b.parentNode;
8485			return a === bup || !!( bup && bup.nodeType === 1 && (
8486				adown.contains ?
8487					adown.contains( bup ) :
8488					a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16
8489			) );
8490		} :
8491		function( a, b ) {
8492			if ( b ) {
8493				while ( ( b = b.parentNode ) ) {
8494					if ( b === a ) {
8495						return true;
8496					}
8497				}
8498			}
8499			return false;
8500		};
8501
8502	/* Sorting
8503	---------------------------------------------------------------------- */
8504
8505	// Document order sorting
8506	sortOrder = hasCompare ?
8507	function( a, b ) {
8508
8509		// Flag for duplicate removal
8510		if ( a === b ) {
8511			hasDuplicate = true;
8512			return 0;
8513		}
8514
8515		// Sort on method existence if only one input has compareDocumentPosition
8516		var compare = !a.compareDocumentPosition - !b.compareDocumentPosition;
8517		if ( compare ) {
8518			return compare;
8519		}
8520
8521		// Calculate position if both inputs belong to the same document
8522		// Support: IE 11+, Edge 17 - 18+
8523		// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
8524		// two documents; shallow comparisons work.
8525		// eslint-disable-next-line eqeqeq
8526		compare = ( a.ownerDocument || a ) == ( b.ownerDocument || b ) ?
8527			a.compareDocumentPosition( b ) :
8528
8529			// Otherwise we know they are disconnected
8530			1;
8531
8532		// Disconnected nodes
8533		if ( compare & 1 ||
8534			( !support.sortDetached && b.compareDocumentPosition( a ) === compare ) ) {
8535
8536			// Choose the first element that is related to our preferred document
8537			// Support: IE 11+, Edge 17 - 18+
8538			// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
8539			// two documents; shallow comparisons work.
8540			// eslint-disable-next-line eqeqeq
8541			if ( a == document || a.ownerDocument == preferredDoc &&
8542				contains( preferredDoc, a ) ) {
8543				return -1;
8544			}
8545
8546			// Support: IE 11+, Edge 17 - 18+
8547			// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
8548			// two documents; shallow comparisons work.
8549			// eslint-disable-next-line eqeqeq
8550			if ( b == document || b.ownerDocument == preferredDoc &&
8551				contains( preferredDoc, b ) ) {
8552				return 1;
8553			}
8554
8555			// Maintain original order
8556			return sortInput ?
8557				( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
8558				0;
8559		}
8560
8561		return compare & 4 ? -1 : 1;
8562	} :
8563	function( a, b ) {
8564
8565		// Exit early if the nodes are identical
8566		if ( a === b ) {
8567			hasDuplicate = true;
8568			return 0;
8569		}
8570
8571		var cur,
8572			i = 0,
8573			aup = a.parentNode,
8574			bup = b.parentNode,
8575			ap = [ a ],
8576			bp = [ b ];
8577
8578		// Parentless nodes are either documents or disconnected
8579		if ( !aup || !bup ) {
8580
8581			// Support: IE 11+, Edge 17 - 18+
8582			// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
8583			// two documents; shallow comparisons work.
8584			/* eslint-disable eqeqeq */
8585			return a == document ? -1 :
8586				b == document ? 1 :
8587				/* eslint-enable eqeqeq */
8588				aup ? -1 :
8589				bup ? 1 :
8590				sortInput ?
8591				( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
8592				0;
8593
8594		// If the nodes are siblings, we can do a quick check
8595		} else if ( aup === bup ) {
8596			return siblingCheck( a, b );
8597		}
8598
8599		// Otherwise we need full lists of their ancestors for comparison
8600		cur = a;
8601		while ( ( cur = cur.parentNode ) ) {
8602			ap.unshift( cur );
8603		}
8604		cur = b;
8605		while ( ( cur = cur.parentNode ) ) {
8606			bp.unshift( cur );
8607		}
8608
8609		// Walk down the tree looking for a discrepancy
8610		while ( ap[ i ] === bp[ i ] ) {
8611			i++;
8612		}
8613
8614		return i ?
8615
8616			// Do a sibling check if the nodes have a common ancestor
8617			siblingCheck( ap[ i ], bp[ i ] ) :
8618
8619			// Otherwise nodes in our document sort first
8620			// Support: IE 11+, Edge 17 - 18+
8621			// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
8622			// two documents; shallow comparisons work.
8623			/* eslint-disable eqeqeq */
8624			ap[ i ] == preferredDoc ? -1 :
8625			bp[ i ] == preferredDoc ? 1 :
8626			/* eslint-enable eqeqeq */
8627			0;
8628	};
8629
8630	return document;
8631};
8632
8633Sizzle.matches = function( expr, elements ) {
8634	return Sizzle( expr, null, null, elements );
8635};
8636
8637Sizzle.matchesSelector = function( elem, expr ) {
8638	setDocument( elem );
8639
8640	if ( support.matchesSelector && documentIsHTML &&
8641		!nonnativeSelectorCache[ expr + " " ] &&
8642		( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&
8643		( !rbuggyQSA     || !rbuggyQSA.test( expr ) ) ) {
8644
8645		try {
8646			var ret = matches.call( elem, expr );
8647
8648			// IE 9's matchesSelector returns false on disconnected nodes
8649			if ( ret || support.disconnectedMatch ||
8650
8651				// As well, disconnected nodes are said to be in a document
8652				// fragment in IE 9
8653				elem.document && elem.document.nodeType !== 11 ) {
8654				return ret;
8655			}
8656		} catch ( e ) {
8657			nonnativeSelectorCache( expr, true );
8658		}
8659	}
8660
8661	return Sizzle( expr, document, null, [ elem ] ).length > 0;
8662};
8663
8664Sizzle.contains = function( context, elem ) {
8665
8666	// Set document vars if needed
8667	// Support: IE 11+, Edge 17 - 18+
8668	// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
8669	// two documents; shallow comparisons work.
8670	// eslint-disable-next-line eqeqeq
8671	if ( ( context.ownerDocument || context ) != document ) {
8672		setDocument( context );
8673	}
8674	return contains( context, elem );
8675};
8676
8677Sizzle.attr = function( elem, name ) {
8678
8679	// Set document vars if needed
8680	// Support: IE 11+, Edge 17 - 18+
8681	// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
8682	// two documents; shallow comparisons work.
8683	// eslint-disable-next-line eqeqeq
8684	if ( ( elem.ownerDocument || elem ) != document ) {
8685		setDocument( elem );
8686	}
8687
8688	var fn = Expr.attrHandle[ name.toLowerCase() ],
8689
8690		// Don't get fooled by Object.prototype properties (jQuery #13807)
8691		val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?
8692			fn( elem, name, !documentIsHTML ) :
8693			undefined;
8694
8695	return val !== undefined ?
8696		val :
8697		support.attributes || !documentIsHTML ?
8698			elem.getAttribute( name ) :
8699			( val = elem.getAttributeNode( name ) ) && val.specified ?
8700				val.value :
8701				null;
8702};
8703
8704Sizzle.escape = function( sel ) {
8705	return ( sel + "" ).replace( rcssescape, fcssescape );
8706};
8707
8708Sizzle.error = function( msg ) {
8709	throw new Error( "Syntax error, unrecognized expression: " + msg );
8710};
8711
8712/**
8713 * Document sorting and removing duplicates
8714 * @param {ArrayLike} results
8715 */
8716Sizzle.uniqueSort = function( results ) {
8717	var elem,
8718		duplicates = [],
8719		j = 0,
8720		i = 0;
8721
8722	// Unless we *know* we can detect duplicates, assume their presence
8723	hasDuplicate = !support.detectDuplicates;
8724	sortInput = !support.sortStable && results.slice( 0 );
8725	results.sort( sortOrder );
8726
8727	if ( hasDuplicate ) {
8728		while ( ( elem = results[ i++ ] ) ) {
8729			if ( elem === results[ i ] ) {
8730				j = duplicates.push( i );
8731			}
8732		}
8733		while ( j-- ) {
8734			results.splice( duplicates[ j ], 1 );
8735		}
8736	}
8737
8738	// Clear input after sorting to release objects
8739	// See https://github.com/jquery/sizzle/pull/225
8740	sortInput = null;
8741
8742	return results;
8743};
8744
8745/**
8746 * Utility function for retrieving the text value of an array of DOM nodes
8747 * @param {Array|Element} elem
8748 */
8749getText = Sizzle.getText = function( elem ) {
8750	var node,
8751		ret = "",
8752		i = 0,
8753		nodeType = elem.nodeType;
8754
8755	if ( !nodeType ) {
8756
8757		// If no nodeType, this is expected to be an array
8758		while ( ( node = elem[ i++ ] ) ) {
8759
8760			// Do not traverse comment nodes
8761			ret += getText( node );
8762		}
8763	} else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {
8764
8765		// Use textContent for elements
8766		// innerText usage removed for consistency of new lines (jQuery #11153)
8767		if ( typeof elem.textContent === "string" ) {
8768			return elem.textContent;
8769		} else {
8770
8771			// Traverse its children
8772			for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
8773				ret += getText( elem );
8774			}
8775		}
8776	} else if ( nodeType === 3 || nodeType === 4 ) {
8777		return elem.nodeValue;
8778	}
8779
8780	// Do not include comment or processing instruction nodes
8781
8782	return ret;
8783};
8784
8785Expr = Sizzle.selectors = {
8786
8787	// Can be adjusted by the user
8788	cacheLength: 50,
8789
8790	createPseudo: markFunction,
8791
8792	match: matchExpr,
8793
8794	attrHandle: {},
8795
8796	find: {},
8797
8798	relative: {
8799		">": { dir: "parentNode", first: true },
8800		" ": { dir: "parentNode" },
8801		"+": { dir: "previousSibling", first: true },
8802		"~": { dir: "previousSibling" }
8803	},
8804
8805	preFilter: {
8806		"ATTR": function( match ) {
8807			match[ 1 ] = match[ 1 ].replace( runescape, funescape );
8808
8809			// Move the given value to match[3] whether quoted or unquoted
8810			match[ 3 ] = ( match[ 3 ] || match[ 4 ] ||
8811				match[ 5 ] || "" ).replace( runescape, funescape );
8812
8813			if ( match[ 2 ] === "~=" ) {
8814				match[ 3 ] = " " + match[ 3 ] + " ";
8815			}
8816
8817			return match.slice( 0, 4 );
8818		},
8819
8820		"CHILD": function( match ) {
8821
8822			/* matches from matchExpr["CHILD"]
8823				1 type (only|nth|...)
8824				2 what (child|of-type)
8825				3 argument (even|odd|\d*|\d*n([+-]\d+)?|...)
8826				4 xn-component of xn+y argument ([+-]?\d*n|)
8827				5 sign of xn-component
8828				6 x of xn-component
8829				7 sign of y-component
8830				8 y of y-component
8831			*/
8832			match[ 1 ] = match[ 1 ].toLowerCase();
8833
8834			if ( match[ 1 ].slice( 0, 3 ) === "nth" ) {
8835
8836				// nth-* requires argument
8837				if ( !match[ 3 ] ) {
8838					Sizzle.error( match[ 0 ] );
8839				}
8840
8841				// numeric x and y parameters for Expr.filter.CHILD
8842				// remember that false/true cast respectively to 0/1
8843				match[ 4 ] = +( match[ 4 ] ?
8844					match[ 5 ] + ( match[ 6 ] || 1 ) :
8845					2 * ( match[ 3 ] === "even" || match[ 3 ] === "odd" ) );
8846				match[ 5 ] = +( ( match[ 7 ] + match[ 8 ] ) || match[ 3 ] === "odd" );
8847
8848				// other types prohibit arguments
8849			} else if ( match[ 3 ] ) {
8850				Sizzle.error( match[ 0 ] );
8851			}
8852
8853			return match;
8854		},
8855
8856		"PSEUDO": function( match ) {
8857			var excess,
8858				unquoted = !match[ 6 ] && match[ 2 ];
8859
8860			if ( matchExpr[ "CHILD" ].test( match[ 0 ] ) ) {
8861				return null;
8862			}
8863
8864			// Accept quoted arguments as-is
8865			if ( match[ 3 ] ) {
8866				match[ 2 ] = match[ 4 ] || match[ 5 ] || "";
8867
8868			// Strip excess characters from unquoted arguments
8869			} else if ( unquoted && rpseudo.test( unquoted ) &&
8870
8871				// Get excess from tokenize (recursively)
8872				( excess = tokenize( unquoted, true ) ) &&
8873
8874				// advance to the next closing parenthesis
8875				( excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length ) ) {
8876
8877				// excess is a negative index
8878				match[ 0 ] = match[ 0 ].slice( 0, excess );
8879				match[ 2 ] = unquoted.slice( 0, excess );
8880			}
8881
8882			// Return only captures needed by the pseudo filter method (type and argument)
8883			return match.slice( 0, 3 );
8884		}
8885	},
8886
8887	filter: {
8888
8889		"TAG": function( nodeNameSelector ) {
8890			var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();
8891			return nodeNameSelector === "*" ?
8892				function() {
8893					return true;
8894				} :
8895				function( elem ) {
8896					return elem.nodeName && elem.nodeName.toLowerCase() === nodeName;
8897				};
8898		},
8899
8900		"CLASS": function( className ) {
8901			var pattern = classCache[ className + " " ];
8902
8903			return pattern ||
8904				( pattern = new RegExp( "(^|" + whitespace +
8905					")" + className + "(" + whitespace + "|$)" ) ) && classCache(
8906						className, function( elem ) {
8907							return pattern.test(
8908								typeof elem.className === "string" && elem.className ||
8909								typeof elem.getAttribute !== "undefined" &&
8910									elem.getAttribute( "class" ) ||
8911								""
8912							);
8913				} );
8914		},
8915
8916		"ATTR": function( name, operator, check ) {
8917			return function( elem ) {
8918				var result = Sizzle.attr( elem, name );
8919
8920				if ( result == null ) {
8921					return operator === "!=";
8922				}
8923				if ( !operator ) {
8924					return true;
8925				}
8926
8927				result += "";
8928
8929				/* eslint-disable max-len */
8930
8931				return operator === "=" ? result === check :
8932					operator === "!=" ? result !== check :
8933					operator === "^=" ? check && result.indexOf( check ) === 0 :
8934					operator === "*=" ? check && result.indexOf( check ) > -1 :
8935					operator === "$=" ? check && result.slice( -check.length ) === check :
8936					operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 :
8937					operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" :
8938					false;
8939				/* eslint-enable max-len */
8940
8941			};
8942		},
8943
8944		"CHILD": function( type, what, _argument, first, last ) {
8945			var simple = type.slice( 0, 3 ) !== "nth",
8946				forward = type.slice( -4 ) !== "last",
8947				ofType = what === "of-type";
8948
8949			return first === 1 && last === 0 ?
8950
8951				// Shortcut for :nth-*(n)
8952				function( elem ) {
8953					return !!elem.parentNode;
8954				} :
8955
8956				function( elem, _context, xml ) {
8957					var cache, uniqueCache, outerCache, node, nodeIndex, start,
8958						dir = simple !== forward ? "nextSibling" : "previousSibling",
8959						parent = elem.parentNode,
8960						name = ofType && elem.nodeName.toLowerCase(),
8961						useCache = !xml && !ofType,
8962						diff = false;
8963
8964					if ( parent ) {
8965
8966						// :(first|last|only)-(child|of-type)
8967						if ( simple ) {
8968							while ( dir ) {
8969								node = elem;
8970								while ( ( node = node[ dir ] ) ) {
8971									if ( ofType ?
8972										node.nodeName.toLowerCase() === name :
8973										node.nodeType === 1 ) {
8974
8975										return false;
8976									}
8977								}
8978
8979								// Reverse direction for :only-* (if we haven't yet done so)
8980								start = dir = type === "only" && !start && "nextSibling";
8981							}
8982							return true;
8983						}
8984
8985						start = [ forward ? parent.firstChild : parent.lastChild ];
8986
8987						// non-xml :nth-child(...) stores cache data on `parent`
8988						if ( forward && useCache ) {
8989
8990							// Seek `elem` from a previously-cached index
8991
8992							// ...in a gzip-friendly way
8993							node = parent;
8994							outerCache = node[ expando ] || ( node[ expando ] = {} );
8995
8996							// Support: IE <9 only
8997							// Defend against cloned attroperties (jQuery gh-1709)
8998							uniqueCache = outerCache[ node.uniqueID ] ||
8999								( outerCache[ node.uniqueID ] = {} );
9000
9001							cache = uniqueCache[ type ] || [];
9002							nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];
9003							diff = nodeIndex && cache[ 2 ];
9004							node = nodeIndex && parent.childNodes[ nodeIndex ];
9005
9006							while ( ( node = ++nodeIndex && node && node[ dir ] ||
9007
9008								// Fallback to seeking `elem` from the start
9009								( diff = nodeIndex = 0 ) || start.pop() ) ) {
9010
9011								// When found, cache indexes on `parent` and break
9012								if ( node.nodeType === 1 && ++diff && node === elem ) {
9013									uniqueCache[ type ] = [ dirruns, nodeIndex, diff ];
9014									break;
9015								}
9016							}
9017
9018						} else {
9019
9020							// Use previously-cached element index if available
9021							if ( useCache ) {
9022
9023								// ...in a gzip-friendly way
9024								node = elem;
9025								outerCache = node[ expando ] || ( node[ expando ] = {} );
9026
9027								// Support: IE <9 only
9028								// Defend against cloned attroperties (jQuery gh-1709)
9029								uniqueCache = outerCache[ node.uniqueID ] ||
9030									( outerCache[ node.uniqueID ] = {} );
9031
9032								cache = uniqueCache[ type ] || [];
9033								nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];
9034								diff = nodeIndex;
9035							}
9036
9037							// xml :nth-child(...)
9038							// or :nth-last-child(...) or :nth(-last)?-of-type(...)
9039							if ( diff === false ) {
9040
9041								// Use the same loop as above to seek `elem` from the start
9042								while ( ( node = ++nodeIndex && node && node[ dir ] ||
9043									( diff = nodeIndex = 0 ) || start.pop() ) ) {
9044
9045									if ( ( ofType ?
9046										node.nodeName.toLowerCase() === name :
9047										node.nodeType === 1 ) &&
9048										++diff ) {
9049
9050										// Cache the index of each encountered element
9051										if ( useCache ) {
9052											outerCache = node[ expando ] ||
9053												( node[ expando ] = {} );
9054
9055											// Support: IE <9 only
9056											// Defend against cloned attroperties (jQuery gh-1709)
9057											uniqueCache = outerCache[ node.uniqueID ] ||
9058												( outerCache[ node.uniqueID ] = {} );
9059
9060											uniqueCache[ type ] = [ dirruns, diff ];
9061										}
9062
9063										if ( node === elem ) {
9064											break;
9065										}
9066									}
9067								}
9068							}
9069						}
9070
9071						// Incorporate the offset, then check against cycle size
9072						diff -= last;
9073						return diff === first || ( diff % first === 0 && diff / first >= 0 );
9074					}
9075				};
9076		},
9077
9078		"PSEUDO": function( pseudo, argument ) {
9079
9080			// pseudo-class names are case-insensitive
9081			// http://www.w3.org/TR/selectors/#pseudo-classes
9082			// Prioritize by case sensitivity in case custom pseudos are added with uppercase letters
9083			// Remember that setFilters inherits from pseudos
9084			var args,
9085				fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||
9086					Sizzle.error( "unsupported pseudo: " + pseudo );
9087
9088			// The user may use createPseudo to indicate that
9089			// arguments are needed to create the filter function
9090			// just as Sizzle does
9091			if ( fn[ expando ] ) {
9092				return fn( argument );
9093			}
9094
9095			// But maintain support for old signatures
9096			if ( fn.length > 1 ) {
9097				args = [ pseudo, pseudo, "", argument ];
9098				return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?
9099					markFunction( function( seed, matches ) {
9100						var idx,
9101							matched = fn( seed, argument ),
9102							i = matched.length;
9103						while ( i-- ) {
9104							idx = indexOf( seed, matched[ i ] );
9105							seed[ idx ] = !( matches[ idx ] = matched[ i ] );
9106						}
9107					} ) :
9108					function( elem ) {
9109						return fn( elem, 0, args );
9110					};
9111			}
9112
9113			return fn;
9114		}
9115	},
9116
9117	pseudos: {
9118
9119		// Potentially complex pseudos
9120		"not": markFunction( function( selector ) {
9121
9122			// Trim the selector passed to compile
9123			// to avoid treating leading and trailing
9124			// spaces as combinators
9125			var input = [],
9126				results = [],
9127				matcher = compile( selector.replace( rtrim, "$1" ) );
9128
9129			return matcher[ expando ] ?
9130				markFunction( function( seed, matches, _context, xml ) {
9131					var elem,
9132						unmatched = matcher( seed, null, xml, [] ),
9133						i = seed.length;
9134
9135					// Match elements unmatched by `matcher`
9136					while ( i-- ) {
9137						if ( ( elem = unmatched[ i ] ) ) {
9138							seed[ i ] = !( matches[ i ] = elem );
9139						}
9140					}
9141				} ) :
9142				function( elem, _context, xml ) {
9143					input[ 0 ] = elem;
9144					matcher( input, null, xml, results );
9145
9146					// Don't keep the element (issue #299)
9147					input[ 0 ] = null;
9148					return !results.pop();
9149				};
9150		} ),
9151
9152		"has": markFunction( function( selector ) {
9153			return function( elem ) {
9154				return Sizzle( selector, elem ).length > 0;
9155			};
9156		} ),
9157
9158		"contains": markFunction( function( text ) {
9159			text = text.replace( runescape, funescape );
9160			return function( elem ) {
9161				return ( elem.textContent || getText( elem ) ).indexOf( text ) > -1;
9162			};
9163		} ),
9164
9165		// "Whether an element is represented by a :lang() selector
9166		// is based solely on the element's language value
9167		// being equal to the identifier C,
9168		// or beginning with the identifier C immediately followed by "-".
9169		// The matching of C against the element's language value is performed case-insensitively.
9170		// The identifier C does not have to be a valid language name."
9171		// http://www.w3.org/TR/selectors/#lang-pseudo
9172		"lang": markFunction( function( lang ) {
9173
9174			// lang value must be a valid identifier
9175			if ( !ridentifier.test( lang || "" ) ) {
9176				Sizzle.error( "unsupported lang: " + lang );
9177			}
9178			lang = lang.replace( runescape, funescape ).toLowerCase();
9179			return function( elem ) {
9180				var elemLang;
9181				do {
9182					if ( ( elemLang = documentIsHTML ?
9183						elem.lang :
9184						elem.getAttribute( "xml:lang" ) || elem.getAttribute( "lang" ) ) ) {
9185
9186						elemLang = elemLang.toLowerCase();
9187						return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0;
9188					}
9189				} while ( ( elem = elem.parentNode ) && elem.nodeType === 1 );
9190				return false;
9191			};
9192		} ),
9193
9194		// Miscellaneous
9195		"target": function( elem ) {
9196			var hash = window.location && window.location.hash;
9197			return hash && hash.slice( 1 ) === elem.id;
9198		},
9199
9200		"root": function( elem ) {
9201			return elem === docElem;
9202		},
9203
9204		"focus": function( elem ) {
9205			return elem === document.activeElement &&
9206				( !document.hasFocus || document.hasFocus() ) &&
9207				!!( elem.type || elem.href || ~elem.tabIndex );
9208		},
9209
9210		// Boolean properties
9211		"enabled": createDisabledPseudo( false ),
9212		"disabled": createDisabledPseudo( true ),
9213
9214		"checked": function( elem ) {
9215
9216			// In CSS3, :checked should return both checked and selected elements
9217			// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
9218			var nodeName = elem.nodeName.toLowerCase();
9219			return ( nodeName === "input" && !!elem.checked ) ||
9220				( nodeName === "option" && !!elem.selected );
9221		},
9222
9223		"selected": function( elem ) {
9224
9225			// Accessing this property makes selected-by-default
9226			// options in Safari work properly
9227			if ( elem.parentNode ) {
9228				// eslint-disable-next-line no-unused-expressions
9229				elem.parentNode.selectedIndex;
9230			}
9231
9232			return elem.selected === true;
9233		},
9234
9235		// Contents
9236		"empty": function( elem ) {
9237
9238			// http://www.w3.org/TR/selectors/#empty-pseudo
9239			// :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),
9240			//   but not by others (comment: 8; processing instruction: 7; etc.)
9241			// nodeType < 6 works because attributes (2) do not appear as children
9242			for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
9243				if ( elem.nodeType < 6 ) {
9244					return false;
9245				}
9246			}
9247			return true;
9248		},
9249
9250		"parent": function( elem ) {
9251			return !Expr.pseudos[ "empty" ]( elem );
9252		},
9253
9254		// Element/input types
9255		"header": function( elem ) {
9256			return rheader.test( elem.nodeName );
9257		},
9258
9259		"input": function( elem ) {
9260			return rinputs.test( elem.nodeName );
9261		},
9262
9263		"button": function( elem ) {
9264			var name = elem.nodeName.toLowerCase();
9265			return name === "input" && elem.type === "button" || name === "button";
9266		},
9267
9268		"text": function( elem ) {
9269			var attr;
9270			return elem.nodeName.toLowerCase() === "input" &&
9271				elem.type === "text" &&
9272
9273				// Support: IE<8
9274				// New HTML5 attribute values (e.g., "search") appear with elem.type === "text"
9275				( ( attr = elem.getAttribute( "type" ) ) == null ||
9276					attr.toLowerCase() === "text" );
9277		},
9278
9279		// Position-in-collection
9280		"first": createPositionalPseudo( function() {
9281			return [ 0 ];
9282		} ),
9283
9284		"last": createPositionalPseudo( function( _matchIndexes, length ) {
9285			return [ length - 1 ];
9286		} ),
9287
9288		"eq": createPositionalPseudo( function( _matchIndexes, length, argument ) {
9289			return [ argument < 0 ? argument + length : argument ];
9290		} ),
9291
9292		"even": createPositionalPseudo( function( matchIndexes, length ) {
9293			var i = 0;
9294			for ( ; i < length; i += 2 ) {
9295				matchIndexes.push( i );
9296			}
9297			return matchIndexes;
9298		} ),
9299
9300		"odd": createPositionalPseudo( function( matchIndexes, length ) {
9301			var i = 1;
9302			for ( ; i < length; i += 2 ) {
9303				matchIndexes.push( i );
9304			}
9305			return matchIndexes;
9306		} ),
9307
9308		"lt": createPositionalPseudo( function( matchIndexes, length, argument ) {
9309			var i = argument < 0 ?
9310				argument + length :
9311				argument > length ?
9312					length :
9313					argument;
9314			for ( ; --i >= 0; ) {
9315				matchIndexes.push( i );
9316			}
9317			return matchIndexes;
9318		} ),
9319
9320		"gt": createPositionalPseudo( function( matchIndexes, length, argument ) {
9321			var i = argument < 0 ? argument + length : argument;
9322			for ( ; ++i < length; ) {
9323				matchIndexes.push( i );
9324			}
9325			return matchIndexes;
9326		} )
9327	}
9328};
9329
9330Expr.pseudos[ "nth" ] = Expr.pseudos[ "eq" ];
9331
9332// Add button/input type pseudos
9333for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {
9334	Expr.pseudos[ i ] = createInputPseudo( i );
9335}
9336for ( i in { submit: true, reset: true } ) {
9337	Expr.pseudos[ i ] = createButtonPseudo( i );
9338}
9339
9340// Easy API for creating new setFilters
9341function setFilters() {}
9342setFilters.prototype = Expr.filters = Expr.pseudos;
9343Expr.setFilters = new setFilters();
9344
9345tokenize = Sizzle.tokenize = function( selector, parseOnly ) {
9346	var matched, match, tokens, type,
9347		soFar, groups, preFilters,
9348		cached = tokenCache[ selector + " " ];
9349
9350	if ( cached ) {
9351		return parseOnly ? 0 : cached.slice( 0 );
9352	}
9353
9354	soFar = selector;
9355	groups = [];
9356	preFilters = Expr.preFilter;
9357
9358	while ( soFar ) {
9359
9360		// Comma and first run
9361		if ( !matched || ( match = rcomma.exec( soFar ) ) ) {
9362			if ( match ) {
9363
9364				// Don't consume trailing commas as valid
9365				soFar = soFar.slice( match[ 0 ].length ) || soFar;
9366			}
9367			groups.push( ( tokens = [] ) );
9368		}
9369
9370		matched = false;
9371
9372		// Combinators
9373		if ( ( match = rcombinators.exec( soFar ) ) ) {
9374			matched = match.shift();
9375			tokens.push( {
9376				value: matched,
9377
9378				// Cast descendant combinators to space
9379				type: match[ 0 ].replace( rtrim, " " )
9380			} );
9381			soFar = soFar.slice( matched.length );
9382		}
9383
9384		// Filters
9385		for ( type in Expr.filter ) {
9386			if ( ( match = matchExpr[ type ].exec( soFar ) ) && ( !preFilters[ type ] ||
9387				( match = preFilters[ type ]( match ) ) ) ) {
9388				matched = match.shift();
9389				tokens.push( {
9390					value: matched,
9391					type: type,
9392					matches: match
9393				} );
9394				soFar = soFar.slice( matched.length );
9395			}
9396		}
9397
9398		if ( !matched ) {
9399			break;
9400		}
9401	}
9402
9403	// Return the length of the invalid excess
9404	// if we're just parsing
9405	// Otherwise, throw an error or return tokens
9406	return parseOnly ?
9407		soFar.length :
9408		soFar ?
9409			Sizzle.error( selector ) :
9410
9411			// Cache the tokens
9412			tokenCache( selector, groups ).slice( 0 );
9413};
9414
9415function toSelector( tokens ) {
9416	var i = 0,
9417		len = tokens.length,
9418		selector = "";
9419	for ( ; i < len; i++ ) {
9420		selector += tokens[ i ].value;
9421	}
9422	return selector;
9423}
9424
9425function addCombinator( matcher, combinator, base ) {
9426	var dir = combinator.dir,
9427		skip = combinator.next,
9428		key = skip || dir,
9429		checkNonElements = base && key === "parentNode",
9430		doneName = done++;
9431
9432	return combinator.first ?
9433
9434		// Check against closest ancestor/preceding element
9435		function( elem, context, xml ) {
9436			while ( ( elem = elem[ dir ] ) ) {
9437				if ( elem.nodeType === 1 || checkNonElements ) {
9438					return matcher( elem, context, xml );
9439				}
9440			}
9441			return false;
9442		} :
9443
9444		// Check against all ancestor/preceding elements
9445		function( elem, context, xml ) {
9446			var oldCache, uniqueCache, outerCache,
9447				newCache = [ dirruns, doneName ];
9448
9449			// We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching
9450			if ( xml ) {
9451				while ( ( elem = elem[ dir ] ) ) {
9452					if ( elem.nodeType === 1 || checkNonElements ) {
9453						if ( matcher( elem, context, xml ) ) {
9454							return true;
9455						}
9456					}
9457				}
9458			} else {
9459				while ( ( elem = elem[ dir ] ) ) {
9460					if ( elem.nodeType === 1 || checkNonElements ) {
9461						outerCache = elem[ expando ] || ( elem[ expando ] = {} );
9462
9463						// Support: IE <9 only
9464						// Defend against cloned attroperties (jQuery gh-1709)
9465						uniqueCache = outerCache[ elem.uniqueID ] ||
9466							( outerCache[ elem.uniqueID ] = {} );
9467
9468						if ( skip && skip === elem.nodeName.toLowerCase() ) {
9469							elem = elem[ dir ] || elem;
9470						} else if ( ( oldCache = uniqueCache[ key ] ) &&
9471							oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) {
9472
9473							// Assign to newCache so results back-propagate to previous elements
9474							return ( newCache[ 2 ] = oldCache[ 2 ] );
9475						} else {
9476
9477							// Reuse newcache so results back-propagate to previous elements
9478							uniqueCache[ key ] = newCache;
9479
9480							// A match means we're done; a fail means we have to keep checking
9481							if ( ( newCache[ 2 ] = matcher( elem, context, xml ) ) ) {
9482								return true;
9483							}
9484						}
9485					}
9486				}
9487			}
9488			return false;
9489		};
9490}
9491
9492function elementMatcher( matchers ) {
9493	return matchers.length > 1 ?
9494		function( elem, context, xml ) {
9495			var i = matchers.length;
9496			while ( i-- ) {
9497				if ( !matchers[ i ]( elem, context, xml ) ) {
9498					return false;
9499				}
9500			}
9501			return true;
9502		} :
9503		matchers[ 0 ];
9504}
9505
9506function multipleContexts( selector, contexts, results ) {
9507	var i = 0,
9508		len = contexts.length;
9509	for ( ; i < len; i++ ) {
9510		Sizzle( selector, contexts[ i ], results );
9511	}
9512	return results;
9513}
9514
9515function condense( unmatched, map, filter, context, xml ) {
9516	var elem,
9517		newUnmatched = [],
9518		i = 0,
9519		len = unmatched.length,
9520		mapped = map != null;
9521
9522	for ( ; i < len; i++ ) {
9523		if ( ( elem = unmatched[ i ] ) ) {
9524			if ( !filter || filter( elem, context, xml ) ) {
9525				newUnmatched.push( elem );
9526				if ( mapped ) {
9527					map.push( i );
9528				}
9529			}
9530		}
9531	}
9532
9533	return newUnmatched;
9534}
9535
9536function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {
9537	if ( postFilter && !postFilter[ expando ] ) {
9538		postFilter = setMatcher( postFilter );
9539	}
9540	if ( postFinder && !postFinder[ expando ] ) {
9541		postFinder = setMatcher( postFinder, postSelector );
9542	}
9543	return markFunction( function( seed, results, context, xml ) {
9544		var temp, i, elem,
9545			preMap = [],
9546			postMap = [],
9547			preexisting = results.length,
9548
9549			// Get initial elements from seed or context
9550			elems = seed || multipleContexts(
9551				selector || "*",
9552				context.nodeType ? [ context ] : context,
9553				[]
9554			),
9555
9556			// Prefilter to get matcher input, preserving a map for seed-results synchronization
9557			matcherIn = preFilter && ( seed || !selector ) ?
9558				condense( elems, preMap, preFilter, context, xml ) :
9559				elems,
9560
9561			matcherOut = matcher ?
9562
9563				// If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,
9564				postFinder || ( seed ? preFilter : preexisting || postFilter ) ?
9565
9566					// ...intermediate processing is necessary
9567					[] :
9568
9569					// ...otherwise use results directly
9570					results :
9571				matcherIn;
9572
9573		// Find primary matches
9574		if ( matcher ) {
9575			matcher( matcherIn, matcherOut, context, xml );
9576		}
9577
9578		// Apply postFilter
9579		if ( postFilter ) {
9580			temp = condense( matcherOut, postMap );
9581			postFilter( temp, [], context, xml );
9582
9583			// Un-match failing elements by moving them back to matcherIn
9584			i = temp.length;
9585			while ( i-- ) {
9586				if ( ( elem = temp[ i ] ) ) {
9587					matcherOut[ postMap[ i ] ] = !( matcherIn[ postMap[ i ] ] = elem );
9588				}
9589			}
9590		}
9591
9592		if ( seed ) {
9593			if ( postFinder || preFilter ) {
9594				if ( postFinder ) {
9595
9596					// Get the final matcherOut by condensing this intermediate into postFinder contexts
9597					temp = [];
9598					i = matcherOut.length;
9599					while ( i-- ) {
9600						if ( ( elem = matcherOut[ i ] ) ) {
9601
9602							// Restore matcherIn since elem is not yet a final match
9603							temp.push( ( matcherIn[ i ] = elem ) );
9604						}
9605					}
9606					postFinder( null, ( matcherOut = [] ), temp, xml );
9607				}
9608
9609				// Move matched elements from seed to results to keep them synchronized
9610				i = matcherOut.length;
9611				while ( i-- ) {
9612					if ( ( elem = matcherOut[ i ] ) &&
9613						( temp = postFinder ? indexOf( seed, elem ) : preMap[ i ] ) > -1 ) {
9614
9615						seed[ temp ] = !( results[ temp ] = elem );
9616					}
9617				}
9618			}
9619
9620		// Add elements to results, through postFinder if defined
9621		} else {
9622			matcherOut = condense(
9623				matcherOut === results ?
9624					matcherOut.splice( preexisting, matcherOut.length ) :
9625					matcherOut
9626			);
9627			if ( postFinder ) {
9628				postFinder( null, results, matcherOut, xml );
9629			} else {
9630				push.apply( results, matcherOut );
9631			}
9632		}
9633	} );
9634}
9635
9636function matcherFromTokens( tokens ) {
9637	var checkContext, matcher, j,
9638		len = tokens.length,
9639		leadingRelative = Expr.relative[ tokens[ 0 ].type ],
9640		implicitRelative = leadingRelative || Expr.relative[ " " ],
9641		i = leadingRelative ? 1 : 0,
9642
9643		// The foundational matcher ensures that elements are reachable from top-level context(s)
9644		matchContext = addCombinator( function( elem ) {
9645			return elem === checkContext;
9646		}, implicitRelative, true ),
9647		matchAnyContext = addCombinator( function( elem ) {
9648			return indexOf( checkContext, elem ) > -1;
9649		}, implicitRelative, true ),
9650		matchers = [ function( elem, context, xml ) {
9651			var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || (
9652				( checkContext = context ).nodeType ?
9653					matchContext( elem, context, xml ) :
9654					matchAnyContext( elem, context, xml ) );
9655
9656			// Avoid hanging onto element (issue #299)
9657			checkContext = null;
9658			return ret;
9659		} ];
9660
9661	for ( ; i < len; i++ ) {
9662		if ( ( matcher = Expr.relative[ tokens[ i ].type ] ) ) {
9663			matchers = [ addCombinator( elementMatcher( matchers ), matcher ) ];
9664		} else {
9665			matcher = Expr.filter[ tokens[ i ].type ].apply( null, tokens[ i ].matches );
9666
9667			// Return special upon seeing a positional matcher
9668			if ( matcher[ expando ] ) {
9669
9670				// Find the next relative operator (if any) for proper handling
9671				j = ++i;
9672				for ( ; j < len; j++ ) {
9673					if ( Expr.relative[ tokens[ j ].type ] ) {
9674						break;
9675					}
9676				}
9677				return setMatcher(
9678					i > 1 && elementMatcher( matchers ),
9679					i > 1 && toSelector(
9680
9681					// If the preceding token was a descendant combinator, insert an implicit any-element `*`
9682					tokens
9683						.slice( 0, i - 1 )
9684						.concat( { value: tokens[ i - 2 ].type === " " ? "*" : "" } )
9685					).replace( rtrim, "$1" ),
9686					matcher,
9687					i < j && matcherFromTokens( tokens.slice( i, j ) ),
9688					j < len && matcherFromTokens( ( tokens = tokens.slice( j ) ) ),
9689					j < len && toSelector( tokens )
9690				);
9691			}
9692			matchers.push( matcher );
9693		}
9694	}
9695
9696	return elementMatcher( matchers );
9697}
9698
9699function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
9700	var bySet = setMatchers.length > 0,
9701		byElement = elementMatchers.length > 0,
9702		superMatcher = function( seed, context, xml, results, outermost ) {
9703			var elem, j, matcher,
9704				matchedCount = 0,
9705				i = "0",
9706				unmatched = seed && [],
9707				setMatched = [],
9708				contextBackup = outermostContext,
9709
9710				// We must always have either seed elements or outermost context
9711				elems = seed || byElement && Expr.find[ "TAG" ]( "*", outermost ),
9712
9713				// Use integer dirruns iff this is the outermost matcher
9714				dirrunsUnique = ( dirruns += contextBackup == null ? 1 : Math.random() || 0.1 ),
9715				len = elems.length;
9716
9717			if ( outermost ) {
9718
9719				// Support: IE 11+, Edge 17 - 18+
9720				// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
9721				// two documents; shallow comparisons work.
9722				// eslint-disable-next-line eqeqeq
9723				outermostContext = context == document || context || outermost;
9724			}
9725
9726			// Add elements passing elementMatchers directly to results
9727			// Support: IE<9, Safari
9728			// Tolerate NodeList properties (IE: "length"; Safari: <number>) matching elements by id
9729			for ( ; i !== len && ( elem = elems[ i ] ) != null; i++ ) {
9730				if ( byElement && elem ) {
9731					j = 0;
9732
9733					// Support: IE 11+, Edge 17 - 18+
9734					// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
9735					// two documents; shallow comparisons work.
9736					// eslint-disable-next-line eqeqeq
9737					if ( !context && elem.ownerDocument != document ) {
9738						setDocument( elem );
9739						xml = !documentIsHTML;
9740					}
9741					while ( ( matcher = elementMatchers[ j++ ] ) ) {
9742						if ( matcher( elem, context || document, xml ) ) {
9743							results.push( elem );
9744							break;
9745						}
9746					}
9747					if ( outermost ) {
9748						dirruns = dirrunsUnique;
9749					}
9750				}
9751
9752				// Track unmatched elements for set filters
9753				if ( bySet ) {
9754
9755					// They will have gone through all possible matchers
9756					if ( ( elem = !matcher && elem ) ) {
9757						matchedCount--;
9758					}
9759
9760					// Lengthen the array for every element, matched or not
9761					if ( seed ) {
9762						unmatched.push( elem );
9763					}
9764				}
9765			}
9766
9767			// `i` is now the count of elements visited above, and adding it to `matchedCount`
9768			// makes the latter nonnegative.
9769			matchedCount += i;
9770
9771			// Apply set filters to unmatched elements
9772			// NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount`
9773			// equals `i`), unless we didn't visit _any_ elements in the above loop because we have
9774			// no element matchers and no seed.
9775			// Incrementing an initially-string "0" `i` allows `i` to remain a string only in that
9776			// case, which will result in a "00" `matchedCount` that differs from `i` but is also
9777			// numerically zero.
9778			if ( bySet && i !== matchedCount ) {
9779				j = 0;
9780				while ( ( matcher = setMatchers[ j++ ] ) ) {
9781					matcher( unmatched, setMatched, context, xml );
9782				}
9783
9784				if ( seed ) {
9785
9786					// Reintegrate element matches to eliminate the need for sorting
9787					if ( matchedCount > 0 ) {
9788						while ( i-- ) {
9789							if ( !( unmatched[ i ] || setMatched[ i ] ) ) {
9790								setMatched[ i ] = pop.call( results );
9791							}
9792						}
9793					}
9794
9795					// Discard index placeholder values to get only actual matches
9796					setMatched = condense( setMatched );
9797				}
9798
9799				// Add matches to results
9800				push.apply( results, setMatched );
9801
9802				// Seedless set matches succeeding multiple successful matchers stipulate sorting
9803				if ( outermost && !seed && setMatched.length > 0 &&
9804					( matchedCount + setMatchers.length ) > 1 ) {
9805
9806					Sizzle.uniqueSort( results );
9807				}
9808			}
9809
9810			// Override manipulation of globals by nested matchers
9811			if ( outermost ) {
9812				dirruns = dirrunsUnique;
9813				outermostContext = contextBackup;
9814			}
9815
9816			return unmatched;
9817		};
9818
9819	return bySet ?
9820		markFunction( superMatcher ) :
9821		superMatcher;
9822}
9823
9824compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {
9825	var i,
9826		setMatchers = [],
9827		elementMatchers = [],
9828		cached = compilerCache[ selector + " " ];
9829
9830	if ( !cached ) {
9831
9832		// Generate a function of recursive functions that can be used to check each element
9833		if ( !match ) {
9834			match = tokenize( selector );
9835		}
9836		i = match.length;
9837		while ( i-- ) {
9838			cached = matcherFromTokens( match[ i ] );
9839			if ( cached[ expando ] ) {
9840				setMatchers.push( cached );
9841			} else {
9842				elementMatchers.push( cached );
9843			}
9844		}
9845
9846		// Cache the compiled function
9847		cached = compilerCache(
9848			selector,
9849			matcherFromGroupMatchers( elementMatchers, setMatchers )
9850		);
9851
9852		// Save selector and tokenization
9853		cached.selector = selector;
9854	}
9855	return cached;
9856};
9857
9858/**
9859 * A low-level selection function that works with Sizzle's compiled
9860 *  selector functions
9861 * @param {String|Function} selector A selector or a pre-compiled
9862 *  selector function built with Sizzle.compile
9863 * @param {Element} context
9864 * @param {Array} [results]
9865 * @param {Array} [seed] A set of elements to match against
9866 */
9867select = Sizzle.select = function( selector, context, results, seed ) {
9868	var i, tokens, token, type, find,
9869		compiled = typeof selector === "function" && selector,
9870		match = !seed && tokenize( ( selector = compiled.selector || selector ) );
9871
9872	results = results || [];
9873
9874	// Try to minimize operations if there is only one selector in the list and no seed
9875	// (the latter of which guarantees us context)
9876	if ( match.length === 1 ) {
9877
9878		// Reduce context if the leading compound selector is an ID
9879		tokens = match[ 0 ] = match[ 0 ].slice( 0 );
9880		if ( tokens.length > 2 && ( token = tokens[ 0 ] ).type === "ID" &&
9881			context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[ 1 ].type ] ) {
9882
9883			context = ( Expr.find[ "ID" ]( token.matches[ 0 ]
9884				.replace( runescape, funescape ), context ) || [] )[ 0 ];
9885			if ( !context ) {
9886				return results;
9887
9888			// Precompiled matchers will still verify ancestry, so step up a level
9889			} else if ( compiled ) {
9890				context = context.parentNode;
9891			}
9892
9893			selector = selector.slice( tokens.shift().value.length );
9894		}
9895
9896		// Fetch a seed set for right-to-left matching
9897		i = matchExpr[ "needsContext" ].test( selector ) ? 0 : tokens.length;
9898		while ( i-- ) {
9899			token = tokens[ i ];
9900
9901			// Abort if we hit a combinator
9902			if ( Expr.relative[ ( type = token.type ) ] ) {
9903				break;
9904			}
9905			if ( ( find = Expr.find[ type ] ) ) {
9906
9907				// Search, expanding context for leading sibling combinators
9908				if ( ( seed = find(
9909					token.matches[ 0 ].replace( runescape, funescape ),
9910					rsibling.test( tokens[ 0 ].type ) && testContext( context.parentNode ) ||
9911						context
9912				) ) ) {
9913
9914					// If seed is empty or no tokens remain, we can return early
9915					tokens.splice( i, 1 );
9916					selector = seed.length && toSelector( tokens );
9917					if ( !selector ) {
9918						push.apply( results, seed );
9919						return results;
9920					}
9921
9922					break;
9923				}
9924			}
9925		}
9926	}
9927
9928	// Compile and execute a filtering function if one is not provided
9929	// Provide `match` to avoid retokenization if we modified the selector above
9930	( compiled || compile( selector, match ) )(
9931		seed,
9932		context,
9933		!documentIsHTML,
9934		results,
9935		!context || rsibling.test( selector ) && testContext( context.parentNode ) || context
9936	);
9937	return results;
9938};
9939
9940// One-time assignments
9941
9942// Sort stability
9943support.sortStable = expando.split( "" ).sort( sortOrder ).join( "" ) === expando;
9944
9945// Support: Chrome 14-35+
9946// Always assume duplicates if they aren't passed to the comparison function
9947support.detectDuplicates = !!hasDuplicate;
9948
9949// Initialize against the default document
9950setDocument();
9951
9952// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)
9953// Detached nodes confoundingly follow *each other*
9954support.sortDetached = assert( function( el ) {
9955
9956	// Should return 1, but returns 4 (following)
9957	return el.compareDocumentPosition( document.createElement( "fieldset" ) ) & 1;
9958} );
9959
9960// Support: IE<8
9961// Prevent attribute/property "interpolation"
9962// https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx
9963if ( !assert( function( el ) {
9964	el.innerHTML = "<a href='#'></a>";
9965	return el.firstChild.getAttribute( "href" ) === "#";
9966} ) ) {
9967	addHandle( "type|href|height|width", function( elem, name, isXML ) {
9968		if ( !isXML ) {
9969			return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 );
9970		}
9971	} );
9972}
9973
9974// Support: IE<9
9975// Use defaultValue in place of getAttribute("value")
9976if ( !support.attributes || !assert( function( el ) {
9977	el.innerHTML = "<input/>";
9978	el.firstChild.setAttribute( "value", "" );
9979	return el.firstChild.getAttribute( "value" ) === "";
9980} ) ) {
9981	addHandle( "value", function( elem, _name, isXML ) {
9982		if ( !isXML && elem.nodeName.toLowerCase() === "input" ) {
9983			return elem.defaultValue;
9984		}
9985	} );
9986}
9987
9988// Support: IE<9
9989// Use getAttributeNode to fetch booleans when getAttribute lies
9990if ( !assert( function( el ) {
9991	return el.getAttribute( "disabled" ) == null;
9992} ) ) {
9993	addHandle( booleans, function( elem, name, isXML ) {
9994		var val;
9995		if ( !isXML ) {
9996			return elem[ name ] === true ? name.toLowerCase() :
9997				( val = elem.getAttributeNode( name ) ) && val.specified ?
9998					val.value :
9999					null;
10000		}
10001	} );
10002}
10003
10004return Sizzle;
10005
10006} )( window );
10007
10008
10009
10010jQuery.find = Sizzle;
10011jQuery.expr = Sizzle.selectors;
10012
10013// Deprecated
10014jQuery.expr[ ":" ] = jQuery.expr.pseudos;
10015jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort;
10016jQuery.text = Sizzle.getText;
10017jQuery.isXMLDoc = Sizzle.isXML;
10018jQuery.contains = Sizzle.contains;
10019jQuery.escapeSelector = Sizzle.escape;
10020
10021
10022
10023
10024var dir = function( elem, dir, until ) {
10025	var matched = [],
10026		truncate = until !== undefined;
10027
10028	while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) {
10029		if ( elem.nodeType === 1 ) {
10030			if ( truncate && jQuery( elem ).is( until ) ) {
10031				break;
10032			}
10033			matched.push( elem );
10034		}
10035	}
10036	return matched;
10037};
10038
10039
10040var siblings = function( n, elem ) {
10041	var matched = [];
10042
10043	for ( ; n; n = n.nextSibling ) {
10044		if ( n.nodeType === 1 && n !== elem ) {
10045			matched.push( n );
10046		}
10047	}
10048
10049	return matched;
10050};
10051
10052
10053var rneedsContext = jQuery.expr.match.needsContext;
10054
10055
10056
10057function nodeName( elem, name ) {
10058
10059	return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
10060
10061}
10062var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i );
10063
10064
10065
10066// Implement the identical functionality for filter and not
10067function winnow( elements, qualifier, not ) {
10068	if ( isFunction( qualifier ) ) {
10069		return jQuery.grep( elements, function( elem, i ) {
10070			return !!qualifier.call( elem, i, elem ) !== not;
10071		} );
10072	}
10073
10074	// Single element
10075	if ( qualifier.nodeType ) {
10076		return jQuery.grep( elements, function( elem ) {
10077			return ( elem === qualifier ) !== not;
10078		} );
10079	}
10080
10081	// Arraylike of elements (jQuery, arguments, Array)
10082	if ( typeof qualifier !== "string" ) {
10083		return jQuery.grep( elements, function( elem ) {
10084			return ( indexOf.call( qualifier, elem ) > -1 ) !== not;
10085		} );
10086	}
10087
10088	// Filtered directly for both simple and complex selectors
10089	return jQuery.filter( qualifier, elements, not );
10090}
10091
10092jQuery.filter = function( expr, elems, not ) {
10093	var elem = elems[ 0 ];
10094
10095	if ( not ) {
10096		expr = ":not(" + expr + ")";
10097	}
10098
10099	if ( elems.length === 1 && elem.nodeType === 1 ) {
10100		return jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [];
10101	}
10102
10103	return jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {
10104		return elem.nodeType === 1;
10105	} ) );
10106};
10107
10108jQuery.fn.extend( {
10109	find: function( selector ) {
10110		var i, ret,
10111			len = this.length,
10112			self = this;
10113
10114		if ( typeof selector !== "string" ) {
vendor: 4,670 bytes, lines 10115-10300
10115			return this.pushStack( jQuery( selector ).filter( function() {
10116				for ( i = 0; i < len; i++ ) {
10117					if ( jQuery.contains( self[ i ], this ) ) {
10118						return true;
10119					}
10120				}
10121			} ) );
10122		}
10123
10124		ret = this.pushStack( [] );
10125
10126		for ( i = 0; i < len; i++ ) {
10127			jQuery.find( selector, self[ i ], ret );
10128		}
10129
10130		return len > 1 ? jQuery.uniqueSort( ret ) : ret;
10131	},
10132	filter: function( selector ) {
10133		return this.pushStack( winnow( this, selector || [], false ) );
10134	},
10135	not: function( selector ) {
10136		return this.pushStack( winnow( this, selector || [], true ) );
10137	},
10138	is: function( selector ) {
10139		return !!winnow(
10140			this,
10141
10142			// If this is a positional/relative selector, check membership in the returned set
10143			// so $("p:first").is("p:last") won't return true for a doc with two "p".
10144			typeof selector === "string" && rneedsContext.test( selector ) ?
10145				jQuery( selector ) :
10146				selector || [],
10147			false
10148		).length;
10149	}
10150} );
10151
10152
10153// Initialize a jQuery object
10154
10155
10156// A central reference to the root jQuery(document)
10157var rootjQuery,
10158
10159	// A simple way to check for HTML strings
10160	// Prioritize #id over <tag> to avoid XSS via location.hash (trac-9521)
10161	// Strict HTML recognition (trac-11290: must start with <)
10162	// Shortcut simple #id case for speed
10163	rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/,
10164
10165	init = jQuery.fn.init = function( selector, context, root ) {
10166		var match, elem;
10167
10168		// HANDLE: $(""), $(null), $(undefined), $(false)
10169		if ( !selector ) {
10170			return this;
10171		}
10172
10173		// Method init() accepts an alternate rootjQuery
10174		// so migrate can support jQuery.sub (gh-2101)
10175		root = root || rootjQuery;
10176
10177		// Handle HTML strings
10178		if ( typeof selector === "string" ) {
10179			if ( selector[ 0 ] === "<" &&
10180				selector[ selector.length - 1 ] === ">" &&
10181				selector.length >= 3 ) {
10182
10183				// Assume that strings that start and end with <> are HTML and skip the regex check
10184				match = [ null, selector, null ];
10185
10186			} else {
10187				match = rquickExpr.exec( selector );
10188			}
10189
10190			// Match html or make sure no context is specified for #id
10191			if ( match && ( match[ 1 ] || !context ) ) {
10192
10193				// HANDLE: $(html) -> $(array)
10194				if ( match[ 1 ] ) {
10195					context = context instanceof jQuery ? context[ 0 ] : context;
10196
10197					// Option to run scripts is true for back-compat
10198					// Intentionally let the error be thrown if parseHTML is not present
10199					jQuery.merge( this, jQuery.parseHTML(
10200						match[ 1 ],
10201						context && context.nodeType ? context.ownerDocument || context : document,
10202						true
10203					) );
10204
10205					// HANDLE: $(html, props)
10206					if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) {
10207						for ( match in context ) {
10208
10209							// Properties of context are called as methods if possible
10210							if ( isFunction( this[ match ] ) ) {
10211								this[ match ]( context[ match ] );
10212
10213							// ...and otherwise set as attributes
10214							} else {
10215								this.attr( match, context[ match ] );
10216							}
10217						}
10218					}
10219
10220					return this;
10221
10222				// HANDLE: $(#id)
10223				} else {
10224					elem = document.getElementById( match[ 2 ] );
10225
10226					if ( elem ) {
10227
10228						// Inject the element directly into the jQuery object
10229						this[ 0 ] = elem;
10230						this.length = 1;
10231					}
10232					return this;
10233				}
10234
10235			// HANDLE: $(expr, $(...))
10236			} else if ( !context || context.jquery ) {
10237				return ( context || root ).find( selector );
10238
10239			// HANDLE: $(expr, context)
10240			// (which is just equivalent to: $(context).find(expr)
10241			} else {
10242				return this.constructor( context ).find( selector );
10243			}
10244
10245		// HANDLE: $(DOMElement)
10246		} else if ( selector.nodeType ) {
10247			this[ 0 ] = selector;
10248			this.length = 1;
10249			return this;
10250
10251		// HANDLE: $(function)
10252		// Shortcut for document ready
10253		} else if ( isFunction( selector ) ) {
10254			return root.ready !== undefined ?
10255				root.ready( selector ) :
10256
10257				// Execute immediately if ready is not present
10258				selector( jQuery );
10259		}
10260
10261		return jQuery.makeArray( selector, this );
10262	};
10263
10264// Give the init function the jQuery prototype for later instantiation
10265init.prototype = jQuery.fn;
10266
10267// Initialize central reference
10268rootjQuery = jQuery( document );
10269
10270
10271var rparentsprev = /^(?:parents|prev(?:Until|All))/,
10272
10273	// Methods guaranteed to produce a unique set when starting from a unique set
10274	guaranteedUnique = {
10275		children: true,
10276		contents: true,
10277		next: true,
10278		prev: true
10279	};
10280
10281jQuery.fn.extend( {
10282	has: function( target ) {
10283		var targets = jQuery( target, this ),
10284			l = targets.length;
10285
10286		return this.filter( function() {
10287			var i = 0;
10288			for ( ; i < l; i++ ) {
10289				if ( jQuery.contains( this, targets[ i ] ) ) {
10290					return true;
10291				}
10292			}
10293		} );
10294	},
10295
10296	closest: function( selectors, context ) {
10297		var cur,
10298			i = 0,
10299			l = this.length,
10300			matched = [],
vendor: 15,549 bytes, lines 10301-10886
10301			targets = typeof selectors !== "string" && jQuery( selectors );
10302
10303		// Positional selectors never match, since there's no _selection_ context
10304		if ( !rneedsContext.test( selectors ) ) {
10305			for ( ; i < l; i++ ) {
10306				for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) {
10307
10308					// Always skip document fragments
10309					if ( cur.nodeType < 11 && ( targets ?
10310						targets.index( cur ) > -1 :
10311
10312						// Don't pass non-elements to Sizzle
10313						cur.nodeType === 1 &&
10314							jQuery.find.matchesSelector( cur, selectors ) ) ) {
10315
10316						matched.push( cur );
10317						break;
10318					}
10319				}
10320			}
10321		}
10322
10323		return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched );
10324	},
10325
10326	// Determine the position of an element within the set
10327	index: function( elem ) {
10328
10329		// No argument, return index in parent
10330		if ( !elem ) {
10331			return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1;
10332		}
10333
10334		// Index in selector
10335		if ( typeof elem === "string" ) {
10336			return indexOf.call( jQuery( elem ), this[ 0 ] );
10337		}
10338
10339		// Locate the position of the desired element
10340		return indexOf.call( this,
10341
10342			// If it receives a jQuery object, the first element is used
10343			elem.jquery ? elem[ 0 ] : elem
10344		);
10345	},
10346
10347	add: function( selector, context ) {
10348		return this.pushStack(
10349			jQuery.uniqueSort(
10350				jQuery.merge( this.get(), jQuery( selector, context ) )
10351			)
10352		);
10353	},
10354
10355	addBack: function( selector ) {
10356		return this.add( selector == null ?
10357			this.prevObject : this.prevObject.filter( selector )
10358		);
10359	}
10360} );
10361
10362function sibling( cur, dir ) {
10363	while ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {}
10364	return cur;
10365}
10366
10367jQuery.each( {
10368	parent: function( elem ) {
10369		var parent = elem.parentNode;
10370		return parent && parent.nodeType !== 11 ? parent : null;
10371	},
10372	parents: function( elem ) {
10373		return dir( elem, "parentNode" );
10374	},
10375	parentsUntil: function( elem, _i, until ) {
10376		return dir( elem, "parentNode", until );
10377	},
10378	next: function( elem ) {
10379		return sibling( elem, "nextSibling" );
10380	},
10381	prev: function( elem ) {
10382		return sibling( elem, "previousSibling" );
10383	},
10384	nextAll: function( elem ) {
10385		return dir( elem, "nextSibling" );
10386	},
10387	prevAll: function( elem ) {
10388		return dir( elem, "previousSibling" );
10389	},
10390	nextUntil: function( elem, _i, until ) {
10391		return dir( elem, "nextSibling", until );
10392	},
10393	prevUntil: function( elem, _i, until ) {
10394		return dir( elem, "previousSibling", until );
10395	},
10396	siblings: function( elem ) {
10397		return siblings( ( elem.parentNode || {} ).firstChild, elem );
10398	},
10399	children: function( elem ) {
10400		return siblings( elem.firstChild );
10401	},
10402	contents: function( elem ) {
10403		if ( elem.contentDocument != null &&
10404
10405			// Support: IE 11+
10406			// <object> elements with no `data` attribute has an object
10407			// `contentDocument` with a `null` prototype.
10408			getProto( elem.contentDocument ) ) {
10409
10410			return elem.contentDocument;
10411		}
10412
10413		// Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only
10414		// Treat the template element as a regular one in browsers that
10415		// don't support it.
10416		if ( nodeName( elem, "template" ) ) {
10417			elem = elem.content || elem;
10418		}
10419
10420		return jQuery.merge( [], elem.childNodes );
10421	}
10422}, function( name, fn ) {
10423	jQuery.fn[ name ] = function( until, selector ) {
10424		var matched = jQuery.map( this, fn, until );
10425
10426		if ( name.slice( -5 ) !== "Until" ) {
10427			selector = until;
10428		}
10429
10430		if ( selector && typeof selector === "string" ) {
10431			matched = jQuery.filter( selector, matched );
10432		}
10433
10434		if ( this.length > 1 ) {
10435
10436			// Remove duplicates
10437			if ( !guaranteedUnique[ name ] ) {
10438				jQuery.uniqueSort( matched );
10439			}
10440
10441			// Reverse order for parents* and prev-derivatives
10442			if ( rparentsprev.test( name ) ) {
10443				matched.reverse();
10444			}
10445		}
10446
10447		return this.pushStack( matched );
10448	};
10449} );
10450var rnothtmlwhite = ( /[^\x20\t\r\n\f]+/g );
10451
10452
10453
10454// Convert String-formatted options into Object-formatted ones
10455function createOptions( options ) {
10456	var object = {};
10457	jQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) {
10458		object[ flag ] = true;
10459	} );
10460	return object;
10461}
10462
10463/*
10464 * Create a callback list using the following parameters:
10465 *
10466 *	options: an optional list of space-separated options that will change how
10467 *			the callback list behaves or a more traditional option object
10468 *
10469 * By default a callback list will act like an event callback list and can be
10470 * "fired" multiple times.
10471 *
10472 * Possible options:
10473 *
10474 *	once:			will ensure the callback list can only be fired once (like a Deferred)
10475 *
10476 *	memory:			will keep track of previous values and will call any callback added
10477 *					after the list has been fired right away with the latest "memorized"
10478 *					values (like a Deferred)
10479 *
10480 *	unique:			will ensure a callback can only be added once (no duplicate in the list)
10481 *
10482 *	stopOnFalse:	interrupt callings when a callback returns false
10483 *
10484 */
10485jQuery.Callbacks = function( options ) {
10486
10487	// Convert options from String-formatted to Object-formatted if needed
10488	// (we check in cache first)
10489	options = typeof options === "string" ?
10490		createOptions( options ) :
10491		jQuery.extend( {}, options );
10492
10493	var // Flag to know if list is currently firing
10494		firing,
10495
10496		// Last fire value for non-forgettable lists
10497		memory,
10498
10499		// Flag to know if list was already fired
10500		fired,
10501
10502		// Flag to prevent firing
10503		locked,
10504
10505		// Actual callback list
10506		list = [],
10507
10508		// Queue of execution data for repeatable lists
10509		queue = [],
10510
10511		// Index of currently firing callback (modified by add/remove as needed)
10512		firingIndex = -1,
10513
10514		// Fire callbacks
10515		fire = function() {
10516
10517			// Enforce single-firing
10518			locked = locked || options.once;
10519
10520			// Execute callbacks for all pending executions,
10521			// respecting firingIndex overrides and runtime changes
10522			fired = firing = true;
10523			for ( ; queue.length; firingIndex = -1 ) {
10524				memory = queue.shift();
10525				while ( ++firingIndex < list.length ) {
10526
10527					// Run callback and check for early termination
10528					if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false &&
10529						options.stopOnFalse ) {
10530
10531						// Jump to end and forget the data so .add doesn't re-fire
10532						firingIndex = list.length;
10533						memory = false;
10534					}
10535				}
10536			}
10537
10538			// Forget the data if we're done with it
10539			if ( !options.memory ) {
10540				memory = false;
10541			}
10542
10543			firing = false;
10544
10545			// Clean up if we're done firing for good
10546			if ( locked ) {
10547
10548				// Keep an empty list if we have data for future add calls
10549				if ( memory ) {
10550					list = [];
10551
10552				// Otherwise, this object is spent
10553				} else {
10554					list = "";
10555				}
10556			}
10557		},
10558
10559		// Actual Callbacks object
10560		self = {
10561
10562			// Add a callback or a collection of callbacks to the list
10563			add: function() {
10564				if ( list ) {
10565
10566					// If we have memory from a past run, we should fire after adding
10567					if ( memory && !firing ) {
10568						firingIndex = list.length - 1;
10569						queue.push( memory );
10570					}
10571
10572					( function add( args ) {
10573						jQuery.each( args, function( _, arg ) {
10574							if ( isFunction( arg ) ) {
10575								if ( !options.unique || !self.has( arg ) ) {
10576									list.push( arg );
10577								}
10578							} else if ( arg && arg.length && toType( arg ) !== "string" ) {
10579
10580								// Inspect recursively
10581								add( arg );
10582							}
10583						} );
10584					} )( arguments );
10585
10586					if ( memory && !firing ) {
10587						fire();
10588					}
10589				}
10590				return this;
10591			},
10592
10593			// Remove a callback from the list
10594			remove: function() {
10595				jQuery.each( arguments, function( _, arg ) {
10596					var index;
10597					while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {
10598						list.splice( index, 1 );
10599
10600						// Handle firing indexes
10601						if ( index <= firingIndex ) {
10602							firingIndex--;
10603						}
10604					}
10605				} );
10606				return this;
10607			},
10608
10609			// Check if a given callback is in the list.
10610			// If no argument is given, return whether or not list has callbacks attached.
10611			has: function( fn ) {
10612				return fn ?
10613					jQuery.inArray( fn, list ) > -1 :
10614					list.length > 0;
10615			},
10616
10617			// Remove all callbacks from the list
10618			empty: function() {
10619				if ( list ) {
10620					list = [];
10621				}
10622				return this;
10623			},
10624
10625			// Disable .fire and .add
10626			// Abort any current/pending executions
10627			// Clear all callbacks and values
10628			disable: function() {
10629				locked = queue = [];
10630				list = memory = "";
10631				return this;
10632			},
10633			disabled: function() {
10634				return !list;
10635			},
10636
10637			// Disable .fire
10638			// Also disable .add unless we have memory (since it would have no effect)
10639			// Abort any pending executions
10640			lock: function() {
10641				locked = queue = [];
10642				if ( !memory && !firing ) {
10643					list = memory = "";
10644				}
10645				return this;
10646			},
10647			locked: function() {
10648				return !!locked;
10649			},
10650
10651			// Call all callbacks with the given context and arguments
10652			fireWith: function( context, args ) {
10653				if ( !locked ) {
10654					args = args || [];
10655					args = [ context, args.slice ? args.slice() : args ];
10656					queue.push( args );
10657					if ( !firing ) {
10658						fire();
10659					}
10660				}
10661				return this;
10662			},
10663
10664			// Call all the callbacks with the given arguments
10665			fire: function() {
10666				self.fireWith( this, arguments );
10667				return this;
10668			},
10669
10670			// To know if the callbacks have already been called at least once
10671			fired: function() {
10672				return !!fired;
10673			}
10674		};
10675
10676	return self;
10677};
10678
10679
10680function Identity( v ) {
10681	return v;
10682}
10683function Thrower( ex ) {
10684	throw ex;
10685}
10686
10687function adoptValue( value, resolve, reject, noValue ) {
10688	var method;
10689
10690	try {
10691
10692		// Check for promise aspect first to privilege synchronous behavior
10693		if ( value && isFunction( ( method = value.promise ) ) ) {
10694			method.call( value ).done( resolve ).fail( reject );
10695
10696		// Other thenables
10697		} else if ( value && isFunction( ( method = value.then ) ) ) {
10698			method.call( value, resolve, reject );
10699
10700		// Other non-thenables
10701		} else {
10702
10703			// Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer:
10704			// * false: [ value ].slice( 0 ) => resolve( value )
10705			// * true: [ value ].slice( 1 ) => resolve()
10706			resolve.apply( undefined, [ value ].slice( noValue ) );
10707		}
10708
10709	// For Promises/A+, convert exceptions into rejections
10710	// Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in
10711	// Deferred#then to conditionally suppress rejection.
10712	} catch ( value ) {
10713
10714		// Support: Android 4.0 only
10715		// Strict mode functions invoked without .call/.apply get global-object context
10716		reject.apply( undefined, [ value ] );
10717	}
10718}
10719
10720jQuery.extend( {
10721
10722	Deferred: function( func ) {
10723		var tuples = [
10724
10725				// action, add listener, callbacks,
10726				// ... .then handlers, argument index, [final state]
10727				[ "notify", "progress", jQuery.Callbacks( "memory" ),
10728					jQuery.Callbacks( "memory" ), 2 ],
10729				[ "resolve", "done", jQuery.Callbacks( "once memory" ),
10730					jQuery.Callbacks( "once memory" ), 0, "resolved" ],
10731				[ "reject", "fail", jQuery.Callbacks( "once memory" ),
10732					jQuery.Callbacks( "once memory" ), 1, "rejected" ]
10733			],
10734			state = "pending",
10735			promise = {
10736				state: function() {
10737					return state;
10738				},
10739				always: function() {
10740					deferred.done( arguments ).fail( arguments );
10741					return this;
10742				},
10743				"catch": function( fn ) {
10744					return promise.then( null, fn );
10745				},
10746
10747				// Keep pipe for back-compat
10748				pipe: function( /* fnDone, fnFail, fnProgress */ ) {
10749					var fns = arguments;
10750
10751					return jQuery.Deferred( function( newDefer ) {
10752						jQuery.each( tuples, function( _i, tuple ) {
10753
10754							// Map tuples (progress, done, fail) to arguments (done, fail, progress)
10755							var fn = isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ];
10756
10757							// deferred.progress(function() { bind to newDefer or newDefer.notify })
10758							// deferred.done(function() { bind to newDefer or newDefer.resolve })
10759							// deferred.fail(function() { bind to newDefer or newDefer.reject })
10760							deferred[ tuple[ 1 ] ]( function() {
10761								var returned = fn && fn.apply( this, arguments );
10762								if ( returned && isFunction( returned.promise ) ) {
10763									returned.promise()
10764										.progress( newDefer.notify )
10765										.done( newDefer.resolve )
10766										.fail( newDefer.reject );
10767								} else {
10768									newDefer[ tuple[ 0 ] + "With" ](
10769										this,
10770										fn ? [ returned ] : arguments
10771									);
10772								}
10773							} );
10774						} );
10775						fns = null;
10776					} ).promise();
10777				},
10778				then: function( onFulfilled, onRejected, onProgress ) {
10779					var maxDepth = 0;
10780					function resolve( depth, deferred, handler, special ) {
10781						return function() {
10782							var that = this,
10783								args = arguments,
10784								mightThrow = function() {
10785									var returned, then;
10786
10787									// Support: Promises/A+ section 2.3.3.3.3
10788									// https://promisesaplus.com/#point-59
10789									// Ignore double-resolution attempts
10790									if ( depth < maxDepth ) {
10791										return;
10792									}
10793
10794									returned = handler.apply( that, args );
10795
10796									// Support: Promises/A+ section 2.3.1
10797									// https://promisesaplus.com/#point-48
10798									if ( returned === deferred.promise() ) {
10799										throw new TypeError( "Thenable self-resolution" );
10800									}
10801
10802									// Support: Promises/A+ sections 2.3.3.1, 3.5
10803									// https://promisesaplus.com/#point-54
10804									// https://promisesaplus.com/#point-75
10805									// Retrieve `then` only once
10806									then = returned &&
10807
10808										// Support: Promises/A+ section 2.3.4
10809										// https://promisesaplus.com/#point-64
10810										// Only check objects and functions for thenability
10811										( typeof returned === "object" ||
10812											typeof returned === "function" ) &&
10813										returned.then;
10814
10815									// Handle a returned thenable
10816									if ( isFunction( then ) ) {
10817
10818										// Special processors (notify) just wait for resolution
10819										if ( special ) {
10820											then.call(
10821												returned,
10822												resolve( maxDepth, deferred, Identity, special ),
10823												resolve( maxDepth, deferred, Thrower, special )
10824											);
10825
10826										// Normal processors (resolve) also hook into progress
10827										} else {
10828
10829											// ...and disregard older resolution values
10830											maxDepth++;
10831
10832											then.call(
10833												returned,
10834												resolve( maxDepth, deferred, Identity, special ),
10835												resolve( maxDepth, deferred, Thrower, special ),
10836												resolve( maxDepth, deferred, Identity,
10837													deferred.notifyWith )
10838											);
10839										}
10840
10841									// Handle all other returned values
10842									} else {
10843
10844										// Only substitute handlers pass on context
10845										// and multiple values (non-spec behavior)
10846										if ( handler !== Identity ) {
10847											that = undefined;
10848											args = [ returned ];
10849										}
10850
10851										// Process the value(s)
10852										// Default process is resolve
10853										( special || deferred.resolveWith )( that, args );
10854									}
10855								},
10856
10857								// Only normal processors (resolve) catch and reject exceptions
10858								process = special ?
10859									mightThrow :
10860									function() {
10861										try {
10862											mightThrow();
10863										} catch ( e ) {
10864
10865											if ( jQuery.Deferred.exceptionHook ) {
10866												jQuery.Deferred.exceptionHook( e,
10867													process.stackTrace );
10868											}
10869
10870											// Support: Promises/A+ section 2.3.3.3.4.1
10871											// https://promisesaplus.com/#point-61
10872											// Ignore post-resolution exceptions
10873											if ( depth + 1 >= maxDepth ) {
10874
10875												// Only substitute handlers pass on context
10876												// and multiple values (non-spec behavior)
10877												if ( handler !== Thrower ) {
10878													that = undefined;
10879													args = [ e ];
10880												}
10881
10882												deferred.rejectWith( that, args );
10883											}
10884										}
10885									};
10886
vendor: 10,679 bytes, lines 10887-11335
10887							// Support: Promises/A+ section 2.3.3.3.1
10888							// https://promisesaplus.com/#point-57
10889							// Re-resolve promises immediately to dodge false rejection from
10890							// subsequent errors
10891							if ( depth ) {
10892								process();
10893							} else {
10894
10895								// Call an optional hook to record the stack, in case of exception
10896								// since it's otherwise lost when execution goes async
10897								if ( jQuery.Deferred.getStackHook ) {
10898									process.stackTrace = jQuery.Deferred.getStackHook();
10899								}
10900								window.setTimeout( process );
10901							}
10902						};
10903					}
10904
10905					return jQuery.Deferred( function( newDefer ) {
10906
10907						// progress_handlers.add( ... )
10908						tuples[ 0 ][ 3 ].add(
10909							resolve(
10910								0,
10911								newDefer,
10912								isFunction( onProgress ) ?
10913									onProgress :
10914									Identity,
10915								newDefer.notifyWith
10916							)
10917						);
10918
10919						// fulfilled_handlers.add( ... )
10920						tuples[ 1 ][ 3 ].add(
10921							resolve(
10922								0,
10923								newDefer,
10924								isFunction( onFulfilled ) ?
10925									onFulfilled :
10926									Identity
10927							)
10928						);
10929
10930						// rejected_handlers.add( ... )
10931						tuples[ 2 ][ 3 ].add(
10932							resolve(
10933								0,
10934								newDefer,
10935								isFunction( onRejected ) ?
10936									onRejected :
10937									Thrower
10938							)
10939						);
10940					} ).promise();
10941				},
10942
10943				// Get a promise for this deferred
10944				// If obj is provided, the promise aspect is added to the object
10945				promise: function( obj ) {
10946					return obj != null ? jQuery.extend( obj, promise ) : promise;
10947				}
10948			},
10949			deferred = {};
10950
10951		// Add list-specific methods
10952		jQuery.each( tuples, function( i, tuple ) {
10953			var list = tuple[ 2 ],
10954				stateString = tuple[ 5 ];
10955
10956			// promise.progress = list.add
10957			// promise.done = list.add
10958			// promise.fail = list.add
10959			promise[ tuple[ 1 ] ] = list.add;
10960
10961			// Handle state
10962			if ( stateString ) {
10963				list.add(
10964					function() {
10965
10966						// state = "resolved" (i.e., fulfilled)
10967						// state = "rejected"
10968						state = stateString;
10969					},
10970
10971					// rejected_callbacks.disable
10972					// fulfilled_callbacks.disable
10973					tuples[ 3 - i ][ 2 ].disable,
10974
10975					// rejected_handlers.disable
10976					// fulfilled_handlers.disable
10977					tuples[ 3 - i ][ 3 ].disable,
10978
10979					// progress_callbacks.lock
10980					tuples[ 0 ][ 2 ].lock,
10981
10982					// progress_handlers.lock
10983					tuples[ 0 ][ 3 ].lock
10984				);
10985			}
10986
10987			// progress_handlers.fire
10988			// fulfilled_handlers.fire
10989			// rejected_handlers.fire
10990			list.add( tuple[ 3 ].fire );
10991
10992			// deferred.notify = function() { deferred.notifyWith(...) }
10993			// deferred.resolve = function() { deferred.resolveWith(...) }
10994			// deferred.reject = function() { deferred.rejectWith(...) }
10995			deferred[ tuple[ 0 ] ] = function() {
10996				deferred[ tuple[ 0 ] + "With" ]( this === deferred ? undefined : this, arguments );
10997				return this;
10998			};
10999
11000			// deferred.notifyWith = list.fireWith
11001			// deferred.resolveWith = list.fireWith
11002			// deferred.rejectWith = list.fireWith
11003			deferred[ tuple[ 0 ] + "With" ] = list.fireWith;
11004		} );
11005
11006		// Make the deferred a promise
11007		promise.promise( deferred );
11008
11009		// Call given func if any
11010		if ( func ) {
11011			func.call( deferred, deferred );
11012		}
11013
11014		// All done!
11015		return deferred;
11016	},
11017
11018	// Deferred helper
11019	when: function( singleValue ) {
11020		var
11021
11022			// count of uncompleted subordinates
11023			remaining = arguments.length,
11024
11025			// count of unprocessed arguments
11026			i = remaining,
11027
11028			// subordinate fulfillment data
11029			resolveContexts = Array( i ),
11030			resolveValues = slice.call( arguments ),
11031
11032			// the primary Deferred
11033			primary = jQuery.Deferred(),
11034
11035			// subordinate callback factory
11036			updateFunc = function( i ) {
11037				return function( value ) {
11038					resolveContexts[ i ] = this;
11039					resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;
11040					if ( !( --remaining ) ) {
11041						primary.resolveWith( resolveContexts, resolveValues );
11042					}
11043				};
11044			};
11045
11046		// Single- and empty arguments are adopted like Promise.resolve
11047		if ( remaining <= 1 ) {
11048			adoptValue( singleValue, primary.done( updateFunc( i ) ).resolve, primary.reject,
11049				!remaining );
11050
11051			// Use .then() to unwrap secondary thenables (cf. gh-3000)
11052			if ( primary.state() === "pending" ||
11053				isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) {
11054
11055				return primary.then();
11056			}
11057		}
11058
11059		// Multiple arguments are aggregated like Promise.all array elements
11060		while ( i-- ) {
11061			adoptValue( resolveValues[ i ], updateFunc( i ), primary.reject );
11062		}
11063
11064		return primary.promise();
11065	}
11066} );
11067
11068
11069// These usually indicate a programmer mistake during development,
11070// warn about them ASAP rather than swallowing them by default.
11071var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;
11072
11073jQuery.Deferred.exceptionHook = function( error, stack ) {
11074
11075	// Support: IE 8 - 9 only
11076	// Console exists when dev tools are open, which can happen at any time
11077	if ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) {
11078		window.console.warn( "jQuery.Deferred exception: " + error.message, error.stack, stack );
11079	}
11080};
11081
11082
11083
11084
11085jQuery.readyException = function( error ) {
11086	window.setTimeout( function() {
11087		throw error;
11088	} );
11089};
11090
11091
11092
11093
11094// The deferred used on DOM ready
11095var readyList = jQuery.Deferred();
11096
11097jQuery.fn.ready = function( fn ) {
11098
11099	readyList
11100		.then( fn )
11101
11102		// Wrap jQuery.readyException in a function so that the lookup
11103		// happens at the time of error handling instead of callback
11104		// registration.
11105		.catch( function( error ) {
11106			jQuery.readyException( error );
11107		} );
11108
11109	return this;
11110};
11111
11112jQuery.extend( {
11113
11114	// Is the DOM ready to be used? Set to true once it occurs.
11115	isReady: false,
11116
11117	// A counter to track how many items to wait for before
11118	// the ready event fires. See trac-6781
11119	readyWait: 1,
11120
11121	// Handle when the DOM is ready
11122	ready: function( wait ) {
11123
11124		// Abort if there are pending holds or we're already ready
11125		if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {
11126			return;
11127		}
11128
11129		// Remember that the DOM is ready
11130		jQuery.isReady = true;
11131
11132		// If a normal DOM Ready event fired, decrement, and wait if need be
11133		if ( wait !== true && --jQuery.readyWait > 0 ) {
11134			return;
11135		}
11136
11137		// If there are functions bound, to execute
11138		readyList.resolveWith( document, [ jQuery ] );
11139	}
11140} );
11141
11142jQuery.ready.then = readyList.then;
11143
11144// The ready event handler and self cleanup method
11145function completed() {
11146	document.removeEventListener( "DOMContentLoaded", completed );
11147	window.removeEventListener( "load", completed );
11148	jQuery.ready();
11149}
11150
11151// Catch cases where $(document).ready() is called
11152// after the browser event has already occurred.
11153// Support: IE <=9 - 10 only
11154// Older IE sometimes signals "interactive" too soon
11155if ( document.readyState === "complete" ||
11156	( document.readyState !== "loading" && !document.documentElement.doScroll ) ) {
11157
11158	// Handle it asynchronously to allow scripts the opportunity to delay ready
11159	window.setTimeout( jQuery.ready );
11160
11161} else {
11162
11163	// Use the handy event callback
11164	document.addEventListener( "DOMContentLoaded", completed );
11165
11166	// A fallback to window.onload, that will always work
11167	window.addEventListener( "load", completed );
11168}
11169
11170
11171
11172
11173// Multifunctional method to get and set values of a collection
11174// The value/s can optionally be executed if it's a function
11175var access = function( elems, fn, key, value, chainable, emptyGet, raw ) {
11176	var i = 0,
11177		len = elems.length,
11178		bulk = key == null;
11179
11180	// Sets many values
11181	if ( toType( key ) === "object" ) {
11182		chainable = true;
11183		for ( i in key ) {
11184			access( elems, fn, i, key[ i ], true, emptyGet, raw );
11185		}
11186
11187	// Sets one value
11188	} else if ( value !== undefined ) {
11189		chainable = true;
11190
11191		if ( !isFunction( value ) ) {
11192			raw = true;
11193		}
11194
11195		if ( bulk ) {
11196
11197			// Bulk operations run against the entire set
11198			if ( raw ) {
11199				fn.call( elems, value );
11200				fn = null;
11201
11202			// ...except when executing function values
11203			} else {
11204				bulk = fn;
11205				fn = function( elem, _key, value ) {
11206					return bulk.call( jQuery( elem ), value );
11207				};
11208			}
11209		}
11210
11211		if ( fn ) {
11212			for ( ; i < len; i++ ) {
11213				fn(
11214					elems[ i ], key, raw ?
11215						value :
11216						value.call( elems[ i ], i, fn( elems[ i ], key ) )
11217				);
11218			}
11219		}
11220	}
11221
11222	if ( chainable ) {
11223		return elems;
11224	}
11225
11226	// Gets
11227	if ( bulk ) {
11228		return fn.call( elems );
11229	}
11230
11231	return len ? fn( elems[ 0 ], key ) : emptyGet;
11232};
11233
11234
11235// Matches dashed string for camelizing
11236var rmsPrefix = /^-ms-/,
11237	rdashAlpha = /-([a-z])/g;
11238
11239// Used by camelCase as callback to replace()
11240function fcamelCase( _all, letter ) {
11241	return letter.toUpperCase();
11242}
11243
11244// Convert dashed to camelCase; used by the css and data modules
11245// Support: IE <=9 - 11, Edge 12 - 15
11246// Microsoft forgot to hump their vendor prefix (trac-9572)
11247function camelCase( string ) {
11248	return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
11249}
11250var acceptData = function( owner ) {
11251
11252	// Accepts only:
11253	//  - Node
11254	//    - Node.ELEMENT_NODE
11255	//    - Node.DOCUMENT_NODE
11256	//  - Object
11257	//    - Any
11258	return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType );
11259};
11260
11261
11262
11263
11264function Data() {
11265	this.expando = jQuery.expando + Data.uid++;
11266}
11267
11268Data.uid = 1;
11269
11270Data.prototype = {
11271
11272	cache: function( owner ) {
11273
11274		// Check if the owner object already has a cache
11275		var value = owner[ this.expando ];
11276
11277		// If not, create one
11278		if ( !value ) {
11279			value = {};
11280
11281			// We can accept data for non-element nodes in modern browsers,
11282			// but we should not, see trac-8335.
11283			// Always return an empty object.
11284			if ( acceptData( owner ) ) {
11285
11286				// If it is a node unlikely to be stringify-ed or looped over
11287				// use plain assignment
11288				if ( owner.nodeType ) {
11289					owner[ this.expando ] = value;
11290
11291				// Otherwise secure it in a non-enumerable property
11292				// configurable must be true to allow the property to be
11293				// deleted when data is removed
11294				} else {
11295					Object.defineProperty( owner, this.expando, {
11296						value: value,
11297						configurable: true
11298					} );
11299				}
11300			}
11301		}
11302
11303		return value;
11304	},
11305	set: function( owner, data, value ) {
11306		var prop,
11307			cache = this.cache( owner );
11308
11309		// Handle: [ owner, key, value ] args
11310		// Always use camelCase key (gh-2257)
11311		if ( typeof data === "string" ) {
11312			cache[ camelCase( data ) ] = value;
11313
11314		// Handle: [ owner, { properties } ] args
11315		} else {
11316
11317			// Copy the properties one-by-one to the cache object
11318			for ( prop in data ) {
11319				cache[ camelCase( prop ) ] = data[ prop ];
11320			}
11321		}
11322		return cache;
11323	},
11324	get: function( owner, key ) {
11325		return key === undefined ?
11326			this.cache( owner ) :
11327
11328			// Always use camelCase key (gh-2257)
11329			owner[ this.expando ] && owner[ this.expando ][ camelCase( key ) ];
11330	},
11331	access: function( owner, key, value ) {
11332
11333		// In cases where either:
11334		//
11335		//   1. No key was specified
vendor: 4,579 bytes, lines 11336-11519
11336		//   2. A string key was specified, but no value provided
11337		//
11338		// Take the "read" path and allow the get method to determine
11339		// which value to return, respectively either:
11340		//
11341		//   1. The entire cache object
11342		//   2. The data stored at the key
11343		//
11344		if ( key === undefined ||
11345				( ( key && typeof key === "string" ) && value === undefined ) ) {
11346
11347			return this.get( owner, key );
11348		}
11349
11350		// When the key is not a string, or both a key and value
11351		// are specified, set or extend (existing objects) with either:
11352		//
11353		//   1. An object of properties
11354		//   2. A key and value
11355		//
11356		this.set( owner, key, value );
11357
11358		// Since the "set" path can have two possible entry points
11359		// return the expected data based on which path was taken[*]
11360		return value !== undefined ? value : key;
11361	},
11362	remove: function( owner, key ) {
11363		var i,
11364			cache = owner[ this.expando ];
11365
11366		if ( cache === undefined ) {
11367			return;
11368		}
11369
11370		if ( key !== undefined ) {
11371
11372			// Support array or space separated string of keys
11373			if ( Array.isArray( key ) ) {
11374
11375				// If key is an array of keys...
11376				// We always set camelCase keys, so remove that.
11377				key = key.map( camelCase );
11378			} else {
11379				key = camelCase( key );
11380
11381				// If a key with the spaces exists, use it.
11382				// Otherwise, create an array by matching non-whitespace
11383				key = key in cache ?
11384					[ key ] :
11385					( key.match( rnothtmlwhite ) || [] );
11386			}
11387
11388			i = key.length;
11389
11390			while ( i-- ) {
11391				delete cache[ key[ i ] ];
11392			}
11393		}
11394
11395		// Remove the expando if there's no more data
11396		if ( key === undefined || jQuery.isEmptyObject( cache ) ) {
11397
11398			// Support: Chrome <=35 - 45
11399			// Webkit & Blink performance suffers when deleting properties
11400			// from DOM nodes, so set to undefined instead
11401			// https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted)
11402			if ( owner.nodeType ) {
11403				owner[ this.expando ] = undefined;
11404			} else {
11405				delete owner[ this.expando ];
11406			}
11407		}
11408	},
11409	hasData: function( owner ) {
11410		var cache = owner[ this.expando ];
11411		return cache !== undefined && !jQuery.isEmptyObject( cache );
11412	}
11413};
11414var dataPriv = new Data();
11415
11416var dataUser = new Data();
11417
11418
11419
11420//	Implementation Summary
11421//
11422//	1. Enforce API surface and semantic compatibility with 1.9.x branch
11423//	2. Improve the module's maintainability by reducing the storage
11424//		paths to a single mechanism.
11425//	3. Use the same single mechanism to support "private" and "user" data.
11426//	4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData)
11427//	5. Avoid exposing implementation details on user objects (eg. expando properties)
11428//	6. Provide a clear path for implementation upgrade to WeakMap in 2014
11429
11430var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,
11431	rmultiDash = /[A-Z]/g;
11432
11433function getData( data ) {
11434	if ( data === "true" ) {
11435		return true;
11436	}
11437
11438	if ( data === "false" ) {
11439		return false;
11440	}
11441
11442	if ( data === "null" ) {
11443		return null;
11444	}
11445
11446	// Only convert to a number if it doesn't change the string
11447	if ( data === +data + "" ) {
11448		return +data;
11449	}
11450
11451	if ( rbrace.test( data ) ) {
11452		return JSON.parse( data );
11453	}
11454
11455	return data;
11456}
11457
11458function dataAttr( elem, key, data ) {
11459	var name;
11460
11461	// If nothing was found internally, try to fetch any
11462	// data from the HTML5 data-* attribute
11463	if ( data === undefined && elem.nodeType === 1 ) {
11464		name = "data-" + key.replace( rmultiDash, "-$&" ).toLowerCase();
11465		data = elem.getAttribute( name );
11466
11467		if ( typeof data === "string" ) {
11468			try {
11469				data = getData( data );
11470			} catch ( e ) {}
11471
11472			// Make sure we set the data so it isn't changed later
11473			dataUser.set( elem, key, data );
11474		} else {
11475			data = undefined;
11476		}
11477	}
11478	return data;
11479}
11480
11481jQuery.extend( {
11482	hasData: function( elem ) {
11483		return dataUser.hasData( elem ) || dataPriv.hasData( elem );
11484	},
11485
11486	data: function( elem, name, data ) {
11487		return dataUser.access( elem, name, data );
11488	},
11489
11490	removeData: function( elem, name ) {
11491		dataUser.remove( elem, name );
11492	},
11493
11494	// TODO: Now that all calls to _data and _removeData have been replaced
11495	// with direct calls to dataPriv methods, these can be deprecated.
11496	_data: function( elem, name, data ) {
11497		return dataPriv.access( elem, name, data );
11498	},
11499
11500	_removeData: function( elem, name ) {
11501		dataPriv.remove( elem, name );
11502	}
11503} );
11504
11505jQuery.fn.extend( {
11506	data: function( key, value ) {
11507		var i, name, data,
11508			elem = this[ 0 ],
11509			attrs = elem && elem.attributes;
11510
11511		// Gets all values
11512		if ( key === undefined ) {
11513			if ( this.length ) {
11514				data = dataUser.get( elem );
11515
11516				if ( elem.nodeType === 1 && !dataPriv.get( elem, "hasDataAttrs" ) ) {
11517					i = attrs.length;
11518					while ( i-- ) {
11519
vendor: 4,119 bytes, lines 11520-11694
11520						// Support: IE 11 only
11521						// The attrs elements can be null (trac-14894)
11522						if ( attrs[ i ] ) {
11523							name = attrs[ i ].name;
11524							if ( name.indexOf( "data-" ) === 0 ) {
11525								name = camelCase( name.slice( 5 ) );
11526								dataAttr( elem, name, data[ name ] );
11527							}
11528						}
11529					}
11530					dataPriv.set( elem, "hasDataAttrs", true );
11531				}
11532			}
11533
11534			return data;
11535		}
11536
11537		// Sets multiple values
11538		if ( typeof key === "object" ) {
11539			return this.each( function() {
11540				dataUser.set( this, key );
11541			} );
11542		}
11543
11544		return access( this, function( value ) {
11545			var data;
11546
11547			// The calling jQuery object (element matches) is not empty
11548			// (and therefore has an element appears at this[ 0 ]) and the
11549			// `value` parameter was not undefined. An empty jQuery object
11550			// will result in `undefined` for elem = this[ 0 ] which will
11551			// throw an exception if an attempt to read a data cache is made.
11552			if ( elem && value === undefined ) {
11553
11554				// Attempt to get data from the cache
11555				// The key will always be camelCased in Data
11556				data = dataUser.get( elem, key );
11557				if ( data !== undefined ) {
11558					return data;
11559				}
11560
11561				// Attempt to "discover" the data in
11562				// HTML5 custom data-* attrs
11563				data = dataAttr( elem, key );
11564				if ( data !== undefined ) {
11565					return data;
11566				}
11567
11568				// We tried really hard, but the data doesn't exist.
11569				return;
11570			}
11571
11572			// Set the data...
11573			this.each( function() {
11574
11575				// We always store the camelCased key
11576				dataUser.set( this, key, value );
11577			} );
11578		}, null, value, arguments.length > 1, null, true );
11579	},
11580
11581	removeData: function( key ) {
11582		return this.each( function() {
11583			dataUser.remove( this, key );
11584		} );
11585	}
11586} );
11587
11588
11589jQuery.extend( {
11590	queue: function( elem, type, data ) {
11591		var queue;
11592
11593		if ( elem ) {
11594			type = ( type || "fx" ) + "queue";
11595			queue = dataPriv.get( elem, type );
11596
11597			// Speed up dequeue by getting out quickly if this is just a lookup
11598			if ( data ) {
11599				if ( !queue || Array.isArray( data ) ) {
11600					queue = dataPriv.access( elem, type, jQuery.makeArray( data ) );
11601				} else {
11602					queue.push( data );
11603				}
11604			}
11605			return queue || [];
11606		}
11607	},
11608
11609	dequeue: function( elem, type ) {
11610		type = type || "fx";
11611
11612		var queue = jQuery.queue( elem, type ),
11613			startLength = queue.length,
11614			fn = queue.shift(),
11615			hooks = jQuery._queueHooks( elem, type ),
11616			next = function() {
11617				jQuery.dequeue( elem, type );
11618			};
11619
11620		// If the fx queue is dequeued, always remove the progress sentinel
11621		if ( fn === "inprogress" ) {
11622			fn = queue.shift();
11623			startLength--;
11624		}
11625
11626		if ( fn ) {
11627
11628			// Add a progress sentinel to prevent the fx queue from being
11629			// automatically dequeued
11630			if ( type === "fx" ) {
11631				queue.unshift( "inprogress" );
11632			}
11633
11634			// Clear up the last queue stop function
11635			delete hooks.stop;
11636			fn.call( elem, next, hooks );
11637		}
11638
11639		if ( !startLength && hooks ) {
11640			hooks.empty.fire();
11641		}
11642	},
11643
11644	// Not public - generate a queueHooks object, or return the current one
11645	_queueHooks: function( elem, type ) {
11646		var key = type + "queueHooks";
11647		return dataPriv.get( elem, key ) || dataPriv.access( elem, key, {
11648			empty: jQuery.Callbacks( "once memory" ).add( function() {
11649				dataPriv.remove( elem, [ type + "queue", key ] );
11650			} )
11651		} );
11652	}
11653} );
11654
11655jQuery.fn.extend( {
11656	queue: function( type, data ) {
11657		var setter = 2;
11658
11659		if ( typeof type !== "string" ) {
11660			data = type;
11661			type = "fx";
11662			setter--;
11663		}
11664
11665		if ( arguments.length < setter ) {
11666			return jQuery.queue( this[ 0 ], type );
11667		}
11668
11669		return data === undefined ?
11670			this :
11671			this.each( function() {
11672				var queue = jQuery.queue( this, type, data );
11673
11674				// Ensure a hooks for this queue
11675				jQuery._queueHooks( this, type );
11676
11677				if ( type === "fx" && queue[ 0 ] !== "inprogress" ) {
11678					jQuery.dequeue( this, type );
11679				}
11680			} );
11681	},
11682	dequeue: function( type ) {
11683		return this.each( function() {
11684			jQuery.dequeue( this, type );
11685		} );
11686	},
11687	clearQueue: function( type ) {
11688		return this.queue( type || "fx", [] );
11689	},
11690
11691	// Get a promise resolved when queues of a certain type
11692	// are emptied (fx is the type by default)
11693	promise: function( type, obj ) {
11694		var tmp,
vendor: 6,339 bytes, lines 11695-11943
11695			count = 1,
11696			defer = jQuery.Deferred(),
11697			elements = this,
11698			i = this.length,
11699			resolve = function() {
11700				if ( !( --count ) ) {
11701					defer.resolveWith( elements, [ elements ] );
11702				}
11703			};
11704
11705		if ( typeof type !== "string" ) {
11706			obj = type;
11707			type = undefined;
11708		}
11709		type = type || "fx";
11710
11711		while ( i-- ) {
11712			tmp = dataPriv.get( elements[ i ], type + "queueHooks" );
11713			if ( tmp && tmp.empty ) {
11714				count++;
11715				tmp.empty.add( resolve );
11716			}
11717		}
11718		resolve();
11719		return defer.promise( obj );
11720	}
11721} );
11722var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source;
11723
11724var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" );
11725
11726
11727var cssExpand = [ "Top", "Right", "Bottom", "Left" ];
11728
11729var documentElement = document.documentElement;
11730
11731
11732
11733	var isAttached = function( elem ) {
11734			return jQuery.contains( elem.ownerDocument, elem );
11735		},
11736		composed = { composed: true };
11737
11738	// Support: IE 9 - 11+, Edge 12 - 18+, iOS 10.0 - 10.2 only
11739	// Check attachment across shadow DOM boundaries when possible (gh-3504)
11740	// Support: iOS 10.0-10.2 only
11741	// Early iOS 10 versions support `attachShadow` but not `getRootNode`,
11742	// leading to errors. We need to check for `getRootNode`.
11743	if ( documentElement.getRootNode ) {
11744		isAttached = function( elem ) {
11745			return jQuery.contains( elem.ownerDocument, elem ) ||
11746				elem.getRootNode( composed ) === elem.ownerDocument;
11747		};
11748	}
11749var isHiddenWithinTree = function( elem, el ) {
11750
11751		// isHiddenWithinTree might be called from jQuery#filter function;
11752		// in that case, element will be second argument
11753		elem = el || elem;
11754
11755		// Inline style trumps all
11756		return elem.style.display === "none" ||
11757			elem.style.display === "" &&
11758
11759			// Otherwise, check computed style
11760			// Support: Firefox <=43 - 45
11761			// Disconnected elements can have computed display: none, so first confirm that elem is
11762			// in the document.
11763			isAttached( elem ) &&
11764
11765			jQuery.css( elem, "display" ) === "none";
11766	};
11767
11768
11769
11770function adjustCSS( elem, prop, valueParts, tween ) {
11771	var adjusted, scale,
11772		maxIterations = 20,
11773		currentValue = tween ?
11774			function() {
11775				return tween.cur();
11776			} :
11777			function() {
11778				return jQuery.css( elem, prop, "" );
11779			},
11780		initial = currentValue(),
11781		unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ),
11782
11783		// Starting value computation is required for potential unit mismatches
11784		initialInUnit = elem.nodeType &&
11785			( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) &&
11786			rcssNum.exec( jQuery.css( elem, prop ) );
11787
11788	if ( initialInUnit && initialInUnit[ 3 ] !== unit ) {
11789
11790		// Support: Firefox <=54
11791		// Halve the iteration target value to prevent interference from CSS upper bounds (gh-2144)
11792		initial = initial / 2;
11793
11794		// Trust units reported by jQuery.css
11795		unit = unit || initialInUnit[ 3 ];
11796
11797		// Iteratively approximate from a nonzero starting point
11798		initialInUnit = +initial || 1;
11799
11800		while ( maxIterations-- ) {
11801
11802			// Evaluate and update our best guess (doubling guesses that zero out).
11803			// Finish if the scale equals or crosses 1 (making the old*new product non-positive).
11804			jQuery.style( elem, prop, initialInUnit + unit );
11805			if ( ( 1 - scale ) * ( 1 - ( scale = currentValue() / initial || 0.5 ) ) <= 0 ) {
11806				maxIterations = 0;
11807			}
11808			initialInUnit = initialInUnit / scale;
11809
11810		}
11811
11812		initialInUnit = initialInUnit * 2;
11813		jQuery.style( elem, prop, initialInUnit + unit );
11814
11815		// Make sure we update the tween properties later on
11816		valueParts = valueParts || [];
11817	}
11818
11819	if ( valueParts ) {
11820		initialInUnit = +initialInUnit || +initial || 0;
11821
11822		// Apply relative offset (+=/-=) if specified
11823		adjusted = valueParts[ 1 ] ?
11824			initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] :
11825			+valueParts[ 2 ];
11826		if ( tween ) {
11827			tween.unit = unit;
11828			tween.start = initialInUnit;
11829			tween.end = adjusted;
11830		}
11831	}
11832	return adjusted;
11833}
11834
11835
11836var defaultDisplayMap = {};
11837
11838function getDefaultDisplay( elem ) {
11839	var temp,
11840		doc = elem.ownerDocument,
11841		nodeName = elem.nodeName,
11842		display = defaultDisplayMap[ nodeName ];
11843
11844	if ( display ) {
11845		return display;
11846	}
11847
11848	temp = doc.body.appendChild( doc.createElement( nodeName ) );
11849	display = jQuery.css( temp, "display" );
11850
11851	temp.parentNode.removeChild( temp );
11852
11853	if ( display === "none" ) {
11854		display = "block";
11855	}
11856	defaultDisplayMap[ nodeName ] = display;
11857
11858	return display;
11859}
11860
11861function showHide( elements, show ) {
11862	var display, elem,
11863		values = [],
11864		index = 0,
11865		length = elements.length;
11866
11867	// Determine new display value for elements that need to change
11868	for ( ; index < length; index++ ) {
11869		elem = elements[ index ];
11870		if ( !elem.style ) {
11871			continue;
11872		}
11873
11874		display = elem.style.display;
11875		if ( show ) {
11876
11877			// Since we force visibility upon cascade-hidden elements, an immediate (and slow)
11878			// check is required in this first loop unless we have a nonempty display value (either
11879			// inline or about-to-be-restored)
11880			if ( display === "none" ) {
11881				values[ index ] = dataPriv.get( elem, "display" ) || null;
11882				if ( !values[ index ] ) {
11883					elem.style.display = "";
11884				}
11885			}
11886			if ( elem.style.display === "" && isHiddenWithinTree( elem ) ) {
11887				values[ index ] = getDefaultDisplay( elem );
11888			}
11889		} else {
11890			if ( display !== "none" ) {
11891				values[ index ] = "none";
11892
11893				// Remember what we're overwriting
11894				dataPriv.set( elem, "display", display );
11895			}
11896		}
11897	}
11898
11899	// Set the display of the elements in a second loop to avoid constant reflow
11900	for ( index = 0; index < length; index++ ) {
11901		if ( values[ index ] != null ) {
11902			elements[ index ].style.display = values[ index ];
11903		}
11904	}
11905
11906	return elements;
11907}
11908
11909jQuery.fn.extend( {
11910	show: function() {
11911		return showHide( this, true );
11912	},
11913	hide: function() {
11914		return showHide( this );
11915	},
11916	toggle: function( state ) {
11917		if ( typeof state === "boolean" ) {
11918			return state ? this.show() : this.hide();
11919		}
11920
11921		return this.each( function() {
11922			if ( isHiddenWithinTree( this ) ) {
11923				jQuery( this ).show();
11924			} else {
11925				jQuery( this ).hide();
11926			}
11927		} );
11928	}
11929} );
11930var rcheckableType = ( /^(?:checkbox|radio)$/i );
11931
11932var rtagName = ( /<([a-z][^\/\0>\x20\t\r\n\f]*)/i );
11933
11934var rscriptType = ( /^$|^module$|\/(?:java|ecma)script/i );
11935
11936
11937
11938( function() {
11939	var fragment = document.createDocumentFragment(),
11940		div = fragment.appendChild( document.createElement( "div" ) ),
11941		input = document.createElement( "input" );
11942
11943	// Support: Android 4.0 - 4.3 only
vendor: 4,796 bytes, lines 11944-12131
11944	// Check state lost if the name is set (trac-11217)
11945	// Support: Windows Web Apps (WWA)
11946	// `name` and `type` must use .setAttribute for WWA (trac-14901)
11947	input.setAttribute( "type", "radio" );
11948	input.setAttribute( "checked", "checked" );
11949	input.setAttribute( "name", "t" );
11950
11951	div.appendChild( input );
11952
11953	// Support: Android <=4.1 only
11954	// Older WebKit doesn't clone checked state correctly in fragments
11955	support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;
11956
11957	// Support: IE <=11 only
11958	// Make sure textarea (and checkbox) defaultValue is properly cloned
11959	div.innerHTML = "<textarea>x</textarea>";
11960	support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;
11961
11962	// Support: IE <=9 only
11963	// IE <=9 replaces <option> tags with their contents when inserted outside of
11964	// the select element.
11965	div.innerHTML = "<option></option>";
11966	support.option = !!div.lastChild;
11967} )();
11968
11969
11970// We have to close these tags to support XHTML (trac-13200)
11971var wrapMap = {
11972
11973	// XHTML parsers do not magically insert elements in the
11974	// same way that tag soup parsers do. So we cannot shorten
11975	// this by omitting <tbody> or other required elements.
11976	thead: [ 1, "<table>", "</table>" ],
11977	col: [ 2, "<table><colgroup>", "</colgroup></table>" ],
11978	tr: [ 2, "<table><tbody>", "</tbody></table>" ],
11979	td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
11980
11981	_default: [ 0, "", "" ]
11982};
11983
11984wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
11985wrapMap.th = wrapMap.td;
11986
11987// Support: IE <=9 only
11988if ( !support.option ) {
11989	wrapMap.optgroup = wrapMap.option = [ 1, "<select multiple='multiple'>", "</select>" ];
11990}
11991
11992
11993function getAll( context, tag ) {
11994
11995	// Support: IE <=9 - 11 only
11996	// Use typeof to avoid zero-argument method invocation on host objects (trac-15151)
11997	var ret;
11998
11999	if ( typeof context.getElementsByTagName !== "undefined" ) {
12000		ret = context.getElementsByTagName( tag || "*" );
12001
12002	} else if ( typeof context.querySelectorAll !== "undefined" ) {
12003		ret = context.querySelectorAll( tag || "*" );
12004
12005	} else {
12006		ret = [];
12007	}
12008
12009	if ( tag === undefined || tag && nodeName( context, tag ) ) {
12010		return jQuery.merge( [ context ], ret );
12011	}
12012
12013	return ret;
12014}
12015
12016
12017// Mark scripts as having already been evaluated
12018function setGlobalEval( elems, refElements ) {
12019	var i = 0,
12020		l = elems.length;
12021
12022	for ( ; i < l; i++ ) {
12023		dataPriv.set(
12024			elems[ i ],
12025			"globalEval",
12026			!refElements || dataPriv.get( refElements[ i ], "globalEval" )
12027		);
12028	}
12029}
12030
12031
12032var rhtml = /<|&#?\w+;/;
12033
12034function buildFragment( elems, context, scripts, selection, ignored ) {
12035	var elem, tmp, tag, wrap, attached, j,
12036		fragment = context.createDocumentFragment(),
12037		nodes = [],
12038		i = 0,
12039		l = elems.length;
12040
12041	for ( ; i < l; i++ ) {
12042		elem = elems[ i ];
12043
12044		if ( elem || elem === 0 ) {
12045
12046			// Add nodes directly
12047			if ( toType( elem ) === "object" ) {
12048
12049				// Support: Android <=4.0 only, PhantomJS 1 only
12050				// push.apply(_, arraylike) throws on ancient WebKit
12051				jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );
12052
12053			// Convert non-html into a text node
12054			} else if ( !rhtml.test( elem ) ) {
12055				nodes.push( context.createTextNode( elem ) );
12056
12057			// Convert html into DOM nodes
12058			} else {
12059				tmp = tmp || fragment.appendChild( context.createElement( "div" ) );
12060
12061				// Deserialize a standard representation
12062				tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase();
12063				wrap = wrapMap[ tag ] || wrapMap._default;
12064				tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ];
12065
12066				// Descend through wrappers to the right content
12067				j = wrap[ 0 ];
12068				while ( j-- ) {
12069					tmp = tmp.lastChild;
12070				}
12071
12072				// Support: Android <=4.0 only, PhantomJS 1 only
12073				// push.apply(_, arraylike) throws on ancient WebKit
12074				jQuery.merge( nodes, tmp.childNodes );
12075
12076				// Remember the top-level container
12077				tmp = fragment.firstChild;
12078
12079				// Ensure the created nodes are orphaned (trac-12392)
12080				tmp.textContent = "";
12081			}
12082		}
12083	}
12084
12085	// Remove wrapper from fragment
12086	fragment.textContent = "";
12087
12088	i = 0;
12089	while ( ( elem = nodes[ i++ ] ) ) {
12090
12091		// Skip elements already in the context collection (trac-4087)
12092		if ( selection && jQuery.inArray( elem, selection ) > -1 ) {
12093			if ( ignored ) {
12094				ignored.push( elem );
12095			}
12096			continue;
12097		}
12098
12099		attached = isAttached( elem );
12100
12101		// Append to fragment
12102		tmp = getAll( fragment.appendChild( elem ), "script" );
12103
12104		// Preserve script evaluation history
12105		if ( attached ) {
12106			setGlobalEval( tmp );
12107		}
12108
12109		// Capture executables
12110		if ( scripts ) {
12111			j = 0;
12112			while ( ( elem = tmp[ j++ ] ) ) {
12113				if ( rscriptType.test( elem.type || "" ) ) {
12114					scripts.push( elem );
12115				}
12116			}
12117		}
12118	}
12119
12120	return fragment;
12121}
12122
12123
12124var rtypenamespace = /^([^.]*)(?:\.(.+)|)/;
12125
12126function returnTrue() {
12127	return true;
12128}
12129
12130function returnFalse() {
12131	return false;
vendor: 10,171 bytes, lines 12132-12486
12132}
12133
12134// Support: IE <=9 - 11+
12135// focus() and blur() are asynchronous, except when they are no-op.
12136// So expect focus to be synchronous when the element is already active,
12137// and blur to be synchronous when the element is not already active.
12138// (focus and blur are always synchronous in other supported browsers,
12139// this just defines when we can count on it).
12140function expectSync( elem, type ) {
12141	return ( elem === safeActiveElement() ) === ( type === "focus" );
12142}
12143
12144// Support: IE <=9 only
12145// Accessing document.activeElement can throw unexpectedly
12146// https://bugs.jquery.com/ticket/13393
12147function safeActiveElement() {
12148	try {
12149		return document.activeElement;
12150	} catch ( err ) { }
12151}
12152
12153function on( elem, types, selector, data, fn, one ) {
12154	var origFn, type;
12155
12156	// Types can be a map of types/handlers
12157	if ( typeof types === "object" ) {
12158
12159		// ( types-Object, selector, data )
12160		if ( typeof selector !== "string" ) {
12161
12162			// ( types-Object, data )
12163			data = data || selector;
12164			selector = undefined;
12165		}
12166		for ( type in types ) {
12167			on( elem, type, selector, data, types[ type ], one );
12168		}
12169		return elem;
12170	}
12171
12172	if ( data == null && fn == null ) {
12173
12174		// ( types, fn )
12175		fn = selector;
12176		data = selector = undefined;
12177	} else if ( fn == null ) {
12178		if ( typeof selector === "string" ) {
12179
12180			// ( types, selector, fn )
12181			fn = data;
12182			data = undefined;
12183		} else {
12184
12185			// ( types, data, fn )
12186			fn = data;
12187			data = selector;
12188			selector = undefined;
12189		}
12190	}
12191	if ( fn === false ) {
12192		fn = returnFalse;
12193	} else if ( !fn ) {
12194		return elem;
12195	}
12196
12197	if ( one === 1 ) {
12198		origFn = fn;
12199		fn = function( event ) {
12200
12201			// Can use an empty set, since event contains the info
12202			jQuery().off( event );
12203			return origFn.apply( this, arguments );
12204		};
12205
12206		// Use same guid so caller can remove using origFn
12207		fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );
12208	}
12209	return elem.each( function() {
12210		jQuery.event.add( this, types, fn, data, selector );
12211	} );
12212}
12213
12214/*
12215 * Helper functions for managing events -- not part of the public interface.
12216 * Props to Dean Edwards' addEvent library for many of the ideas.
12217 */
12218jQuery.event = {
12219
12220	global: {},
12221
12222	add: function( elem, types, handler, data, selector ) {
12223
12224		var handleObjIn, eventHandle, tmp,
12225			events, t, handleObj,
12226			special, handlers, type, namespaces, origType,
12227			elemData = dataPriv.get( elem );
12228
12229		// Only attach events to objects that accept data
12230		if ( !acceptData( elem ) ) {
12231			return;
12232		}
12233
12234		// Caller can pass in an object of custom data in lieu of the handler
12235		if ( handler.handler ) {
12236			handleObjIn = handler;
12237			handler = handleObjIn.handler;
12238			selector = handleObjIn.selector;
12239		}
12240
12241		// Ensure that invalid selectors throw exceptions at attach time
12242		// Evaluate against documentElement in case elem is a non-element node (e.g., document)
12243		if ( selector ) {
12244			jQuery.find.matchesSelector( documentElement, selector );
12245		}
12246
12247		// Make sure that the handler has a unique ID, used to find/remove it later
12248		if ( !handler.guid ) {
12249			handler.guid = jQuery.guid++;
12250		}
12251
12252		// Init the element's event structure and main handler, if this is the first
12253		if ( !( events = elemData.events ) ) {
12254			events = elemData.events = Object.create( null );
12255		}
12256		if ( !( eventHandle = elemData.handle ) ) {
12257			eventHandle = elemData.handle = function( e ) {
12258
12259				// Discard the second event of a jQuery.event.trigger() and
12260				// when an event is called after a page has unloaded
12261				return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ?
12262					jQuery.event.dispatch.apply( elem, arguments ) : undefined;
12263			};
12264		}
12265
12266		// Handle multiple events separated by a space
12267		types = ( types || "" ).match( rnothtmlwhite ) || [ "" ];
12268		t = types.length;
12269		while ( t-- ) {
12270			tmp = rtypenamespace.exec( types[ t ] ) || [];
12271			type = origType = tmp[ 1 ];
12272			namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort();
12273
12274			// There *must* be a type, no attaching namespace-only handlers
12275			if ( !type ) {
12276				continue;
12277			}
12278
12279			// If event changes its type, use the special event handlers for the changed type
12280			special = jQuery.event.special[ type ] || {};
12281
12282			// If selector defined, determine special event api type, otherwise given type
12283			type = ( selector ? special.delegateType : special.bindType ) || type;
12284
12285			// Update special based on newly reset type
12286			special = jQuery.event.special[ type ] || {};
12287
12288			// handleObj is passed to all event handlers
12289			handleObj = jQuery.extend( {
12290				type: type,
12291				origType: origType,
12292				data: data,
12293				handler: handler,
12294				guid: handler.guid,
12295				selector: selector,
12296				needsContext: selector && jQuery.expr.match.needsContext.test( selector ),
12297				namespace: namespaces.join( "." )
12298			}, handleObjIn );
12299
12300			// Init the event handler queue if we're the first
12301			if ( !( handlers = events[ type ] ) ) {
12302				handlers = events[ type ] = [];
12303				handlers.delegateCount = 0;
12304
12305				// Only use addEventListener if the special events handler returns false
12306				if ( !special.setup ||
12307					special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
12308
12309					if ( elem.addEventListener ) {
12310						elem.addEventListener( type, eventHandle );
12311					}
12312				}
12313			}
12314
12315			if ( special.add ) {
12316				special.add.call( elem, handleObj );
12317
12318				if ( !handleObj.handler.guid ) {
12319					handleObj.handler.guid = handler.guid;
12320				}
12321			}
12322
12323			// Add to the element's handler list, delegates in front
12324			if ( selector ) {
12325				handlers.splice( handlers.delegateCount++, 0, handleObj );
12326			} else {
12327				handlers.push( handleObj );
12328			}
12329
12330			// Keep track of which events have ever been used, for event optimization
12331			jQuery.event.global[ type ] = true;
12332		}
12333
12334	},
12335
12336	// Detach an event or set of events from an element
12337	remove: function( elem, types, handler, selector, mappedTypes ) {
12338
12339		var j, origCount, tmp,
12340			events, t, handleObj,
12341			special, handlers, type, namespaces, origType,
12342			elemData = dataPriv.hasData( elem ) && dataPriv.get( elem );
12343
12344		if ( !elemData || !( events = elemData.events ) ) {
12345			return;
12346		}
12347
12348		// Once for each type.namespace in types; type may be omitted
12349		types = ( types || "" ).match( rnothtmlwhite ) || [ "" ];
12350		t = types.length;
12351		while ( t-- ) {
12352			tmp = rtypenamespace.exec( types[ t ] ) || [];
12353			type = origType = tmp[ 1 ];
12354			namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort();
12355
12356			// Unbind all events (on this namespace, if provided) for the element
12357			if ( !type ) {
12358				for ( type in events ) {
12359					jQuery.event.remove( elem, type + types[ t ], handler, selector, true );
12360				}
12361				continue;
12362			}
12363
12364			special = jQuery.event.special[ type ] || {};
12365			type = ( selector ? special.delegateType : special.bindType ) || type;
12366			handlers = events[ type ] || [];
12367			tmp = tmp[ 2 ] &&
12368				new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" );
12369
12370			// Remove matching events
12371			origCount = j = handlers.length;
12372			while ( j-- ) {
12373				handleObj = handlers[ j ];
12374
12375				if ( ( mappedTypes || origType === handleObj.origType ) &&
12376					( !handler || handler.guid === handleObj.guid ) &&
12377					( !tmp || tmp.test( handleObj.namespace ) ) &&
12378					( !selector || selector === handleObj.selector ||
12379						selector === "**" && handleObj.selector ) ) {
12380					handlers.splice( j, 1 );
12381
12382					if ( handleObj.selector ) {
12383						handlers.delegateCount--;
12384					}
12385					if ( special.remove ) {
12386						special.remove.call( elem, handleObj );
12387					}
12388				}
12389			}
12390
12391			// Remove generic event handler if we removed something and no more handlers exist
12392			// (avoids potential for endless recursion during removal of special event handlers)
12393			if ( origCount && !handlers.length ) {
12394				if ( !special.teardown ||
12395					special.teardown.call( elem, namespaces, elemData.handle ) === false ) {
12396
12397					jQuery.removeEvent( elem, type, elemData.handle );
12398				}
12399
12400				delete events[ type ];
12401			}
12402		}
12403
12404		// Remove data and the expando if it's no longer used
12405		if ( jQuery.isEmptyObject( events ) ) {
12406			dataPriv.remove( elem, "handle events" );
12407		}
12408	},
12409
12410	dispatch: function( nativeEvent ) {
12411
12412		var i, j, ret, matched, handleObj, handlerQueue,
12413			args = new Array( arguments.length ),
12414
12415			// Make a writable jQuery.Event from the native event object
12416			event = jQuery.event.fix( nativeEvent ),
12417
12418			handlers = (
12419				dataPriv.get( this, "events" ) || Object.create( null )
12420			)[ event.type ] || [],
12421			special = jQuery.event.special[ event.type ] || {};
12422
12423		// Use the fix-ed jQuery.Event rather than the (read-only) native event
12424		args[ 0 ] = event;
12425
12426		for ( i = 1; i < arguments.length; i++ ) {
12427			args[ i ] = arguments[ i ];
12428		}
12429
12430		event.delegateTarget = this;
12431
12432		// Call the preDispatch hook for the mapped type, and let it bail if desired
12433		if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {
12434			return;
12435		}
12436
12437		// Determine handlers
12438		handlerQueue = jQuery.event.handlers.call( this, event, handlers );
12439
12440		// Run delegates first; they may want to stop propagation beneath us
12441		i = 0;
12442		while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) {
12443			event.currentTarget = matched.elem;
12444
12445			j = 0;
12446			while ( ( handleObj = matched.handlers[ j++ ] ) &&
12447				!event.isImmediatePropagationStopped() ) {
12448
12449				// If the event is namespaced, then each handler is only invoked if it is
12450				// specially universal or its namespaces are a superset of the event's.
12451				if ( !event.rnamespace || handleObj.namespace === false ||
12452					event.rnamespace.test( handleObj.namespace ) ) {
12453
12454					event.handleObj = handleObj;
12455					event.data = handleObj.data;
12456
12457					ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle ||
12458						handleObj.handler ).apply( matched.elem, args );
12459
12460					if ( ret !== undefined ) {
12461						if ( ( event.result = ret ) === false ) {
12462							event.preventDefault();
12463							event.stopPropagation();
12464						}
12465					}
12466				}
12467			}
12468		}
12469
12470		// Call the postDispatch hook for the mapped type
12471		if ( special.postDispatch ) {
12472			special.postDispatch.call( this, event );
12473		}
12474
12475		return event.result;
12476	},
12477
12478	handlers: function( event, handlers ) {
12479		var i, handleObj, sel, matchedHandlers, matchedSelectors,
12480			handlerQueue = [],
12481			delegateCount = handlers.delegateCount,
12482			cur = event.target;
12483
12484		// Find delegate handlers
12485		if ( delegateCount &&
12486
vendor: 21,304 bytes, lines 12487-13247
12487			// Support: IE <=9
12488			// Black-hole SVG <use> instance trees (trac-13180)
12489			cur.nodeType &&
12490
12491			// Support: Firefox <=42
12492			// Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861)
12493			// https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click
12494			// Support: IE 11 only
12495			// ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343)
12496			!( event.type === "click" && event.button >= 1 ) ) {
12497
12498			for ( ; cur !== this; cur = cur.parentNode || this ) {
12499
12500				// Don't check non-elements (trac-13208)
12501				// Don't process clicks on disabled elements (trac-6911, trac-8165, trac-11382, trac-11764)
12502				if ( cur.nodeType === 1 && !( event.type === "click" && cur.disabled === true ) ) {
12503					matchedHandlers = [];
12504					matchedSelectors = {};
12505					for ( i = 0; i < delegateCount; i++ ) {
12506						handleObj = handlers[ i ];
12507
12508						// Don't conflict with Object.prototype properties (trac-13203)
12509						sel = handleObj.selector + " ";
12510
12511						if ( matchedSelectors[ sel ] === undefined ) {
12512							matchedSelectors[ sel ] = handleObj.needsContext ?
12513								jQuery( sel, this ).index( cur ) > -1 :
12514								jQuery.find( sel, this, null, [ cur ] ).length;
12515						}
12516						if ( matchedSelectors[ sel ] ) {
12517							matchedHandlers.push( handleObj );
12518						}
12519					}
12520					if ( matchedHandlers.length ) {
12521						handlerQueue.push( { elem: cur, handlers: matchedHandlers } );
12522					}
12523				}
12524			}
12525		}
12526
12527		// Add the remaining (directly-bound) handlers
12528		cur = this;
12529		if ( delegateCount < handlers.length ) {
12530			handlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } );
12531		}
12532
12533		return handlerQueue;
12534	},
12535
12536	addProp: function( name, hook ) {
12537		Object.defineProperty( jQuery.Event.prototype, name, {
12538			enumerable: true,
12539			configurable: true,
12540
12541			get: isFunction( hook ) ?
12542				function() {
12543					if ( this.originalEvent ) {
12544						return hook( this.originalEvent );
12545					}
12546				} :
12547				function() {
12548					if ( this.originalEvent ) {
12549						return this.originalEvent[ name ];
12550					}
12551				},
12552
12553			set: function( value ) {
12554				Object.defineProperty( this, name, {
12555					enumerable: true,
12556					configurable: true,
12557					writable: true,
12558					value: value
12559				} );
12560			}
12561		} );
12562	},
12563
12564	fix: function( originalEvent ) {
12565		return originalEvent[ jQuery.expando ] ?
12566			originalEvent :
12567			new jQuery.Event( originalEvent );
12568	},
12569
12570	special: {
12571		load: {
12572
12573			// Prevent triggered image.load events from bubbling to window.load
12574			noBubble: true
12575		},
12576		click: {
12577
12578			// Utilize native event to ensure correct state for checkable inputs
12579			setup: function( data ) {
12580
12581				// For mutual compressibility with _default, replace `this` access with a local var.
12582				// `|| data` is dead code meant only to preserve the variable through minification.
12583				var el = this || data;
12584
12585				// Claim the first handler
12586				if ( rcheckableType.test( el.type ) &&
12587					el.click && nodeName( el, "input" ) ) {
12588
12589					// dataPriv.set( el, "click", ... )
12590					leverageNative( el, "click", returnTrue );
12591				}
12592
12593				// Return false to allow normal processing in the caller
12594				return false;
12595			},
12596			trigger: function( data ) {
12597
12598				// For mutual compressibility with _default, replace `this` access with a local var.
12599				// `|| data` is dead code meant only to preserve the variable through minification.
12600				var el = this || data;
12601
12602				// Force setup before triggering a click
12603				if ( rcheckableType.test( el.type ) &&
12604					el.click && nodeName( el, "input" ) ) {
12605
12606					leverageNative( el, "click" );
12607				}
12608
12609				// Return non-false to allow normal event-path propagation
12610				return true;
12611			},
12612
12613			// For cross-browser consistency, suppress native .click() on links
12614			// Also prevent it if we're currently inside a leveraged native-event stack
12615			_default: function( event ) {
12616				var target = event.target;
12617				return rcheckableType.test( target.type ) &&
12618					target.click && nodeName( target, "input" ) &&
12619					dataPriv.get( target, "click" ) ||
12620					nodeName( target, "a" );
12621			}
12622		},
12623
12624		beforeunload: {
12625			postDispatch: function( event ) {
12626
12627				// Support: Firefox 20+
12628				// Firefox doesn't alert if the returnValue field is not set.
12629				if ( event.result !== undefined && event.originalEvent ) {
12630					event.originalEvent.returnValue = event.result;
12631				}
12632			}
12633		}
12634	}
12635};
12636
12637// Ensure the presence of an event listener that handles manually-triggered
12638// synthetic events by interrupting progress until reinvoked in response to
12639// *native* events that it fires directly, ensuring that state changes have
12640// already occurred before other listeners are invoked.
12641function leverageNative( el, type, expectSync ) {
12642
12643	// Missing expectSync indicates a trigger call, which must force setup through jQuery.event.add
12644	if ( !expectSync ) {
12645		if ( dataPriv.get( el, type ) === undefined ) {
12646			jQuery.event.add( el, type, returnTrue );
12647		}
12648		return;
12649	}
12650
12651	// Register the controller as a special universal handler for all event namespaces
12652	dataPriv.set( el, type, false );
12653	jQuery.event.add( el, type, {
12654		namespace: false,
12655		handler: function( event ) {
12656			var notAsync, result,
12657				saved = dataPriv.get( this, type );
12658
12659			if ( ( event.isTrigger & 1 ) && this[ type ] ) {
12660
12661				// Interrupt processing of the outer synthetic .trigger()ed event
12662				// Saved data should be false in such cases, but might be a leftover capture object
12663				// from an async native handler (gh-4350)
12664				if ( !saved.length ) {
12665
12666					// Store arguments for use when handling the inner native event
12667					// There will always be at least one argument (an event object), so this array
12668					// will not be confused with a leftover capture object.
12669					saved = slice.call( arguments );
12670					dataPriv.set( this, type, saved );
12671
12672					// Trigger the native event and capture its result
12673					// Support: IE <=9 - 11+
12674					// focus() and blur() are asynchronous
12675					notAsync = expectSync( this, type );
12676					this[ type ]();
12677					result = dataPriv.get( this, type );
12678					if ( saved !== result || notAsync ) {
12679						dataPriv.set( this, type, false );
12680					} else {
12681						result = {};
12682					}
12683					if ( saved !== result ) {
12684
12685						// Cancel the outer synthetic event
12686						event.stopImmediatePropagation();
12687						event.preventDefault();
12688
12689						// Support: Chrome 86+
12690						// In Chrome, if an element having a focusout handler is blurred by
12691						// clicking outside of it, it invokes the handler synchronously. If
12692						// that handler calls `.remove()` on the element, the data is cleared,
12693						// leaving `result` undefined. We need to guard against this.
12694						return result && result.value;
12695					}
12696
12697				// If this is an inner synthetic event for an event with a bubbling surrogate
12698				// (focus or blur), assume that the surrogate already propagated from triggering the
12699				// native event and prevent that from happening again here.
12700				// This technically gets the ordering wrong w.r.t. to `.trigger()` (in which the
12701				// bubbling surrogate propagates *after* the non-bubbling base), but that seems
12702				// less bad than duplication.
12703				} else if ( ( jQuery.event.special[ type ] || {} ).delegateType ) {
12704					event.stopPropagation();
12705				}
12706
12707			// If this is a native event triggered above, everything is now in order
12708			// Fire an inner synthetic event with the original arguments
12709			} else if ( saved.length ) {
12710
12711				// ...and capture the result
12712				dataPriv.set( this, type, {
12713					value: jQuery.event.trigger(
12714
12715						// Support: IE <=9 - 11+
12716						// Extend with the prototype to reset the above stopImmediatePropagation()
12717						jQuery.extend( saved[ 0 ], jQuery.Event.prototype ),
12718						saved.slice( 1 ),
12719						this
12720					)
12721				} );
12722
12723				// Abort handling of the native event
12724				event.stopImmediatePropagation();
12725			}
12726		}
12727	} );
12728}
12729
12730jQuery.removeEvent = function( elem, type, handle ) {
12731
12732	// This "if" is needed for plain objects
12733	if ( elem.removeEventListener ) {
12734		elem.removeEventListener( type, handle );
12735	}
12736};
12737
12738jQuery.Event = function( src, props ) {
12739
12740	// Allow instantiation without the 'new' keyword
12741	if ( !( this instanceof jQuery.Event ) ) {
12742		return new jQuery.Event( src, props );
12743	}
12744
12745	// Event object
12746	if ( src && src.type ) {
12747		this.originalEvent = src;
12748		this.type = src.type;
12749
12750		// Events bubbling up the document may have been marked as prevented
12751		// by a handler lower down the tree; reflect the correct value.
12752		this.isDefaultPrevented = src.defaultPrevented ||
12753				src.defaultPrevented === undefined &&
12754
12755				// Support: Android <=2.3 only
12756				src.returnValue === false ?
12757			returnTrue :
12758			returnFalse;
12759
12760		// Create target properties
12761		// Support: Safari <=6 - 7 only
12762		// Target should not be a text node (trac-504, trac-13143)
12763		this.target = ( src.target && src.target.nodeType === 3 ) ?
12764			src.target.parentNode :
12765			src.target;
12766
12767		this.currentTarget = src.currentTarget;
12768		this.relatedTarget = src.relatedTarget;
12769
12770	// Event type
12771	} else {
12772		this.type = src;
12773	}
12774
12775	// Put explicitly provided properties onto the event object
12776	if ( props ) {
12777		jQuery.extend( this, props );
12778	}
12779
12780	// Create a timestamp if incoming event doesn't have one
12781	this.timeStamp = src && src.timeStamp || Date.now();
12782
12783	// Mark it as fixed
12784	this[ jQuery.expando ] = true;
12785};
12786
12787// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
12788// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
12789jQuery.Event.prototype = {
12790	constructor: jQuery.Event,
12791	isDefaultPrevented: returnFalse,
12792	isPropagationStopped: returnFalse,
12793	isImmediatePropagationStopped: returnFalse,
12794	isSimulated: false,
12795
12796	preventDefault: function() {
12797		var e = this.originalEvent;
12798
12799		this.isDefaultPrevented = returnTrue;
12800
12801		if ( e && !this.isSimulated ) {
12802			e.preventDefault();
12803		}
12804	},
12805	stopPropagation: function() {
12806		var e = this.originalEvent;
12807
12808		this.isPropagationStopped = returnTrue;
12809
12810		if ( e && !this.isSimulated ) {
12811			e.stopPropagation();
12812		}
12813	},
12814	stopImmediatePropagation: function() {
12815		var e = this.originalEvent;
12816
12817		this.isImmediatePropagationStopped = returnTrue;
12818
12819		if ( e && !this.isSimulated ) {
12820			e.stopImmediatePropagation();
12821		}
12822
12823		this.stopPropagation();
12824	}
12825};
12826
12827// Includes all common event props including KeyEvent and MouseEvent specific props
12828jQuery.each( {
12829	altKey: true,
12830	bubbles: true,
12831	cancelable: true,
12832	changedTouches: true,
12833	ctrlKey: true,
12834	detail: true,
12835	eventPhase: true,
12836	metaKey: true,
12837	pageX: true,
12838	pageY: true,
12839	shiftKey: true,
12840	view: true,
12841	"char": true,
12842	code: true,
12843	charCode: true,
12844	key: true,
12845	keyCode: true,
12846	button: true,
12847	buttons: true,
12848	clientX: true,
12849	clientY: true,
12850	offsetX: true,
12851	offsetY: true,
12852	pointerId: true,
12853	pointerType: true,
12854	screenX: true,
12855	screenY: true,
12856	targetTouches: true,
12857	toElement: true,
12858	touches: true,
12859	which: true
12860}, jQuery.event.addProp );
12861
12862jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateType ) {
12863	jQuery.event.special[ type ] = {
12864
12865		// Utilize native event if possible so blur/focus sequence is correct
12866		setup: function() {
12867
12868			// Claim the first handler
12869			// dataPriv.set( this, "focus", ... )
12870			// dataPriv.set( this, "blur", ... )
12871			leverageNative( this, type, expectSync );
12872
12873			// Return false to allow normal processing in the caller
12874			return false;
12875		},
12876		trigger: function() {
12877
12878			// Force setup before trigger
12879			leverageNative( this, type );
12880
12881			// Return non-false to allow normal event-path propagation
12882			return true;
12883		},
12884
12885		// Suppress native focus or blur if we're currently inside
12886		// a leveraged native-event stack
12887		_default: function( event ) {
12888			return dataPriv.get( event.target, type );
12889		},
12890
12891		delegateType: delegateType
12892	};
12893} );
12894
12895// Create mouseenter/leave events using mouseover/out and event-time checks
12896// so that event delegation works in jQuery.
12897// Do the same for pointerenter/pointerleave and pointerover/pointerout
12898//
12899// Support: Safari 7 only
12900// Safari sends mouseenter too often; see:
12901// https://bugs.chromium.org/p/chromium/issues/detail?id=470258
12902// for the description of the bug (it existed in older Chrome versions as well).
12903jQuery.each( {
12904	mouseenter: "mouseover",
12905	mouseleave: "mouseout",
12906	pointerenter: "pointerover",
12907	pointerleave: "pointerout"
12908}, function( orig, fix ) {
12909	jQuery.event.special[ orig ] = {
12910		delegateType: fix,
12911		bindType: fix,
12912
12913		handle: function( event ) {
12914			var ret,
12915				target = this,
12916				related = event.relatedTarget,
12917				handleObj = event.handleObj;
12918
12919			// For mouseenter/leave call the handler if related is outside the target.
12920			// NB: No relatedTarget if the mouse left/entered the browser window
12921			if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) {
12922				event.type = handleObj.origType;
12923				ret = handleObj.handler.apply( this, arguments );
12924				event.type = fix;
12925			}
12926			return ret;
12927		}
12928	};
12929} );
12930
12931jQuery.fn.extend( {
12932
12933	on: function( types, selector, data, fn ) {
12934		return on( this, types, selector, data, fn );
12935	},
12936	one: function( types, selector, data, fn ) {
12937		return on( this, types, selector, data, fn, 1 );
12938	},
12939	off: function( types, selector, fn ) {
12940		var handleObj, type;
12941		if ( types && types.preventDefault && types.handleObj ) {
12942
12943			// ( event )  dispatched jQuery.Event
12944			handleObj = types.handleObj;
12945			jQuery( types.delegateTarget ).off(
12946				handleObj.namespace ?
12947					handleObj.origType + "." + handleObj.namespace :
12948					handleObj.origType,
12949				handleObj.selector,
12950				handleObj.handler
12951			);
12952			return this;
12953		}
12954		if ( typeof types === "object" ) {
12955
12956			// ( types-object [, selector] )
12957			for ( type in types ) {
12958				this.off( type, selector, types[ type ] );
12959			}
12960			return this;
12961		}
12962		if ( selector === false || typeof selector === "function" ) {
12963
12964			// ( types [, fn] )
12965			fn = selector;
12966			selector = undefined;
12967		}
12968		if ( fn === false ) {
12969			fn = returnFalse;
12970		}
12971		return this.each( function() {
12972			jQuery.event.remove( this, types, fn, selector );
12973		} );
12974	}
12975} );
12976
12977
12978var
12979
12980	// Support: IE <=10 - 11, Edge 12 - 13 only
12981	// In IE/Edge using regex groups here causes severe slowdowns.
12982	// See https://connect.microsoft.com/IE/feedback/details/1736512/
12983	rnoInnerhtml = /<script|<style|<link/i,
12984
12985	// checked="checked" or checked
12986	rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
12987
12988	rcleanScript = /^\s*<!\[CDATA\[|\]\]>\s*$/g;
12989
12990// Prefer a tbody over its parent table for containing new rows
12991function manipulationTarget( elem, content ) {
12992	if ( nodeName( elem, "table" ) &&
12993		nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ) {
12994
12995		return jQuery( elem ).children( "tbody" )[ 0 ] || elem;
12996	}
12997
12998	return elem;
12999}
13000
13001// Replace/restore the type attribute of script elements for safe DOM manipulation
13002function disableScript( elem ) {
13003	elem.type = ( elem.getAttribute( "type" ) !== null ) + "/" + elem.type;
13004	return elem;
13005}
13006function restoreScript( elem ) {
13007	if ( ( elem.type || "" ).slice( 0, 5 ) === "true/" ) {
13008		elem.type = elem.type.slice( 5 );
13009	} else {
13010		elem.removeAttribute( "type" );
13011	}
13012
13013	return elem;
13014}
13015
13016function cloneCopyEvent( src, dest ) {
13017	var i, l, type, pdataOld, udataOld, udataCur, events;
13018
13019	if ( dest.nodeType !== 1 ) {
13020		return;
13021	}
13022
13023	// 1. Copy private data: events, handlers, etc.
13024	if ( dataPriv.hasData( src ) ) {
13025		pdataOld = dataPriv.get( src );
13026		events = pdataOld.events;
13027
13028		if ( events ) {
13029			dataPriv.remove( dest, "handle events" );
13030
13031			for ( type in events ) {
13032				for ( i = 0, l = events[ type ].length; i < l; i++ ) {
13033					jQuery.event.add( dest, type, events[ type ][ i ] );
13034				}
13035			}
13036		}
13037	}
13038
13039	// 2. Copy user data
13040	if ( dataUser.hasData( src ) ) {
13041		udataOld = dataUser.access( src );
13042		udataCur = jQuery.extend( {}, udataOld );
13043
13044		dataUser.set( dest, udataCur );
13045	}
13046}
13047
13048// Fix IE bugs, see support tests
13049function fixInput( src, dest ) {
13050	var nodeName = dest.nodeName.toLowerCase();
13051
13052	// Fails to persist the checked state of a cloned checkbox or radio button.
13053	if ( nodeName === "input" && rcheckableType.test( src.type ) ) {
13054		dest.checked = src.checked;
13055
13056	// Fails to return the selected option to the default selected state when cloning options
13057	} else if ( nodeName === "input" || nodeName === "textarea" ) {
13058		dest.defaultValue = src.defaultValue;
13059	}
13060}
13061
13062function domManip( collection, args, callback, ignored ) {
13063
13064	// Flatten any nested arrays
13065	args = flat( args );
13066
13067	var fragment, first, scripts, hasScripts, node, doc,
13068		i = 0,
13069		l = collection.length,
13070		iNoClone = l - 1,
13071		value = args[ 0 ],
13072		valueIsFunction = isFunction( value );
13073
13074	// We can't cloneNode fragments that contain checked, in WebKit
13075	if ( valueIsFunction ||
13076			( l > 1 && typeof value === "string" &&
13077				!support.checkClone && rchecked.test( value ) ) ) {
13078		return collection.each( function( index ) {
13079			var self = collection.eq( index );
13080			if ( valueIsFunction ) {
13081				args[ 0 ] = value.call( this, index, self.html() );
13082			}
13083			domManip( self, args, callback, ignored );
13084		} );
13085	}
13086
13087	if ( l ) {
13088		fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored );
13089		first = fragment.firstChild;
13090
13091		if ( fragment.childNodes.length === 1 ) {
13092			fragment = first;
13093		}
13094
13095		// Require either new content or an interest in ignored elements to invoke the callback
13096		if ( first || ignored ) {
13097			scripts = jQuery.map( getAll( fragment, "script" ), disableScript );
13098			hasScripts = scripts.length;
13099
13100			// Use the original fragment for the last item
13101			// instead of the first because it can end up
13102			// being emptied incorrectly in certain situations (trac-8070).
13103			for ( ; i < l; i++ ) {
13104				node = fragment;
13105
13106				if ( i !== iNoClone ) {
13107					node = jQuery.clone( node, true, true );
13108
13109					// Keep references to cloned scripts for later restoration
13110					if ( hasScripts ) {
13111
13112						// Support: Android <=4.0 only, PhantomJS 1 only
13113						// push.apply(_, arraylike) throws on ancient WebKit
13114						jQuery.merge( scripts, getAll( node, "script" ) );
13115					}
13116				}
13117
13118				callback.call( collection[ i ], node, i );
13119			}
13120
13121			if ( hasScripts ) {
13122				doc = scripts[ scripts.length - 1 ].ownerDocument;
13123
13124				// Reenable scripts
13125				jQuery.map( scripts, restoreScript );
13126
13127				// Evaluate executable scripts on first document insertion
13128				for ( i = 0; i < hasScripts; i++ ) {
13129					node = scripts[ i ];
13130					if ( rscriptType.test( node.type || "" ) &&
13131						!dataPriv.access( node, "globalEval" ) &&
13132						jQuery.contains( doc, node ) ) {
13133
13134						if ( node.src && ( node.type || "" ).toLowerCase()  !== "module" ) {
13135
13136							// Optional AJAX dependency, but won't run scripts if not present
13137							if ( jQuery._evalUrl && !node.noModule ) {
13138								jQuery._evalUrl( node.src, {
13139									nonce: node.nonce || node.getAttribute( "nonce" )
13140								}, doc );
13141							}
13142						} else {
13143
13144							// Unwrap a CDATA section containing script contents. This shouldn't be
13145							// needed as in XML documents they're already not visible when
13146							// inspecting element contents and in HTML documents they have no
13147							// meaning but we're preserving that logic for backwards compatibility.
13148							// This will be removed completely in 4.0. See gh-4904.
13149							DOMEval( node.textContent.replace( rcleanScript, "" ), node, doc );
13150						}
13151					}
13152				}
13153			}
13154		}
13155	}
13156
13157	return collection;
13158}
13159
13160function remove( elem, selector, keepData ) {
13161	var node,
13162		nodes = selector ? jQuery.filter( selector, elem ) : elem,
13163		i = 0;
13164
13165	for ( ; ( node = nodes[ i ] ) != null; i++ ) {
13166		if ( !keepData && node.nodeType === 1 ) {
13167			jQuery.cleanData( getAll( node ) );
13168		}
13169
13170		if ( node.parentNode ) {
13171			if ( keepData && isAttached( node ) ) {
13172				setGlobalEval( getAll( node, "script" ) );
13173			}
13174			node.parentNode.removeChild( node );
13175		}
13176	}
13177
13178	return elem;
13179}
13180
13181jQuery.extend( {
13182	htmlPrefilter: function( html ) {
13183		return html;
13184	},
13185
13186	clone: function( elem, dataAndEvents, deepDataAndEvents ) {
13187		var i, l, srcElements, destElements,
13188			clone = elem.cloneNode( true ),
13189			inPage = isAttached( elem );
13190
13191		// Fix IE cloning issues
13192		if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) &&
13193				!jQuery.isXMLDoc( elem ) ) {
13194
13195			// We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2
13196			destElements = getAll( clone );
13197			srcElements = getAll( elem );
13198
13199			for ( i = 0, l = srcElements.length; i < l; i++ ) {
13200				fixInput( srcElements[ i ], destElements[ i ] );
13201			}
13202		}
13203
13204		// Copy the events from the original to the clone
13205		if ( dataAndEvents ) {
13206			if ( deepDataAndEvents ) {
13207				srcElements = srcElements || getAll( elem );
13208				destElements = destElements || getAll( clone );
13209
13210				for ( i = 0, l = srcElements.length; i < l; i++ ) {
13211					cloneCopyEvent( srcElements[ i ], destElements[ i ] );
13212				}
13213			} else {
13214				cloneCopyEvent( elem, clone );
13215			}
13216		}
13217
13218		// Preserve script evaluation history
13219		destElements = getAll( clone, "script" );
13220		if ( destElements.length > 0 ) {
13221			setGlobalEval( destElements, !inPage && getAll( elem, "script" ) );
13222		}
13223
13224		// Return the cloned set
13225		return clone;
13226	},
13227
13228	cleanData: function( elems ) {
13229		var data, elem, type,
13230			special = jQuery.event.special,
13231			i = 0;
13232
13233		for ( ; ( elem = elems[ i ] ) !== undefined; i++ ) {
13234			if ( acceptData( elem ) ) {
13235				if ( ( data = elem[ dataPriv.expando ] ) ) {
13236					if ( data.events ) {
13237						for ( type in data.events ) {
13238							if ( special[ type ] ) {
13239								jQuery.event.remove( elem, type );
13240
13241							// This is a shortcut to avoid jQuery.event.remove's overhead
13242							} else {
13243								jQuery.removeEvent( elem, type, data.handle );
13244							}
13245						}
13246					}
13247
vendor: 1,119 bytes, lines 13248-13292
13248					// Support: Chrome <=35 - 45+
13249					// Assign undefined instead of using delete, see Data#remove
13250					elem[ dataPriv.expando ] = undefined;
13251				}
13252				if ( elem[ dataUser.expando ] ) {
13253
13254					// Support: Chrome <=35 - 45+
13255					// Assign undefined instead of using delete, see Data#remove
13256					elem[ dataUser.expando ] = undefined;
13257				}
13258			}
13259		}
13260	}
13261} );
13262
13263jQuery.fn.extend( {
13264	detach: function( selector ) {
13265		return remove( this, selector, true );
13266	},
13267
13268	remove: function( selector ) {
13269		return remove( this, selector );
13270	},
13271
13272	text: function( value ) {
13273		return access( this, function( value ) {
13274			return value === undefined ?
13275				jQuery.text( this ) :
13276				this.empty().each( function() {
13277					if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
13278						this.textContent = value;
13279					}
13280				} );
13281		}, null, value, arguments.length );
13282	},
13283
13284	append: function() {
13285		return domManip( this, arguments, function( elem ) {
13286			if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
13287				var target = manipulationTarget( this, elem );
13288				target.appendChild( elem );
13289			}
13290		} );
13291	},
13292
vendor: 4,664 bytes, lines 13293-13493
13293	prepend: function() {
13294		return domManip( this, arguments, function( elem ) {
13295			if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
13296				var target = manipulationTarget( this, elem );
13297				target.insertBefore( elem, target.firstChild );
13298			}
13299		} );
13300	},
13301
13302	before: function() {
13303		return domManip( this, arguments, function( elem ) {
13304			if ( this.parentNode ) {
13305				this.parentNode.insertBefore( elem, this );
13306			}
13307		} );
13308	},
13309
13310	after: function() {
13311		return domManip( this, arguments, function( elem ) {
13312			if ( this.parentNode ) {
13313				this.parentNode.insertBefore( elem, this.nextSibling );
13314			}
13315		} );
13316	},
13317
13318	empty: function() {
13319		var elem,
13320			i = 0;
13321
13322		for ( ; ( elem = this[ i ] ) != null; i++ ) {
13323			if ( elem.nodeType === 1 ) {
13324
13325				// Prevent memory leaks
13326				jQuery.cleanData( getAll( elem, false ) );
13327
13328				// Remove any remaining nodes
13329				elem.textContent = "";
13330			}
13331		}
13332
13333		return this;
13334	},
13335
13336	clone: function( dataAndEvents, deepDataAndEvents ) {
13337		dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
13338		deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
13339
13340		return this.map( function() {
13341			return jQuery.clone( this, dataAndEvents, deepDataAndEvents );
13342		} );
13343	},
13344
13345	html: function( value ) {
13346		return access( this, function( value ) {
13347			var elem = this[ 0 ] || {},
13348				i = 0,
13349				l = this.length;
13350
13351			if ( value === undefined && elem.nodeType === 1 ) {
13352				return elem.innerHTML;
13353			}
13354
13355			// See if we can take a shortcut and just use innerHTML
13356			if ( typeof value === "string" && !rnoInnerhtml.test( value ) &&
13357				!wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) {
13358
13359				value = jQuery.htmlPrefilter( value );
13360
13361				try {
13362					for ( ; i < l; i++ ) {
13363						elem = this[ i ] || {};
13364
13365						// Remove element nodes and prevent memory leaks
13366						if ( elem.nodeType === 1 ) {
13367							jQuery.cleanData( getAll( elem, false ) );
13368							elem.innerHTML = value;
13369						}
13370					}
13371
13372					elem = 0;
13373
13374				// If using innerHTML throws an exception, use the fallback method
13375				} catch ( e ) {}
13376			}
13377
13378			if ( elem ) {
13379				this.empty().append( value );
13380			}
13381		}, null, value, arguments.length );
13382	},
13383
13384	replaceWith: function() {
13385		var ignored = [];
13386
13387		// Make the changes, replacing each non-ignored context element with the new content
13388		return domManip( this, arguments, function( elem ) {
13389			var parent = this.parentNode;
13390
13391			if ( jQuery.inArray( this, ignored ) < 0 ) {
13392				jQuery.cleanData( getAll( this ) );
13393				if ( parent ) {
13394					parent.replaceChild( elem, this );
13395				}
13396			}
13397
13398		// Force callback invocation
13399		}, ignored );
13400	}
13401} );
13402
13403jQuery.each( {
13404	appendTo: "append",
13405	prependTo: "prepend",
13406	insertBefore: "before",
13407	insertAfter: "after",
13408	replaceAll: "replaceWith"
13409}, function( name, original ) {
13410	jQuery.fn[ name ] = function( selector ) {
13411		var elems,
13412			ret = [],
13413			insert = jQuery( selector ),
13414			last = insert.length - 1,
13415			i = 0;
13416
13417		for ( ; i <= last; i++ ) {
13418			elems = i === last ? this : this.clone( true );
13419			jQuery( insert[ i ] )[ original ]( elems );
13420
13421			// Support: Android <=4.0 only, PhantomJS 1 only
13422			// .get() because push.apply(_, arraylike) throws on ancient WebKit
13423			push.apply( ret, elems.get() );
13424		}
13425
13426		return this.pushStack( ret );
13427	};
13428} );
13429var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" );
13430
13431var rcustomProp = /^--/;
13432
13433
13434var getStyles = function( elem ) {
13435
13436		// Support: IE <=11 only, Firefox <=30 (trac-15098, trac-14150)
13437		// IE throws on elements created in popups
13438		// FF meanwhile throws on frame elements through "defaultView.getComputedStyle"
13439		var view = elem.ownerDocument.defaultView;
13440
13441		if ( !view || !view.opener ) {
13442			view = window;
13443		}
13444
13445		return view.getComputedStyle( elem );
13446	};
13447
13448var swap = function( elem, options, callback ) {
13449	var ret, name,
13450		old = {};
13451
13452	// Remember the old values, and insert the new ones
13453	for ( name in options ) {
13454		old[ name ] = elem.style[ name ];
13455		elem.style[ name ] = options[ name ];
13456	}
13457
13458	ret = callback.call( elem );
13459
13460	// Revert the old values
13461	for ( name in options ) {
13462		elem.style[ name ] = old[ name ];
13463	}
13464
13465	return ret;
13466};
13467
13468
13469var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" );
13470
13471var whitespace = "[\\x20\\t\\r\\n\\f]";
13472
13473
13474var rtrimCSS = new RegExp(
13475	"^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$",
13476	"g"
13477);
13478
13479
13480
13481
13482( function() {
13483
13484	// Executing both pixelPosition & boxSizingReliable tests require only one layout
13485	// so they're executed at the same time to save the second computation.
13486	function computeStyleTests() {
13487
13488		// This is a singleton, we need to execute it only once
13489		if ( !div ) {
13490			return;
13491		}
13492
13493		container.style.cssText = "position:absolute;
vendor: 4,131 bytes, lines 13493-13612
13493left:-11111px;width:60px;" +
13494			"margin-top:1px;padding:0;border:0";
13495		div.style.cssText =
13496			"position:relative;display:block;box-sizing:border-box;overflow:scroll;" +
13497			"margin:auto;border:1px;padding:1px;" +
13498			"width:60%;top:1%";
13499		documentElement.appendChild( container ).appendChild( div );
13500
13501		var divStyle = window.getComputedStyle( div );
13502		pixelPositionVal = divStyle.top !== "1%";
13503
13504		// Support: Android 4.0 - 4.3 only, Firefox <=3 - 44
13505		reliableMarginLeftVal = roundPixelMeasures( divStyle.marginLeft ) === 12;
13506
13507		// Support: Android 4.0 - 4.3 only, Safari <=9.1 - 10.1, iOS <=7.0 - 9.3
13508		// Some styles come back with percentage values, even though they shouldn't
13509		div.style.right = "60%";
13510		pixelBoxStylesVal = roundPixelMeasures( divStyle.right ) === 36;
13511
13512		// Support: IE 9 - 11 only
13513		// Detect misreporting of content dimensions for box-sizing:border-box elements
13514		boxSizingReliableVal = roundPixelMeasures( divStyle.width ) === 36;
13515
13516		// Support: IE 9 only
13517		// Detect overflow:scroll screwiness (gh-3699)
13518		// Support: Chrome <=64
13519		// Don't get tricked when zoom affects offsetWidth (gh-4029)
13520		div.style.position = "absolute";
13521		scrollboxSizeVal = roundPixelMeasures( div.offsetWidth / 3 ) === 12;
13522
13523		documentElement.removeChild( container );
13524
13525		// Nullify the div so it wouldn't be stored in the memory and
13526		// it will also be a sign that checks already performed
13527		div = null;
13528	}
13529
13530	function roundPixelMeasures( measure ) {
13531		return Math.round( parseFloat( measure ) );
13532	}
13533
13534	var pixelPositionVal, boxSizingReliableVal, scrollboxSizeVal, pixelBoxStylesVal,
13535		reliableTrDimensionsVal, reliableMarginLeftVal,
13536		container = document.createElement( "div" ),
13537		div = document.createElement( "div" );
13538
13539	// Finish early in limited (non-browser) environments
13540	if ( !div.style ) {
13541		return;
13542	}
13543
13544	// Support: IE <=9 - 11 only
13545	// Style of cloned element affects source element cloned (trac-8908)
13546	div.style.backgroundClip = "content-box";
13547	div.cloneNode( true ).style.backgroundClip = "";
13548	support.clearCloneStyle = div.style.backgroundClip === "content-box";
13549
13550	jQuery.extend( support, {
13551		boxSizingReliable: function() {
13552			computeStyleTests();
13553			return boxSizingReliableVal;
13554		},
13555		pixelBoxStyles: function() {
13556			computeStyleTests();
13557			return pixelBoxStylesVal;
13558		},
13559		pixelPosition: function() {
13560			computeStyleTests();
13561			return pixelPositionVal;
13562		},
13563		reliableMarginLeft: function() {
13564			computeStyleTests();
13565			return reliableMarginLeftVal;
13566		},
13567		scrollboxSize: function() {
13568			computeStyleTests();
13569			return scrollboxSizeVal;
13570		},
13571
13572		// Support: IE 9 - 11+, Edge 15 - 18+
13573		// IE/Edge misreport `getComputedStyle` of table rows with width/height
13574		// set in CSS while `offset*` properties report correct values.
13575		// Behavior in IE 9 is more subtle than in newer versions & it passes
13576		// some versions of this test; make sure not to make it pass there!
13577		//
13578		// Support: Firefox 70+
13579		// Only Firefox includes border widths
13580		// in computed dimensions. (gh-4529)
13581		reliableTrDimensions: function() {
13582			var table, tr, trChild, trStyle;
13583			if ( reliableTrDimensionsVal == null ) {
13584				table = document.createElement( "table" );
13585				tr = document.createElement( "tr" );
13586				trChild = document.createElement( "div" );
13587
13588				table.style.cssText = "position:absolute;left:-11111px;border-collapse:separate";
13589				tr.style.cssText = "border:1px solid";
13590
13591				// Support: Chrome 86+
13592				// Height set through cssText does not get applied.
13593				// Computed height then comes back as 0.
13594				tr.style.height = "1px";
13595				trChild.style.height = "9px";
13596
13597				// Support: Android 8 Chrome 86+
13598				// In our bodyBackground.html iframe,
13599				// display for all div elements is set to "inline",
13600				// which causes a problem only in Android 8 Chrome 86.
13601				// Ensuring the div is display: block
13602				// gets around this issue.
13603				trChild.style.display = "block";
13604
13605				documentElement
13606					.appendChild( table )
13607					.appendChild( tr )
13608					.appendChild( trChild );
13609
13610				trStyle = window.getComputedStyle( tr );
13611				reliableTrDimensionsVal = ( parseInt( trStyle.height, 10 ) +
13612					parseInt( trStyle.borderTopWidth, 10 ) +
vendor: 11,424 bytes, lines 13613-14007
13613					parseInt( trStyle.borderBottomWidth, 10 ) ) === tr.offsetHeight;
13614
13615				documentElement.removeChild( table );
13616			}
13617			return reliableTrDimensionsVal;
13618		}
13619	} );
13620} )();
13621
13622
13623function curCSS( elem, name, computed ) {
13624	var width, minWidth, maxWidth, ret,
13625		isCustomProp = rcustomProp.test( name ),
13626
13627		// Support: Firefox 51+
13628		// Retrieving style before computed somehow
13629		// fixes an issue with getting wrong values
13630		// on detached elements
13631		style = elem.style;
13632
13633	computed = computed || getStyles( elem );
13634
13635	// getPropertyValue is needed for:
13636	//   .css('filter') (IE 9 only, trac-12537)
13637	//   .css('--customProperty) (gh-3144)
13638	if ( computed ) {
13639		ret = computed.getPropertyValue( name ) || computed[ name ];
13640
13641		// trim whitespace for custom property (issue gh-4926)
13642		if ( isCustomProp ) {
13643
13644			// rtrim treats U+000D CARRIAGE RETURN and U+000C FORM FEED
13645			// as whitespace while CSS does not, but this is not a problem
13646			// because CSS preprocessing replaces them with U+000A LINE FEED
13647			// (which *is* CSS whitespace)
13648			// https://www.w3.org/TR/css-syntax-3/#input-preprocessing
13649			ret = ret.replace( rtrimCSS, "$1" );
13650		}
13651
13652		if ( ret === "" && !isAttached( elem ) ) {
13653			ret = jQuery.style( elem, name );
13654		}
13655
13656		// A tribute to the "awesome hack by Dean Edwards"
13657		// Android Browser returns percentage for some values,
13658		// but width seems to be reliably pixels.
13659		// This is against the CSSOM draft spec:
13660		// https://drafts.csswg.org/cssom/#resolved-values
13661		if ( !support.pixelBoxStyles() && rnumnonpx.test( ret ) && rboxStyle.test( name ) ) {
13662
13663			// Remember the original values
13664			width = style.width;
13665			minWidth = style.minWidth;
13666			maxWidth = style.maxWidth;
13667
13668			// Put in the new values to get a computed value out
13669			style.minWidth = style.maxWidth = style.width = ret;
13670			ret = computed.width;
13671
13672			// Revert the changed values
13673			style.width = width;
13674			style.minWidth = minWidth;
13675			style.maxWidth = maxWidth;
13676		}
13677	}
13678
13679	return ret !== undefined ?
13680
13681		// Support: IE <=9 - 11 only
13682		// IE returns zIndex value as an integer.
13683		ret + "" :
13684		ret;
13685}
13686
13687
13688function addGetHookIf( conditionFn, hookFn ) {
13689
13690	// Define the hook, we'll check on the first run if it's really needed.
13691	return {
13692		get: function() {
13693			if ( conditionFn() ) {
13694
13695				// Hook not needed (or it's not possible to use it due
13696				// to missing dependency), remove it.
13697				delete this.get;
13698				return;
13699			}
13700
13701			// Hook needed; redefine it so that the support test is not executed again.
13702			return ( this.get = hookFn ).apply( this, arguments );
13703		}
13704	};
13705}
13706
13707
13708var cssPrefixes = [ "Webkit", "Moz", "ms" ],
13709	emptyStyle = document.createElement( "div" ).style,
13710	vendorProps = {};
13711
13712// Return a vendor-prefixed property or undefined
13713function vendorPropName( name ) {
13714
13715	// Check for vendor prefixed names
13716	var capName = name[ 0 ].toUpperCase() + name.slice( 1 ),
13717		i = cssPrefixes.length;
13718
13719	while ( i-- ) {
13720		name = cssPrefixes[ i ] + capName;
13721		if ( name in emptyStyle ) {
13722			return name;
13723		}
13724	}
13725}
13726
13727// Return a potentially-mapped jQuery.cssProps or vendor prefixed property
13728function finalPropName( name ) {
13729	var final = jQuery.cssProps[ name ] || vendorProps[ name ];
13730
13731	if ( final ) {
13732		return final;
13733	}
13734	if ( name in emptyStyle ) {
13735		return name;
13736	}
13737	return vendorProps[ name ] = vendorPropName( name ) || name;
13738}
13739
13740
13741var
13742
13743	// Swappable if display is none or starts with table
13744	// except "table", "table-cell", or "table-caption"
13745	// See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display
13746	rdisplayswap = /^(none|table(?!-c[ea]).+)/,
13747	cssShow = { position: "absolute", visibility: "hidden", display: "block" },
13748	cssNormalTransform = {
13749		letterSpacing: "0",
13750		fontWeight: "400"
13751	};
13752
13753function setPositiveNumber( _elem, value, subtract ) {
13754
13755	// Any relative (+/-) values have already been
13756	// normalized at this point
13757	var matches = rcssNum.exec( value );
13758	return matches ?
13759
13760		// Guard against undefined "subtract", e.g., when used as in cssHooks
13761		Math.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || "px" ) :
13762		value;
13763}
13764
13765function boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computedVal ) {
13766	var i = dimension === "width" ? 1 : 0,
13767		extra = 0,
13768		delta = 0;
13769
13770	// Adjustment may not be necessary
13771	if ( box === ( isBorderBox ? "border" : "content" ) ) {
13772		return 0;
13773	}
13774
13775	for ( ; i < 4; i += 2 ) {
13776
13777		// Both box models exclude margin
13778		if ( box === "margin" ) {
13779			delta += jQuery.css( elem, box + cssExpand[ i ], true, styles );
13780		}
13781
13782		// If we get here with a content-box, we're seeking "padding" or "border" or "margin"
13783		if ( !isBorderBox ) {
13784
13785			// Add padding
13786			delta += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
13787
13788			// For "border" or "margin", add border
13789			if ( box !== "padding" ) {
13790				delta += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
13791
13792			// But still keep track of it otherwise
13793			} else {
13794				extra += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
13795			}
13796
13797		// If we get here with a border-box (content + padding + border), we're seeking "content" or
13798		// "padding" or "margin"
13799		} else {
13800
13801			// For "content", subtract padding
13802			if ( box === "content" ) {
13803				delta -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
13804			}
13805
13806			// For "content" or "padding", subtract border
13807			if ( box !== "margin" ) {
13808				delta -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
13809			}
13810		}
13811	}
13812
13813	// Account for positive content-box scroll gutter when requested by providing computedVal
13814	if ( !isBorderBox && computedVal >= 0 ) {
13815
13816		// offsetWidth/offsetHeight is a rounded sum of content, padding, scroll gutter, and border
13817		// Assuming integer scroll gutter, subtract the rest and round down
13818		delta += Math.max( 0, Math.ceil(
13819			elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] -
13820			computedVal -
13821			delta -
13822			extra -
13823			0.5
13824
13825		// If offsetWidth/offsetHeight is unknown, then we can't determine content-box scroll gutter
13826		// Use an explicit zero to avoid NaN (gh-3964)
13827		) ) || 0;
13828	}
13829
13830	return delta;
13831}
13832
13833function getWidthOrHeight( elem, dimension, extra ) {
13834
13835	// Start with computed style
13836	var styles = getStyles( elem ),
13837
13838		// To avoid forcing a reflow, only fetch boxSizing if we need it (gh-4322).
13839		// Fake content-box until we know it's needed to know the true value.
13840		boxSizingNeeded = !support.boxSizingReliable() || extra,
13841		isBorderBox = boxSizingNeeded &&
13842			jQuery.css( elem, "boxSizing", false, styles ) === "border-box",
13843		valueIsBorderBox = isBorderBox,
13844
13845		val = curCSS( elem, dimension, styles ),
13846		offsetProp = "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 );
13847
13848	// Support: Firefox <=54
13849	// Return a confounding non-pixel value or feign ignorance, as appropriate.
13850	if ( rnumnonpx.test( val ) ) {
13851		if ( !extra ) {
13852			return val;
13853		}
13854		val = "auto";
13855	}
13856
13857
13858	// Support: IE 9 - 11 only
13859	// Use offsetWidth/offsetHeight for when box sizing is unreliable.
13860	// In those cases, the computed value can be trusted to be border-box.
13861	if ( ( !support.boxSizingReliable() && isBorderBox ||
13862
13863		// Support: IE 10 - 11+, Edge 15 - 18+
13864		// IE/Edge misreport `getComputedStyle` of table rows with width/height
13865		// set in CSS while `offset*` properties report correct values.
13866		// Interestingly, in some cases IE 9 doesn't suffer from this issue.
13867		!support.reliableTrDimensions() && nodeName( elem, "tr" ) ||
13868
13869		// Fall back to offsetWidth/offsetHeight when value is "auto"
13870		// This happens for inline elements with no explicit setting (gh-3571)
13871		val === "auto" ||
13872
13873		// Support: Android <=4.1 - 4.3 only
13874		// Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602)
13875		!parseFloat( val ) && jQuery.css( elem, "display", false, styles ) === "inline" ) &&
13876
13877		// Make sure the element is visible & connected
13878		elem.getClientRects().length ) {
13879
13880		isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box";
13881
13882		// Where available, offsetWidth/offsetHeight approximate border box dimensions.
13883		// Where not available (e.g., SVG), assume unreliable box-sizing and interpret the
13884		// retrieved value as a content box dimension.
13885		valueIsBorderBox = offsetProp in elem;
13886		if ( valueIsBorderBox ) {
13887			val = elem[ offsetProp ];
13888		}
13889	}
13890
13891	// Normalize "" and auto
13892	val = parseFloat( val ) || 0;
13893
13894	// Adjust for the element's box model
13895	return ( val +
13896		boxModelAdjustment(
13897			elem,
13898			dimension,
13899			extra || ( isBorderBox ? "border" : "content" ),
13900			valueIsBorderBox,
13901			styles,
13902
13903			// Provide the current computed size to request scroll gutter calculation (gh-3589)
13904			val
13905		)
13906	) + "px";
13907}
13908
13909jQuery.extend( {
13910
13911	// Add in style property hooks for overriding the default
13912	// behavior of getting and setting a style property
13913	cssHooks: {
13914		opacity: {
13915			get: function( elem, computed ) {
13916				if ( computed ) {
13917
13918					// We should always get a number back from opacity
13919					var ret = curCSS( elem, "opacity" );
13920					return ret === "" ? "1" : ret;
13921				}
13922			}
13923		}
13924	},
13925
13926	// Don't automatically add "px" to these possibly-unitless properties
13927	cssNumber: {
13928		"animationIterationCount": true,
13929		"columnCount": true,
13930		"fillOpacity": true,
13931		"flexGrow": true,
13932		"flexShrink": true,
13933		"fontWeight": true,
13934		"gridArea": true,
13935		"gridColumn": true,
13936		"gridColumnEnd": true,
13937		"gridColumnStart": true,
13938		"gridRow": true,
13939		"gridRowEnd": true,
13940		"gridRowStart": true,
13941		"lineHeight": true,
13942		"opacity": true,
13943		"order": true,
13944		"orphans": true,
13945		"widows": true,
13946		"zIndex": true,
13947		"zoom": true
13948	},
13949
13950	// Add in properties whose names you wish to fix before
13951	// setting or getting the value
13952	cssProps: {},
13953
13954	// Get and set the style property on a DOM Node
13955	style: function( elem, name, value, extra ) {
13956
13957		// Don't set styles on text and comment nodes
13958		if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {
13959			return;
13960		}
13961
13962		// Make sure that we're working with the right name
13963		var ret, type, hooks,
13964			origName = camelCase( name ),
13965			isCustomProp = rcustomProp.test( name ),
13966			style = elem.style;
13967
13968		// Make sure that we're working with the right name. We don't
13969		// want to query the value if it is a CSS custom property
13970		// since they are user-defined.
13971		if ( !isCustomProp ) {
13972			name = finalPropName( origName );
13973		}
13974
13975		// Gets hook for the prefixed version, then unprefixed version
13976		hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
13977
13978		// Check if we're setting a value
13979		if ( value !== undefined ) {
13980			type = typeof value;
13981
13982			// Convert "+=" or "-=" to relative numbers (trac-7345)
13983			if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) {
13984				value = adjustCSS( elem, name, ret );
13985
13986				// Fixes bug trac-9237
13987				type = "number";
13988			}
13989
13990			// Make sure that null and NaN values aren't set (trac-7116)
13991			if ( value == null || value !== value ) {
13992				return;
13993			}
13994
13995			// If a number was passed in, add the unit (except for certain CSS properties)
13996			// The isCustomProp check can be removed in jQuery 4.0 when we only auto-append
13997			// "px" to a few hardcoded values.
13998			if ( type === "number" && !isCustomProp ) {
13999				value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" );
14000			}
14001
14002			// background-* props affect original clone's values
14003			if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) {
14004				style[ name ] = "inherit";
14005			}
14006
14007			// If a hook was provided, use that value, otherwise just set the specified value
vendor: 16,052 bytes, lines 14008-14612
14008			if ( !hooks || !( "set" in hooks ) ||
14009				( value = hooks.set( elem, value, extra ) ) !== undefined ) {
14010
14011				if ( isCustomProp ) {
14012					style.setProperty( name, value );
14013				} else {
14014					style[ name ] = value;
14015				}
14016			}
14017
14018		} else {
14019
14020			// If a hook was provided get the non-computed value from there
14021			if ( hooks && "get" in hooks &&
14022				( ret = hooks.get( elem, false, extra ) ) !== undefined ) {
14023
14024				return ret;
14025			}
14026
14027			// Otherwise just get the value from the style object
14028			return style[ name ];
14029		}
14030	},
14031
14032	css: function( elem, name, extra, styles ) {
14033		var val, num, hooks,
14034			origName = camelCase( name ),
14035			isCustomProp = rcustomProp.test( name );
14036
14037		// Make sure that we're working with the right name. We don't
14038		// want to modify the value if it is a CSS custom property
14039		// since they are user-defined.
14040		if ( !isCustomProp ) {
14041			name = finalPropName( origName );
14042		}
14043
14044		// Try prefixed name followed by the unprefixed name
14045		hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
14046
14047		// If a hook was provided get the computed value from there
14048		if ( hooks && "get" in hooks ) {
14049			val = hooks.get( elem, true, extra );
14050		}
14051
14052		// Otherwise, if a way to get the computed value exists, use that
14053		if ( val === undefined ) {
14054			val = curCSS( elem, name, styles );
14055		}
14056
14057		// Convert "normal" to computed value
14058		if ( val === "normal" && name in cssNormalTransform ) {
14059			val = cssNormalTransform[ name ];
14060		}
14061
14062		// Make numeric if forced or a qualifier was provided and val looks numeric
14063		if ( extra === "" || extra ) {
14064			num = parseFloat( val );
14065			return extra === true || isFinite( num ) ? num || 0 : val;
14066		}
14067
14068		return val;
14069	}
14070} );
14071
14072jQuery.each( [ "height", "width" ], function( _i, dimension ) {
14073	jQuery.cssHooks[ dimension ] = {
14074		get: function( elem, computed, extra ) {
14075			if ( computed ) {
14076
14077				// Certain elements can have dimension info if we invisibly show them
14078				// but it must have a current display style that would benefit
14079				return rdisplayswap.test( jQuery.css( elem, "display" ) ) &&
14080
14081					// Support: Safari 8+
14082					// Table columns in Safari have non-zero offsetWidth & zero
14083					// getBoundingClientRect().width unless display is changed.
14084					// Support: IE <=11 only
14085					// Running getBoundingClientRect on a disconnected node
14086					// in IE throws an error.
14087					( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ?
14088					swap( elem, cssShow, function() {
14089						return getWidthOrHeight( elem, dimension, extra );
14090					} ) :
14091					getWidthOrHeight( elem, dimension, extra );
14092			}
14093		},
14094
14095		set: function( elem, value, extra ) {
14096			var matches,
14097				styles = getStyles( elem ),
14098
14099				// Only read styles.position if the test has a chance to fail
14100				// to avoid forcing a reflow.
14101				scrollboxSizeBuggy = !support.scrollboxSize() &&
14102					styles.position === "absolute",
14103
14104				// To avoid forcing a reflow, only fetch boxSizing if we need it (gh-3991)
14105				boxSizingNeeded = scrollboxSizeBuggy || extra,
14106				isBorderBox = boxSizingNeeded &&
14107					jQuery.css( elem, "boxSizing", false, styles ) === "border-box",
14108				subtract = extra ?
14109					boxModelAdjustment(
14110						elem,
14111						dimension,
14112						extra,
14113						isBorderBox,
14114						styles
14115					) :
14116					0;
14117
14118			// Account for unreliable border-box dimensions by comparing offset* to computed and
14119			// faking a content-box to get border and padding (gh-3699)
14120			if ( isBorderBox && scrollboxSizeBuggy ) {
14121				subtract -= Math.ceil(
14122					elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] -
14123					parseFloat( styles[ dimension ] ) -
14124					boxModelAdjustment( elem, dimension, "border", false, styles ) -
14125					0.5
14126				);
14127			}
14128
14129			// Convert to pixels if value adjustment is needed
14130			if ( subtract && ( matches = rcssNum.exec( value ) ) &&
14131				( matches[ 3 ] || "px" ) !== "px" ) {
14132
14133				elem.style[ dimension ] = value;
14134				value = jQuery.css( elem, dimension );
14135			}
14136
14137			return setPositiveNumber( elem, value, subtract );
14138		}
14139	};
14140} );
14141
14142jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft,
14143	function( elem, computed ) {
14144		if ( computed ) {
14145			return ( parseFloat( curCSS( elem, "marginLeft" ) ) ||
14146				elem.getBoundingClientRect().left -
14147					swap( elem, { marginLeft: 0 }, function() {
14148						return elem.getBoundingClientRect().left;
14149					} )
14150			) + "px";
14151		}
14152	}
14153);
14154
14155// These hooks are used by animate to expand properties
14156jQuery.each( {
14157	margin: "",
14158	padding: "",
14159	border: "Width"
14160}, function( prefix, suffix ) {
14161	jQuery.cssHooks[ prefix + suffix ] = {
14162		expand: function( value ) {
14163			var i = 0,
14164				expanded = {},
14165
14166				// Assumes a single number if not a string
14167				parts = typeof value === "string" ? value.split( " " ) : [ value ];
14168
14169			for ( ; i < 4; i++ ) {
14170				expanded[ prefix + cssExpand[ i ] + suffix ] =
14171					parts[ i ] || parts[ i - 2 ] || parts[ 0 ];
14172			}
14173
14174			return expanded;
14175		}
14176	};
14177
14178	if ( prefix !== "margin" ) {
14179		jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;
14180	}
14181} );
14182
14183jQuery.fn.extend( {
14184	css: function( name, value ) {
14185		return access( this, function( elem, name, value ) {
14186			var styles, len,
14187				map = {},
14188				i = 0;
14189
14190			if ( Array.isArray( name ) ) {
14191				styles = getStyles( elem );
14192				len = name.length;
14193
14194				for ( ; i < len; i++ ) {
14195					map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );
14196				}
14197
14198				return map;
14199			}
14200
14201			return value !== undefined ?
14202				jQuery.style( elem, name, value ) :
14203				jQuery.css( elem, name );
14204		}, name, value, arguments.length > 1 );
14205	}
14206} );
14207
14208
14209function Tween( elem, options, prop, end, easing ) {
14210	return new Tween.prototype.init( elem, options, prop, end, easing );
14211}
14212jQuery.Tween = Tween;
14213
14214Tween.prototype = {
14215	constructor: Tween,
14216	init: function( elem, options, prop, end, easing, unit ) {
14217		this.elem = elem;
14218		this.prop = prop;
14219		this.easing = easing || jQuery.easing._default;
14220		this.options = options;
14221		this.start = this.now = this.cur();
14222		this.end = end;
14223		this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" );
14224	},
14225	cur: function() {
14226		var hooks = Tween.propHooks[ this.prop ];
14227
14228		return hooks && hooks.get ?
14229			hooks.get( this ) :
14230			Tween.propHooks._default.get( this );
14231	},
14232	run: function( percent ) {
14233		var eased,
14234			hooks = Tween.propHooks[ this.prop ];
14235
14236		if ( this.options.duration ) {
14237			this.pos = eased = jQuery.easing[ this.easing ](
14238				percent, this.options.duration * percent, 0, 1, this.options.duration
14239			);
14240		} else {
14241			this.pos = eased = percent;
14242		}
14243		this.now = ( this.end - this.start ) * eased + this.start;
14244
14245		if ( this.options.step ) {
14246			this.options.step.call( this.elem, this.now, this );
14247		}
14248
14249		if ( hooks && hooks.set ) {
14250			hooks.set( this );
14251		} else {
14252			Tween.propHooks._default.set( this );
14253		}
14254		return this;
14255	}
14256};
14257
14258Tween.prototype.init.prototype = Tween.prototype;
14259
14260Tween.propHooks = {
14261	_default: {
14262		get: function( tween ) {
14263			var result;
14264
14265			// Use a property on the element directly when it is not a DOM element,
14266			// or when there is no matching style property that exists.
14267			if ( tween.elem.nodeType !== 1 ||
14268				tween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) {
14269				return tween.elem[ tween.prop ];
14270			}
14271
14272			// Passing an empty string as a 3rd parameter to .css will automatically
14273			// attempt a parseFloat and fallback to a string if the parse fails.
14274			// Simple values such as "10px" are parsed to Float;
14275			// complex values such as "rotate(1rad)" are returned as-is.
14276			result = jQuery.css( tween.elem, tween.prop, "" );
14277
14278			// Empty strings, null, undefined and "auto" are converted to 0.
14279			return !result || result === "auto" ? 0 : result;
14280		},
14281		set: function( tween ) {
14282
14283			// Use step hook for back compat.
14284			// Use cssHook if its there.
14285			// Use .style if available and use plain properties where available.
14286			if ( jQuery.fx.step[ tween.prop ] ) {
14287				jQuery.fx.step[ tween.prop ]( tween );
14288			} else if ( tween.elem.nodeType === 1 && (
14289				jQuery.cssHooks[ tween.prop ] ||
14290					tween.elem.style[ finalPropName( tween.prop ) ] != null ) ) {
14291				jQuery.style( tween.elem, tween.prop, tween.now + tween.unit );
14292			} else {
14293				tween.elem[ tween.prop ] = tween.now;
14294			}
14295		}
14296	}
14297};
14298
14299// Support: IE <=9 only
14300// Panic based approach to setting things on disconnected nodes
14301Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {
14302	set: function( tween ) {
14303		if ( tween.elem.nodeType && tween.elem.parentNode ) {
14304			tween.elem[ tween.prop ] = tween.now;
14305		}
14306	}
14307};
14308
14309jQuery.easing = {
14310	linear: function( p ) {
14311		return p;
14312	},
14313	swing: function( p ) {
14314		return 0.5 - Math.cos( p * Math.PI ) / 2;
14315	},
14316	_default: "swing"
14317};
14318
14319jQuery.fx = Tween.prototype.init;
14320
14321// Back compat <1.8 extension point
14322jQuery.fx.step = {};
14323
14324
14325
14326
14327var
14328	fxNow, inProgress,
14329	rfxtypes = /^(?:toggle|show|hide)$/,
14330	rrun = /queueHooks$/;
14331
14332function schedule() {
14333	if ( inProgress ) {
14334		if ( document.hidden === false && window.requestAnimationFrame ) {
14335			window.requestAnimationFrame( schedule );
14336		} else {
14337			window.setTimeout( schedule, jQuery.fx.interval );
14338		}
14339
14340		jQuery.fx.tick();
14341	}
14342}
14343
14344// Animations created synchronously will run synchronously
14345function createFxNow() {
14346	window.setTimeout( function() {
14347		fxNow = undefined;
14348	} );
14349	return ( fxNow = Date.now() );
14350}
14351
14352// Generate parameters to create a standard animation
14353function genFx( type, includeWidth ) {
14354	var which,
14355		i = 0,
14356		attrs = { height: type };
14357
14358	// If we include width, step value is 1 to do all cssExpand values,
14359	// otherwise step value is 2 to skip over Left and Right
14360	includeWidth = includeWidth ? 1 : 0;
14361	for ( ; i < 4; i += 2 - includeWidth ) {
14362		which = cssExpand[ i ];
14363		attrs[ "margin" + which ] = attrs[ "padding" + which ] = type;
14364	}
14365
14366	if ( includeWidth ) {
14367		attrs.opacity = attrs.width = type;
14368	}
14369
14370	return attrs;
14371}
14372
14373function createTween( value, prop, animation ) {
14374	var tween,
14375		collection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ "*" ] ),
14376		index = 0,
14377		length = collection.length;
14378	for ( ; index < length; index++ ) {
14379		if ( ( tween = collection[ index ].call( animation, prop, value ) ) ) {
14380
14381			// We're done with this property
14382			return tween;
14383		}
14384	}
14385}
14386
14387function defaultPrefilter( elem, props, opts ) {
14388	var prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display,
14389		isBox = "width" in props || "height" in props,
14390		anim = this,
14391		orig = {},
14392		style = elem.style,
14393		hidden = elem.nodeType && isHiddenWithinTree( elem ),
14394		dataShow = dataPriv.get( elem, "fxshow" );
14395
14396	// Queue-skipping animations hijack the fx hooks
14397	if ( !opts.queue ) {
14398		hooks = jQuery._queueHooks( elem, "fx" );
14399		if ( hooks.unqueued == null ) {
14400			hooks.unqueued = 0;
14401			oldfire = hooks.empty.fire;
14402			hooks.empty.fire = function() {
14403				if ( !hooks.unqueued ) {
14404					oldfire();
14405				}
14406			};
14407		}
14408		hooks.unqueued++;
14409
14410		anim.always( function() {
14411
14412			// Ensure the complete handler is called before this completes
14413			anim.always( function() {
14414				hooks.unqueued--;
14415				if ( !jQuery.queue( elem, "fx" ).length ) {
14416					hooks.empty.fire();
14417				}
14418			} );
14419		} );
14420	}
14421
14422	// Detect show/hide animations
14423	for ( prop in props ) {
14424		value = props[ prop ];
14425		if ( rfxtypes.test( value ) ) {
14426			delete props[ prop ];
14427			toggle = toggle || value === "toggle";
14428			if ( value === ( hidden ? "hide" : "show" ) ) {
14429
14430				// Pretend to be hidden if this is a "show" and
14431				// there is still data from a stopped show/hide
14432				if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) {
14433					hidden = true;
14434
14435				// Ignore all other no-op show/hide data
14436				} else {
14437					continue;
14438				}
14439			}
14440			orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop );
14441		}
14442	}
14443
14444	// Bail out if this is a no-op like .hide().hide()
14445	propTween = !jQuery.isEmptyObject( props );
14446	if ( !propTween && jQuery.isEmptyObject( orig ) ) {
14447		return;
14448	}
14449
14450	// Restrict "overflow" and "display" styles during box animations
14451	if ( isBox && elem.nodeType === 1 ) {
14452
14453		// Support: IE <=9 - 11, Edge 12 - 15
14454		// Record all 3 overflow attributes because IE does not infer the shorthand
14455		// from identically-valued overflowX and overflowY and Edge just mirrors
14456		// the overflowX value there.
14457		opts.overflow = [ style.overflow, style.overflowX, style.overflowY ];
14458
14459		// Identify a display type, preferring old show/hide data over the CSS cascade
14460		restoreDisplay = dataShow && dataShow.display;
14461		if ( restoreDisplay == null ) {
14462			restoreDisplay = dataPriv.get( elem, "display" );
14463		}
14464		display = jQuery.css( elem, "display" );
14465		if ( display === "none" ) {
14466			if ( restoreDisplay ) {
14467				display = restoreDisplay;
14468			} else {
14469
14470				// Get nonempty value(s) by temporarily forcing visibility
14471				showHide( [ elem ], true );
14472				restoreDisplay = elem.style.display || restoreDisplay;
14473				display = jQuery.css( elem, "display" );
14474				showHide( [ elem ] );
14475			}
14476		}
14477
14478		// Animate inline elements as inline-block
14479		if ( display === "inline" || display === "inline-block" && restoreDisplay != null ) {
14480			if ( jQuery.css( elem, "float" ) === "none" ) {
14481
14482				// Restore the original display value at the end of pure show/hide animations
14483				if ( !propTween ) {
14484					anim.done( function() {
14485						style.display = restoreDisplay;
14486					} );
14487					if ( restoreDisplay == null ) {
14488						display = style.display;
14489						restoreDisplay = display === "none" ? "" : display;
14490					}
14491				}
14492				style.display = "inline-block";
14493			}
14494		}
14495	}
14496
14497	if ( opts.overflow ) {
14498		style.overflow = "hidden";
14499		anim.always( function() {
14500			style.overflow = opts.overflow[ 0 ];
14501			style.overflowX = opts.overflow[ 1 ];
14502			style.overflowY = opts.overflow[ 2 ];
14503		} );
14504	}
14505
14506	// Implement show/hide animations
14507	propTween = false;
14508	for ( prop in orig ) {
14509
14510		// General show/hide setup for this element animation
14511		if ( !propTween ) {
14512			if ( dataShow ) {
14513				if ( "hidden" in dataShow ) {
14514					hidden = dataShow.hidden;
14515				}
14516			} else {
14517				dataShow = dataPriv.access( elem, "fxshow", { display: restoreDisplay } );
14518			}
14519
14520			// Store hidden/visible for toggle so `.stop().toggle()` "reverses"
14521			if ( toggle ) {
14522				dataShow.hidden = !hidden;
14523			}
14524
14525			// Show elements before animating them
14526			if ( hidden ) {
14527				showHide( [ elem ], true );
14528			}
14529
14530			/* eslint-disable no-loop-func */
14531
14532			anim.done( function() {
14533
14534				/* eslint-enable no-loop-func */
14535
14536				// The final step of a "hide" animation is actually hiding the element
14537				if ( !hidden ) {
14538					showHide( [ elem ] );
14539				}
14540				dataPriv.remove( elem, "fxshow" );
14541				for ( prop in orig ) {
14542					jQuery.style( elem, prop, orig[ prop ] );
14543				}
14544			} );
14545		}
14546
14547		// Per-property setup
14548		propTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim );
14549		if ( !( prop in dataShow ) ) {
14550			dataShow[ prop ] = propTween.start;
14551			if ( hidden ) {
14552				propTween.end = propTween.start;
14553				propTween.start = 0;
14554			}
14555		}
14556	}
14557}
14558
14559function propFilter( props, specialEasing ) {
14560	var index, name, easing, value, hooks;
14561
14562	// camelCase, specialEasing and expand cssHook pass
14563	for ( index in props ) {
14564		name = camelCase( index );
14565		easing = specialEasing[ name ];
14566		value = props[ index ];
14567		if ( Array.isArray( value ) ) {
14568			easing = value[ 1 ];
14569			value = props[ index ] = value[ 0 ];
14570		}
14571
14572		if ( index !== name ) {
14573			props[ name ] = value;
14574			delete props[ index ];
14575		}
14576
14577		hooks = jQuery.cssHooks[ name ];
14578		if ( hooks && "expand" in hooks ) {
14579			value = hooks.expand( value );
14580			delete props[ name ];
14581
14582			// Not quite $.extend, this won't overwrite existing keys.
14583			// Reusing 'index' because we have the correct "name"
14584			for ( index in value ) {
14585				if ( !( index in props ) ) {
14586					props[ index ] = value[ index ];
14587					specialEasing[ index ] = easing;
14588				}
14589			}
14590		} else {
14591			specialEasing[ name ] = easing;
14592		}
14593	}
14594}
14595
14596function Animation( elem, properties, options ) {
14597	var result,
14598		stopped,
14599		index = 0,
14600		length = Animation.prefilters.length,
14601		deferred = jQuery.Deferred().always( function() {
14602
14603			// Don't match elem in the :animated selector
14604			delete tick.elem;
14605		} ),
14606		tick = function() {
14607			if ( stopped ) {
14608				return false;
14609			}
14610			var currentTime = fxNow || createFxNow(),
14611				remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),
14612
vendor: 9,542 bytes, lines 14613-15003
14613				// Support: Android 2.3 only
14614				// Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (trac-12497)
14615				temp = remaining / animation.duration || 0,
14616				percent = 1 - temp,
14617				index = 0,
14618				length = animation.tweens.length;
14619
14620			for ( ; index < length; index++ ) {
14621				animation.tweens[ index ].run( percent );
14622			}
14623
14624			deferred.notifyWith( elem, [ animation, percent, remaining ] );
14625
14626			// If there's more to do, yield
14627			if ( percent < 1 && length ) {
14628				return remaining;
14629			}
14630
14631			// If this was an empty animation, synthesize a final progress notification
14632			if ( !length ) {
14633				deferred.notifyWith( elem, [ animation, 1, 0 ] );
14634			}
14635
14636			// Resolve the animation and report its conclusion
14637			deferred.resolveWith( elem, [ animation ] );
14638			return false;
14639		},
14640		animation = deferred.promise( {
14641			elem: elem,
14642			props: jQuery.extend( {}, properties ),
14643			opts: jQuery.extend( true, {
14644				specialEasing: {},
14645				easing: jQuery.easing._default
14646			}, options ),
14647			originalProperties: properties,
14648			originalOptions: options,
14649			startTime: fxNow || createFxNow(),
14650			duration: options.duration,
14651			tweens: [],
14652			createTween: function( prop, end ) {
14653				var tween = jQuery.Tween( elem, animation.opts, prop, end,
14654					animation.opts.specialEasing[ prop ] || animation.opts.easing );
14655				animation.tweens.push( tween );
14656				return tween;
14657			},
14658			stop: function( gotoEnd ) {
14659				var index = 0,
14660
14661					// If we are going to the end, we want to run all the tweens
14662					// otherwise we skip this part
14663					length = gotoEnd ? animation.tweens.length : 0;
14664				if ( stopped ) {
14665					return this;
14666				}
14667				stopped = true;
14668				for ( ; index < length; index++ ) {
14669					animation.tweens[ index ].run( 1 );
14670				}
14671
14672				// Resolve when we played the last frame; otherwise, reject
14673				if ( gotoEnd ) {
14674					deferred.notifyWith( elem, [ animation, 1, 0 ] );
14675					deferred.resolveWith( elem, [ animation, gotoEnd ] );
14676				} else {
14677					deferred.rejectWith( elem, [ animation, gotoEnd ] );
14678				}
14679				return this;
14680			}
14681		} ),
14682		props = animation.props;
14683
14684	propFilter( props, animation.opts.specialEasing );
14685
14686	for ( ; index < length; index++ ) {
14687		result = Animation.prefilters[ index ].call( animation, elem, props, animation.opts );
14688		if ( result ) {
14689			if ( isFunction( result.stop ) ) {
14690				jQuery._queueHooks( animation.elem, animation.opts.queue ).stop =
14691					result.stop.bind( result );
14692			}
14693			return result;
14694		}
14695	}
14696
14697	jQuery.map( props, createTween, animation );
14698
14699	if ( isFunction( animation.opts.start ) ) {
14700		animation.opts.start.call( elem, animation );
14701	}
14702
14703	// Attach callbacks from options
14704	animation
14705		.progress( animation.opts.progress )
14706		.done( animation.opts.done, animation.opts.complete )
14707		.fail( animation.opts.fail )
14708		.always( animation.opts.always );
14709
14710	jQuery.fx.timer(
14711		jQuery.extend( tick, {
14712			elem: elem,
14713			anim: animation,
14714			queue: animation.opts.queue
14715		} )
14716	);
14717
14718	return animation;
14719}
14720
14721jQuery.Animation = jQuery.extend( Animation, {
14722
14723	tweeners: {
14724		"*": [ function( prop, value ) {
14725			var tween = this.createTween( prop, value );
14726			adjustCSS( tween.elem, prop, rcssNum.exec( value ), tween );
14727			return tween;
14728		} ]
14729	},
14730
14731	tweener: function( props, callback ) {
14732		if ( isFunction( props ) ) {
14733			callback = props;
14734			props = [ "*" ];
14735		} else {
14736			props = props.match( rnothtmlwhite );
14737		}
14738
14739		var prop,
14740			index = 0,
14741			length = props.length;
14742
14743		for ( ; index < length; index++ ) {
14744			prop = props[ index ];
14745			Animation.tweeners[ prop ] = Animation.tweeners[ prop ] || [];
14746			Animation.tweeners[ prop ].unshift( callback );
14747		}
14748	},
14749
14750	prefilters: [ defaultPrefilter ],
14751
14752	prefilter: function( callback, prepend ) {
14753		if ( prepend ) {
14754			Animation.prefilters.unshift( callback );
14755		} else {
14756			Animation.prefilters.push( callback );
14757		}
14758	}
14759} );
14760
14761jQuery.speed = function( speed, easing, fn ) {
14762	var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : {
14763		complete: fn || !fn && easing ||
14764			isFunction( speed ) && speed,
14765		duration: speed,
14766		easing: fn && easing || easing && !isFunction( easing ) && easing
14767	};
14768
14769	// Go to the end state if fx are off
14770	if ( jQuery.fx.off ) {
14771		opt.duration = 0;
14772
14773	} else {
14774		if ( typeof opt.duration !== "number" ) {
14775			if ( opt.duration in jQuery.fx.speeds ) {
14776				opt.duration = jQuery.fx.speeds[ opt.duration ];
14777
14778			} else {
14779				opt.duration = jQuery.fx.speeds._default;
14780			}
14781		}
14782	}
14783
14784	// Normalize opt.queue - true/undefined/null -> "fx"
14785	if ( opt.queue == null || opt.queue === true ) {
14786		opt.queue = "fx";
14787	}
14788
14789	// Queueing
14790	opt.old = opt.complete;
14791
14792	opt.complete = function() {
14793		if ( isFunction( opt.old ) ) {
14794			opt.old.call( this );
14795		}
14796
14797		if ( opt.queue ) {
14798			jQuery.dequeue( this, opt.queue );
14799		}
14800	};
14801
14802	return opt;
14803};
14804
14805jQuery.fn.extend( {
14806	fadeTo: function( speed, to, easing, callback ) {
14807
14808		// Show any hidden elements after setting opacity to 0
14809		return this.filter( isHiddenWithinTree ).css( "opacity", 0 ).show()
14810
14811			// Animate to the value specified
14812			.end().animate( { opacity: to }, speed, easing, callback );
14813	},
14814	animate: function( prop, speed, easing, callback ) {
14815		var empty = jQuery.isEmptyObject( prop ),
14816			optall = jQuery.speed( speed, easing, callback ),
14817			doAnimation = function() {
14818
14819				// Operate on a copy of prop so per-property easing won't be lost
14820				var anim = Animation( this, jQuery.extend( {}, prop ), optall );
14821
14822				// Empty animations, or finishing resolves immediately
14823				if ( empty || dataPriv.get( this, "finish" ) ) {
14824					anim.stop( true );
14825				}
14826			};
14827
14828		doAnimation.finish = doAnimation;
14829
14830		return empty || optall.queue === false ?
14831			this.each( doAnimation ) :
14832			this.queue( optall.queue, doAnimation );
14833	},
14834	stop: function( type, clearQueue, gotoEnd ) {
14835		var stopQueue = function( hooks ) {
14836			var stop = hooks.stop;
14837			delete hooks.stop;
14838			stop( gotoEnd );
14839		};
14840
14841		if ( typeof type !== "string" ) {
14842			gotoEnd = clearQueue;
14843			clearQueue = type;
14844			type = undefined;
14845		}
14846		if ( clearQueue ) {
14847			this.queue( type || "fx", [] );
14848		}
14849
14850		return this.each( function() {
14851			var dequeue = true,
14852				index = type != null && type + "queueHooks",
14853				timers = jQuery.timers,
14854				data = dataPriv.get( this );
14855
14856			if ( index ) {
14857				if ( data[ index ] && data[ index ].stop ) {
14858					stopQueue( data[ index ] );
14859				}
14860			} else {
14861				for ( index in data ) {
14862					if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {
14863						stopQueue( data[ index ] );
14864					}
14865				}
14866			}
14867
14868			for ( index = timers.length; index--; ) {
14869				if ( timers[ index ].elem === this &&
14870					( type == null || timers[ index ].queue === type ) ) {
14871
14872					timers[ index ].anim.stop( gotoEnd );
14873					dequeue = false;
14874					timers.splice( index, 1 );
14875				}
14876			}
14877
14878			// Start the next in the queue if the last step wasn't forced.
14879			// Timers currently will call their complete callbacks, which
14880			// will dequeue but only if they were gotoEnd.
14881			if ( dequeue || !gotoEnd ) {
14882				jQuery.dequeue( this, type );
14883			}
14884		} );
14885	},
14886	finish: function( type ) {
14887		if ( type !== false ) {
14888			type = type || "fx";
14889		}
14890		return this.each( function() {
14891			var index,
14892				data = dataPriv.get( this ),
14893				queue = data[ type + "queue" ],
14894				hooks = data[ type + "queueHooks" ],
14895				timers = jQuery.timers,
14896				length = queue ? queue.length : 0;
14897
14898			// Enable finishing flag on private data
14899			data.finish = true;
14900
14901			// Empty the queue first
14902			jQuery.queue( this, type, [] );
14903
14904			if ( hooks && hooks.stop ) {
14905				hooks.stop.call( this, true );
14906			}
14907
14908			// Look for any active animations, and finish them
14909			for ( index = timers.length; index--; ) {
14910				if ( timers[ index ].elem === this && timers[ index ].queue === type ) {
14911					timers[ index ].anim.stop( true );
14912					timers.splice( index, 1 );
14913				}
14914			}
14915
14916			// Look for any animations in the old queue and finish them
14917			for ( index = 0; index < length; index++ ) {
14918				if ( queue[ index ] && queue[ index ].finish ) {
14919					queue[ index ].finish.call( this );
14920				}
14921			}
14922
14923			// Turn off finishing flag
14924			delete data.finish;
14925		} );
14926	}
14927} );
14928
14929jQuery.each( [ "toggle", "show", "hide" ], function( _i, name ) {
14930	var cssFn = jQuery.fn[ name ];
14931	jQuery.fn[ name ] = function( speed, easing, callback ) {
14932		return speed == null || typeof speed === "boolean" ?
14933			cssFn.apply( this, arguments ) :
14934			this.animate( genFx( name, true ), speed, easing, callback );
14935	};
14936} );
14937
14938// Generate shortcuts for custom animations
14939jQuery.each( {
14940	slideDown: genFx( "show" ),
14941	slideUp: genFx( "hide" ),
14942	slideToggle: genFx( "toggle" ),
14943	fadeIn: { opacity: "show" },
14944	fadeOut: { opacity: "hide" },
14945	fadeToggle: { opacity: "toggle" }
14946}, function( name, props ) {
14947	jQuery.fn[ name ] = function( speed, easing, callback ) {
14948		return this.animate( props, speed, easing, callback );
14949	};
14950} );
14951
14952jQuery.timers = [];
14953jQuery.fx.tick = function() {
14954	var timer,
14955		i = 0,
14956		timers = jQuery.timers;
14957
14958	fxNow = Date.now();
14959
14960	for ( ; i < timers.length; i++ ) {
14961		timer = timers[ i ];
14962
14963		// Run the timer and safely remove it when done (allowing for external removal)
14964		if ( !timer() && timers[ i ] === timer ) {
14965			timers.splice( i--, 1 );
14966		}
14967	}
14968
14969	if ( !timers.length ) {
14970		jQuery.fx.stop();
14971	}
14972	fxNow = undefined;
14973};
14974
14975jQuery.fx.timer = function( timer ) {
14976	jQuery.timers.push( timer );
14977	jQuery.fx.start();
14978};
14979
14980jQuery.fx.interval = 13;
14981jQuery.fx.start = function() {
14982	if ( inProgress ) {
14983		return;
14984	}
14985
14986	inProgress = true;
14987	schedule();
14988};
14989
14990jQuery.fx.stop = function() {
14991	inProgress = null;
14992};
14993
14994jQuery.fx.speeds = {
14995	slow: 600,
14996	fast: 200,
14997
14998	// Default speed
14999	_default: 400
15000};
15001
15002
15003// Based off of the plugin by Clint Helfers, with permission.
vendor: 5,177 bytes, lines 15004-15224
15004jQuery.fn.delay = function( time, type ) {
15005	time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;
15006	type = type || "fx";
15007
15008	return this.queue( type, function( next, hooks ) {
15009		var timeout = window.setTimeout( next, time );
15010		hooks.stop = function() {
15011			window.clearTimeout( timeout );
15012		};
15013	} );
15014};
15015
15016
15017( function() {
15018	var input = document.createElement( "input" ),
15019		select = document.createElement( "select" ),
15020		opt = select.appendChild( document.createElement( "option" ) );
15021
15022	input.type = "checkbox";
15023
15024	// Support: Android <=4.3 only
15025	// Default value for a checkbox should be "on"
15026	support.checkOn = input.value !== "";
15027
15028	// Support: IE <=11 only
15029	// Must access selectedIndex to make default options select
15030	support.optSelected = opt.selected;
15031
15032	// Support: IE <=11 only
15033	// An input loses its value after becoming a radio
15034	input = document.createElement( "input" );
15035	input.value = "t";
15036	input.type = "radio";
15037	support.radioValue = input.value === "t";
15038} )();
15039
15040
15041var boolHook,
15042	attrHandle = jQuery.expr.attrHandle;
15043
15044jQuery.fn.extend( {
15045	attr: function( name, value ) {
15046		return access( this, jQuery.attr, name, value, arguments.length > 1 );
15047	},
15048
15049	removeAttr: function( name ) {
15050		return this.each( function() {
15051			jQuery.removeAttr( this, name );
15052		} );
15053	}
15054} );
15055
15056jQuery.extend( {
15057	attr: function( elem, name, value ) {
15058		var ret, hooks,
15059			nType = elem.nodeType;
15060
15061		// Don't get/set attributes on text, comment and attribute nodes
15062		if ( nType === 3 || nType === 8 || nType === 2 ) {
15063			return;
15064		}
15065
15066		// Fallback to prop when attributes are not supported
15067		if ( typeof elem.getAttribute === "undefined" ) {
15068			return jQuery.prop( elem, name, value );
15069		}
15070
15071		// Attribute hooks are determined by the lowercase version
15072		// Grab necessary hook if one is defined
15073		if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {
15074			hooks = jQuery.attrHooks[ name.toLowerCase() ] ||
15075				( jQuery.expr.match.bool.test( name ) ? boolHook : undefined );
15076		}
15077
15078		if ( value !== undefined ) {
15079			if ( value === null ) {
15080				jQuery.removeAttr( elem, name );
15081				return;
15082			}
15083
15084			if ( hooks && "set" in hooks &&
15085				( ret = hooks.set( elem, value, name ) ) !== undefined ) {
15086				return ret;
15087			}
15088
15089			elem.setAttribute( name, value + "" );
15090			return value;
15091		}
15092
15093		if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {
15094			return ret;
15095		}
15096
15097		ret = jQuery.find.attr( elem, name );
15098
15099		// Non-existent attributes return null, we normalize to undefined
15100		return ret == null ? undefined : ret;
15101	},
15102
15103	attrHooks: {
15104		type: {
15105			set: function( elem, value ) {
15106				if ( !support.radioValue && value === "radio" &&
15107					nodeName( elem, "input" ) ) {
15108					var val = elem.value;
15109					elem.setAttribute( "type", value );
15110					if ( val ) {
15111						elem.value = val;
15112					}
15113					return value;
15114				}
15115			}
15116		}
15117	},
15118
15119	removeAttr: function( elem, value ) {
15120		var name,
15121			i = 0,
15122
15123			// Attribute names can contain non-HTML whitespace characters
15124			// https://html.spec.whatwg.org/multipage/syntax.html#attributes-2
15125			attrNames = value && value.match( rnothtmlwhite );
15126
15127		if ( attrNames && elem.nodeType === 1 ) {
15128			while ( ( name = attrNames[ i++ ] ) ) {
15129				elem.removeAttribute( name );
15130			}
15131		}
15132	}
15133} );
15134
15135// Hooks for boolean attributes
15136boolHook = {
15137	set: function( elem, value, name ) {
15138		if ( value === false ) {
15139
15140			// Remove boolean attributes when set to false
15141			jQuery.removeAttr( elem, name );
15142		} else {
15143			elem.setAttribute( name, name );
15144		}
15145		return name;
15146	}
15147};
15148
15149jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( _i, name ) {
15150	var getter = attrHandle[ name ] || jQuery.find.attr;
15151
15152	attrHandle[ name ] = function( elem, name, isXML ) {
15153		var ret, handle,
15154			lowercaseName = name.toLowerCase();
15155
15156		if ( !isXML ) {
15157
15158			// Avoid an infinite loop by temporarily removing this function from the getter
15159			handle = attrHandle[ lowercaseName ];
15160			attrHandle[ lowercaseName ] = ret;
15161			ret = getter( elem, name, isXML ) != null ?
15162				lowercaseName :
15163				null;
15164			attrHandle[ lowercaseName ] = handle;
15165		}
15166		return ret;
15167	};
15168} );
15169
15170
15171
15172
15173var rfocusable = /^(?:input|select|textarea|button)$/i,
15174	rclickable = /^(?:a|area)$/i;
15175
15176jQuery.fn.extend( {
15177	prop: function( name, value ) {
15178		return access( this, jQuery.prop, name, value, arguments.length > 1 );
15179	},
15180
15181	removeProp: function( name ) {
15182		return this.each( function() {
15183			delete this[ jQuery.propFix[ name ] || name ];
15184		} );
15185	}
15186} );
15187
15188jQuery.extend( {
15189	prop: function( elem, name, value ) {
15190		var ret, hooks,
15191			nType = elem.nodeType;
15192
15193		// Don't get/set properties on text, comment and attribute nodes
15194		if ( nType === 3 || nType === 8 || nType === 2 ) {
15195			return;
15196		}
15197
15198		if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {
15199
15200			// Fix name and attach hooks
15201			name = jQuery.propFix[ name ] || name;
15202			hooks = jQuery.propHooks[ name ];
15203		}
15204
15205		if ( value !== undefined ) {
15206			if ( hooks && "set" in hooks &&
15207				( ret = hooks.set( elem, value, name ) ) !== undefined ) {
15208				return ret;
15209			}
15210
15211			return ( elem[ name ] = value );
15212		}
15213
15214		if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {
15215			return ret;
15216		}
15217
15218		return elem[ name ];
15219	},
15220
15221	propHooks: {
15222		tabIndex: {
15223			get: function( elem ) {
15224
vendor: 6,126 bytes, lines 15225-15484
15225				// Support: IE <=9 - 11 only
15226				// elem.tabIndex doesn't always return the
15227				// correct value when it hasn't been explicitly set
15228				// Use proper attribute retrieval (trac-12072)
15229				var tabindex = jQuery.find.attr( elem, "tabindex" );
15230
15231				if ( tabindex ) {
15232					return parseInt( tabindex, 10 );
15233				}
15234
15235				if (
15236					rfocusable.test( elem.nodeName ) ||
15237					rclickable.test( elem.nodeName ) &&
15238					elem.href
15239				) {
15240					return 0;
15241				}
15242
15243				return -1;
15244			}
15245		}
15246	},
15247
15248	propFix: {
15249		"for": "htmlFor",
15250		"class": "className"
15251	}
15252} );
15253
15254// Support: IE <=11 only
15255// Accessing the selectedIndex property
15256// forces the browser to respect setting selected
15257// on the option
15258// The getter ensures a default option is selected
15259// when in an optgroup
15260// eslint rule "no-unused-expressions" is disabled for this code
15261// since it considers such accessions noop
15262if ( !support.optSelected ) {
15263	jQuery.propHooks.selected = {
15264		get: function( elem ) {
15265
15266			/* eslint no-unused-expressions: "off" */
15267
15268			var parent = elem.parentNode;
15269			if ( parent && parent.parentNode ) {
15270				parent.parentNode.selectedIndex;
15271			}
15272			return null;
15273		},
15274		set: function( elem ) {
15275
15276			/* eslint no-unused-expressions: "off" */
15277
15278			var parent = elem.parentNode;
15279			if ( parent ) {
15280				parent.selectedIndex;
15281
15282				if ( parent.parentNode ) {
15283					parent.parentNode.selectedIndex;
15284				}
15285			}
15286		}
15287	};
15288}
15289
15290jQuery.each( [
15291	"tabIndex",
15292	"readOnly",
15293	"maxLength",
15294	"cellSpacing",
15295	"cellPadding",
15296	"rowSpan",
15297	"colSpan",
15298	"useMap",
15299	"frameBorder",
15300	"contentEditable"
15301], function() {
15302	jQuery.propFix[ this.toLowerCase() ] = this;
15303} );
15304
15305
15306
15307
15308	// Strip and collapse whitespace according to HTML spec
15309	// https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace
15310	function stripAndCollapse( value ) {
15311		var tokens = value.match( rnothtmlwhite ) || [];
15312		return tokens.join( " " );
15313	}
15314
15315
15316function getClass( elem ) {
15317	return elem.getAttribute && elem.getAttribute( "class" ) || "";
15318}
15319
15320function classesToArray( value ) {
15321	if ( Array.isArray( value ) ) {
15322		return value;
15323	}
15324	if ( typeof value === "string" ) {
15325		return value.match( rnothtmlwhite ) || [];
15326	}
15327	return [];
15328}
15329
15330jQuery.fn.extend( {
15331	addClass: function( value ) {
15332		var classNames, cur, curValue, className, i, finalValue;
15333
15334		if ( isFunction( value ) ) {
15335			return this.each( function( j ) {
15336				jQuery( this ).addClass( value.call( this, j, getClass( this ) ) );
15337			} );
15338		}
15339
15340		classNames = classesToArray( value );
15341
15342		if ( classNames.length ) {
15343			return this.each( function() {
15344				curValue = getClass( this );
15345				cur = this.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " );
15346
15347				if ( cur ) {
15348					for ( i = 0; i < classNames.length; i++ ) {
15349						className = classNames[ i ];
15350						if ( cur.indexOf( " " + className + " " ) < 0 ) {
15351							cur += className + " ";
15352						}
15353					}
15354
15355					// Only assign if different to avoid unneeded rendering.
15356					finalValue = stripAndCollapse( cur );
15357					if ( curValue !== finalValue ) {
15358						this.setAttribute( "class", finalValue );
15359					}
15360				}
15361			} );
15362		}
15363
15364		return this;
15365	},
15366
15367	removeClass: function( value ) {
15368		var classNames, cur, curValue, className, i, finalValue;
15369
15370		if ( isFunction( value ) ) {
15371			return this.each( function( j ) {
15372				jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) );
15373			} );
15374		}
15375
15376		if ( !arguments.length ) {
15377			return this.attr( "class", "" );
15378		}
15379
15380		classNames = classesToArray( value );
15381
15382		if ( classNames.length ) {
15383			return this.each( function() {
15384				curValue = getClass( this );
15385
15386				// This expression is here for better compressibility (see addClass)
15387				cur = this.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " );
15388
15389				if ( cur ) {
15390					for ( i = 0; i < classNames.length; i++ ) {
15391						className = classNames[ i ];
15392
15393						// Remove *all* instances
15394						while ( cur.indexOf( " " + className + " " ) > -1 ) {
15395							cur = cur.replace( " " + className + " ", " " );
15396						}
15397					}
15398
15399					// Only assign if different to avoid unneeded rendering.
15400					finalValue = stripAndCollapse( cur );
15401					if ( curValue !== finalValue ) {
15402						this.setAttribute( "class", finalValue );
15403					}
15404				}
15405			} );
15406		}
15407
15408		return this;
15409	},
15410
15411	toggleClass: function( value, stateVal ) {
15412		var classNames, className, i, self,
15413			type = typeof value,
15414			isValidValue = type === "string" || Array.isArray( value );
15415
15416		if ( isFunction( value ) ) {
15417			return this.each( function( i ) {
15418				jQuery( this ).toggleClass(
15419					value.call( this, i, getClass( this ), stateVal ),
15420					stateVal
15421				);
15422			} );
15423		}
15424
15425		if ( typeof stateVal === "boolean" && isValidValue ) {
15426			return stateVal ? this.addClass( value ) : this.removeClass( value );
15427		}
15428
15429		classNames = classesToArray( value );
15430
15431		return this.each( function() {
15432			if ( isValidValue ) {
15433
15434				// Toggle individual class names
15435				self = jQuery( this );
15436
15437				for ( i = 0; i < classNames.length; i++ ) {
15438					className = classNames[ i ];
15439
15440					// Check each className given, space separated list
15441					if ( self.hasClass( className ) ) {
15442						self.removeClass( className );
15443					} else {
15444						self.addClass( className );
15445					}
15446				}
15447
15448			// Toggle whole class name
15449			} else if ( value === undefined || type === "boolean" ) {
15450				className = getClass( this );
15451				if ( className ) {
15452
15453					// Store className if set
15454					dataPriv.set( this, "__className__", className );
15455				}
15456
15457				// If the element has a class name or if we're passed `false`,
15458				// then remove the whole classname (if there was one, the above saved it).
15459				// Otherwise bring back whatever was previously saved (if anything),
15460				// falling back to the empty string if nothing was stored.
15461				if ( this.setAttribute ) {
15462					this.setAttribute( "class",
15463						className || value === false ?
15464							"" :
15465							dataPriv.get( this, "__className__" ) || ""
15466					);
15467				}
15468			}
15469		} );
15470	},
15471
15472	hasClass: function( selector ) {
15473		var className, elem,
15474			i = 0;
15475
15476		className = " " + selector + " ";
15477		while ( ( elem = this[ i++ ] ) ) {
15478			if ( elem.nodeType === 1 &&
15479				( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) {
15480				return true;
15481			}
15482		}
15483
15484		return false;
vendor: 1,385 bytes, lines 15485-15554
15485	}
15486} );
15487
15488
15489
15490
15491var rreturn = /\r/g;
15492
15493jQuery.fn.extend( {
15494	val: function( value ) {
15495		var hooks, ret, valueIsFunction,
15496			elem = this[ 0 ];
15497
15498		if ( !arguments.length ) {
15499			if ( elem ) {
15500				hooks = jQuery.valHooks[ elem.type ] ||
15501					jQuery.valHooks[ elem.nodeName.toLowerCase() ];
15502
15503				if ( hooks &&
15504					"get" in hooks &&
15505					( ret = hooks.get( elem, "value" ) ) !== undefined
15506				) {
15507					return ret;
15508				}
15509
15510				ret = elem.value;
15511
15512				// Handle most common string cases
15513				if ( typeof ret === "string" ) {
15514					return ret.replace( rreturn, "" );
15515				}
15516
15517				// Handle cases where value is null/undef or number
15518				return ret == null ? "" : ret;
15519			}
15520
15521			return;
15522		}
15523
15524		valueIsFunction = isFunction( value );
15525
15526		return this.each( function( i ) {
15527			var val;
15528
15529			if ( this.nodeType !== 1 ) {
15530				return;
15531			}
15532
15533			if ( valueIsFunction ) {
15534				val = value.call( this, i, jQuery( this ).val() );
15535			} else {
15536				val = value;
15537			}
15538
15539			// Treat null/undefined as ""; convert numbers to string
15540			if ( val == null ) {
15541				val = "";
15542
15543			} else if ( typeof val === "number" ) {
15544				val += "";
15545
15546			} else if ( Array.isArray( val ) ) {
15547				val = jQuery.map( val, function( value ) {
15548					return value == null ? "" : value + "";
15549				} );
15550			}
15551
15552			hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];
15553
15554			// If set returns undefined, fall back to normal setting
vendor: 8,269 bytes, lines 15555-15869
15555			if ( !hooks || !( "set" in hooks ) || hooks.set( this, val, "value" ) === undefined ) {
15556				this.value = val;
15557			}
15558		} );
15559	}
15560} );
15561
15562jQuery.extend( {
15563	valHooks: {
15564		option: {
15565			get: function( elem ) {
15566
15567				var val = jQuery.find.attr( elem, "value" );
15568				return val != null ?
15569					val :
15570
15571					// Support: IE <=10 - 11 only
15572					// option.text throws exceptions (trac-14686, trac-14858)
15573					// Strip and collapse whitespace
15574					// https://html.spec.whatwg.org/#strip-and-collapse-whitespace
15575					stripAndCollapse( jQuery.text( elem ) );
15576			}
15577		},
15578		select: {
15579			get: function( elem ) {
15580				var value, option, i,
15581					options = elem.options,
15582					index = elem.selectedIndex,
15583					one = elem.type === "select-one",
15584					values = one ? null : [],
15585					max = one ? index + 1 : options.length;
15586
15587				if ( index < 0 ) {
15588					i = max;
15589
15590				} else {
15591					i = one ? index : 0;
15592				}
15593
15594				// Loop through all the selected options
15595				for ( ; i < max; i++ ) {
15596					option = options[ i ];
15597
15598					// Support: IE <=9 only
15599					// IE8-9 doesn't update selected after form reset (trac-2551)
15600					if ( ( option.selected || i === index ) &&
15601
15602							// Don't return options that are disabled or in a disabled optgroup
15603							!option.disabled &&
15604							( !option.parentNode.disabled ||
15605								!nodeName( option.parentNode, "optgroup" ) ) ) {
15606
15607						// Get the specific value for the option
15608						value = jQuery( option ).val();
15609
15610						// We don't need an array for one selects
15611						if ( one ) {
15612							return value;
15613						}
15614
15615						// Multi-Selects return an array
15616						values.push( value );
15617					}
15618				}
15619
15620				return values;
15621			},
15622
15623			set: function( elem, value ) {
15624				var optionSet, option,
15625					options = elem.options,
15626					values = jQuery.makeArray( value ),
15627					i = options.length;
15628
15629				while ( i-- ) {
15630					option = options[ i ];
15631
15632					/* eslint-disable no-cond-assign */
15633
15634					if ( option.selected =
15635						jQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1
15636					) {
15637						optionSet = true;
15638					}
15639
15640					/* eslint-enable no-cond-assign */
15641				}
15642
15643				// Force browsers to behave consistently when non-matching value is set
15644				if ( !optionSet ) {
15645					elem.selectedIndex = -1;
15646				}
15647				return values;
15648			}
15649		}
15650	}
15651} );
15652
15653// Radios and checkboxes getter/setter
15654jQuery.each( [ "radio", "checkbox" ], function() {
15655	jQuery.valHooks[ this ] = {
15656		set: function( elem, value ) {
15657			if ( Array.isArray( value ) ) {
15658				return ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 );
15659			}
15660		}
15661	};
15662	if ( !support.checkOn ) {
15663		jQuery.valHooks[ this ].get = function( elem ) {
15664			return elem.getAttribute( "value" ) === null ? "on" : elem.value;
15665		};
15666	}
15667} );
15668
15669
15670
15671
15672// Return jQuery for attributes-only inclusion
15673
15674
15675support.focusin = "onfocusin" in window;
15676
15677
15678var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,
15679	stopPropagationCallback = function( e ) {
15680		e.stopPropagation();
15681	};
15682
15683jQuery.extend( jQuery.event, {
15684
15685	trigger: function( event, data, elem, onlyHandlers ) {
15686
15687		var i, cur, tmp, bubbleType, ontype, handle, special, lastElement,
15688			eventPath = [ elem || document ],
15689			type = hasOwn.call( event, "type" ) ? event.type : event,
15690			namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : [];
15691
15692		cur = lastElement = tmp = elem = elem || document;
15693
15694		// Don't do events on text and comment nodes
15695		if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
15696			return;
15697		}
15698
15699		// focus/blur morphs to focusin/out; ensure we're not firing them right now
15700		if ( rfocusMorph.test( type + jQuery.event.triggered ) ) {
15701			return;
15702		}
15703
15704		if ( type.indexOf( "." ) > -1 ) {
15705
15706			// Namespaced trigger; create a regexp to match event type in handle()
15707			namespaces = type.split( "." );
15708			type = namespaces.shift();
15709			namespaces.sort();
15710		}
15711		ontype = type.indexOf( ":" ) < 0 && "on" + type;
15712
15713		// Caller can pass in a jQuery.Event object, Object, or just an event type string
15714		event = event[ jQuery.expando ] ?
15715			event :
15716			new jQuery.Event( type, typeof event === "object" && event );
15717
15718		// Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)
15719		event.isTrigger = onlyHandlers ? 2 : 3;
15720		event.namespace = namespaces.join( "." );
15721		event.rnamespace = event.namespace ?
15722			new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) :
15723			null;
15724
15725		// Clean up the event in case it is being reused
15726		event.result = undefined;
15727		if ( !event.target ) {
15728			event.target = elem;
15729		}
15730
15731		// Clone any incoming data and prepend the event, creating the handler arg list
15732		data = data == null ?
15733			[ event ] :
15734			jQuery.makeArray( data, [ event ] );
15735
15736		// Allow special events to draw outside the lines
15737		special = jQuery.event.special[ type ] || {};
15738		if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {
15739			return;
15740		}
15741
15742		// Determine event propagation path in advance, per W3C events spec (trac-9951)
15743		// Bubble up to document, then to window; watch for a global ownerDocument var (trac-9724)
15744		if ( !onlyHandlers && !special.noBubble && !isWindow( elem ) ) {
15745
15746			bubbleType = special.delegateType || type;
15747			if ( !rfocusMorph.test( bubbleType + type ) ) {
15748				cur = cur.parentNode;
15749			}
15750			for ( ; cur; cur = cur.parentNode ) {
15751				eventPath.push( cur );
15752				tmp = cur;
15753			}
15754
15755			// Only add window if we got to document (e.g., not plain obj or detached DOM)
15756			if ( tmp === ( elem.ownerDocument || document ) ) {
15757				eventPath.push( tmp.defaultView || tmp.parentWindow || window );
15758			}
15759		}
15760
15761		// Fire handlers on the event path
15762		i = 0;
15763		while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) {
15764			lastElement = cur;
15765			event.type = i > 1 ?
15766				bubbleType :
15767				special.bindType || type;
15768
15769			// jQuery handler
15770			handle = ( dataPriv.get( cur, "events" ) || Object.create( null ) )[ event.type ] &&
15771				dataPriv.get( cur, "handle" );
15772			if ( handle ) {
15773				handle.apply( cur, data );
15774			}
15775
15776			// Native handler
15777			handle = ontype && cur[ ontype ];
15778			if ( handle && handle.apply && acceptData( cur ) ) {
15779				event.result = handle.apply( cur, data );
15780				if ( event.result === false ) {
15781					event.preventDefault();
15782				}
15783			}
15784		}
15785		event.type = type;
15786
15787		// If nobody prevented the default action, do it now
15788		if ( !onlyHandlers && !event.isDefaultPrevented() ) {
15789
15790			if ( ( !special._default ||
15791				special._default.apply( eventPath.pop(), data ) === false ) &&
15792				acceptData( elem ) ) {
15793
15794				// Call a native DOM method on the target with the same name as the event.
15795				// Don't do default actions on window, that's where global variables be (trac-6170)
15796				if ( ontype && isFunction( elem[ type ] ) && !isWindow( elem ) ) {
15797
15798					// Don't re-trigger an onFOO event when we call its FOO() method
15799					tmp = elem[ ontype ];
15800
15801					if ( tmp ) {
15802						elem[ ontype ] = null;
15803					}
15804
15805					// Prevent re-triggering of the same event, since we already bubbled it above
15806					jQuery.event.triggered = type;
15807
15808					if ( event.isPropagationStopped() ) {
15809						lastElement.addEventListener( type, stopPropagationCallback );
15810					}
15811
15812					elem[ type ]();
15813
15814					if ( event.isPropagationStopped() ) {
15815						lastElement.removeEventListener( type, stopPropagationCallback );
15816					}
15817
15818					jQuery.event.triggered = undefined;
15819
15820					if ( tmp ) {
15821						elem[ ontype ] = tmp;
15822					}
15823				}
15824			}
15825		}
15826
15827		return event.result;
15828	},
15829
15830	// Piggyback on a donor event to simulate a different one
15831	// Used only for `focus(in | out)` events
15832	simulate: function( type, elem, event ) {
15833		var e = jQuery.extend(
15834			new jQuery.Event(),
15835			event,
15836			{
15837				type: type,
15838				isSimulated: true
15839			}
15840		);
15841
15842		jQuery.event.trigger( e, null, elem );
15843	}
15844
15845} );
15846
15847jQuery.fn.extend( {
15848
15849	trigger: function( type, data ) {
15850		return this.each( function() {
15851			jQuery.event.trigger( type, data, this );
15852		} );
15853	},
15854	triggerHandler: function( type, data ) {
15855		var elem = this[ 0 ];
15856		if ( elem ) {
15857			return jQuery.event.trigger( type, data, elem, true );
15858		}
15859	}
15860} );
15861
15862
15863// Support: Firefox <=44
15864// Firefox doesn't have focus(in | out) events
15865// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787
15866//
15867// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1
15868// focus(in | out) events fire after focus & blur events,
15869// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order
vendor: 4,255 bytes, lines 15870-16039
15870// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857
15871if ( !support.focusin ) {
15872	jQuery.each( { focus: "focusin", blur: "focusout" }, function( orig, fix ) {
15873
15874		// Attach a single capturing handler on the document while someone wants focusin/focusout
15875		var handler = function( event ) {
15876			jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) );
15877		};
15878
15879		jQuery.event.special[ fix ] = {
15880			setup: function() {
15881
15882				// Handle: regular nodes (via `this.ownerDocument`), window
15883				// (via `this.document`) & document (via `this`).
15884				var doc = this.ownerDocument || this.document || this,
15885					attaches = dataPriv.access( doc, fix );
15886
15887				if ( !attaches ) {
15888					doc.addEventListener( orig, handler, true );
15889				}
15890				dataPriv.access( doc, fix, ( attaches || 0 ) + 1 );
15891			},
15892			teardown: function() {
15893				var doc = this.ownerDocument || this.document || this,
15894					attaches = dataPriv.access( doc, fix ) - 1;
15895
15896				if ( !attaches ) {
15897					doc.removeEventListener( orig, handler, true );
15898					dataPriv.remove( doc, fix );
15899
15900				} else {
15901					dataPriv.access( doc, fix, attaches );
15902				}
15903			}
15904		};
15905	} );
15906}
15907var location = window.location;
15908
15909var nonce = { guid: Date.now() };
15910
15911var rquery = ( /\?/ );
15912
15913
15914
15915// Cross-browser xml parsing
15916jQuery.parseXML = function( data ) {
15917	var xml, parserErrorElem;
15918	if ( !data || typeof data !== "string" ) {
15919		return null;
15920	}
15921
15922	// Support: IE 9 - 11 only
15923	// IE throws on parseFromString with invalid input.
15924	try {
15925		xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" );
15926	} catch ( e ) {}
15927
15928	parserErrorElem = xml && xml.getElementsByTagName( "parsererror" )[ 0 ];
15929	if ( !xml || parserErrorElem ) {
15930		jQuery.error( "Invalid XML: " + (
15931			parserErrorElem ?
15932				jQuery.map( parserErrorElem.childNodes, function( el ) {
15933					return el.textContent;
15934				} ).join( "\n" ) :
15935				data
15936		) );
15937	}
15938	return xml;
15939};
15940
15941
15942var
15943	rbracket = /\[\]$/,
15944	rCRLF = /\r?\n/g,
15945	rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,
15946	rsubmittable = /^(?:input|select|textarea|keygen)/i;
15947
15948function buildParams( prefix, obj, traditional, add ) {
15949	var name;
15950
15951	if ( Array.isArray( obj ) ) {
15952
15953		// Serialize array item.
15954		jQuery.each( obj, function( i, v ) {
15955			if ( traditional || rbracket.test( prefix ) ) {
15956
15957				// Treat each array item as a scalar.
15958				add( prefix, v );
15959
15960			} else {
15961
15962				// Item is non-scalar (array or object), encode its numeric index.
15963				buildParams(
15964					prefix + "[" + ( typeof v === "object" && v != null ? i : "" ) + "]",
15965					v,
15966					traditional,
15967					add
15968				);
15969			}
15970		} );
15971
15972	} else if ( !traditional && toType( obj ) === "object" ) {
15973
15974		// Serialize object item.
15975		for ( name in obj ) {
15976			buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
15977		}
15978
15979	} else {
15980
15981		// Serialize scalar item.
15982		add( prefix, obj );
15983	}
15984}
15985
15986// Serialize an array of form elements or a set of
15987// key/values into a query string
15988jQuery.param = function( a, traditional ) {
15989	var prefix,
15990		s = [],
15991		add = function( key, valueOrFunction ) {
15992
15993			// If value is a function, invoke it and use its return value
15994			var value = isFunction( valueOrFunction ) ?
15995				valueOrFunction() :
15996				valueOrFunction;
15997
15998			s[ s.length ] = encodeURIComponent( key ) + "=" +
15999				encodeURIComponent( value == null ? "" : value );
16000		};
16001
16002	if ( a == null ) {
16003		return "";
16004	}
16005
16006	// If an array was passed in, assume that it is an array of form elements.
16007	if ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
16008
16009		// Serialize the form elements
16010		jQuery.each( a, function() {
16011			add( this.name, this.value );
16012		} );
16013
16014	} else {
16015
16016		// If traditional, encode the "old" way (the way 1.3.2 or older
16017		// did it), otherwise encode params recursively.
16018		for ( prefix in a ) {
16019			buildParams( prefix, a[ prefix ], traditional, add );
16020		}
16021	}
16022
16023	// Return the resulting serialization
16024	return s.join( "&" );
16025};
16026
16027jQuery.fn.extend( {
16028	serialize: function() {
16029		return jQuery.param( this.serializeArray() );
16030	},
16031	serializeArray: function() {
16032		return this.map( function() {
16033
16034			// Can add propHook for "elements" to filter or add form elements
16035			var elements = jQuery.prop( this, "elements" );
16036			return elements ? jQuery.makeArray( elements ) : this;
16037		} ).filter( function() {
16038			var type = this.type;
16039
vendor: 32,437 bytes, lines 16040-17293
16040			// Use .is( ":disabled" ) so that fieldset[disabled] works
16041			return this.name && !jQuery( this ).is( ":disabled" ) &&
16042				rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&
16043				( this.checked || !rcheckableType.test( type ) );
16044		} ).map( function( _i, elem ) {
16045			var val = jQuery( this ).val();
16046
16047			if ( val == null ) {
16048				return null;
16049			}
16050
16051			if ( Array.isArray( val ) ) {
16052				return jQuery.map( val, function( val ) {
16053					return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
16054				} );
16055			}
16056
16057			return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
16058		} ).get();
16059	}
16060} );
16061
16062
16063var
16064	r20 = /%20/g,
16065	rhash = /#.*$/,
16066	rantiCache = /([?&])_=[^&]*/,
16067	rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg,
16068
16069	// trac-7653, trac-8125, trac-8152: local protocol detection
16070	rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,
16071	rnoContent = /^(?:GET|HEAD)$/,
16072	rprotocol = /^\/\//,
16073
16074	/* Prefilters
16075	 * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
16076	 * 2) These are called:
16077	 *    - BEFORE asking for a transport
16078	 *    - AFTER param serialization (s.data is a string if s.processData is true)
16079	 * 3) key is the dataType
16080	 * 4) the catchall symbol "*" can be used
16081	 * 5) execution will start with transport dataType and THEN continue down to "*" if needed
16082	 */
16083	prefilters = {},
16084
16085	/* Transports bindings
16086	 * 1) key is the dataType
16087	 * 2) the catchall symbol "*" can be used
16088	 * 3) selection will start with transport dataType and THEN go to "*" if needed
16089	 */
16090	transports = {},
16091
16092	// Avoid comment-prolog char sequence (trac-10098); must appease lint and evade compression
16093	allTypes = "*/".concat( "*" ),
16094
16095	// Anchor tag for parsing the document origin
16096	originAnchor = document.createElement( "a" );
16097
16098originAnchor.href = location.href;
16099
16100// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
16101function addToPrefiltersOrTransports( structure ) {
16102
16103	// dataTypeExpression is optional and defaults to "*"
16104	return function( dataTypeExpression, func ) {
16105
16106		if ( typeof dataTypeExpression !== "string" ) {
16107			func = dataTypeExpression;
16108			dataTypeExpression = "*";
16109		}
16110
16111		var dataType,
16112			i = 0,
16113			dataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || [];
16114
16115		if ( isFunction( func ) ) {
16116
16117			// For each dataType in the dataTypeExpression
16118			while ( ( dataType = dataTypes[ i++ ] ) ) {
16119
16120				// Prepend if requested
16121				if ( dataType[ 0 ] === "+" ) {
16122					dataType = dataType.slice( 1 ) || "*";
16123					( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func );
16124
16125				// Otherwise append
16126				} else {
16127					( structure[ dataType ] = structure[ dataType ] || [] ).push( func );
16128				}
16129			}
16130		}
16131	};
16132}
16133
16134// Base inspection function for prefilters and transports
16135function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {
16136
16137	var inspected = {},
16138		seekingTransport = ( structure === transports );
16139
16140	function inspect( dataType ) {
16141		var selected;
16142		inspected[ dataType ] = true;
16143		jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {
16144			var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );
16145			if ( typeof dataTypeOrTransport === "string" &&
16146				!seekingTransport && !inspected[ dataTypeOrTransport ] ) {
16147
16148				options.dataTypes.unshift( dataTypeOrTransport );
16149				inspect( dataTypeOrTransport );
16150				return false;
16151			} else if ( seekingTransport ) {
16152				return !( selected = dataTypeOrTransport );
16153			}
16154		} );
16155		return selected;
16156	}
16157
16158	return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" );
16159}
16160
16161// A special extend for ajax options
16162// that takes "flat" options (not to be deep extended)
16163// Fixes trac-9887
16164function ajaxExtend( target, src ) {
16165	var key, deep,
16166		flatOptions = jQuery.ajaxSettings.flatOptions || {};
16167
16168	for ( key in src ) {
16169		if ( src[ key ] !== undefined ) {
16170			( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ];
16171		}
16172	}
16173	if ( deep ) {
16174		jQuery.extend( true, target, deep );
16175	}
16176
16177	return target;
16178}
16179
16180/* Handles responses to an ajax request:
16181 * - finds the right dataType (mediates between content-type and expected dataType)
16182 * - returns the corresponding response
16183 */
16184function ajaxHandleResponses( s, jqXHR, responses ) {
16185
16186	var ct, type, finalDataType, firstDataType,
16187		contents = s.contents,
16188		dataTypes = s.dataTypes;
16189
16190	// Remove auto dataType and get content-type in the process
16191	while ( dataTypes[ 0 ] === "*" ) {
16192		dataTypes.shift();
16193		if ( ct === undefined ) {
16194			ct = s.mimeType || jqXHR.getResponseHeader( "Content-Type" );
16195		}
16196	}
16197
16198	// Check if we're dealing with a known content-type
16199	if ( ct ) {
16200		for ( type in contents ) {
16201			if ( contents[ type ] && contents[ type ].test( ct ) ) {
16202				dataTypes.unshift( type );
16203				break;
16204			}
16205		}
16206	}
16207
16208	// Check to see if we have a response for the expected dataType
16209	if ( dataTypes[ 0 ] in responses ) {
16210		finalDataType = dataTypes[ 0 ];
16211	} else {
16212
16213		// Try convertible dataTypes
16214		for ( type in responses ) {
16215			if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[ 0 ] ] ) {
16216				finalDataType = type;
16217				break;
16218			}
16219			if ( !firstDataType ) {
16220				firstDataType = type;
16221			}
16222		}
16223
16224		// Or just use first one
16225		finalDataType = finalDataType || firstDataType;
16226	}
16227
16228	// If we found a dataType
16229	// We add the dataType to the list if needed
16230	// and return the corresponding response
16231	if ( finalDataType ) {
16232		if ( finalDataType !== dataTypes[ 0 ] ) {
16233			dataTypes.unshift( finalDataType );
16234		}
16235		return responses[ finalDataType ];
16236	}
16237}
16238
16239/* Chain conversions given the request and the original response
16240 * Also sets the responseXXX fields on the jqXHR instance
16241 */
16242function ajaxConvert( s, response, jqXHR, isSuccess ) {
16243	var conv2, current, conv, tmp, prev,
16244		converters = {},
16245
16246		// Work with a copy of dataTypes in case we need to modify it for conversion
16247		dataTypes = s.dataTypes.slice();
16248
16249	// Create converters map with lowercased keys
16250	if ( dataTypes[ 1 ] ) {
16251		for ( conv in s.converters ) {
16252			converters[ conv.toLowerCase() ] = s.converters[ conv ];
16253		}
16254	}
16255
16256	current = dataTypes.shift();
16257
16258	// Convert to each sequential dataType
16259	while ( current ) {
16260
16261		if ( s.responseFields[ current ] ) {
16262			jqXHR[ s.responseFields[ current ] ] = response;
16263		}
16264
16265		// Apply the dataFilter if provided
16266		if ( !prev && isSuccess && s.dataFilter ) {
16267			response = s.dataFilter( response, s.dataType );
16268		}
16269
16270		prev = current;
16271		current = dataTypes.shift();
16272
16273		if ( current ) {
16274
16275			// There's only work to do if current dataType is non-auto
16276			if ( current === "*" ) {
16277
16278				current = prev;
16279
16280			// Convert response if prev dataType is non-auto and differs from current
16281			} else if ( prev !== "*" && prev !== current ) {
16282
16283				// Seek a direct converter
16284				conv = converters[ prev + " " + current ] || converters[ "* " + current ];
16285
16286				// If none found, seek a pair
16287				if ( !conv ) {
16288					for ( conv2 in converters ) {
16289
16290						// If conv2 outputs current
16291						tmp = conv2.split( " " );
16292						if ( tmp[ 1 ] === current ) {
16293
16294							// If prev can be converted to accepted input
16295							conv = converters[ prev + " " + tmp[ 0 ] ] ||
16296								converters[ "* " + tmp[ 0 ] ];
16297							if ( conv ) {
16298
16299								// Condense equivalence converters
16300								if ( conv === true ) {
16301									conv = converters[ conv2 ];
16302
16303								// Otherwise, insert the intermediate dataType
16304								} else if ( converters[ conv2 ] !== true ) {
16305									current = tmp[ 0 ];
16306									dataTypes.unshift( tmp[ 1 ] );
16307								}
16308								break;
16309							}
16310						}
16311					}
16312				}
16313
16314				// Apply converter (if not an equivalence)
16315				if ( conv !== true ) {
16316
16317					// Unless errors are allowed to bubble, catch and return them
16318					if ( conv && s.throws ) {
16319						response = conv( response );
16320					} else {
16321						try {
16322							response = conv( response );
16323						} catch ( e ) {
16324							return {
16325								state: "parsererror",
16326								error: conv ? e : "No conversion from " + prev + " to " + current
16327							};
16328						}
16329					}
16330				}
16331			}
16332		}
16333	}
16334
16335	return { state: "success", data: response };
16336}
16337
16338jQuery.extend( {
16339
16340	// Counter for holding the number of active queries
16341	active: 0,
16342
16343	// Last-Modified header cache for next request
16344	lastModified: {},
16345	etag: {},
16346
16347	ajaxSettings: {
16348		url: location.href,
16349		type: "GET",
16350		isLocal: rlocalProtocol.test( location.protocol ),
16351		global: true,
16352		processData: true,
16353		async: true,
16354		contentType: "application/x-www-form-urlencoded; charset=UTF-8",
16355
16356		/*
16357		timeout: 0,
16358		data: null,
16359		dataType: null,
16360		username: null,
16361		password: null,
16362		cache: null,
16363		throws: false,
16364		traditional: false,
16365		headers: {},
16366		*/
16367
16368		accepts: {
16369			"*": allTypes,
16370			text: "text/plain",
16371			html: "text/html",
16372			xml: "application/xml, text/xml",
16373			json: "application/json, text/javascript"
16374		},
16375
16376		contents: {
16377			xml: /\bxml\b/,
16378			html: /\bhtml/,
16379			json: /\bjson\b/
16380		},
16381
16382		responseFields: {
16383			xml: "responseXML",
16384			text: "responseText",
16385			json: "responseJSON"
16386		},
16387
16388		// Data converters
16389		// Keys separate source (or catchall "*") and destination types with a single space
16390		converters: {
16391
16392			// Convert anything to text
16393			"* text": String,
16394
16395			// Text to html (true = no transformation)
16396			"text html": true,
16397
16398			// Evaluate text as a json expression
16399			"text json": JSON.parse,
16400
16401			// Parse text as xml
16402			"text xml": jQuery.parseXML
16403		},
16404
16405		// For options that shouldn't be deep extended:
16406		// you can add your own custom options here if
16407		// and when you create one that shouldn't be
16408		// deep extended (see ajaxExtend)
16409		flatOptions: {
16410			url: true,
16411			context: true
16412		}
16413	},
16414
16415	// Creates a full fledged settings object into target
16416	// with both ajaxSettings and settings fields.
16417	// If target is omitted, writes into ajaxSettings.
16418	ajaxSetup: function( target, settings ) {
16419		return settings ?
16420
16421			// Building a settings object
16422			ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :
16423
16424			// Extending ajaxSettings
16425			ajaxExtend( jQuery.ajaxSettings, target );
16426	},
16427
16428	ajaxPrefilter: addToPrefiltersOrTransports( prefilters ),
16429	ajaxTransport: addToPrefiltersOrTransports( transports ),
16430
16431	// Main method
16432	ajax: function( url, options ) {
16433
16434		// If url is an object, simulate pre-1.5 signature
16435		if ( typeof url === "object" ) {
16436			options = url;
16437			url = undefined;
16438		}
16439
16440		// Force options to be an object
16441		options = options || {};
16442
16443		var transport,
16444
16445			// URL without anti-cache param
16446			cacheURL,
16447
16448			// Response headers
16449			responseHeadersString,
16450			responseHeaders,
16451
16452			// timeout handle
16453			timeoutTimer,
16454
16455			// Url cleanup var
16456			urlAnchor,
16457
16458			// Request state (becomes false upon send and true upon completion)
16459			completed,
16460
16461			// To know if global events are to be dispatched
16462			fireGlobals,
16463
16464			// Loop variable
16465			i,
16466
16467			// uncached part of the url
16468			uncached,
16469
16470			// Create the final options object
16471			s = jQuery.ajaxSetup( {}, options ),
16472
16473			// Callbacks context
16474			callbackContext = s.context || s,
16475
16476			// Context for global events is callbackContext if it is a DOM node or jQuery collection
16477			globalEventContext = s.context &&
16478				( callbackContext.nodeType || callbackContext.jquery ) ?
16479				jQuery( callbackContext ) :
16480				jQuery.event,
16481
16482			// Deferreds
16483			deferred = jQuery.Deferred(),
16484			completeDeferred = jQuery.Callbacks( "once memory" ),
16485
16486			// Status-dependent callbacks
16487			statusCode = s.statusCode || {},
16488
16489			// Headers (they are sent all at once)
16490			requestHeaders = {},
16491			requestHeadersNames = {},
16492
16493			// Default abort message
16494			strAbort = "canceled",
16495
16496			// Fake xhr
16497			jqXHR = {
16498				readyState: 0,
16499
16500				// Builds headers hashtable if needed
16501				getResponseHeader: function( key ) {
16502					var match;
16503					if ( completed ) {
16504						if ( !responseHeaders ) {
16505							responseHeaders = {};
16506							while ( ( match = rheaders.exec( responseHeadersString ) ) ) {
16507								responseHeaders[ match[ 1 ].toLowerCase() + " " ] =
16508									( responseHeaders[ match[ 1 ].toLowerCase() + " " ] || [] )
16509										.concat( match[ 2 ] );
16510							}
16511						}
16512						match = responseHeaders[ key.toLowerCase() + " " ];
16513					}
16514					return match == null ? null : match.join( ", " );
16515				},
16516
16517				// Raw string
16518				getAllResponseHeaders: function() {
16519					return completed ? responseHeadersString : null;
16520				},
16521
16522				// Caches the header
16523				setRequestHeader: function( name, value ) {
16524					if ( completed == null ) {
16525						name = requestHeadersNames[ name.toLowerCase() ] =
16526							requestHeadersNames[ name.toLowerCase() ] || name;
16527						requestHeaders[ name ] = value;
16528					}
16529					return this;
16530				},
16531
16532				// Overrides response content-type header
16533				overrideMimeType: function( type ) {
16534					if ( completed == null ) {
16535						s.mimeType = type;
16536					}
16537					return this;
16538				},
16539
16540				// Status-dependent callbacks
16541				statusCode: function( map ) {
16542					var code;
16543					if ( map ) {
16544						if ( completed ) {
16545
16546							// Execute the appropriate callbacks
16547							jqXHR.always( map[ jqXHR.status ] );
16548						} else {
16549
16550							// Lazy-add the new callbacks in a way that preserves old ones
16551							for ( code in map ) {
16552								statusCode[ code ] = [ statusCode[ code ], map[ code ] ];
16553							}
16554						}
16555					}
16556					return this;
16557				},
16558
16559				// Cancel the request
16560				abort: function( statusText ) {
16561					var finalText = statusText || strAbort;
16562					if ( transport ) {
16563						transport.abort( finalText );
16564					}
16565					done( 0, finalText );
16566					return this;
16567				}
16568			};
16569
16570		// Attach deferreds
16571		deferred.promise( jqXHR );
16572
16573		// Add protocol if not provided (prefilters might expect it)
16574		// Handle falsy url in the settings object (trac-10093: consistency with old signature)
16575		// We also use the url parameter if available
16576		s.url = ( ( url || s.url || location.href ) + "" )
16577			.replace( rprotocol, location.protocol + "//" );
16578
16579		// Alias method option to type as per ticket trac-12004
16580		s.type = options.method || options.type || s.method || s.type;
16581
16582		// Extract dataTypes list
16583		s.dataTypes = ( s.dataType || "*" ).toLowerCase().match( rnothtmlwhite ) || [ "" ];
16584
16585		// A cross-domain request is in order when the origin doesn't match the current origin.
16586		if ( s.crossDomain == null ) {
16587			urlAnchor = document.createElement( "a" );
16588
16589			// Support: IE <=8 - 11, Edge 12 - 15
16590			// IE throws exception on accessing the href property if url is malformed,
16591			// e.g. http://example.com:80x/
16592			try {
16593				urlAnchor.href = s.url;
16594
16595				// Support: IE <=8 - 11 only
16596				// Anchor's host property isn't correctly set when s.url is relative
16597				urlAnchor.href = urlAnchor.href;
16598				s.crossDomain = originAnchor.protocol + "//" + originAnchor.host !==
16599					urlAnchor.protocol + "//" + urlAnchor.host;
16600			} catch ( e ) {
16601
16602				// If there is an error parsing the URL, assume it is crossDomain,
16603				// it can be rejected by the transport if it is invalid
16604				s.crossDomain = true;
16605			}
16606		}
16607
16608		// Convert data if not already a string
16609		if ( s.data && s.processData && typeof s.data !== "string" ) {
16610			s.data = jQuery.param( s.data, s.traditional );
16611		}
16612
16613		// Apply prefilters
16614		inspectPrefiltersOrTransports( prefilters, s, options, jqXHR );
16615
16616		// If request was aborted inside a prefilter, stop there
16617		if ( completed ) {
16618			return jqXHR;
16619		}
16620
16621		// We can fire global events as of now if asked to
16622		// Don't fire events if jQuery.event is undefined in an AMD-usage scenario (trac-15118)
16623		fireGlobals = jQuery.event && s.global;
16624
16625		// Watch for a new set of requests
16626		if ( fireGlobals && jQuery.active++ === 0 ) {
16627			jQuery.event.trigger( "ajaxStart" );
16628		}
16629
16630		// Uppercase the type
16631		s.type = s.type.toUpperCase();
16632
16633		// Determine if request has content
16634		s.hasContent = !rnoContent.test( s.type );
16635
16636		// Save the URL in case we're toying with the If-Modified-Since
16637		// and/or If-None-Match header later on
16638		// Remove hash to simplify url manipulation
16639		cacheURL = s.url.replace( rhash, "" );
16640
16641		// More options handling for requests with no content
16642		if ( !s.hasContent ) {
16643
16644			// Remember the hash so we can put it back
16645			uncached = s.url.slice( cacheURL.length );
16646
16647			// If data is available and should be processed, append data to url
16648			if ( s.data && ( s.processData || typeof s.data === "string" ) ) {
16649				cacheURL += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data;
16650
16651				// trac-9682: remove data so that it's not used in an eventual retry
16652				delete s.data;
16653			}
16654
16655			// Add or update anti-cache param if needed
16656			if ( s.cache === false ) {
16657				cacheURL = cacheURL.replace( rantiCache, "$1" );
16658				uncached = ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ( nonce.guid++ ) +
16659					uncached;
16660			}
16661
16662			// Put hash and anti-cache on the URL that will be requested (gh-1732)
16663			s.url = cacheURL + uncached;
16664
16665		// Change '%20' to '+' if this is encoded form body content (gh-2658)
16666		} else if ( s.data && s.processData &&
16667			( s.contentType || "" ).indexOf( "application/x-www-form-urlencoded" ) === 0 ) {
16668			s.data = s.data.replace( r20, "+" );
16669		}
16670
16671		// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
16672		if ( s.ifModified ) {
16673			if ( jQuery.lastModified[ cacheURL ] ) {
16674				jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] );
16675			}
16676			if ( jQuery.etag[ cacheURL ] ) {
16677				jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] );
16678			}
16679		}
16680
16681		// Set the correct header, if data is being sent
16682		if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {
16683			jqXHR.setRequestHeader( "Content-Type", s.contentType );
16684		}
16685
16686		// Set the Accepts header for the server, depending on the dataType
16687		jqXHR.setRequestHeader(
16688			"Accept",
16689			s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ?
16690				s.accepts[ s.dataTypes[ 0 ] ] +
16691					( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) :
16692				s.accepts[ "*" ]
16693		);
16694
16695		// Check for headers option
16696		for ( i in s.headers ) {
16697			jqXHR.setRequestHeader( i, s.headers[ i ] );
16698		}
16699
16700		// Allow custom headers/mimetypes and early abort
16701		if ( s.beforeSend &&
16702			( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) {
16703
16704			// Abort if not done already and return
16705			return jqXHR.abort();
16706		}
16707
16708		// Aborting is no longer a cancellation
16709		strAbort = "abort";
16710
16711		// Install callbacks on deferreds
16712		completeDeferred.add( s.complete );
16713		jqXHR.done( s.success );
16714		jqXHR.fail( s.error );
16715
16716		// Get transport
16717		transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );
16718
16719		// If no transport, we auto-abort
16720		if ( !transport ) {
16721			done( -1, "No Transport" );
16722		} else {
16723			jqXHR.readyState = 1;
16724
16725			// Send global event
16726			if ( fireGlobals ) {
16727				globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] );
16728			}
16729
16730			// If request was aborted inside ajaxSend, stop there
16731			if ( completed ) {
16732				return jqXHR;
16733			}
16734
16735			// Timeout
16736			if ( s.async && s.timeout > 0 ) {
16737				timeoutTimer = window.setTimeout( function() {
16738					jqXHR.abort( "timeout" );
16739				}, s.timeout );
16740			}
16741
16742			try {
16743				completed = false;
16744				transport.send( requestHeaders, done );
16745			} catch ( e ) {
16746
16747				// Rethrow post-completion exceptions
16748				if ( completed ) {
16749					throw e;
16750				}
16751
16752				// Propagate others as results
16753				done( -1, e );
16754			}
16755		}
16756
16757		// Callback for when everything is done
16758		function done( status, nativeStatusText, responses, headers ) {
16759			var isSuccess, success, error, response, modified,
16760				statusText = nativeStatusText;
16761
16762			// Ignore repeat invocations
16763			if ( completed ) {
16764				return;
16765			}
16766
16767			completed = true;
16768
16769			// Clear timeout if it exists
16770			if ( timeoutTimer ) {
16771				window.clearTimeout( timeoutTimer );
16772			}
16773
16774			// Dereference transport for early garbage collection
16775			// (no matter how long the jqXHR object will be used)
16776			transport = undefined;
16777
16778			// Cache response headers
16779			responseHeadersString = headers || "";
16780
16781			// Set readyState
16782			jqXHR.readyState = status > 0 ? 4 : 0;
16783
16784			// Determine if successful
16785			isSuccess = status >= 200 && status < 300 || status === 304;
16786
16787			// Get response data
16788			if ( responses ) {
16789				response = ajaxHandleResponses( s, jqXHR, responses );
16790			}
16791
16792			// Use a noop converter for missing script but not if jsonp
16793			if ( !isSuccess &&
16794				jQuery.inArray( "script", s.dataTypes ) > -1 &&
16795				jQuery.inArray( "json", s.dataTypes ) < 0 ) {
16796				s.converters[ "text script" ] = function() {};
16797			}
16798
16799			// Convert no matter what (that way responseXXX fields are always set)
16800			response = ajaxConvert( s, response, jqXHR, isSuccess );
16801
16802			// If successful, handle type chaining
16803			if ( isSuccess ) {
16804
16805				// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
16806				if ( s.ifModified ) {
16807					modified = jqXHR.getResponseHeader( "Last-Modified" );
16808					if ( modified ) {
16809						jQuery.lastModified[ cacheURL ] = modified;
16810					}
16811					modified = jqXHR.getResponseHeader( "etag" );
16812					if ( modified ) {
16813						jQuery.etag[ cacheURL ] = modified;
16814					}
16815				}
16816
16817				// if no content
16818				if ( status === 204 || s.type === "HEAD" ) {
16819					statusText = "nocontent";
16820
16821				// if not modified
16822				} else if ( status === 304 ) {
16823					statusText = "notmodified";
16824
16825				// If we have data, let's convert it
16826				} else {
16827					statusText = response.state;
16828					success = response.data;
16829					error = response.error;
16830					isSuccess = !error;
16831				}
16832			} else {
16833
16834				// Extract error from statusText and normalize for non-aborts
16835				error = statusText;
16836				if ( status || !statusText ) {
16837					statusText = "error";
16838					if ( status < 0 ) {
16839						status = 0;
16840					}
16841				}
16842			}
16843
16844			// Set data for the fake xhr object
16845			jqXHR.status = status;
16846			jqXHR.statusText = ( nativeStatusText || statusText ) + "";
16847
16848			// Success/Error
16849			if ( isSuccess ) {
16850				deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );
16851			} else {
16852				deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );
16853			}
16854
16855			// Status-dependent callbacks
16856			jqXHR.statusCode( statusCode );
16857			statusCode = undefined;
16858
16859			if ( fireGlobals ) {
16860				globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError",
16861					[ jqXHR, s, isSuccess ? success : error ] );
16862			}
16863
16864			// Complete
16865			completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );
16866
16867			if ( fireGlobals ) {
16868				globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] );
16869
16870				// Handle the global AJAX counter
16871				if ( !( --jQuery.active ) ) {
16872					jQuery.event.trigger( "ajaxStop" );
16873				}
16874			}
16875		}
16876
16877		return jqXHR;
16878	},
16879
16880	getJSON: function( url, data, callback ) {
16881		return jQuery.get( url, data, callback, "json" );
16882	},
16883
16884	getScript: function( url, callback ) {
16885		return jQuery.get( url, undefined, callback, "script" );
16886	}
16887} );
16888
16889jQuery.each( [ "get", "post" ], function( _i, method ) {
16890	jQuery[ method ] = function( url, data, callback, type ) {
16891
16892		// Shift arguments if data argument was omitted
16893		if ( isFunction( data ) ) {
16894			type = type || callback;
16895			callback = data;
16896			data = undefined;
16897		}
16898
16899		// The url can be an options object (which then must have .url)
16900		return jQuery.ajax( jQuery.extend( {
16901			url: url,
16902			type: method,
16903			dataType: type,
16904			data: data,
16905			success: callback
16906		}, jQuery.isPlainObject( url ) && url ) );
16907	};
16908} );
16909
16910jQuery.ajaxPrefilter( function( s ) {
16911	var i;
16912	for ( i in s.headers ) {
16913		if ( i.toLowerCase() === "content-type" ) {
16914			s.contentType = s.headers[ i ] || "";
16915		}
16916	}
16917} );
16918
16919
16920jQuery._evalUrl = function( url, options, doc ) {
16921	return jQuery.ajax( {
16922		url: url,
16923
16924		// Make this explicit, since user can override this through ajaxSetup (trac-11264)
16925		type: "GET",
16926		dataType: "script",
16927		cache: true,
16928		async: false,
16929		global: false,
16930
16931		// Only evaluate the response if it is successful (gh-4126)
16932		// dataFilter is not invoked for failure responses, so using it instead
16933		// of the default converter is kludgy but it works.
16934		converters: {
16935			"text script": function() {}
16936		},
16937		dataFilter: function( response ) {
16938			jQuery.globalEval( response, options, doc );
16939		}
16940	} );
16941};
16942
16943
16944jQuery.fn.extend( {
16945	wrapAll: function( html ) {
16946		var wrap;
16947
16948		if ( this[ 0 ] ) {
16949			if ( isFunction( html ) ) {
16950				html = html.call( this[ 0 ] );
16951			}
16952
16953			// The elements to wrap the target around
16954			wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true );
16955
16956			if ( this[ 0 ].parentNode ) {
16957				wrap.insertBefore( this[ 0 ] );
16958			}
16959
16960			wrap.map( function() {
16961				var elem = this;
16962
16963				while ( elem.firstElementChild ) {
16964					elem = elem.firstElementChild;
16965				}
16966
16967				return elem;
16968			} ).append( this );
16969		}
16970
16971		return this;
16972	},
16973
16974	wrapInner: function( html ) {
16975		if ( isFunction( html ) ) {
16976			return this.each( function( i ) {
16977				jQuery( this ).wrapInner( html.call( this, i ) );
16978			} );
16979		}
16980
16981		return this.each( function() {
16982			var self = jQuery( this ),
16983				contents = self.contents();
16984
16985			if ( contents.length ) {
16986				contents.wrapAll( html );
16987
16988			} else {
16989				self.append( html );
16990			}
16991		} );
16992	},
16993
16994	wrap: function( html ) {
16995		var htmlIsFunction = isFunction( html );
16996
16997		return this.each( function( i ) {
16998			jQuery( this ).wrapAll( htmlIsFunction ? html.call( this, i ) : html );
16999		} );
17000	},
17001
17002	unwrap: function( selector ) {
17003		this.parent( selector ).not( "body" ).each( function() {
17004			jQuery( this ).replaceWith( this.childNodes );
17005		} );
17006		return this;
17007	}
17008} );
17009
17010
17011jQuery.expr.pseudos.hidden = function( elem ) {
17012	return !jQuery.expr.pseudos.visible( elem );
17013};
17014jQuery.expr.pseudos.visible = function( elem ) {
17015	return !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length );
17016};
17017
17018
17019
17020
17021jQuery.ajaxSettings.xhr = function() {
17022	try {
17023		return new window.XMLHttpRequest();
17024	} catch ( e ) {}
17025};
17026
17027var xhrSuccessStatus = {
17028
17029		// File protocol always yields status code 0, assume 200
17030		0: 200,
17031
17032		// Support: IE <=9 only
17033		// trac-1450: sometimes IE returns 1223 when it should be 204
17034		1223: 204
17035	},
17036	xhrSupported = jQuery.ajaxSettings.xhr();
17037
17038support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported );
17039support.ajax = xhrSupported = !!xhrSupported;
17040
17041jQuery.ajaxTransport( function( options ) {
17042	var callback, errorCallback;
17043
17044	// Cross domain only allowed if supported through XMLHttpRequest
17045	if ( support.cors || xhrSupported && !options.crossDomain ) {
17046		return {
17047			send: function( headers, complete ) {
17048				var i,
17049					xhr = options.xhr();
17050
17051				xhr.open(
17052					options.type,
17053					options.url,
17054					options.async,
17055					options.username,
17056					options.password
17057				);
17058
17059				// Apply custom fields if provided
17060				if ( options.xhrFields ) {
17061					for ( i in options.xhrFields ) {
17062						xhr[ i ] = options.xhrFields[ i ];
17063					}
17064				}
17065
17066				// Override mime type if needed
17067				if ( options.mimeType && xhr.overrideMimeType ) {
17068					xhr.overrideMimeType( options.mimeType );
17069				}
17070
17071				// X-Requested-With header
17072				// For cross-domain requests, seeing as conditions for a preflight are
17073				// akin to a jigsaw puzzle, we simply never set it to be sure.
17074				// (it can always be set on a per-request basis or even using ajaxSetup)
17075				// For same-domain requests, won't change header if already provided.
17076				if ( !options.crossDomain && !headers[ "X-Requested-With" ] ) {
17077					headers[ "X-Requested-With" ] = "XMLHttpRequest";
17078				}
17079
17080				// Set headers
17081				for ( i in headers ) {
17082					xhr.setRequestHeader( i, headers[ i ] );
17083				}
17084
17085				// Callback
17086				callback = function( type ) {
17087					return function() {
17088						if ( callback ) {
17089							callback = errorCallback = xhr.onload =
17090								xhr.onerror = xhr.onabort = xhr.ontimeout =
17091									xhr.onreadystatechange = null;
17092
17093							if ( type === "abort" ) {
17094								xhr.abort();
17095							} else if ( type === "error" ) {
17096
17097								// Support: IE <=9 only
17098								// On a manual native abort, IE9 throws
17099								// errors on any property access that is not readyState
17100								if ( typeof xhr.status !== "number" ) {
17101									complete( 0, "error" );
17102								} else {
17103									complete(
17104
17105										// File: protocol always yields status 0; see trac-8605, trac-14207
17106										xhr.status,
17107										xhr.statusText
17108									);
17109								}
17110							} else {
17111								complete(
17112									xhrSuccessStatus[ xhr.status ] || xhr.status,
17113									xhr.statusText,
17114
17115									// Support: IE <=9 only
17116									// IE9 has no XHR2 but throws on binary (trac-11426)
17117									// For XHR2 non-text, let the caller handle it (gh-2498)
17118									( xhr.responseType || "text" ) !== "text"  ||
17119									typeof xhr.responseText !== "string" ?
17120										{ binary: xhr.response } :
17121										{ text: xhr.responseText },
17122									xhr.getAllResponseHeaders()
17123								);
17124							}
17125						}
17126					};
17127				};
17128
17129				// Listen to events
17130				xhr.onload = callback();
17131				errorCallback = xhr.onerror = xhr.ontimeout = callback( "error" );
17132
17133				// Support: IE 9 only
17134				// Use onreadystatechange to replace onabort
17135				// to handle uncaught aborts
17136				if ( xhr.onabort !== undefined ) {
17137					xhr.onabort = errorCallback;
17138				} else {
17139					xhr.onreadystatechange = function() {
17140
17141						// Check readyState before timeout as it changes
17142						if ( xhr.readyState === 4 ) {
17143
17144							// Allow onerror to be called first,
17145							// but that will not handle a native abort
17146							// Also, save errorCallback to a variable
17147							// as xhr.onerror cannot be accessed
17148							window.setTimeout( function() {
17149								if ( callback ) {
17150									errorCallback();
17151								}
17152							} );
17153						}
17154					};
17155				}
17156
17157				// Create the abort callback
17158				callback = callback( "abort" );
17159
17160				try {
17161
17162					// Do send the request (this may raise an exception)
17163					xhr.send( options.hasContent && options.data || null );
17164				} catch ( e ) {
17165
17166					// trac-14683: Only rethrow if this hasn't been notified as an error yet
17167					if ( callback ) {
17168						throw e;
17169					}
17170				}
17171			},
17172
17173			abort: function() {
17174				if ( callback ) {
17175					callback();
17176				}
17177			}
17178		};
17179	}
17180} );
17181
17182
17183
17184
17185// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432)
17186jQuery.ajaxPrefilter( function( s ) {
17187	if ( s.crossDomain ) {
17188		s.contents.script = false;
17189	}
17190} );
17191
17192// Install script dataType
17193jQuery.ajaxSetup( {
17194	accepts: {
17195		script: "text/javascript, application/javascript, " +
17196			"application/ecmascript, application/x-ecmascript"
17197	},
17198	contents: {
17199		script: /\b(?:java|ecma)script\b/
17200	},
17201	converters: {
17202		"text script": function( text ) {
17203			jQuery.globalEval( text );
17204			return text;
17205		}
17206	}
17207} );
17208
17209// Handle cache's special case and crossDomain
17210jQuery.ajaxPrefilter( "script", function( s ) {
17211	if ( s.cache === undefined ) {
17212		s.cache = false;
17213	}
17214	if ( s.crossDomain ) {
17215		s.type = "GET";
17216	}
17217} );
17218
17219// Bind script tag hack transport
17220jQuery.ajaxTransport( "script", function( s ) {
17221
17222	// This transport only deals with cross domain or forced-by-attrs requests
17223	if ( s.crossDomain || s.scriptAttrs ) {
17224		var script, callback;
17225		return {
17226			send: function( _, complete ) {
17227				script = jQuery( "<script>" )
17228					.attr( s.scriptAttrs || {} )
17229					.prop( { charset: s.scriptCharset, src: s.url } )
17230					.on( "load error", callback = function( evt ) {
17231						script.remove();
17232						callback = null;
17233						if ( evt ) {
17234							complete( evt.type === "error" ? 404 : 200, evt.type );
17235						}
17236					} );
17237
17238				// Use native DOM manipulation to avoid our domManip AJAX trickery
17239				document.head.appendChild( script[ 0 ] );
17240			},
17241			abort: function() {
17242				if ( callback ) {
17243					callback();
17244				}
17245			}
17246		};
17247	}
17248} );
17249
17250
17251
17252
17253var oldCallbacks = [],
17254	rjsonp = /(=)\?(?=&|$)|\?\?/;
17255
17256// Default jsonp settings
17257jQuery.ajaxSetup( {
17258	jsonp: "callback",
17259	jsonpCallback: function() {
17260		var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( nonce.guid++ ) );
17261		this[ callback ] = true;
17262		return callback;
17263	}
17264} );
17265
17266// Detect, normalize options and install callbacks for jsonp requests
17267jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
17268
17269	var callbackName, overwritten, responseContainer,
17270		jsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ?
17271			"url" :
17272			typeof s.data === "string" &&
17273				( s.contentType || "" )
17274					.indexOf( "application/x-www-form-urlencoded" ) === 0 &&
17275				rjsonp.test( s.data ) && "data"
17276		);
17277
17278	// Handle iff the expected data type is "jsonp" or we have a parameter to set
17279	if ( jsonProp || s.dataTypes[ 0 ] === "jsonp" ) {
17280
17281		// Get callback name, remembering preexisting value associated with it
17282		callbackName = s.jsonpCallback = isFunction( s.jsonpCallback ) ?
17283			s.jsonpCallback() :
17284			s.jsonpCallback;
17285
17286		// Insert callback into url or form data
17287		if ( jsonProp ) {
17288			s[ jsonProp ] = s[ jsonProp ].replace( rjsonp, "$1" + callbackName );
17289		} else if ( s.jsonp !== false ) {
17290			s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.jsonp + "=" + callbackName;
17291		}
17292
17293		// Use data converter to retrieve json after script execution
vendor: 8,362 bytes, lines 17294-17605
17294		s.converters[ "script json" ] = function() {
17295			if ( !responseContainer ) {
17296				jQuery.error( callbackName + " was not called" );
17297			}
17298			return responseContainer[ 0 ];
17299		};
17300
17301		// Force json dataType
17302		s.dataTypes[ 0 ] = "json";
17303
17304		// Install callback
17305		overwritten = window[ callbackName ];
17306		window[ callbackName ] = function() {
17307			responseContainer = arguments;
17308		};
17309
17310		// Clean-up function (fires after converters)
17311		jqXHR.always( function() {
17312
17313			// If previous value didn't exist - remove it
17314			if ( overwritten === undefined ) {
17315				jQuery( window ).removeProp( callbackName );
17316
17317			// Otherwise restore preexisting value
17318			} else {
17319				window[ callbackName ] = overwritten;
17320			}
17321
17322			// Save back as free
17323			if ( s[ callbackName ] ) {
17324
17325				// Make sure that re-using the options doesn't screw things around
17326				s.jsonpCallback = originalSettings.jsonpCallback;
17327
17328				// Save the callback name for future use
17329				oldCallbacks.push( callbackName );
17330			}
17331
17332			// Call if it was a function and we have a response
17333			if ( responseContainer && isFunction( overwritten ) ) {
17334				overwritten( responseContainer[ 0 ] );
17335			}
17336
17337			responseContainer = overwritten = undefined;
17338		} );
17339
17340		// Delegate to script
17341		return "script";
17342	}
17343} );
17344
17345
17346
17347
17348// Support: Safari 8 only
17349// In Safari 8 documents created via document.implementation.createHTMLDocument
17350// collapse sibling forms: the second one becomes a child of the first one.
17351// Because of that, this security measure has to be disabled in Safari 8.
17352// https://bugs.webkit.org/show_bug.cgi?id=137337
17353support.createHTMLDocument = ( function() {
17354	var body = document.implementation.createHTMLDocument( "" ).body;
17355	body.innerHTML = "<form></form><form></form>";
17356	return body.childNodes.length === 2;
17357} )();
17358
17359
17360// Argument "data" should be string of html
17361// context (optional): If specified, the fragment will be created in this context,
17362// defaults to document
17363// keepScripts (optional): If true, will include scripts passed in the html string
17364jQuery.parseHTML = function( data, context, keepScripts ) {
17365	if ( typeof data !== "string" ) {
17366		return [];
17367	}
17368	if ( typeof context === "boolean" ) {
17369		keepScripts = context;
17370		context = false;
17371	}
17372
17373	var base, parsed, scripts;
17374
17375	if ( !context ) {
17376
17377		// Stop scripts or inline event handlers from being executed immediately
17378		// by using document.implementation
17379		if ( support.createHTMLDocument ) {
17380			context = document.implementation.createHTMLDocument( "" );
17381
17382			// Set the base href for the created document
17383			// so any parsed elements with URLs
17384			// are based on the document's URL (gh-2965)
17385			base = context.createElement( "base" );
17386			base.href = document.location.href;
17387			context.head.appendChild( base );
17388		} else {
17389			context = document;
17390		}
17391	}
17392
17393	parsed = rsingleTag.exec( data );
17394	scripts = !keepScripts && [];
17395
17396	// Single tag
17397	if ( parsed ) {
17398		return [ context.createElement( parsed[ 1 ] ) ];
17399	}
17400
17401	parsed = buildFragment( [ data ], context, scripts );
17402
17403	if ( scripts && scripts.length ) {
17404		jQuery( scripts ).remove();
17405	}
17406
17407	return jQuery.merge( [], parsed.childNodes );
17408};
17409
17410
17411/**
17412 * Load a url into a page
17413 */
17414jQuery.fn.load = function( url, params, callback ) {
17415	var selector, type, response,
17416		self = this,
17417		off = url.indexOf( " " );
17418
17419	if ( off > -1 ) {
17420		selector = stripAndCollapse( url.slice( off ) );
17421		url = url.slice( 0, off );
17422	}
17423
17424	// If it's a function
17425	if ( isFunction( params ) ) {
17426
17427		// We assume that it's the callback
17428		callback = params;
17429		params = undefined;
17430
17431	// Otherwise, build a param string
17432	} else if ( params && typeof params === "object" ) {
17433		type = "POST";
17434	}
17435
17436	// If we have elements to modify, make the request
17437	if ( self.length > 0 ) {
17438		jQuery.ajax( {
17439			url: url,
17440
17441			// If "type" variable is undefined, then "GET" method will be used.
17442			// Make value of this field explicit since
17443			// user can override it through ajaxSetup method
17444			type: type || "GET",
17445			dataType: "html",
17446			data: params
17447		} ).done( function( responseText ) {
17448
17449			// Save response for use in complete callback
17450			response = arguments;
17451
17452			self.html( selector ?
17453
17454				// If a selector was specified, locate the right elements in a dummy div
17455				// Exclude scripts to avoid IE 'Permission Denied' errors
17456				jQuery( "<div>" ).append( jQuery.parseHTML( responseText ) ).find( selector ) :
17457
17458				// Otherwise use the full result
17459				responseText );
17460
17461		// If the request succeeds, this function gets "data", "status", "jqXHR"
17462		// but they are ignored because response was set above.
17463		// If it fails, this function gets "jqXHR", "status", "error"
17464		} ).always( callback && function( jqXHR, status ) {
17465			self.each( function() {
17466				callback.apply( this, response || [ jqXHR.responseText, status, jqXHR ] );
17467			} );
17468		} );
17469	}
17470
17471	return this;
17472};
17473
17474
17475
17476
17477jQuery.expr.pseudos.animated = function( elem ) {
17478	return jQuery.grep( jQuery.timers, function( fn ) {
17479		return elem === fn.elem;
17480	} ).length;
17481};
17482
17483
17484
17485
17486jQuery.offset = {
17487	setOffset: function( elem, options, i ) {
17488		var curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition,
17489			position = jQuery.css( elem, "position" ),
17490			curElem = jQuery( elem ),
17491			props = {};
17492
17493		// Set position first, in-case top/left are set even on static elem
17494		if ( position === "static" ) {
17495			elem.style.position = "relative";
17496		}
17497
17498		curOffset = curElem.offset();
17499		curCSSTop = jQuery.css( elem, "top" );
17500		curCSSLeft = jQuery.css( elem, "left" );
17501		calculatePosition = ( position === "absolute" || position === "fixed" ) &&
17502			( curCSSTop + curCSSLeft ).indexOf( "auto" ) > -1;
17503
17504		// Need to be able to calculate position if either
17505		// top or left is auto and position is either absolute or fixed
17506		if ( calculatePosition ) {
17507			curPosition = curElem.position();
17508			curTop = curPosition.top;
17509			curLeft = curPosition.left;
17510
17511		} else {
17512			curTop = parseFloat( curCSSTop ) || 0;
17513			curLeft = parseFloat( curCSSLeft ) || 0;
17514		}
17515
17516		if ( isFunction( options ) ) {
17517
17518			// Use jQuery.extend here to allow modification of coordinates argument (gh-1848)
17519			options = options.call( elem, i, jQuery.extend( {}, curOffset ) );
17520		}
17521
17522		if ( options.top != null ) {
17523			props.top = ( options.top - curOffset.top ) + curTop;
17524		}
17525		if ( options.left != null ) {
17526			props.left = ( options.left - curOffset.left ) + curLeft;
17527		}
17528
17529		if ( "using" in options ) {
17530			options.using.call( elem, props );
17531
17532		} else {
17533			curElem.css( props );
17534		}
17535	}
17536};
17537
17538jQuery.fn.extend( {
17539
17540	// offset() relates an element's border box to the document origin
17541	offset: function( options ) {
17542
17543		// Preserve chaining for setter
17544		if ( arguments.length ) {
17545			return options === undefined ?
17546				this :
17547				this.each( function( i ) {
17548					jQuery.offset.setOffset( this, options, i );
17549				} );
17550		}
17551
17552		var rect, win,
17553			elem = this[ 0 ];
17554
17555		if ( !elem ) {
17556			return;
17557		}
17558
17559		// Return zeros for disconnected and hidden (display: none) elements (gh-2310)
17560		// Support: IE <=11 only
17561		// Running getBoundingClientRect on a
17562		// disconnected node in IE throws an error
17563		if ( !elem.getClientRects().length ) {
17564			return { top: 0, left: 0 };
17565		}
17566
17567		// Get document-relative position by adding viewport scroll to viewport-relative gBCR
17568		rect = elem.getBoundingClientRect();
17569		win = elem.ownerDocument.defaultView;
17570		return {
17571			top: rect.top + win.pageYOffset,
17572			left: rect.left + win.pageXOffset
17573		};
17574	},
17575
17576	// position() relates an element's margin box to its offset parent's padding box
17577	// This corresponds to the behavior of CSS absolute positioning
17578	position: function() {
17579		if ( !this[ 0 ] ) {
17580			return;
17581		}
17582
17583		var offsetParent, offset, doc,
17584			elem = this[ 0 ],
17585			parentOffset = { top: 0, left: 0 };
17586
17587		// position:fixed elements are offset from the viewport, which itself always has zero offset
17588		if ( jQuery.css( elem, "position" ) === "fixed" ) {
17589
17590			// Assume position:fixed implies availability of getBoundingClientRect
17591			offset = elem.getBoundingClientRect();
17592
17593		} else {
17594			offset = this.offset();
17595
17596			// Account for the *real* offset parent, which can be the document or its root element
17597			// when a statically positioned element is identified
17598			doc = elem.ownerDocument;
17599			offsetParent = elem.offsetParent || doc.documentElement;
17600			while ( offsetParent &&
17601				( offsetParent === doc.body || offsetParent === doc.documentElement ) &&
17602				jQuery.css( offsetParent, "position" ) === "static" ) {
17603
17604				offsetParent = offsetParent.parentNode;
17605			}
vendor: 9,494 bytes, lines 17606-17937
17606			if ( offsetParent && offsetParent !== elem && offsetParent.nodeType === 1 ) {
17607
17608				// Incorporate borders into its offset, since they are outside its content origin
17609				parentOffset = jQuery( offsetParent ).offset();
17610				parentOffset.top += jQuery.css( offsetParent, "borderTopWidth", true );
17611				parentOffset.left += jQuery.css( offsetParent, "borderLeftWidth", true );
17612			}
17613		}
17614
17615		// Subtract parent offsets and element margins
17616		return {
17617			top: offset.top - parentOffset.top - jQuery.css( elem, "marginTop", true ),
17618			left: offset.left - parentOffset.left - jQuery.css( elem, "marginLeft", true )
17619		};
17620	},
17621
17622	// This method will return documentElement in the following cases:
17623	// 1) For the element inside the iframe without offsetParent, this method will return
17624	//    documentElement of the parent window
17625	// 2) For the hidden or detached element
17626	// 3) For body or html element, i.e. in case of the html node - it will return itself
17627	//
17628	// but those exceptions were never presented as a real life use-cases
17629	// and might be considered as more preferable results.
17630	//
17631	// This logic, however, is not guaranteed and can change at any point in the future
17632	offsetParent: function() {
17633		return this.map( function() {
17634			var offsetParent = this.offsetParent;
17635
17636			while ( offsetParent && jQuery.css( offsetParent, "position" ) === "static" ) {
17637				offsetParent = offsetParent.offsetParent;
17638			}
17639
17640			return offsetParent || documentElement;
17641		} );
17642	}
17643} );
17644
17645// Create scrollLeft and scrollTop methods
17646jQuery.each( { scrollLeft: "pageXOffset", scrollTop: "pageYOffset" }, function( method, prop ) {
17647	var top = "pageYOffset" === prop;
17648
17649	jQuery.fn[ method ] = function( val ) {
17650		return access( this, function( elem, method, val ) {
17651
17652			// Coalesce documents and windows
17653			var win;
17654			if ( isWindow( elem ) ) {
17655				win = elem;
17656			} else if ( elem.nodeType === 9 ) {
17657				win = elem.defaultView;
17658			}
17659
17660			if ( val === undefined ) {
17661				return win ? win[ prop ] : elem[ method ];
17662			}
17663
17664			if ( win ) {
17665				win.scrollTo(
17666					!top ? val : win.pageXOffset,
17667					top ? val : win.pageYOffset
17668				);
17669
17670			} else {
17671				elem[ method ] = val;
17672			}
17673		}, method, val, arguments.length );
17674	};
17675} );
17676
17677// Support: Safari <=7 - 9.1, Chrome <=37 - 49
17678// Add the top/left cssHooks using jQuery.fn.position
17679// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084
17680// Blink bug: https://bugs.chromium.org/p/chromium/issues/detail?id=589347
17681// getComputedStyle returns percent when specified for top/left/bottom/right;
17682// rather than make the css module depend on the offset module, just check for it here
17683jQuery.each( [ "top", "left" ], function( _i, prop ) {
17684	jQuery.cssHooks[ prop ] = addGetHookIf( support.pixelPosition,
17685		function( elem, computed ) {
17686			if ( computed ) {
17687				computed = curCSS( elem, prop );
17688
17689				// If curCSS returns percentage, fallback to offset
17690				return rnumnonpx.test( computed ) ?
17691					jQuery( elem ).position()[ prop ] + "px" :
17692					computed;
17693			}
17694		}
17695	);
17696} );
17697
17698
17699// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods
17700jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
17701	jQuery.each( {
17702		padding: "inner" + name,
17703		content: type,
17704		"": "outer" + name
17705	}, function( defaultExtra, funcName ) {
17706
17707		// Margin is only for outerHeight, outerWidth
17708		jQuery.fn[ funcName ] = function( margin, value ) {
17709			var chainable = arguments.length && ( defaultExtra || typeof margin !== "boolean" ),
17710				extra = defaultExtra || ( margin === true || value === true ? "margin" : "border" );
17711
17712			return access( this, function( elem, type, value ) {
17713				var doc;
17714
17715				if ( isWindow( elem ) ) {
17716
17717					// $( window ).outerWidth/Height return w/h including scrollbars (gh-1729)
17718					return funcName.indexOf( "outer" ) === 0 ?
17719						elem[ "inner" + name ] :
17720						elem.document.documentElement[ "client" + name ];
17721				}
17722
17723				// Get document width or height
17724				if ( elem.nodeType === 9 ) {
17725					doc = elem.documentElement;
17726
17727					// Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height],
17728					// whichever is greatest
17729					return Math.max(
17730						elem.body[ "scroll" + name ], doc[ "scroll" + name ],
17731						elem.body[ "offset" + name ], doc[ "offset" + name ],
17732						doc[ "client" + name ]
17733					);
17734				}
17735
17736				return value === undefined ?
17737
17738					// Get width or height on the element, requesting but not forcing parseFloat
17739					jQuery.css( elem, type, extra ) :
17740
17741					// Set width or height on the element
17742					jQuery.style( elem, type, value, extra );
17743			}, type, chainable ? margin : undefined, chainable );
17744		};
17745	} );
17746} );
17747
17748
17749jQuery.each( [
17750	"ajaxStart",
17751	"ajaxStop",
17752	"ajaxComplete",
17753	"ajaxError",
17754	"ajaxSuccess",
17755	"ajaxSend"
17756], function( _i, type ) {
17757	jQuery.fn[ type ] = function( fn ) {
17758		return this.on( type, fn );
17759	};
17760} );
17761
17762
17763
17764
17765jQuery.fn.extend( {
17766
17767	bind: function( types, data, fn ) {
17768		return this.on( types, null, data, fn );
17769	},
17770	unbind: function( types, fn ) {
17771		return this.off( types, null, fn );
17772	},
17773
17774	delegate: function( selector, types, data, fn ) {
17775		return this.on( types, selector, data, fn );
17776	},
17777	undelegate: function( selector, types, fn ) {
17778
17779		// ( namespace ) or ( selector, types [, fn] )
17780		return arguments.length === 1 ?
17781			this.off( selector, "**" ) :
17782			this.off( types, selector || "**", fn );
17783	},
17784
17785	hover: function( fnOver, fnOut ) {
17786		return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
17787	}
17788} );
17789
17790jQuery.each(
17791	( "blur focus focusin focusout resize scroll click dblclick " +
17792	"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
17793	"change select submit keydown keypress keyup contextmenu" ).split( " " ),
17794	function( _i, name ) {
17795
17796		// Handle event binding
17797		jQuery.fn[ name ] = function( data, fn ) {
17798			return arguments.length > 0 ?
17799				this.on( name, null, data, fn ) :
17800				this.trigger( name );
17801		};
17802	}
17803);
17804
17805
17806
17807
17808// Support: Android <=4.0 only
17809// Make sure we trim BOM and NBSP
17810// Require that the "whitespace run" starts from a non-whitespace
17811// to avoid O(N^2) behavior when the engine would try matching "\s+$" at each space position.
17812var rtrim = /^[\s\uFEFF\xA0]+|([^\s\uFEFF\xA0])[\s\uFEFF\xA0]+$/g;
17813
17814// Bind a function to a context, optionally partially applying any
17815// arguments.
17816// jQuery.proxy is deprecated to promote standards (specifically Function#bind)
17817// However, it is not slated for removal any time soon
17818jQuery.proxy = function( fn, context ) {
17819	var tmp, args, proxy;
17820
17821	if ( typeof context === "string" ) {
17822		tmp = fn[ context ];
17823		context = fn;
17824		fn = tmp;
17825	}
17826
17827	// Quick check to determine if target is callable, in the spec
17828	// this throws a TypeError, but we will just return undefined.
17829	if ( !isFunction( fn ) ) {
17830		return undefined;
17831	}
17832
17833	// Simulated bind
17834	args = slice.call( arguments, 2 );
17835	proxy = function() {
17836		return fn.apply( context || this, args.concat( slice.call( arguments ) ) );
17837	};
17838
17839	// Set the guid of unique handler to the same of original handler, so it can be removed
17840	proxy.guid = fn.guid = fn.guid || jQuery.guid++;
17841
17842	return proxy;
17843};
17844
17845jQuery.holdReady = function( hold ) {
17846	if ( hold ) {
17847		jQuery.readyWait++;
17848	} else {
17849		jQuery.ready( true );
17850	}
17851};
17852jQuery.isArray = Array.isArray;
17853jQuery.parseJSON = JSON.parse;
17854jQuery.nodeName = nodeName;
17855jQuery.isFunction = isFunction;
17856jQuery.isWindow = isWindow;
17857jQuery.camelCase = camelCase;
17858jQuery.type = toType;
17859
17860jQuery.now = Date.now;
17861
17862jQuery.isNumeric = function( obj ) {
17863
17864	// As of jQuery 3.0, isNumeric is limited to
17865	// strings and numbers (primitives or objects)
17866	// that can be coerced to finite numbers (gh-2662)
17867	var type = jQuery.type( obj );
17868	return ( type === "number" || type === "string" ) &&
17869
17870		// parseFloat NaNs numeric-cast false positives ("")
17871		// ...but misinterprets leading-number strings, particularly hex literals ("0x...")
17872		// subtraction forces infinities to NaN
17873		!isNaN( obj - parseFloat( obj ) );
17874};
17875
17876jQuery.trim = function( text ) {
17877	return text == null ?
17878		"" :
17879		( text + "" ).replace( rtrim, "$1" );
17880};
17881
17882
17883
17884// Register as a named AMD module, since jQuery can be concatenated with other
17885// files that may use define, but not via a proper concatenation script that
17886// understands anonymous AMD modules. A named AMD is safest and most robust
17887// way to register. Lowercase jquery is used because AMD module names are
17888// derived from file names, and jQuery is normally delivered in a lowercase
17889// file name. Do this after creating the global so that if an AMD module wants
17890// to call noConflict to hide this version of jQuery, it will work.
17891
17892// Note that for maximum portability, libraries that are not jQuery should
17893// declare themselves as anonymous modules, and avoid setting a global if an
17894// AMD loader is present. jQuery is a special case. For more information, see
17895// https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon
17896
17897if ( typeof define === "function" && define.amd ) {
17898	define( "jquery", [], function() {
17899		return jQuery;
17900	} );
17901}
17902
17903
17904
17905
17906var
17907
17908	// Map over jQuery in case of overwrite
17909	_jQuery = window.jQuery,
17910
17911	// Map over the $ in case of overwrite
17912	_$ = window.$;
17913
17914jQuery.noConflict = function( deep ) {
17915	if ( window.$ === jQuery ) {
17916		window.$ = _$;
17917	}
17918
17919	if ( deep && window.jQuery === jQuery ) {
17920		window.jQuery = _jQuery;
17921	}
17922
17923	return jQuery;
17924};
17925
17926// Expose jQuery and $ identifiers, even in AMD
17927// (trac-7102#comment:10, https://github.com/jquery/jquery/pull/557)
17928// and CommonJS for browser emulators (trac-13566)
17929if ( typeof noGlobal === "undefined" ) {
17930	window.jQuery = window.$ = jQuery;
17931}
17932
17933
17934
17935
17936return jQuery;
17937} );
vendor: 3,339 bytes, lines 17938-18030
17938
17939},{}],64:[function(require,module,exports){
17940// shim for using process in browser
17941var process = module.exports = {};
17942
17943// cached from whatever global is present so that test runners that stub it
17944// don't break things.  But we need to wrap it in a try catch in case it is
17945// wrapped in strict mode code which doesn't define any globals.  It's inside a
17946// function because try/catches deoptimize in certain engines.
17947
17948var cachedSetTimeout;
17949var cachedClearTimeout;
17950
17951function defaultSetTimout() {
17952    throw new Error('setTimeout has not been defined');
17953}
17954function defaultClearTimeout () {
17955    throw new Error('clearTimeout has not been defined');
17956}
17957(function () {
17958    try {
17959        if (typeof setTimeout === 'function') {
17960            cachedSetTimeout = setTimeout;
17961        } else {
17962            cachedSetTimeout = defaultSetTimout;
17963        }
17964    } catch (e) {
17965        cachedSetTimeout = defaultSetTimout;
17966    }
17967    try {
17968        if (typeof clearTimeout === 'function') {
17969            cachedClearTimeout = clearTimeout;
17970        } else {
17971            cachedClearTimeout = defaultClearTimeout;
17972        }
17973    } catch (e) {
17974        cachedClearTimeout = defaultClearTimeout;
17975    }
17976} ())
17977function runTimeout(fun) {
17978    if (cachedSetTimeout === setTimeout) {
17979        //normal enviroments in sane situations
17980        return setTimeout(fun, 0);
17981    }
17982    // if setTimeout wasn't available but was latter defined
17983    if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {
17984        cachedSetTimeout = setTimeout;
17985        return setTimeout(fun, 0);
17986    }
17987    try {
17988        // when when somebody has screwed with setTimeout but no I.E. maddness
17989        return cachedSetTimeout(fun, 0);
17990    } catch(e){
17991        try {
17992            // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally
17993            return cachedSetTimeout.call(null, fun, 0);
17994        } catch(e){
17995            // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error
17996            return cachedSetTimeout.call(this, fun, 0);
17997        }
17998    }
17999
18000
18001}
18002function runClearTimeout(marker) {
18003    if (cachedClearTimeout === clearTimeout) {
18004        //normal enviroments in sane situations
18005        return clearTimeout(marker);
18006    }
18007    // if clearTimeout wasn't available but was latter defined
18008    if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {
18009        cachedClearTimeout = clearTimeout;
18010        return clearTimeout(marker);
18011    }
18012    try {
18013        // when when somebody has screwed with setTimeout but no I.E. maddness
18014        return cachedClearTimeout(marker);
18015    } catch (e){
18016        try {
18017            // When we are in I.E. but the script has been evaled so I.E. doesn't  trust the global object when called normally
18018            return cachedClearTimeout.call(null, marker);
18019        } catch (e){
18020            // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.
18021            // Some versions of I.E. have different rules for clearTimeout vs setTimeout
18022            return cachedClearTimeout.call(this, marker);
18023        }
18024    }
18025
18026
18027
18028}
18029var queue = [];
18030var draining = false;
18031var currentQueue;
18032var queueIndex = -1;
18033
18034function cleanUpNextTick() {
18035    if (!draining || !currentQueue) {
18036        return;
18037    }
18038    draining = false;
18039    if (currentQueue.length) {
18040        queue = currentQueue.concat(queue);
18041    } else {
18042        queueIndex = -1;
18043    }
18044    if (queue.length) {
18045        drainQueue();
18046    }
18047}
18048
18049function drainQueue() {
18050    if (draining) {
18051        return;
18052    }
18053    var timeout = runTimeout(cleanUpNextTick);
18054    draining = true;
18055
18056    var len = queue.length;
18057    while(len) {
18058        currentQueue = queue;
18059        queue = [];
18060        while (++queueIndex < len) {
18061            if (currentQueue) {
18062                currentQueue[queueIndex].run();
18063            }
18064        }
18065        queueIndex = -1;
18066        len = queue.length;
18067    }
18068    currentQueue = null;
18069    draining = false;
18070    runClearTimeout(timeout);
18071}
18072
18073process.nextTick = function (fun) {
18074    var args = new Array(arguments.length - 1);
18075    if (arguments.length > 1) {
18076        for (var i = 1; i < arguments.length; i++) {
18077            args[i - 1] = arguments[i];
18078        }
18079    }
18080    queue.push(new Item(fun, args));
18081    if (queue.length === 1 && !draining) {
18082        runTimeout(drainQueue);
18083    }
18084};
18085
18086// v8 likes predictible objects
18087function Item(fun, array) {
18088    this.fun = fun;
18089    this.array = array;
18090}
18091Item.prototype.run = function () {
18092    this.fun.apply(null, this.array);
18093};
18094process.title = 'browser';
18095process.browser = true;
18096process.env = {};
18097process.argv = [];
18098process.version = ''; // empty string to avoid regexp issues
18099process.versions = {};
18100
18101function noop() {}
18102
18103process.on = noop;
18104process.addListener = noop;
18105process.once = noop;
18106process.off = noop;
18107process.removeListener = noop;
18108process.removeAllListeners = noop;
18109process.emit = noop;
18110process.prependListener = noop;
18111process.prependOnceListener = noop;
18112
18113process.listeners = function (name) { return [] }
18114
18115process.binding = function (name) {
18116    throw new Error('process.binding is not supported');
18117};
18118
18119process.cwd = function () { return '/' };
18120process.chdir = function (dir) {
18121    throw new Error('process.chdir is not supported');
18122};
18123process.umask = function() { return 0; };
18124
18125},{}],65:[function(require,module,exports){
18126"use strict";
18127
18128var _jquery = _interopRequireDefault(require("jquery"));
18129function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
18130window.jQuery = _jquery.default;
18131window.$ = _jquery.default;
18132require("jquery.cookie");
18133const bootstrap = window.bootstrap = require('bootstrap');
18134(0, _jquery.default)(document).ready(function () {
18135  console.log("Ninja is ready, mam jquery=", _jquery.default, "mam bootstrap=", bootstrap);
18136  Ninja.init({
18137    debug: true
18138  });
18139  (0, _jquery.default)('.pb-autoaccordion .md-accordion-header').each(function () {
18140    (0, _jquery.default)(this).on('click', function () {
18141      (0, _jquery.default)(this).parent().toggleClass('open');
18142      (0, _jquery.default)(this).parent().siblings().children().next().slideUp();
18143      (0, _jquery.default)(this).parent().siblings().removeClass('open');
18144      (0, _jquery.default)(this).next().slideToggle();
18145    });
18146  });
18147  if ((0, _jquery.default)('.md-tabs .tab-content .tab-pane').length > 0) {
18148    (0, _jquery.default)('.md-tabs .tab-content .tab-pane').each(function (i) {
18149      (0, _jquery.default)(this).attr('data-position', i);
18150    });
18151  }
18152  if ((0, _jquery.default)('.pb-autotabs .nav-item').length > 0) {
18153    (0, _jquery.default)('.pb-autotabs .nav-item').each(function (i) {
18154      (0, _jquery.default)(this).find('.nav-link').attr('data-position', i);
18155      (0, _jquery.default)(this).find('.nav-link').on('click', function () {
18156        var tabContentElement = (0, _jquery.default)(this).closest('.tabsBox').next().find('[data-position=' + (0, _jquery.default)(this).data('position') + ']');
18157        (0, _jquery.default)(this).parent().siblings().find('.nav-link').removeClass('active show');
18158        (0, _jquery.default)(this).parent().siblings().removeClass('active');
18159        (0, _jquery.default)(this).addClass('active show');
18160        (0, _jquery.default)(this).parent().addClass('active');
18161        (0, _jquery.default)(this).closest('.tabsBox').next().find('.tab-pane').removeClass('active show');
18162        tabContentElement.addClass('show active');
18163        return false;
18164      });
18165    });
18166  }
18167  (0, _jquery.default)(document).on('click', '.pb-autotabs .nav-item .nav-link', function () {
18168    var tabHref = (0, _jquery.default)(this).attr('href');
18169    (0, _jquery.default)(this).parent().siblings().removeClass('active');
18170    (0, _jquery.default)(this).parent().siblings().find('.nav-link').removeClass('active show');
18171    (0, _jquery.default)(this).addClass('active show');
18172    (0, _jquery.default)(this).parent().addClass('active');
18173    (0, _jquery.default)(this).closest('.tabsBox').next().find('.tab-pane').removeClass('active show');
18174    (0, _jquery.default)(this).closest('.tabsBox').next().find(tabHref).addClass('active show');
18175    return false;
18176  });
18177  (0, _jquery.default)(window).on("scroll", function () {
18178    if ((0, _jquery.default)("header .navbar-collapse").length) {
18179      var navbarTop = (0, _jquery.default)("header .navbar-collapse").offset();
18180      var windowScrollTop = (0, _jquery.default)(window).scrollTop();
18181      var navbarHeight = (0, _jquery.default)("header .navbar-collapse").height();
18182      (0, _jquery.default)(".dropdown-onion.level-1").css("top", navbarTop.top + navbarHeight - windowScrollTop + "px");
18183    }
18184  });
18185  if ((0, _jquery.default)("header .navbar-collapse").length) {
18186    var navbarTop = (0, _jquery.default)("header .navbar-collapse").offset();
18187    var windowScrollTop = (0, _jquery.default)(window).scrollTop();
18188    var navbarHeight = (0, _jquery.default)("header .navbar-collapse").height();
18189    (0, _jquery.default)(".dropdown-onion.level-1").css("top", navbarTop.top + navbarHeight - windowScrollTop + "px");
18190  }
18191});
18192
18193//var menuType = 'scroll';
18194var menuType = 'fixed';
18195var initialHeaderHeight = 0;
18196(0, _jquery.default)(function () {
18197  initialHeaderHeight = (0, _jquery.default)('header').outerHeight(true);
18198
18199  // scroll hide/show menu
18200  if (menuType == 'scroll') {
18201    (0, _jquery.default)(function () {
18202      (0, _jquery.default)('body').css('padding-top', (0, _jquery.default)('header').outerHeight() + 'px');
18203
18204      // detect scroll top or down
18205      if ((0, _jquery.default)('header').length > 0) {
18206        // check if element exists
18207        var last_scroll_top = 0;
18208        (0, _jquery.default)(window).on('scroll', function () {
18209          var scroll_top = (0, _jquery.default)(this).scrollTop();
18210          if (scroll_top < last_scroll_top || scroll_top <= 0) {
18211            (0, _jquery.default)('header').removeClass('scrolled-down').addClass('scrolled-up');
18212          } else {
18213            (0, _jquery.default)('header').removeClass('scrolled-up').addClass('scrolled-down');
18214          }
18215          last_scroll_top = scroll_top;
18216        });
18217      }
18218    });
18219  }
18220
18221  // fixed menu
18222  if (menuType == 'fixed') {
18223    (0, _jquery.default)(window).on("scroll", function () {
18224      if ((0, _jquery.default)(window).scrollTop() > initialHeaderHeight) {
18225        (0, _jquery.default)("header").addClass("transitioning").delay(300).queue(function () {
18226          if ((0, _jquery.default)(window).scrollTop() > initialHeaderHeight) {
18227            (0, _jquery.default)(this).addClass("fixed").removeClass("transitioning").dequeue();
18228            (0, _jquery.default)("header.fixed + main").css("margin-top", initialHeaderHeight + "px");
18229          } else {
18230            (0, _jquery.default)(this).removeClass("fixed").removeClass("transitioning").dequeue();
18231            (0, _jquery.default)("header + main").css("margin-top", "0px");
18232          }
18233        });
18234      } else {
18235        //$("header").addClass("transitioning").delay(300).queue(function(){
18236        //  $(this).removeClass("fixed").removeClass("transitioning").dequeue();
18237        //});
18238        (0, _jquery.default)("header").removeClass("fixed");
18239        (0, _jquery.default)("header + main").css("margin-top", "0px");
18240      }
18241    });
18242  }
18243});
18244(0, _jquery.default)(function () {
18245  if ((0, _jquery.default)('[data-toggle="tooltip"]')) {
18246    (0, _jquery.default)('[data-toggle="tooltip"][data-placement="bottom"]').each(function () {
18247      (0, _jquery.default)(this).attr("data-bs-toggle", "tooltip").attr("data-bs-placement", "bottom");
18248    });
18249  }
18250  if ((0, _jquery.default)('[data-bs-toggle="tooltip"]')) {
18251    const tooltipTriggerList = document.querySelectorAll('[data-bs-toggle="tooltip"], [data-toggle="tooltip"]');
18252    const tooltipList = [...tooltipTriggerList].map(tooltipTriggerEl => new bootstrap.Tooltip(tooltipTriggerEl));
18253  }
18254  (0, _jquery.default)('.plus-box-link').click(function () {
18255    var spn = (0, _jquery.default)(this).find("span");
18256    if (spn.hasClass("glyphicon-plus")) {
18257      spn.removeClass("glyphicon-plus").addClass("glyphicon-minus");
18258    } else {
18259      spn.removeClass("glyphicon-minus").addClass("glyphicon-plus");
18260    }
18261  });
18262});
18263(0, _jquery.default)(function () {
18264  (0, _jquery.default)('#header-menu-mobile .navbar-toggler').click(function () {
18265    var $nav = (0, _jquery.default)('.navbar-nav');
18266    if (!(0, _jquery.default)(this).is('[aria-expanded="true"]')) {
18267      // use the timeout to make sure it works after the navbar is expanded by the BS JS
18268      setTimeout(function () {
18269        $nav.smartmenus('itemActivate', $nav.find('li.current a').eq(-1));
18270      }, 1);
18271    } else {
18272      $nav.smartmenus('menuHideAll');
18273    }
18274  });
18275});
18276function resizeTitleNews() {
18277  if ((0, _jquery.default)("#main-news").length) {
18278    var cumulatedHeight = 0;
18279    var minHeight = 400;
18280    var maxHeight = minHeight;
18281    if ((0, _jquery.default)("#main-news .news").length) {
18282      maxHeight = (0, _jquery.default)("#main-news .news")[0].scrollHeight;
18283      if (maxHeight < minHeight) maxHeight = minHeight;
18284    }
18285    var counter = 0;
18286    var offset = 30 + 24;
18287    (0, _jquery.default)("#secondary-news .row").each(function () {
18288      if ((0, _jquery.default)(this).outerHeight(true) + cumulatedHeight + offset > maxHeight) {
18289        (0, _jquery.default)(this).hide();
18290      } else {
18291        cumulatedHeight += (0, _jquery.default)(this).outerHeight(true);
18292      }
18293      counter++;
18294    });
18295  }
18296}
18297(0, _jquery.default)(function () {
18298  var day = new Date();
18299  var dayNum = day.getDay();
18300  //if (dayNum == 0 || dayNum == 7) dayNum = 1;
18301  (0, _jquery.default)("#footer .uredni-hodiny .uh-row").each(function () {
18302    if ((0, _jquery.default)(this).hasClass("uh-row-" + dayNum)) {
18303      (0, _jquery.default)(this).show();
18304    } else {
18305      (0, _jquery.default)(this).hide();
18306    }
18307  });
18308  resizeTitleNews();
18309});
18310(0, _jquery.default)(window).resize(function () {
18311  (0, _jquery.default)("#secondary-news .row").show();
18312  resizeTitleNews();
18313});
18314(0, _jquery.default)(function () {
18315  (0, _jquery.default)(window).scroll(function () {
18316    var aTop = 1000;
18317    if ((0, _jquery.default)(window).width() <= 767) {
18318      aTop = 500;
18319    }
18320    if ((0, _jquery.default)(this).scrollTop() >= aTop) {
18321      (0, _jquery.default)("#skip-top").css("right", "0px");
18322    } else {
18323      (0, _jquery.default)("#skip-top").css("right", "-100px");
18324    }
18325  });
18326});
18327
18328},{"bootstrap":61,"jquery":63,"jquery.cookie":62}]},{},[65]);
18329
18330
18331/* =========================================================================== */
18332/* /templates/2022/js/global-functions.js */
18333/* =========================================================================== */
18334var Ninja = (function(){
18335
18336    var  debugInfo = {
18337        allow: false
18338    };
18339
18340    function createDebugInfo() {
18341
18342        if($(".md-debug-info").length) {
18343
18344            var setDebugInfo = {
18345                allow: $(".md-debug-info").length > 0,
18346                blockDeviceSize: $(".md-debug-info").find(".device-size"),
18347                blockClasses: $(".html-class-list"),
18348                blockNewSize: $(".device-resize-new-size"),
18349                blockWidthInfo: $(".device-resize-w-info"),
18350                blockHeightInfo: $(".device-resize-h-info"),
18351                blockDeviceType: $(".device-type-from-css"),
18352                classesList: $('html').attr('class').split(/\s+/),
18353                windowInfo: $(window).width() + " x " + $(window).height()
18354            }
18355
18356            debugInfo = $.extend({}, debugInfo, setDebugInfo);
18357
18358            setTimeout(function () {
18359                var classes = "";
18360                $.each(debugInfo.classesList, function (index, item) {
18361                    classes += item + "<br>";
18362                });
18363                debugInfo.blockClasses.html("").append(classes);
18364                debugInfo.blockDeviceSize.html(debugInfo.windowInfo);
18365            }, 1000);
18366        }
18367    }
18368
18369    var defaults = {
18370        fireTime:200,
18371        debug:false,
18372
18373        onDinosaur: function() {},
18374        onDinosaurBlink: function() {},
18375        onDinosaurUp: function() {},
18376        onDinosaurUpBlink: function() {},
18377
18378        onMobile: function() {},
18379        onMobileBlink: function() {},
18380        onMobileUp: function() {},
18381        onMobileUpBlink: function() {},
18382        onMobileDown: function() {},
18383        onMobileDownBlink: function() {},
18384
18385        onTablet: function() {},
18386        onTabletBlink: function() {},
18387        onTabletUp: function() {},
18388        onTabletUpBlink: function() {},
18389        onTabletDown: function() {},
18390        onTabletDownBlink: function() {},
18391
18392        onLaptop: function() {},
18393        onLaptopBlink: function() {},
18394        onLaptopUp: function() {},
18395        onLaptopUpBlink: function() {},
18396        onLaptopDown: function() {},
18397        onLaptopDownBlink: function() {},
18398
18399        onDesktop: function() {},
18400        onDesktopBlink: function() {},
18401        onDesktopDown: function() {},
18402        onDesktopDownBlink: function() {},
18403
18404        onResize: function() {},
18405        onResizeWidth: function() {},
18406        onResizeHeight: function() {}
18407    }
18408
18409    function bindEvents() {
18410
18411        var isNew,
18412        lastWidth = $(window).width(),
18413        lastHeight = $(window).height();
18414
18415        $(window).on("orientationchange resize", function() {
18416
18417            function isNewWidth(){
18418                isNew = false;
18419                if($(window).width()!=lastWidth){
18420                    lastWidth = $(window).width();
18421                    isNew = true;
18422                }
18423                return isNew;
18424            }
18425
18426            function isNewHeight(){
18427                isNew = false;
18428                if($(window).height()!=lastHeight){
18429                    lastHeight = $(window).height();
18430                    isNew = true;
18431                }
18432                return isNew;
18433            }
18434
18435            waitForFinalEvent(function(){
18436                defaults.onResize();
18437                if(debugInfo.allow){
18438                    debugInfo.blockNewSize.html(" / " + $(window).width() + " x " + $(window).height());
18439                }
18440                if(isNewWidth()) {
18441                    defaults.onResizeWidth();
18442                    bp.storeLastValue();
18443                    callFuncByScreenSize();
18444                    if(debugInfo.allow){
18445                        debugInfo.blockWidthInfo.html("true");
18446                    }
18447                }
18448                if(isNewHeight()) {
18449                    defaults.onResizeHeight();
18450                    if(debugInfo.allow){
18451                        debugInfo.blockHeightInfo.html("true");
18452                    }
18453                }
18454            }, defaults.fireTime);
18455
18456        });
18457    }
18458    
18459    var bp = {
18460        deviceType: [
18461            "onChange_dinosaur",
18462            "onChange_mobile",
18463            "onChange_tablet",
18464            "onChange_laptop",
18465            "onChange_desktop",
18466            "onChangeUp_dinosaur",
18467            "onChangeUp_mobile",
18468            "onChangeUp_tablet",
18469            "onChangeUp_laptop",
18470            "onChangeDown_mobile",
18471            "onChangeDown_tablet",
18472            "onChangeDown_laptop",
18473            "onChangeDown_desktop"
18474        ],
18475        deviceValue: [],
18476        deviceLastValue: [],
18477        deviceState: [],
18478        deviceFunctions: {
18479            "onChange_dinosaur": function() { defaults.onDinosaur(); if(debugInfo.allow){ debugInfo.blockDeviceType.html("onDinosaur"); } },
18480            "onChange_mobile": function() { defaults.onMobile(); if(debugInfo.allow){ debugInfo.blockDeviceType.html("onMobile"); } },
18481            "onChange_tablet": function() { defaults.onTablet(); if(debugInfo.allow){ debugInfo.blockDeviceType.html("onTablet"); } },
18482            "onChange_laptop": function() { defaults.onLaptop(); if(debugInfo.allow){ debugInfo.blockDeviceType.html("onLaptop"); } },
18483            "onChange_desktop": function() { defaults.onDesktop(); if(debugInfo.allow){ debugInfo.blockDeviceType.html("onDesktop"); } },
18484            "onChangeUp_dinosaur": function() { defaults.onDinosaurUp(); },
18485            "onChangeUp_mobile": function() { defaults.onMobileUp(); },
18486            "onChangeUp_tablet": function() { defaults.onTabletUp(); },
18487            "onChangeUp_laptop": function() { defaults.onLaptopUp(); },
18488            "onChangeDown_mobile": function() { defaults.onMobileDown(); },
18489            "onChangeDown_tablet": function() { defaults.onTabletDown(); },
18490            "onChangeDown_laptop": function() { defaults.onLaptopDown(); },
18491            "onChangeDown_desktop": function() { defaults.onDesktopDown(); }
18492        },
18493        deviceFunctionsBlink: {
18494            "onChange_dinosaur": function() { defaults.onDinosaurBlink(); },
18495            "onChange_mobile": function() { defaults.onMobileBlink(); },
18496            "onChange_tablet": function() { defaults.onTabletBlink(); },
18497            "onChange_laptop": function() { defaults.onLaptopBlink(); },
18498            "onChange_desktop": function() { defaults.onDesktopBlink(); },
18499            "onChangeUp_dinosaur": function() { defaults.onDinosaurUpBlink(); },
18500            "onChangeUp_mobile": function() { defaults.onMobileUpBlink(); },
18501            "onChangeUp_tablet": function() { defaults.onTabletUpBlink(); },
18502            "onChangeUp_laptop": function() { defaults.onLaptopUpBlink(); },
18503            "onChangeDown_mobile": function() { defaults.onMobileDownBlink(); },
18504            "onChangeDown_tablet": function() { defaults.onTabletDownBlink(); },
18505            "onChangeDown_laptop": function() { defaults.onLaptopDownBlink(); },
18506            "onChangeDown_desktop": function() { defaults.onDesktopDownBlink(); }
18507        },
18508        refreshValue: function() {
18509            var self = this;
18510            $.each(self.deviceType, function (index, item) {
18511                self.deviceValue[item] = self.getElementValue('.'+item+'');
18512            });
18513            this.setBreakpointState();
18514        },
18515        storeLastValue: function() {
18516            var self = this;
18517            $.each(self.deviceType, function (index, item) {
18518                self.deviceLastValue[item] = self.deviceValue[item];
18519            });
18520        },
18521        setBreakpointState: function() {
18522            var self = this;
18523            $.each(self.deviceType, function (index, item) {
18524                self.deviceState[item] = self.isStateTrue(item);
18525            });
18526        },
18527        isStateTrue: function(item) {
18528            if(this.deviceValue[item] == "true") {
18529                return true;
18530            } else {
18531                return false;
18532            }
18533        },
18534        getElementValue: function(selector) {
18535            var value = window.getComputedStyle(
18536                document.querySelector(selector), ':before'
18537            ).getPropertyValue('content').replace(/\"/g, '');
18538            return value;
18539        }
18540    };
18541
18542    function createQueryHolders() {
18543        var device = "";
18544        $.each(bp.deviceType, function (index, item) {
18545            device += '<span class="'+item+'"></span>';
18546        });
18547        $('body').append('<div class="queryHolders">'+device+'</div>');
18548    }
18549
18550    function callFuncByScreenSize() {
18551        bp.refreshValue();
18552        $.each(bp.deviceType, function (index, item) {
18553            if(bp.deviceLastValue[item] != bp.deviceValue[item]) {
18554                if (bp.deviceState[item]) { bp.deviceFunctions[item](); }
18555            } else {
18556                if (bp.deviceState[item]) { bp.deviceFunctionsBlink[item]();  }
18557            }
18558        });
18559        bp.storeLastValue();
18560    }
18561
18562    var waitForFinalEvent = (function() {
18563        var timers = {};
18564        return function(callback, ms, uniqueId) {
18565            if (!uniqueId) {
18566                uniqueId = "Don't call this twice without a uniqueId";
18567            }
18568            if (timers[uniqueId]) {
18569                clearTimeout(timers[uniqueId]);
18570            }
18571            timers[uniqueId] = setTimeout(callback, ms);
18572        };
18573    })();
18574
18575    function NinjaLog(param) {
18576        if(defaults.debug || debugInfo.allow) {
18577            console.warn(param);
18578        }
18579    }
18580
18581    function NinjaTouchDevice() {
18582        var isTouchDevice = false,
18583            supportsTouch = false;
18584        if ( ('ontouchstart' in window) || (window.navigator.msPointerEnabled) || ('ontouchstart' in document.documentElement) ) {
18585            supportsTouch = true;
18586        }
18587        isTouchDevice = Modernizr.touchevents || supportsTouch;
18588        return isTouchDevice;
18589    }
18590
18591    return {
18592        init: function(config) {
18593            if ($('html').hasClass('ninja-initialized')) {
18594                return;
18595            }
18596            $('html').addClass('ninja-initialized');
18597            defaults = $.extend({}, defaults, config);
18598            createDebugInfo();
18599            createQueryHolders();
18600            bindEvents();
18601            callFuncByScreenSize();
18602        },
18603        log: function(param) {
18604            NinjaLog(param);
18605        },
18606        isTouchDevice: function () {
18607            return NinjaTouchDevice();
18608        }
18609    }
18610}());
18611
18612
18613
18614
18615
18616
18617
18618
18619
18620function decodeEmailImpl(encodeEmail)
18621{
18622	var email = encodeEmail;
18623	if (email.indexOf("~") > -1)
18624		email = email.replace(/~/gi, '@');
18625	if(email.indexOf("!") > -1)
18626		email = email.replace(/!/gi, '.');
18627
18628	
18629	var newEmail = new Array(email.length);
18630	for (i = 0; i < email.length; i++)
18631	{
18632		newEmail[i] = email.charAt(email.length - i - 1);
18633	}
18634	email = newEmail.join("");
18635	return email;
18636}
18637function decodeEmail(encodeEmail)
18638{
18639	window.location.href="mailto:"+decodeEmailImpl(encodeEmail);
18640}
18641function writeEmailToPage(encodeEmail)
18642{
18643	document.write(decodeEmailImpl(encodeEmail));
18644}
18645function openTargetBlank(link, event)
18646{
18647    var href = link.href;
18648
18649    if (href.indexOf("javascript:")==0) return true;
18650
18651    window.open(href,'_blank');
18652    event.returnValue = false;
18653    event.stopPropagation();
18654    return false;
18655}
18656function wjPopup(url, width, height)
18657{
18658	  var options = "toolbar=no,scrollbars=yes,resizable=yes,width="+width+",height="+height+";"
18659	  popupWindow=window.open(url,"_blank",options);
18660}
18661
18662
18663$(document).ready(function()
18664{
18665	try
18666	{
18667		  if ($("a[rel='wjimageviewer']").length > 0)
18668		  {
18669			var head = document.getElementsByTagName('HEAD')[0];
18670
18671			if ($("#photoswipe1").length <= 0) {
18672				var link = document.createElement("script");
18673				link.src = "/components/gallery/photoswipe/js/photoswipe.js";
18674				link.id = "photoswipe1";
18675				head.appendChild(link);
18676			}
18677			if ($("#photoswipe2").length <= 0) {
18678				var link = document.createElement("script");
18679				link.src = "/components/gallery/photoswipe/js/photoswipe-ui-default.js";
18680				link.id = "photoswipe2";
18681				head.appendChild(link);
18682			}
18683			if ($("#photoswipe3").length <= 0) {
18684				var link = document.createElement("script");
18685				link.src = "/components/gallery/photoswipe/photoswipe.jsp";
18686				link.id = "photoswipe3";
18687				head.appendChild(link);
18688			}
18689		  }
18690
18691	} catch (e) {}
18692});
18693
18694
18695    $(document).ready(function()
18696    {
18697        try {
18698            if ("Odkaz se otevře v novém okně"!="")
18699            {
18700                //console.log("Doplnam target blank");
18701                $('a[onclick*="return openTargetBlank"]').each(function()
18702                {
18703                    var href = $(this).attr("href");
18704
18705                    //console.log(href);
18706
18707                    if (href != null) 
18708                    {
18709                        var actualTitle = $(this).attr("title");
18710                        if (actualTitle!=null && actualTitle!="") $(this).attr("title", actualTitle+" (Odkaz se otevře v novém okně)");
18711                        else  $(this).attr("title", "Odkaz se otevře v novém okně");
18712                    }
18713                });
18714            }
18715        }
18716        catch (e) {}
18717    });
18718
18719var checkFormLoaded = true;
18720
18721    
18722    
18723
18724//event_attacher.js
18725    function addEventCheckForm(obj, evType, fn)
18726    {
18727        if (navigator.userAgent.indexOf("Opera")!=-1)
18728        {
18729            //opera je tupa, cez addEventListener to nefunguje
18730            eval("obj.on"+evType+"=fn");
18731            return;
18732        }
18733
18734        if (obj.addEventListener)
18735        {
18736            obj.addEventListener(evType, fn, true);
18737            return true;
18738        }
18739        else if (obj.attachEvent)
18740        {
18741            var r = obj.attachEvent("on"+evType, fn);
18742            return r;
18743        }
18744        else
18745        {
18746            return false;
18747        }
18748    }
18749
18750//fix for Internet Explorer event model
18751    function fixECheckForm(e) {
18752        if (!e && window.event) e = window.event;
18753        if (!e.target) e.target = e.srcElement;
18754        return e;
18755    }
18756
18757//class magic
18758    var classMagic = {};
18759
18760//prida objektu novy class
18761    classMagic.add = function (elm, newCl) {
18762        if (elm && newCl) {
18763            elm = this.fixElm(elm);
18764            for (var i = 0; i < elm.length; i++) {
18765                // ak uz dany objekt ma dany class, nepridame ho
18766                if (!classMagic.has(elm[i], newCl))
18767                {
18768                    elm[i].className += (this.get(elm[i])) ? " " + newCl : newCl;
18769                }
18770                try
18771                {
18772                    if (("required"==newCl || "invalid"==newCl) && (elm[i].type=="radio" || elm[i].type=="checkbox"))
18773                    {
18774                        var newcl2 = newCl+elm[i].type;
18775                        if (!classMagic.has(elm[i], newcl2))
18776                        {
18777                            elm[i].className += (this.get(elm[i])) ? " " + newcl2 : newcl2;
18778                        }
18779                    }
18780                }
18781                catch (e) { }
18782            }
18783            return true;
18784        }
18785        return false;
18786    };
18787
18788//zisti, ci dany objekt ma priradeny dany class
18789    classMagic.has = function (elm, cl) {
18790        if (elm && cl) {
18791            if (actCl = this.get(elm)) {
18792                for (var i = 0; i < actCl.length; i++) {
18793                    if (actCl[i] == cl) {
18794                        return true;
18795                    }
18796                }
18797            }
18798        }
18799        return false;
18800    }
18801
18802//nahradi class(-y) objektu novym classom
18803    classMagic.set = function (elm, newCl) {
18804        if (elm && newCl) {
18805            elm = this.fixElm(elm);
18806            for (var i = 0; i < elm.length; i++) {
18807                elm[i].className = newCl;
18808            }
18809            return true;
18810        }
18811        return false;
18812    };
18813
18814//nahradi stary class objektu novym classom
18815    classMagic.replace = function (elm, newCl, oldCl) {
18816        if (elm && newCl && oldCl) {
18817            elm = this.fixElm(elm);
18818            for (var i = 0; i < elm.length; i++) {
18819                var cl;
18820                var replCl = "";
18821                if (cl = this.get(elm[i])) {
18822                    for (var j = 0; j < cl.length; j++) {
18823                        replCl += (j > 0) ? " " : "";
18824                        replCl += (cl[j] == oldCl) ? newCl : cl[j];
18825                    }
18826                    elm[i].className = replCl;
18827                }
18828            }
18829            return true;
18830        }
18831        return false;
18832    };
18833
18834//odstrani stary class
18835    classMagic.remove = function (elm, oldCl) {
18836        if (elm && oldCl) {
18837            elm = this.fixElm(elm);
18838            for (var i = 0; i < elm.length; i++) {
18839                var cl;
18840                var replCl = "";
18841                if (cl = this.get(elm[i])) {
18842                    for (var j = 0; j < cl.length; j++) {
18843                        replCl += (j > 0) ? " " : "";
18844                        replCl += (cl[j] == oldCl) ? "" : cl[j];
18845                    }
18846                    elm[i].className = replCl;
18847                }
18848
18849                try
18850                {
18851                    if (("required"==oldCl || "invalid"==oldCl) && (elm[i].type=="radio" || elm[i].type=="checkbox"))
18852                    {
18853                        var oldcl2 = oldCl+elm[i].type;
18854                        this.remove(elm[i], oldcl2);
18855                    }
18856                }
18857                catch (e) { }
18858            }
18859            return true;
18860        }
18861        return false;
18862    };
18863
18864//vrati pole vsetkych classov, ktore objekt ma
18865//(toto je pomocna funkcia, ktoru vyuzivaju dalsie funkcie, ale moze sa pouzit aj samostatne)
18866    classMagic.get = function (elm) {
18867        if (elm) {
18868            return (elm.className == "") ? false : elm.className.split(" ");
18869        }
18870        return false;
18871    };
18872
18873//pomocna funkcia, ktore prevedie samostatny element na pole
18874    classMagic.fixElm = function (elm) {
18875        if (elm) {
18876            if (!elm.sort) {
18877                elm = [elm];
18878            }
18879            return elm;
18880        }
18881        return false;
18882    }
18883
18884
18885
18886    function checkNaN(value)
18887    {
18888        if (isNaN(value))
18889        {
18890            return(0);
18891        }
18892
18893        value = (""+value.toFixed(2)).replace(".", ",");
18894        return(value);
18895    }
18896
18897//Excel funkcie
18898    function rounddown(n, nd)
18899    {
18900        if(isFinite(n) && isFinite(nd))
18901        {
18902            var sign_n = (n<0)?-1:1;
18903            var abs_n=Math.abs(n);
18904            var factor=Math.pow(10,nd);
18905            return sign_n*Math.floor(abs_n*factor)/factor;
18906        }
18907        else
18908        {
18909            return NaN;
18910        }
18911    }
18912
18913    function round2(fltValue)
18914    {
18915        return Math.round(fltValue * 100) / 100;
18916    }
18917
18918    function getFloat(value)
18919    {
18920        value = value.replace(/,/gi, ".");
18921        return(parseFloat(value));
18922    }
18923
18924    function onlyPositive(value)
18925    {
18926        if (value < 0) return 0;
18927        return value;
18928    }
18929
18930    function smallerNumber(value1, value2)
18931    {
18932        if (value1 < value2) return value1;
18933        return value2;
18934    }
18935
18936    function biggerNumber(value1, value2)
18937    {
18938        if (value1 > value2) return value1;
18939        return value2;
18940    }
18941
18942    function ifCondition(condition, value1, value2)
18943    {
18944        if (condition) return value1;
18945        return value2;
18946    }
18947
18948    var REQCOND1 = "no";
18949    var REQCOND2 = "no";
18950    var REQCOND3 = "no";
18951    var REQCOND4 = "no";
18952    var REQCOND5 = "no";
18953    var REQCOND6 = "no";
18954
18955    /*
18956    checkForm by Riki "Fczbkk" Fridrich, 2002
18957    ver 2.0
18958    http://www.fczbkk.com/
18959    mailto:[email protected]
18960    You should find latest version of this script and documentation at
18961    http://www.fczbkk.sk/com/check_form/
18962    */
18963
18964
18965
18966    /*
18967    This is second version of my script for automatic checking of forms. It should
18968    work in in all standards-compliant browsers (Mozilla, Internet Explorer 5+), it
18969    downgrades OK in older browsers. No, it's not working in Opera (I said it works
18970    in standards-compliant browsers only).
18971
18972    It requires additional functions and libraries:
18973    - event_attacher.js
18974        http://www.fczbkk.com/js/event_attacher/
18975    - fix_e.js
18976        http://www.fczbkk.com/js/fix_e/
18977    - class_magic.js
18978        http://www.fczbkk.com/js/class_magic/
18979
18980    ATTENTION!!! Additional libraries and functions must be placed/linked before
18981    checkForm.
18982
18983    All used scripts and libraries are writen by me, except "Event Attacher", which
18984    was writen by Scott Andrew (http://www.scottandrew.com/). Feel free to use
18985    and/or modify them (as far as I know, "Event Attacher" is free to use too), just
18986    please let me know where you used it if possible (I want to see it in action).
18987    Any suggestions, comments, bugreports, modifications or functionality
18988    enhancements are wellcome.
18989    */
18990
18991    /*
18992    Formatting of the fields (e.g. highlighting of "required" or "invalid" fields)
18993    is defined in external CSS file "check_field.css". These definitions can be
18994    modified to fit your layout and they can be moved anywhere into your CSS
18995    definitions.
18996    */
18997
18998// object holding all other functions and variables
18999    var checkForm = {};
19000
19001    /*
19002    Regular expression builder, used for simplier adding or editing of character
19003    groups.
19004    */
19005
19006    checkForm.buildRegExp = function(str) {
19007        if (str) {return new RegExp("^[" + str + "]{1,}$");}
19008        return false;
19009    }
19010
19011    /* -------------- customizations start here -------------- */
19012
19013    /*
19014    Message, which will be displayed in the alert, when user tries to submit
19015    incomplete or invalid form.
19016    */
19017
19018    checkForm.invalidMsg = "Promiňte, ale formulář není vyplněný správně.\nNěkterá pole obsahují nesprávné údaje, nebo nejsou vyplněna. Prosím opravte všechna zvýrazněná pole.";
19019    checkForm.allreadySendingMsg = "Formulář je odesílán, čekejte prosím";
19020
19021//toto sa pouziva v custom onSubmit funkciach, ak vracaju false, musia toto nastavit na false
19022    checkForm.isInvalidForm = false;
19023
19024//ak chceme zobrazit klasicku error hlasku hore a nie vedla inputov daj true
19025    checkForm.showClassicErrorMessage = false;
19026
19027    /*
19028    Acceptable characters or regular expressions defining valid content of checked
19029    classes.
19030    */
19031
19032    checkForm.fieldType = new Array();
19033    checkForm.title = new Array();
19034
19035    checkForm.trimRegexp = new RegExp("^[ \f\n\r\t\v]+|[ \f\n\r\t\v]+$", "i");
19036
19037    
19038    checkForm.fieldType["alphabet"] =	new RegExp("^[abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZľěščťřžýáíéúůňťóďäôöüĽĚŠČŤŘŽÝÁÍÉÚŮŇŤÓĎÄÔÖÜ ]{1,}$", "i");
19039    checkForm.title["alphabet"] = "povoleny písmena";
19040    
19041    checkForm.fieldType["alphabetLowercase"] =	new RegExp("^[abcdefghijklmnopqrstuvwxyzľěščťřžýáíéúůňťóďäô ]{1,}$", "i");
19042    checkForm.title["alphabetLowercase"] = "povolena pouze malá písmena";
19043    
19044    checkForm.fieldType["alphabetUppercase"] =	new RegExp("^[ABCDEFGHIJKLMNOPQRSTUVWXYZĽĚŠČŤŘŽÝÁÍÉÚŮŇŤÓĎÄÔ ]{1,}$", "i");
19045    checkForm.title["alphabetUppercase"] = "povolena pouze velká písmena";
19046    
19047    checkForm.fieldType["alphanumeric"] =	new RegExp("^[abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789ľěščťřžýáíéúůňťóďäôĽĚŠČŤŘŽÝÁÍÉÚŮŇŤÓĎÄÔ ]{1,}$", "i");
19048    checkForm.title["alphanumeric"] = "povoleny číslice a písmena";
19049    
19050    checkForm.fieldType["date"] =	new RegExp("^(([0]?[123456789])|([12][0-9])|(3[01]))[.]((0?[123456789])|(1[012]))[.][0-9]{4}$", "i");
19051    checkForm.title["date"] = "datum ve formátu dd.mm.rrrr";
19052    
19053    checkForm.fieldType["datetime"] =	new RegExp("^[0-9]{1,2}[.][0-9]{1,2}[.][0-9]{4}.[0-9]{1,2}[:][0-9]{1,2}[:][0-9]{1,2}$", "i");
19054    checkForm.title["datetime"] = "datum a čas ve formátu dd.mm.rrrr hh:mm:ss";
19055    
19056    checkForm.fieldType["email"] =	new RegExp("^[a-zA-Z0-9]+[a-zA-Z0-9\._+=#$%&-]*[a-zA-Z0-9]+@[a-zA-Z0-9]+[a-zA-Z0-9\._-]*[a-zA-Z0-9]+\\.[a-zA-Z]{2,16}$", "i");
19057    checkForm.title["email"] = "e-mailová adresa ve formátu [email protected]";
19058    
19059    checkForm.fieldType["fixedPhone"] =	new RegExp("(^[0-9]{2,3}[\/][0-9]{3,12}$)|(^[+][0-9]{1,3}
19059[\/][0-9]{1,2}[\/][0-9]{3,12}$)", "i");
19060    checkForm.title["fixedPhone"] = "telefonní číslo pevné linky ve formátu xxx(x)/yyy(yyyyyyyyy)";
19061    
19062    checkForm.fieldType["integer"] =	new RegExp("^[-]?[0-9]+$", "i");
19063    checkForm.title["integer"] = "Celé číslo";
19064    
19065    checkForm.fieldType["loginChars"] =	new RegExp("^[0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_.]{1,}$", "i");
19066    checkForm.title["loginChars"] = "povoleny číslice a písmena (bez diakritiky)";
19067    
19068    checkForm.fieldType["minLen16"] =	new RegExp(".................*", "i");
19069    checkForm.title["minLen16"] = "minimálně 16 znaků";
19070    
19071    checkForm.fieldType["minLen2"] =	new RegExp("...*", "i");
19072    checkForm.title["minLen2"] = "minimálně 2 znaky";
19073    
19074    checkForm.fieldType["minLen3"] =	new RegExp("....*", "i");
19075    checkForm.title["minLen3"] = "minimálně 3 znaky";
19076    
19077    checkForm.fieldType["minLen4"] =	new RegExp(".....*", "i");
19078    checkForm.title["minLen4"] = "minimálně 4 znaky";
19079    
19080    checkForm.fieldType["minLen5"] =	new RegExp("......*", "i");
19081    checkForm.title["minLen5"] = "minimálně 5 znaků";
19082    
19083    checkForm.fieldType["minLen6"] =	new RegExp(".......*", "i");
19084    checkForm.title["minLen6"] = "minimálně 6 znaků";
19085    
19086    checkForm.fieldType["minLen8"] =	new RegExp(".........*", "i");
19087    checkForm.title["minLen8"] = "minimálně 8 znaků";
19088    
19089    checkForm.fieldType["mobilePhone"] =	new RegExp("(^[0-9]{4}[\/][0-9]{6}$)|(^[+][0-9]{1,3}[\/][0-9]{3}[\/][0-9]{6}$)", "i");
19090    checkForm.title["mobilePhone"] = "mobilní telefonní číslo ve formátu xxxx/yyyzzz";
19091    
19092    checkForm.fieldType["numbers"] =	new RegExp("^[-]?[0-9]+([,.][0-9]+)?$", "i");
19093    checkForm.title["numbers"] = "povoleny číslice";
19094    
19095    checkForm.fieldType["postalCode"] =	new RegExp("^(([0-9]{5})|([0-9]{3} [0-9]{2})|([0-9]{2} [0-9]{3}))$", "i");
19096    checkForm.title["postalCode"] = "PSČ";
19097    
19098    checkForm.fieldType["safeChars"] =	new RegExp("^[0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_ ]{1,}$", "i");
19099    checkForm.title["safeChars"] = "povoleny číslice a písmena (bez diakritiky)";
19100    
19101    checkForm.fieldType["time"] =	new RegExp("^[0-9]{1,2}[:][0-9]{1,2}$", "i");
19102    checkForm.title["time"] = "čas ve formátu hh:mm";
19103    
19104    checkForm.fieldType["trim"] =	new RegExp("^[^ \f\n\r\t\v]+[.]*", "i");
19105    checkForm.title["trim"] = "Prázdný znak";
19106    
19107    checkForm.fieldType["url"] =	new RegExp("^http[s]?:\/\/[a-zA-Z0-9]+([-_\.]?[a-zA-Z0-9])*\.[a-zA-Z]{2,4}([:0-9]*)(\/{1}[%-_~&=\?\.:a-z0-9]*)*$", "i");
19108    checkForm.title["url"] = "adresa web stránky ve formátu http://www.example.com";
19109    
19110    checkForm.fieldType["phone"] =	new RegExp("^([+]?[s0-9]+)?(d{3}|[(]?[0-9]+[)])?([-]?[s]?[0-9])+$", "i");
19111    checkForm.title["phone"] = "telefonní číslo ve formátu (+)1234567890";
19112    
19113    /*
19114    Default values for classes. These will be displayed, if form field with given
19115    class is focused and empty.
19116    */
19117
19118    checkForm.defaultValue = new Array();
19119    checkForm.defaultValue["url"] =						"http://www.";
19120    checkForm.defaultValue["email"] =					"@";
19121
19122    checkForm.formula = new Array();
19123
19124    /* -------------- customizations end here -------------- */
19125
19126    /*
19127    Initialisation of checkForm when document is loaded. It finds all forms and
19128    fields, checks them and adds events to them.
19129    */
19130
19131    checkForm.allreadyInitialized = false;
19132
19133    checkForm.init = function() {
19134
19135        if (checkForm.allreadyInitialized == true) return;
19136        checkForm.allreadyInitialized = true;
19137
19138        var forms = document.getElementsByTagName("form");
19139        for (var i = 0; i < forms.length; i++)
19140        {
19141            if(classMagic.has(forms[i], 'noCheckForm')) {
19142                continue;
19143            }
19144            addEventCheckForm(forms[i], "submit", checkForm.check);
19145            addEventCheckForm(forms[i], "reset", checkForm.resetClick);
19146            if (classMagic.has(forms[i], "checkFormClassicMessage")) checkForm.showClassicErrorMessage = true;
19147        }
19148
19149        var fields = checkForm.findInputs();
19150        for (var i = 0; i < fields.length; i++)
19151        {
19152            if (fields[i].value && fields[i].value.indexOf("=")==0 && fields[i].form.name!="")
19153            {
19154                //window.alert("value="+fields[i].value);
19155                fnc = fields[i].value.replace(/]/gi, ".value)");
19156                fnc = fnc.replace(/\[/gi, "getFloat(document."+fields[i].form.name+".");
19157                fnc = fnc.replace(/=/gi, "=checkNaN(");
19158                fnc = fnc + ")";
19159                fnc = "document."+fields[i].form.name+"." + fields[i].name + ".value"+ fnc + ";";
19160                //window.alert("fnc: " + fnc);
19161                checkForm.formula[checkForm.formula.length] = fnc;
19162                //window.alert("size: " + checkForm.formula.length);
19163            }
19164
19165            if (fields[i].type.toLowerCase().indexOf("select")!=-1)
19166            {
19167                //pre select box nemozu byt ostatne eventy lebo to v IE blblo
19168                addEventCheckForm(fields[i], "change", checkForm.checkField);
19169            }
19170            else
19171            {
19172                checkForm.fillTitles(fields[i]);
19173
19174                //ak je vypnuta validacia pri inicializacii tak nevaliduj
19175                if(false)
19176                {
19177                    checkForm.checkField(fields[i]);
19178                }
19179                else
19180                {
19181                    //vypnuta validacia pri inicializacii -> nevalidovat len ak je pole prazdne
19182                    if(!isEmpty(fields[i].value))
19183                        checkForm.checkField(fields[i]);
19184                }
19185
19186                addEventCheckForm(fields[i], "blur", checkForm.checkImplBlur);
19187                addEventCheckForm(fields[i], "focus", checkForm.checkField);
19188                if (classMagic.has(fields[i], "noEnterSubmit"))
19189                {
19190                    addEventCheckForm(fields[i], "keydown", checkForm.checkFieldEnter);
19191                }
19192                addEventCheckForm(fields[i], "keyup", checkForm.checkField);
19193
19194                addEventCheckForm(fields[i], "click", checkForm.checkField);
19195
19196                if ($(fields[i]).is(":checkbox")) {
19197                    addEventCheckForm(fields[i], "change", checkForm.checkImplBlur);
19198                }
19199                else {
19200                    addEventCheckForm(fields[i], "change", checkForm.checkField);
19201                }
19202
19203                //pridaj mu classu, aby sa to dalo rozumnejsie stylovat
19204                classMagic.add(fields[i], "input"+fields[i].type.toLowerCase());
19205
19206                //pridaj requiredradio pre required radia
19207                if (fields[i].type=="radio" || fields[i].type=="checkbox")
19208                {
19209                    if (classMagic.has(fields[i], "required"))
19210                    {
19211                        var newcl = "required"+fields[i].type;
19212                        classMagic.add(fields[i], newcl);
19213                    }
19214                }
19215            }
19216        }
19217    }
19218
19219    function isEmpty(obj) {
19220        if (typeof obj == 'undefined' || obj == null || obj == '' || obj == '@') return true;
19221        if (typeof obj == 'number' && isNaN(obj)) return true;
19222        if (obj instanceof Date && isNaN(Number(obj))) return true;
19223        return false;
19224    }
19225
19226    checkForm.resetClickLastE = null;
19227    checkForm.resetClick = function(e)
19228    {
19229        var formResultDiv = document.getElementById("ajaxFormResultContainer");
19230        if (formResultDiv != null)
19231        {
19232            formResultDiv.style.display = "none";
19233            formResultDiv.innerHTML = "";
19234        }
19235        checkForm.resetClickLastE = e;
19236        window.setTimeout(checkForm.resetClickRecheck, 100);
19237    }
19238    checkForm.resetClickRecheck = function()
19239    {
19240        if (checkForm.resetClickLastE != null) checkForm.recheck(checkForm.resetClickLastE);
19241    }
19242
19243    /*
19244    Helper functions, which finds all fields in given element and returns them in
19245    an array. If no element is specified, all fields in document are returned.
19246    */
19247
19248    checkForm.findInputs = function(elm) {
19249        var fields = new Array();
19250        if (!elm) {elm = document;}
19251
19252        var selects = elm.getElementsByTagName("select");
19253        var textareas = elm.getElementsByTagName("textarea");
19254        var inputs = elm.getElementsByTagName("input");
19255
19256        for (var i = 0; i < inputs.length; i++) {
19257            if ((inputs[i].type == "text") || (inputs[i].type == "email") || (inputs[i].type == "tel") || (inputs[i].type == "date") || (inputs[i].type == "number") || (inputs[i].type == "password") || (inputs[i].type == "file") || (inputs[i].type == "radio") || (inputs[i].type == "checkbox")) {
19258                fields[fields.length] = inputs[i];
19259            }
19260        }
19261
19262        for (var i = 0; i < textareas.length; i++) {
19263            fields[fields.length] = textareas[i];
19264        }
19265
19266        for (var i = 0; i < selects.length; i++) {
19267            fields[fields.length] = selects[i];
19268        }
19269
19270        return fields;
19271    }
19272
19273    /*
19274    Checking the form before submitting. To be sure, we will check all fields of
19275    given form once more and cancel the submit action if some fields are invalid.
19276    */
19277    checkForm.allreadySending = false;
19278
19279    checkForm.check = function(e)
19280    {
19281        if (checkForm.isInvalidForm==true)
19282        {
19283            return false;
19284        }
19285
19286        e = fixECheckForm(e);
19287        var obj = e.target;
19288        while (obj.tagName != "FORM") {
19289            obj = obj.parentNode;
19290        }
19291
19292        var isSubmit = (e.type == "submit");
19293        if (checkForm.checkImpl(obj, isSubmit, e)==false)
19294        {
19295            return false;
19296        }
19297
19298        if (checkForm.allreadySending == true)
19299        {
19300            alert(checkForm.allreadySendingMsg);
19301            e.preventDefault();
19302            return false;
19303        }
19304        if (e.type == "submit")
19305        {
19306            checkForm.allreadySending = true;
19307        }
19308        checkForm.hideAutocompleteOff(obj);
19309        return true;
19310    }
19311
19312    checkForm.checkImpl = function(obj, isSubmit, e)
19313    {
19314        var fields = checkForm.findInputs(obj);
19315        var isSubmitError = false;
19316        var errorMessage = checkForm.invalidMsg+"\n";
19317        var errorMessageHtml = '<div class="ajaxError">Prosím, opravte následující chyby:</div><ol>';
19318        for (var i = 0; i < fields.length; i++)
19319        {
19320            //sprav trim (ak treba)
19321            checkForm.trimField(fields[i]);
19322            //skontroluj
19323            var status = checkForm.checkField(fields[i]);
19324            var errorBlock = [];
19325            var isExistErrorBlock = false;
19326            try
19327            {
19328                errorBlock = checkForm.getErrorBlock(fields[i]);
19329
19330                if (errorBlock.length == 0) {
19331                    var id = fields[i].id != null ? fields[i].id : fields[i].name;
19332                    if (id != '') {
19333                        errorBlock = $("#" + id).parent().find(".cs-error");
19334                        if (errorBlock.length<1) errorBlock = checkForm.getErrorBlock(fields[i]);
19335                    }
19336                    else {
19337                        errorBlock = $();
19338                    }
19339                }
19340                isExistErrorBlock = errorBlock.length > 0;
19341            } catch (e) { console.log(e); }
19342
19343            if (status == "invalid")
19344            {
19345                if (isSubmit)
19346                {
19347                    isSubmitError = true;
19348                    var msg = checkForm.markAndGetLabelText(fields[i], true);
19349                    if (errorMessage.indexOf("- "+msg)==-1)
19350                    {
19351                        if(!isExistErrorBlock)
19352                        {
19353                            errorMessage = errorMessage + "\n- " + msg;
19354                            errorMessageHtml = errorMessageHtml + "\n<li>" + msg;
19355                            if (fields[i].title != null && fields[i].title != undefined && fields[i].title!="") {
19356                                errorMessageHtml += " - " + fields[i].title
19357                            }
19358                            errorMessageHtml += "</li>";
19359
19360                            if(typeof $(fields[i]).attr("rel") != "undefined")
19361                            {
19362                                msg = $(fields[i]).attr("rel");
19363                            }
19364                            else {
19365                                msg += " " + fields[i].title;
19366                            }
19367
19368                            if (checkForm.showClassicErrorMessage==false) {
19369                                var el;
19370                                var id = fields[i].id != null ? fields[i].id : fields[i].name;
19371                                if (id != '') {
19372                                    el = $("#" + id).next(".cs-error");
19373                                }
19374                                else {
19375                                    el = $();
19376                                }
19377                                el.parent().append('<div class="help-block cs-error cs-error-'+obj.id+'">'+msg+'</div>').show();
19378                            }
19379                        }
19380                        else {
19381                            if (errorBlock.html() == "") {
19382                                errorBlock.html(msg +' - ' + fields[i].title);
19383                            }
19384                            errorBlock.show();
19385                        }
19386                    }
19387                }
19388                else
19389                {
19390                    return false;
19391                }
19392            }
19393            else
19394            {
19395                //odznac label, ze je zle vyplneny
19396                checkForm.markAndGetLabelText(fields[i], false);
19397            }
19398        }
19399
19400        if (isSubmitError)
19401        {
19402            checkForm.printAlertMessage(errorMessageHtml, errorMessage, e, obj);
19403
19404            if (e!=null && e.preventDefault)
19405            {
19406                e.preventDefault();
19407            }
19408
19409            return false;
19410        }
19411    }
19412
19413    checkForm.checkImplBlur = function(e)
19414    {
19415        var errorMessage = checkForm.invalidMsg+"\n";
19416        var errorMessageHtml = '<div class="ajaxError">Prosím, opravte následující chyby:</div><ol>';
19417        var obj;
19418        if (e && e.tagName) {
19419            obj = e;
19420        } else {
19421            e = fixECheckForm(e);
19422            obj = e.target;
19423        }
19424        //window.alert(fields[i]);
19425        isSubmit = true;
19426        //sprav trim (ak treba)
19427        checkForm.trimField(obj);
19428        //skontroluj
19429        var status = checkForm.checkField(obj);
19430        var errorBlock = checkForm.getErrorBlock(obj);
19431        if (errorBlock.length == 0) {
19432            var id = obj.id != null ? obj.id : obj.name;
19433            if (id != '') {
19434                errorBlock = $("#" + id).next(".cs-error");
19435            }
19436            else {
19437                errorBlock = $();
19438            }
19439        }
19440        var isExistErrorBlock = errorBlock.length > 0;
19441
19442        if (status == "invalid")
19443        {
19444            var msg = checkForm.markAndGetLabelText(obj, true);
19445
19446            if (errorMessage.indexOf("- "+msg)==-1)
19447            {
19448                if(!isExistErrorBlock){
19449                    if($(obj).attr("rel") != undefined ){
19450                        msg = $(obj).attr("rel");
19451
19452                    }else{
19453                        msg += " " + obj.title;
19454                    }
19455                    if (checkForm.showClassicErrorMessage==false) {
19456                        var el;
19457                        var id = obj.id != null ? obj.id : obj.name;
19458                        if (id != '') {
19459                            el = $("#"+obj.id);
19460                        }
19461                        else {
19462                            el = $();
19463                        }
19464                        el.parent().append('<div class="help-block cs-error cs-error-'+obj.id+'">'+msg+'</div>');
19465                    }
19466                }else{
19467                    if (errorBlock.html() == "") {
19468                        errorBlock.html(msg +' - ' + obj.title);
19469                    }
19470                    errorBlock.show();
19471                }
19472            }
19473        }
19474        else
19475        {
19476            if(isExistErrorBlock) {
19477                errorBlock.hide();
19478            }
19479
19480            //odznac label, ze je zle vyplneny
19481            checkForm.markAndGetLabelText(obj, false);
19482        }
19483    }
19484
19485    checkForm.getErrorBlock = function(obj) {
19486        var id = obj.id != null ? obj.id : obj.name;
19487        if (id != '') {
19488            return $(".cs-error-" + obj.id);
19489        }
19490        return $();
19491    }
19492
19493    checkForm.printAlertMessage = function(errorMessageHtml, errorMessage, e, obj)
19494    {
19495        try
19496        {
19497            if (errorMessageHtml == null) errorMessageHtml="<div class='ajaxError'>"+errorMessage+"</div>";
19498
19499            var errorDivElement = document.getElementById("checkFormAlertDiv");
19500            if (errorDivElement == null) errorDivElement = document.getElementById("ajaxFormResultContainer");
19501            if (errorDivElement == null && ($('.cs-error').length == 0 || checkForm.showClassicErrorMessage==true))
19502            {
19503                //console.log("Vytvaram error div message");
19504                //vytvor ho
19505                var form = null;
19506                if (obj != null && obj != undefined) form = $(obj)
19507                else form = $("form[name=formMailForm]");
19508                form.prepend("<div id='formResult'><div id='ajaxFormResultContainer'></div></div>");
19509                errorDivElement = document.getElementById("ajaxFormResultContainer");
19510            }
19511
19512            if (errorDivElement != null) {
19513                //console.log("Zobrazujem, html="+$(errorDivElement).html()+"; length=", $(errorDivElement).html().length);
19514                if ($(errorDivElement).html().length < 5) $(errorDivElement).html(checkForm.invalidMsg);
19515                $(errorDivElement).addClass("alert alert-danger");
19516                $(errorDivElement).removeClass("alert-success");
19517            }
19518
19519            if ($('.cs-error').length > 0 && checkForm.showClassicErrorMessage==false) {
19520                var csError = $('.cs-error:visible').first();
19521                if (csError.length > 0) {
19522                    $("html,body").animate({ scrollTop: (csError.offset().top - 100) }, { duration: 'fast', easing: 'linear'});
19523                }
19524            }
19525            else if (errorDivElement != null)
19526            {
19527                try
19528                {
19529                    //console.log("Zobrazujem error hlasenie, div=", errorDivElement, "message=", errorMessageHtml);
19530                    $(errorDivElement).html(errorMessageHtml+"</ol>").show("slow");
19531                    //div.tab-pane pridane pre tabovany content (usredit)
19532                    $("html,body,div.tab-pane").animate({ scrollTop: ($(errorDivElement).offset().top - 100) }, { duration: 'fast', easing: 'linear'});
19533                }
19534                catch (e) {
19535                    alert(errorMessage);
19536                }
19537            }
19538            else {
19539                alert(errorMessage);
19540            }
19541
19542            if (e!=null && e.preventDefault)
19543            {
19544                e.preventDefault();
19545            }
19546        }
19547        catch (e)
19548        {
19549            alert(errorMessage);
19550        }
19551    }
19552
19553    checkForm.markAndGetLabelText = function(field, isInvalid)
19554    {
19555        //najskor skus najst label pre dany field
19556        var id = field.id;
19557        if (id == "") id = field.name;
19558
19559        var text = null;
19560        if (id != null)
19561        {
19562            //skus najst label pre dane pole
19563            var labelElm = checkForm.formGetLabel(id);
19564            if (labelElm != null)
19565            {
19566                if (isInvalid)
19567                {
19568                    $("form").removeClass("sending");
19569                    if (field.type == "radio" || field.type == "checkbox")
19570                    {
19571                        var leftLabelElm = checkForm.formGetLabel(field.name);
19572                        if (leftLabelElm != null) text = checkForm.getInnerText(leftLabelElm);
19573                    }
19574                    if (text == null || text == "") text = checkForm.getInnerText(labelElm);
19575
19576                    if (!classMagic.has(field, "noCheckForm")) {
19577                        classMagic.add(labelElm, "invalidLabel");
19578                    }
19579                }
19580                else
19581                {
19582                    if (!classMagic.has(field, "noCheckForm")) {
19583                        classMagic.remove(labelElm, "invalidLabel");
19584                    }
19585                }
19586            }
19587        }
19588
19589        if (text==null && id.indexOf("wjcaptcha")!=-1) {
19590            text = "Text na obrázku";
19591        }
19592
19593        if (text == null) {
19594            text = id;
19595        }
19596
19597        if (text == null) {
19598            text = $(field).prop('name');
19599        }
19600
19601        var dataName = $(field).data('name');
19602        if (typeof dataName != "undefined" && dataName != "") {
19603            text = dataName;
19604        }
19605
19606        return text;
19607    }
19608
19609    checkForm.getInnerText = function(elem)
19610    {
19611        var hasInnerText = (document.getElementsByTagName("body")[0].innerText != undefined) ? true : false;
19612        if(!hasInnerText)
19613        {
19614            return elem.textContent;
19615        }
19616        return elem.innerText;
19617    }
19618
19619    checkForm.formGetLabel = function(forField)
19620    {
19621        if (forField == null || forField == "") return null
19622
19623        var labels = document.getElementsByTagName("LABEL");
19624        for (i=0; i < labels.length; i++)
19625        {
19626            if (labels[i].htmlFor == forField) return labels[i];
19627        }
19628        return null;
19629    }
19630
19631
19632    checkForm.hideAutocompleteOff = function(obj)
19633    {
19634        var fields = obj.elements;
19635        for (var i = 0; i < fields.length; i++)
19636        {
19637            var classes = classMagic.get(fields[i]);
19638            //taketo pole nastavim na hidden aby si FF nepamatal heslo
19639            if (classMagic.has(fields[i], "autocompleteoff"))
19640            {
19641                fields[i].setAttribute("type", "hidden");
19642            }
19643        }
19644    }
19645
19646    checkForm.showAutocompleteOff = function(obj)
19647    {
19648
19649        var fields = obj.elements;
19650        for (var i = 0; i < fields.length; i++)
19651        {
19652            var classes = classMagic.get(fields[i]);
19653            //taketo pole nastavim na hidden aby si FF nepamatal heslo
19654            if (classMagic.has(fields[i], "autocompleteoff"))
19655            {
19656                fields[i].setAttribute("type", "password");
19657            }
19658        }
19659    }
19660
19661    checkForm.btnSubmit = function(obj)
19662    {
19663        if (checkForm.isInvalidForm==true)
19664        {
19665            return false;
19666        }
19667
19668        var fields = checkForm.findInputs(obj);
19669        for (var i = 0; i < fields.length; i++)
19670        {
19671            //window.alert(fields[i]);
19672
19673            //sprav trim (ak treba)
19674            checkForm.trimField(fields[i]);
19675            //skontroluj
19676            var status = checkForm.checkField(fields[i]);
19677            if (status == "invalid")
19678            {
19679                alert(checkForm.invalidMsg);
19680                return false;
19681            }
19682        }
19683        if (checkForm.allreadySending == true)
19684        {
19685            alert(checkForm.allreadySendingMsg);
19686            return false;
19687        }
19688        checkForm.allreadySending = true;
19689        checkForm.hideAutocompleteOff(obj);
19690        obj.submit();
19691        return true;
19692    }
19693
19694    /*
19695    Prekontroluje polia, ale nespravi ziadny alert, potrebne po zmene REQCOND
19696    */
19697    checkForm.recheck = function(e)
19698    {
19699        var valid = true
19700        var fields = checkForm.findInputs();
19701        for (var i = 0; i < fields.length; i++)
19702        {
19703            status = checkForm.checkField(fields[i]);
19704            if (valid && status == "invalid" || status == "required")
19705                valid = false
19706        }
19707        return valid
19708    }
19709
19710    checkForm.recheckAjax = function(form)
19711    {
19712        return checkForm.checkImpl(form, true, null);
19713    }
19714
19715    /*
19716    checks one field, prints message if not valid
19717    */
19718    checkForm.recheckFieldAjax = function(element)
19719    {
19720        var status = checkForm.checkField(element);
19721        var errorMessage = checkForm.invalidMsg+"\n";
19722        var errorMessageHtml = '<div class="ajaxError">Prosím, opravte následující chyby:</div><ol>';
19723        if (status == "invalid")
19724        {
19725            //TODO: mark the input
19726
19727            var msg = checkForm.markAndGetLabelText(element, true);
19728            if (errorMessage.indexOf("- "+msg)==-1)
19729            {
19730                errorMessage = errorMessage + "\n- " + msg;
19731                errorMessageHtml = errorMessageHtml + "\n<li>" + msg;
19732                if (element.title != null && element.title != undefined && element.title!="") errorMessageHtml += " - " + element.title
19733                errorMessageHtml += "</li>";
19734            }
19735            checkForm.printAlertMessage(errorMessageHtml, errorMessage, null, element.form);
19736            return false;
19737        }
19738        return true;
19739    }
19740
19741    /*
19742    checks more fields, prints messages if at least one not valid
19743    */
19744    checkForm.recheckFieldsAjax = function(fields)
19745    {
19746        var ret =true;
19747        var errorMessage = checkForm.invalidMsg+"\n";
19748        var errorMessageHtml = '<div class="ajaxError">Prosím, opravte následující chyby:</div><ol>';
19749        var form = fields[0].form;
19750        for (var i = 0; i < fields.length; i++)
19751        {
19752            checkForm.trimField(fields[i]);
19753            var status = checkForm.checkField(fields[i]);
19754            if (status == "invalid")
19755            {
19756                ret = false;
19757                var msg = checkForm.markAndGetLabelText(fields[i], true);
19758                if (errorMessage.indexOf("- "+msg)==-1)
19759                {
19760                    errorMessage = errorMessage + "\n- " + msg;
19761                    errorMessageHtml = errorMessageHtml + "\n<li>" + msg;
19762                    if (fields[i].title != null && fields[i].title != undefined && fields[i].title!="")errorMessageHtml += " - " + fields[i].title
19763                    errorMessageHtml += "</li>";
19764                }
19765            }
19766            else
19767            {
19768                //odznac label, ze je zle vyplneny
19769                checkForm.markAndGetLabelText(fields[i], false);
19770            }
19771        }
19772        if(!ret) checkForm.printAlertMessage(errorMessageHtml, errorMessage, null, form);
19773        return ret;
19774    }
19775
19776
19777
19778    /*
19779    Checking the form field.
19780    */
19781    checkForm.checkFieldEnter = function(e)
19782    {
19783        if (e.keyCode && e.keyCode==13)
19784        {
19785            window.alert("Formulár nie je možné odoslať klávesou enter, kliknite prosím na príslušné tlačítko pre odoslanie formuláru.");
19786            if (e.preventDefault) {
19787                e.preventDefault();
19788            }
19789            return false;
19790        }
19791        return true;
19792    }
19793
19794    checkForm.trimField = function(e)
19795    {
19796        var obj;
19797        if (e && e.tagName) {
19798            obj = e;
19799        } else {
19800            e = fixECheckForm(e);
19801            obj = e.target;
19802        }
19803
19804        //tieto nebudeme kontrolovat
19805        if (classMagic.has(obj, "trim")==false) return;
19806
19807        //2x je to tu lebo to netrimovalo spravne konce
19808        obj.value = obj.value.replace(checkForm.trimRegexp, "");
19809        obj.value = obj.value.replace(checkForm.trimRegexp, "");
19810    }
19811
19812
19813    var checkFormSetCursorObj = null;
19814    var checkFormSetCursorPos = 0;
19815    checkForm.setCursorAsync = function()
19816    {
19817        var node = checkFormSetCursorObj;
19818        var pos = checkFormSetCursorPos;
19819        try
19820        {
19821            var node = (typeof node == "string" || node instanceof String) ? document.getElementById(node) : node;
19822
19823            if(!node)
19824            {
19825                return false;
19826            }
19827            else if(node.createTextRange)
19828            {
19829                var textRange = node.createTextRange();
19830                textRange.collapse(true);
19831                textRange.moveEnd(pos);
19832                textRange.moveStart(pos);
19833                textRange.select();
19834                return true;
19835            }
19836            else if(node.setSelectionRange)
19837            {
19838                node.setSelectionRange(pos,pos);
19839                return true;
19840            }
19841        }
19842        catch (e) { }
19843
19844        return false;
19845    }
19846    checkForm.setCursor = function(node,pos)
19847    {
19848        checkFormSetCursorObj = node;
19849        checkFormSetCursorPos = pos;
19850        setTimeout(checkForm.setCursorAsync, 50);
19851    }
19852
19853    checkForm.checkField = function(e)
19854    {
19855        var obj;
19856        if (e && e.tagName) {
19857            obj = e;
19858        } else {
19859            e = fixECheckForm(e);
19860            obj = e.target;
19861        }
19862
19863        //recalculate values
19864        try
19865        {
19866            if (checkForm.formula.length>0)
19867            {
19868                for (i=0; i< checkForm.formula.length; i++)
19869                {
19870                    try
19871                    {
19872                        //window.alert("vypocitavam: "+checkForm.formula[i]);
19873                        eval(checkForm.formula[i]);
19874                    }
19875                    catch (e2)
19876                    {
19877                        window.status= "chyba vypoctu 2: "+e2+" fnc: "+checkForm.formula[i];
19878                    }
19879                }
19880            }
19881        }
19882        catch (e)
19883        {
19884            window.status= "chyba vypoctu: "+e;
19885        }
19886
19887        var fieldOK = true;
19888        var classes = classMagic.get(obj);
19889
19890        //tieto nebudeme kontrolovat
19891        if (classMagic.has(obj, "noCheckForm")) return;
19892
19893        if (classMagic.has(obj, "captcha"))
19894        {
19895            var actualStatus = "invalid";
19896            if (classMagic.has(obj, "invalid")==false) actualStatus = "valid";
19897
19898            checkForm.checkCaptcha(obj);
19899
19900            return actualStatus;
19901        }
19902
19903        classMagic.add(obj, "invalid");
19904
19905        // conditional required field
19906        if (classMagic.has(obj, "reqcond1"))
19907        {
19908            if ("yes"==REQCOND1)
19909            {
19910                classMagic.remove(obj, "invalid");
19911                classMagic.remove(obj, "required");
19912                return("valid");
19913            }
19914            else
19915            {
19916                classMagic.add(obj, "invalid");
19917                classMagic.add(obj, "required");
19918            }
19919        }
19920
19921        if (classMagic.has(obj, "reqcond2"))
19922        {
19923            if ("yes"==REQCOND2)
19924            {
19925                classMagic.remove(obj, "invalid");
19926                classMagic.remove(obj, "required");
19927                return("valid");
19928            }
19929            else
19930            {
19931                classMagic.add(obj, "invalid")
19932                classMagic.add(obj, "required")
19933            }
19934        }
19935
19936        if (classMagic.has(obj, "reqcond3"))
19937        {
19938            if ("yes"==REQCOND3)
19939            {
19940                classMagic.remove(obj, "invalid");
19941                classMagic.remove(obj, "required");
19942                return("valid");
19943            }
19944            else
19945            {
19946                classMagic.add(obj, "invalid");
19947                classMagic.add(obj, "required");
19948            }
19949        }
19950
19951        if (classMagic.has(obj, "reqcond4"))
19952        {
19953            if ("yes"==REQCOND4)
19954            {
19955                classMagic.remove(obj, "invalid");
19956                classMagic.remove(obj, "required");
19957                return("valid");
19958            }
19959            else
19960            {
19961                classMagic.add(obj, "invalid")
19962                classMagic.add(obj, "required")
19963            }
19964        }
19965
19966        if (classMagic.has(obj, "reqcond5"))
19967        {
19968            if ("yes"==REQCOND5)
19969            {
19970                classMagic.remove(obj, "invalid");
19971                classMagic.remove(obj, "required");
19972                return("valid");
19973            }
19974            else
19975            {
19976                classMagic.add(obj, "invalid")
19977                classMagic.add(obj, "required")
19978            }
19979        }
19980
19981        if (classMagic.has(obj, "reqcond6"))
19982        {
19983            if ("yes"==REQCOND6)
19984            {
19985                classMagic.remove(obj, "invalid");
19986                classMagic.remove(obj, "required");
19987                return("valid");
19988            }
19989            else
19990            {
19991                classMagic.add(obj, "invalid")
19992                classMagic.add(obj, "required")
19993            }
19994        }
19995
19996        var i = 0;
19997        // required field can't be empty
19998        if (classMagic.has(obj, "required"))
19999        {
20000            if (obj.type == "radio" || obj.type == "checkbox")
20001            {
20002                fieldOK = checkForm.isRadioSelected(obj);
20003            }
20004            else
20005            {
20006                i = 0;
20007                while (i < classes.length)
20008                {
20009                    if ((e.type == "blur") && (obj.value == checkForm.defaultValue[classes[i]])) {
20010                        obj.value = "";
20011                    }
20012                    i++;
20013                }
20014
20015                fieldOK = (checkForm.isBlank(obj.value)) ? false : true;
20016            }
20017        }
20018
20019        // find classes of given field and check, if there are any rules for it
20020        i = 0;
20021        while (i < classes.length)
20022        {
20023            if (checkForm.defaultValue[classes[i]]) {
20024                if ((e.type == "focus") && checkForm.isBlank(obj.value))
20025                {
20026                    obj.value = checkForm.defaultValue[classes[i]];
20027                    checkForm.setCursor(obj, 0);
20028                }
20029
20030                if ((e.type == "blur") && (obj.value == checkForm.defaultValue[classes[i]])) {
20031                    obj.value = "";
20032                }
20033            }
20034
20035            if (fieldOK && obj.type!="checkbox" && obj.type!="radio")
20036            {
20037                if (checkForm.fieldType[classes[i]])
20038                {
20039                    fieldOK = (!checkForm.isBlank(obj.value) && checkForm.checkChars(obj.value, checkForm.fieldType[classes[i]])) ? false : true;
20040                    i = classes.length;
20041                }
20042            }
20043            i++;
20044        }
20045
20046        //password2 check
20047        //console.log("Pass 2 check, name=", obj.name);
20048        if ("password2"===obj.name && typeof obj.form["usr.password"] != "undefined") {
20049            var pass2 = obj.value;
20050            var pass1 = obj.form["usr.password"].value;
20051            //console.log("pass1=", pass1, "pass2=", pass2);
20052            if (pass1 != pass2) fieldOK = false;
20053        }
20054
20055        fieldOK = fieldOK || obj.type == 'hidden';
20056
20057        // if content of the field is not OK, highlight it as invali
20057d
20058        (fieldOK) ? classMagic.remove(obj, "invalid") : classMagic.add(obj, "invalid");
20059
20060        /*
20061        Function like this should return "true" or "false". But this would be
20062        blocking of keyboard input in case of incomplete content of the field
20063        (e.g. URL). That's why this function returns "valid" or "invalid".
20064        */
20065        return (fieldOK) ? "valid" : "invalid";
20066    }
20067
20068    checkForm.fillTitles = function(obj)
20069    {
20070        try
20071        {
20072            if (obj.title!="") return;
20073
20074            if (classMagic.has(obj, "required"))
20075            {
20076                obj.title = "povinná pole";
20077            }
20078
20079            var classes = classMagic.get(obj);
20080            var i = 0;
20081            for (i=0; i < classes.length; i++)
20082            {
20083                var text = checkForm.title[classes[i]];
20084                if (text != null && text!=undefined && text != "")
20085                {
20086                    if (obj.title != "") obj.title = obj.title+", "+text;
20087                    else obj.title = obj.title+" "+text;
20088                }
20089            }
20090        } catch (e) {}
20091    }
20092
20093    /*
20094    Checks if given string contains given pattern (regullar expression).
20095    */
20096
20097    checkForm.checkChars = function(str, re) {
20098        if (str && re) {
20099            return (str.search(re) == -1) ? true : false;
20100        }
20101        return true;
20102    }
20103
20104    /*
20105    Checks, if given string is blank or not.
20106    */
20107
20108    checkForm.isBlank = function(str)
20109    {
20110        str = str.replace(checkForm.trimRegexp, "");
20111        str = str.replace(checkForm.trimRegexp, "");
20112        return (str == "" || str == " ") ? true : false;
20113    }
20114
20115    /*
20116    WebJET: skontroluje, ci je zvolene aspon jedno radio/checkbox z danej skupiny
20117    */
20118    checkForm.isRadioSelected = function(obj)
20119    {
20120        try
20121        {
20122            var radioForm = obj.form;
20123            var radios = radioForm.elements[obj.name];
20124
20125            if (radios.length==undefined)
20126            {
20127                //mame jedno radio
20128                if (obj.checked)
20129                {
20130                    classMagic.remove(obj, "invalid");
20131                    if (obj.type=="radio") classMagic.remove(obj, "required");
20132                }
20133                else
20134                {
20135                    classMagic.add(obj, "invalid");
20136                }
20137                return obj.checked;
20138            }
20139
20140            var someChecked = false;
20141            var checkedCount = 0;
20142            for (i=0; i< radios.length; i++)
20143            {
20144                if (radios[i].checked)
20145                {
20146                    someChecked = true;
20147                    checkedCount++;
20148                }
20149            }
20150
20151            //skontroluj hodnoty pre min a max len
20152            try
20153            {
20154                var classes = classMagic.get(obj);
20155                if (classes && classes.length)
20156                {
20157                    for (i=0; i< classes.length; i++)
20158                    {
20159                        if (classes[i].indexOf("countCond-")==0)
20160                        {
20161                            var data = classes[i].split("-");
20162                            if (data && data.length==3)
20163                            {
20164                                if (checkedCount < data[1]) someChecked = false;
20165                                if (checkedCount > data[2]) someChecked = false;
20166                            }
20167                        }
20168                    }
20169                }
20170            }
20171            catch (ex2) {}
20172
20173            for (i=0; i< radios.length; i++)
20174            {
20175                if (someChecked == false)
20176                {
20177                    classMagic.add(radios[i], "invalid");
20178
20179                    //najdi prislusny label a nastav aj tomu
20180                    var elmId = radios[i].id;
20181                    var label = $("label[for="+elmId+"]").addClass("invalidLabel");
20182                }
20183                else
20184                {
20185                    //cb sa uz neda odselectnut, mozeme removnut aj required aby sa to ako tak odstylovalo
20186                    classMagic.remove(radios[i], "invalid");
20187
20188                    //najdi prislusny label a nastav aj tomu
20189                    var elmId = radios[i].id;
20190                    var label = $("label[for="+elmId+"]").removeClass("invalidLabel");
20191
20192                }
20193            }
20194
20195            return someChecked;
20196        }
20197        catch (ex)
20198        {
20199            //alert(ex);
20200        }
20201        return true;
20202    }
20203
20204    /*
20205    WebJET - kontrola captcha kodu
20206    */
20207    checkForm.xmlhttp = null;
20208    checkForm.captchaObj = null;
20209    checkForm.checkCaptcha = function(obj)
20210    {
20211        var value = obj.value;
20212        checkForm.xmlhttp=null;
20213        if (window.XMLHttpRequest)
20214        {
20215            // code for IE7+, Firefox, Chrome, Opera, Safari
20216            checkForm.xmlhttp=new XMLHttpRequest();
20217        }
20218        else
20219        {
20220            // code for IE6, IE5
20221            checkForm.xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
20222        }
20223
20224        classMagic.add(obj, "invalid");
20225        checkForm.captchaObj = obj;
20226
20227        checkForm.xmlhttp.onreadystatechange=checkForm.checkCaptchaChange;
20228        checkForm.xmlhttp.open("GET", "/components/form/catpcha_ajax.jsp?v="+value, true);
20229        checkForm.xmlhttp.send(null);
20230    }
20231
20232    checkForm.checkCaptchaChange = function()
20233    {
20234        try
20235        {
20236            if (checkForm.captchaObj != null)
20237            {
20238                if (checkForm.xmlhttp.readyState==4)
20239                {
20240                    // 4 = "loaded"
20241                    if (checkForm.xmlhttp.status==200)
20242                    {
20243                        // 200 = "OK"
20244                        classMagic.remove(checkForm.captchaObj, "invalid");
20245                    }
20246                    else
20247                    {
20248                        classMagic.add(checkForm.captchaObj, "invalid");
20249                    }
20250                }
20251            }
20252        } catch (e) {}
20253    }
20254
20255    /*
20256    Initialize script when document is loaded.
20257    */
20258    addEventCheckForm(window, "load", checkForm.init);
20259//failsafe, ak uz sa nahodou okno loadlo a horny event nenastane
20260    window.setTimeout(checkForm.init, 2000);
20261
20262    /* schova dany element ak checkbox nie je zaskrtnuty */
20263    function formShowHide(checkbox, elementNamesShow, elementNamesHide)
20264    {
20265        if (checkbox.checked == false) return;
20266
20267        var elements = elementNamesShow.split(",");
20268        for (i=0; i< elements.length; i++)
20269        {
20270            var element = document.getElementById(elements[i]);
20271            if (element != null) element.style.display="block";
20272        }
20273        elements = elementNamesHide.split(",");
20274        for (i=0; i< elements.length; i++)
20275        {
20276            var element = document.getElementById(elements[i]);
20277            if (element != null) element.style.display="none";
20278        }
20279    }
20280
20281//alert na odoslanie formularu
20282    if (location.href.indexOf("formsend=true")!=-1)
20283    {
20284        if (location.href.indexOf("DoubleOptIn")!=-1) {
20285            checkForm.printAlertMessage(null, "Formulář byl odeslán, na váš email jsme odeslali zprávu, ve které je třeba potvrdit odeslání kliknutím na odkaz.", null);
20286        } else {
20287            checkForm.printAlertMessage(null, "Formulář byl úspěšně odeslán", null);
20288        }
20289    }
20290
20291    if (location.href.indexOf("formfail=formIsAllreadySubmitted")!=-1)
20292    {
20293        checkForm.printAlertMessage(null, "Formulář už jste jednou odeslali, není možné ho odeslat znovu.", null);
20294    }
20295    else if (location.href.indexOf("formfail=javascript")!=-1)
20296    {
20297        checkForm.printAlertMessage(null, "<strong><span style='color: red;'>UPOZORNĚNÍ:</span> Pro odeslání formuláře musíte mít povolen JavaScript. Pokud váš prohlížeč JavaScript nepodporuje můžete <a href='/components/form/spamprotectiondisable.jsp?backurl=null'>deaktivovat ochranu formulářů</a>.</strong>", null);
20298    }
20299    else if (location.href.indexOf("formfail=probablySpamBot")!=-1)
20300    {
20301        checkForm.printAlertMessage(null, "Formulář byl detekován jako SPAM (nevyžádaná pošta). Pro správné odeslání formuláře musíte mít standardní nastavení prohlížeče, mezi jednotlivými odesláními počkat 10 sekund a neodesílat víc než 50 formulářů za hodinu.", null);
20302    }
20303    else if (location.href.indexOf("formfail=requiredFields")!=-1)
20304    {
20305        checkForm.printAlertMessage(null, "Ve formuláři jste nevyplnili všechna povinná pole, nebo pole nemají správné hodnoty. Zkontrolujte jednotlivá pole formuláře a zkúste ho znovu odeslat.", null);
20306    }
20307    else if (location.href.indexOf("formfail=bad_file")!=-1)
20308    {
20309        checkForm.printAlertMessage(null, "Vámi zaslaný soubor nevyhovuje požadavkům, formulář nebyl odeslán", null);
20310    }
20311    else if (location.href.indexOf("formfail=captcha")!=-1)
20312    {
20313        checkForm.printAlertMessage(null, "Bezpečnostní ověření (captcha) nebylo úspěšné. Zkuste to znovu.", null);
20314    }
20315    else if (location.href.indexOf("formfail=emailNotSend")!=-1)
20316    {
20317        window.alert("Formulář se nepodařilo odeslat na email! Zkuste ho znovu odeslat později.");
20318    }
20319    else if (location.href.indexOf("formfail=")!=-1)
20320    {
20321        checkForm.printAlertMessage(null, "Formulář se nepodařilo odeslat! Zkuste ho znovu odeslat později.", null);
20322    }
20323
20324    
20325
20326var defaultStripesExenstion = ".x";
20327var ajaxStripesExenstion = ".ajax";
20328
20329/*
20330* Function that uses jQuery to invoke an action of a form. Slurps the values
20331* from the form using prototype's 'form.serialize()' method, and then submits
20332* them to the server using prototype's 'jQuery.post' which transmits the request
20333* and then renders the resposne text into the named container.
20334*
20335* @param formDiv reference to the form object being submitted
20336* @param resultDivthe name of the HTML container to insert the result into
20337* @param event the name of the event to be triggered, or null
20338*/
20339
20340function invokeWJAjax(formDiv, resultDiv, event, action, callMyFunction)
20341{
20342  try
20343  {
20344    var form = null;
20345
20346    $("form[name="+formDiv+"]").addClass("sending");
20347
20348    //"formMailForm"==formDiv
20349    if (formDiv.indexOf("formMailForm") > -1)
20350    {
20351
20352      form = $("form[name="+formDiv+"]");
20353      form.attr("id", formDiv);
20354    }
20355    var formByIds = null;
20356    if (form == null) formByIds = $("#" + formDiv + " form");
20357    if (form == null && formByIds != null && formByIds.length!=0)
20358    {
20359      if(formByIds.length > 1)
20360      {
20361        form = $(formByIds[1]);  //zoberiem druhy formular - prvy je webjetObfuscateForm
20362      }
20363      else
20364      {
20365        form = $(formByIds[0]);
20366      }
20367    }
20368
20369    try
20370    {
20371      if ("multipart/form-data" == form.attr("enctype"))
20372      {
20373        return true;
20374      }
20375    }
20376    catch (ex1) {alert("1:" + ex1)}
20377
20378        $("#formResult").remove();// vymaze form result
20379        $("input, textarea, select").removeClass("invalid");
20379// vymaze vsetky classy invalid
20380
20381    if ($("#" + resultDiv).length==0)
20382    {
20383      form.prepend("<div id=\"formResult\"><div id='"+resultDiv+"'></div></div>");
20384    }
20385
20386    try
20387    {
20388      //checkform test
20389      if (checkForm)
20390      {
20391        var check = checkForm.recheckAjax(document.getElementById(formDiv));
20392        if (check==false)
20393        {
20394
20395            try
20396            {
20397               if (typeof callMyFunction != 'undefined') callMyFunction(check);
20398            }
20399            catch (e) { }
20400
20401          //prevent default
20402          return false;
20403        }
20404      }
20405    }
20406    catch (ex2) { window.alert("7" + ex2); console.log(ex2); }
20407
20408
20409    var extIndex = action.indexOf(defaultStripesExenstion);
20410    //compose ajax url from original form action replacing original stripes script extension
20411    //with stripes ajax extension configured in web.xml
20412    var url = action;
20413
20414        //"formMailForm"==formDiv
20415    if (formDiv.indexOf("formMailForm") > -1)
20416    {
20417      url = form.attr("action").replace(/\/formmail\.do/gi, "/FormMailAjax.action");
20418    }
20419
20420    //create params from serializing form inputs and add param simulating button click in order to
20421    //Stripes could find actionBean event handler
20422
20423    var formSubmitCallback = function() {
20424      var params = form.serialize();
20425      if(event != null) params = event + '&' + params;
20426      //hide errors if visible
20427      $("#" + resultDiv).hide();
20428      //fire ajax request
20429
20430      var callback = function(dataFromServer) {
20431            wjAjaxOnFormResult(formDiv, resultDiv, dataFromServer, callMyFunction);
20432          };
20433      //set up what to do if AJAX request fails
20434      $("").ajaxError(wjAjaxOnServerError);
20435
20436      
20437      $.post(url, params, callback, "text");
20438      //return false to button to stop standard submit of the form
20439    }
20440    //pre re-captcha v3 potrebujeme najskor volat validate
20441    if (typeof window.wjFormSubmit == "function") {
20442      window.wjFormSubmit(form, formSubmitCallback);
20443    } else {
20444      formSubmitCallback();
20445    }
20446
20447    return false;
20448  }
20449  catch(ex)
20450  {
20451    window.alert("Error 2: " + ex);
20452    return true;
20453  }
20454}
20455
20456/*
20457* Method is executed when server returns exception.
20458*/
20459function wjAjaxOnServerError(event, request, settings, error){
20460  alert("Server returned an error, form was not probably processed by the server.");
20461}
20462
20463/*
20464* Method is called when server returns non JSON data.
20465*/
20466function wjAjaxOnServerDataError(data){
20467  alert("Server has returned data in unknown format.");
20468}
20469
20470/*
20471* Method is called when server returns reply to ajax call.
20472*
20473* @param data contains reply from the server
20474*/
20475function wjAjaxOnFormResult(formDiv, resultDiv, data, callMyFunction) {
20476  try
20477  {
20478    var result = eval(data);
20479  } catch (ex) {
20480    wjAjaxOnServerDataError(data);
20481    return;
20482  }
20483
20484    try
20485    {
20486       if (typeof callMyFunction != 'undefined') callMyFunction(result);
20487    }
20488    catch (e) { }
20489
20490  if (result.ok)
20491  {
20492    wjAjaxOnSuccess(formDiv, resultDiv, result, callMyFunction);
20493  } else {
20494    wjAjaxOnError(formDiv, resultDiv, result);
20495  }
20496  try {
20497    const wjEvent = new CustomEvent("WJ.formSubmit", {
20498        detail: {
20499          success: result.ok,
20500          result: result,
20501          formDiv: formDiv,
20502          resultDiv: resultDiv
20503        }
20504    });
20505    //console.log("Dispatching event: ", wjEvent);
20506    window.dispatchEvent(wjEvent);
20507  } catch (e) { console.log(e); }
20508}
20509
20510/*
20511* Method is executed, when form was submited with success.
20512*/
20513function wjAjaxOnSuccess(formDiv, resultDiv, result)
20514{
20515  $("#" + formDiv).queue(function()
20516  {
20517    //console.log(formDiv+"/"+resultDiv+"/"+result);
20518    $("#" + resultDiv).parent().addClass("alert alert-ajax alert-success");
20519    $("#" + resultDiv).parent().removeClass("alert-danger");
20520	  formAfterSend();
20521    $("#" + resultDiv).html("<div class=\"overlay\"></div><div class=\"form-dialog\">"+result.okResult).fadeIn();
20522     $("html,body").animate({ scrollTop: ($("#" + resultDiv).offset().top - 100) }, { duration: 'fast', easing: 'linear'}); 
20523    $(this).dequeue();
20524
20525     window.setTimeout(wjAjaxResetForm.bind(null, formDiv), 500); 
20526    window.setTimeout(function(){
20527          var div = $("#" + resultDiv),
20528              formResult = div.closest('#formResult');
20529
20530          if (formResult.length > 0) {
20531              formResult.fadeOut("slow");
20532          }
20533          else {
20534              div.fadeOut("slow");
20535          }
20536    }, 4000);
20537
20538    wjAjaxSetToken(formDiv, result.token);
20539  });
20540}
20541
20542function formAfterSend() {
20543}
20544
20545function wjAjaxResetForm(formDiv)
20546{
20547  try
20548  {
20549    var form = $('form[name="' + formDiv + '"]')
20550    if (formDiv.length > 0)
20551    {
20552
20553      form.find('input[type=text], input[type=email], input[type=tel], input[type=date], input[type=checkbox], input[type=radio], textarea').each(function(){
20554        var el = $(this);
20555
20556        $("form[name="+formDiv+"]").removeClass("sending");
20557
20558        if (el.is(':checkbox') || el.is(':radio')) {
20559          el.prop('checked', el[0].defaultValue).trigger('change');
20560        }
20561        else {
20562          el.val('').trigger('change');
20563        }
20564
20565        if (el.hasClass('selectmenu')) {
20566            setTimeout(function(){
20567                el.val('').selectmenu('refresh');
20568            });
20569        }
20570      });
20571
20572      form.find('select').each(function() {
20573        this.selectedIndex = 0;
20574      });
20575
20576      form.find(".dropzone").each(function() {
20577        Dropzone.forElement(this).removeAllFiles();
20578      });
20579    }
20580  } catch (e) {
20581    console.log(e);
20582  }
20583}
20584
20585function wjAjaxSetToken(formDiv, token)
20586{
20587  try
20588  {
20589    if (token != undefined && token != null && token!="")
20590    {
20591      $("form[name="+formDiv+"]").find("input[name=__token]").val(token);
20592    }
20593  } catch (e) {}
20594}
20595
20596/*
20597* Method is executed, when form was submitted and server returned error.
20598*/
20599function wjAjaxOnError(formDiv, resultDiv, result) {
20600  $("#" + resultDiv).html(result.errorResult).show("slow");
20601  $("#" + formDiv).queue(function ()
20602  {
20603    var callback = function()
20604    {
20605      wjAjaxColorizeLabel(this, result);
20606    };
20607    $("#" + formDiv + " label").each(callback);
20608    $("#wjcaptchaImg1").click();
20609    $("#wjcaptcha1").addClass("invalid");
20610    $("#" + resultDiv).parent().addClass("alert alert-ajax alert-danger");
20611    $("html,body").animate({ scrollTop: ($("#" + resultDiv).offset().top - 100) }, { duration: 'fast', easing: 'linear'});
20612    $("form").removeClass("sending");
20613    $(this).dequeue();
20614
20615    wjAjaxSetToken(formDiv, result.token);
20616  });
20617}
20618
20619/*
20620* Method will add class "error" to each label, whose input was found in validationErrors object.
20621* In the oposite way, it removes any possible "error" class from any labes, that currently is not in error.
20622*/
20623function wjAjaxColorizeLabel(label, result) {
20624  var error = result.validationErrors[label.htmlFor];
20625  var errorIndex = -1;
20626  if (label.className != null) errorIndex = label.className.indexOf('error');
20627  if (error != null && errorIndex == -1) {
20628    label.className = label.className + " error";
20629  }
20630  if (error == null && errorIndex > -1) {
20631    label.className = label.className.substring(0, errorIndex)
20632        + label.className.substring(errorIndex + 5, label.className.length);
20633  }
20634}
20635
20636
20637
20638(function() {
20639    var method;
20640    var noop = function () {};
20641    var methods = [
20642        'assert', 'clear', 'count', 'debug', 'dir', 'dirxml', 'error',
20643        'exception', 'group', 'groupCollapsed', 'groupEnd', 'info', 'log',
20644        'markTimeline', 'profile', 'profileEnd', 'table', 'time', 'timeEnd',
20645        'timeline', 'timelineEnd', 'timeStamp', 'trace', 'warn'
20646    ];
20647    var length = methods.length;
20648    var console = (window.console = window.console || {});
20649
20650    while (length--) {
20651        method = methods[length];
20652
20653        
20654        if (!console[method]) {
20655            console[method] = noop;
20656        }
20657    }
20658}());
20659
20660
20661

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.